Monday, May 27, 2024

httpd & pixelfed

Hi Everyone,

I am trying to install and run pixelfed (think of it as a self-hosted instagram alternative) on OpenBSD 7.5, but I am having a problem with my /etc/httpd.conf. Unfortunately, pixelfed's installation instructions only provide an nginx example. For those of you familiar with nextcloud, pixelfed is similar -- it's essentially a large php application that one can unpack under /var/www/.

I have chosen to "install" (i.e. unpack) pixelfed into /var/www/pixelfed. After chown -R www:www'ing the entire directory, everything "works" except for one critical part -- none of the images load, which, for an instagram alternative, is an issue :)

What works is everything else -- I can browse around, create a user, login, adjust my settings, and post images (which ultimately don't show up). Everything works except displaying images. This expands to more than just uploaded photos -- for example, the main page's header image won't load.

I believe I have pinpointed the issue, but I struggle to translate that into my /etc/httpd.conf.

Most of what makes pixelfed work is located in /var/www/pixelfed/public, and hence pixelfed requires that the root directory be /var/www/pixelfed/public.
So in /etc/httpd.conf I have the following lines:
-   root "/pixelfed/public"
-   directory index "index.php"

However, for some bizarre reason, all the images are stored in /var/www/pixelfed/storage (note: *not* /var/www/pixelfed/public/storage).
And part of the pixelfed installation process includes creating the following symlink in /var/www/pixelfed:
-   lrwxr-xr-x  1 root  www    37B May 27 12:15 storage@ -> /var/www/pixelfed/storage/app/public/

That, unfortunately, is "outside" of the root directory specified in /etc/httpd.conf.

My /etc/httpd.conf is below, and you can see that I have tried to re-set the root directory whenever someone navigates to "/storage/*", but it doesn't work. Does anyone know what I'm doing wrong?

P.S. -
Running the following makes all images work, but I hesitate to use this as a long-term solution:
-   cd /var/www/pixlfed/public
-   cp -a /var/www/pixelfed/storage /var/www/pixelfed/public/storage_blah
-   ln -s /var/www/pixelfed/public/storage_blah/app/public storage


Many Thanks.

/etc/httpd.conf:

server "www.domain.com" {                                                                                    
        listen on * tls port 443                                                                          
                                                                                                           
        # acme-challenge TLS location                                                                      
        location "/.well-known/acme-challenge/*" {                                                        
                root "/acme"                                                                              
                request strip 2                                                                            
        }                                                                                                  
                                                                                                           
        # enable HTTP Strict Transport Security                                                            
        hsts {                                                                                            
                preload                                                                                    
                subdomains                                                                                
                max-age 15768000                                                                          
        }                                                                                                  
                                                                                                           
        tls {                                                                                              
                certificate "/etc/ssl/domain.com.fullchain.pem"                                              
                key "/etc/ssl/private/domain.com.key"                                                        
        }                                                                                                  
                                                                                                           
        # set logs                                                                                        
        log {                                                                                              
                access "pixelfed-access.log"                                                              
                error "pixelfed-error.log"                                                                
        }                                                                                                  
                                                                                                           
        # set max upload size to 1G (in bytes)                                                            
        connection max request body 1048576000                                                            
        connection max requests 1000                                                                      
        connection request timeout 3600                                                                    
        connection timeout 3600                                                                            
                                                                                                          
        root "/pixelfed/public"                                                                            
        directory index "index.php"                                                                        
                                                                                                           
        # works roughly like the `try_files` line of an nginx config                                      
        location not found "*" {                                                                          
                request rewrite "/index.php?$QUERY_STRING"                                                
                fastcgi socket "/run/php-fpm.sock"                                                        
        }                                                                                                  
                                                                                                           
        location "/storage/*" {                                                                            
                root "/pixelfed/storage/app/public"                                                        
                fastcgi socket "/run/php-fpm.sock"                                                        
        }                                                                                                  
                                                                                                           
        location "/*.php" {                                                                                
                fastcgi socket "/run/php-fpm.sock"                                                        
        }                                                                                                                                                                                                 
 }       

No comments:

Post a Comment