Seafile und Wordpress auf einem NGINX Server

Hallo zusammen,

ich habe eine grundsätzliche Frage zur NGINX Serverkonfiguration.
Ich betreibe zwei Dienste auf einem OpenMediaVault Server.
Zum einen natürlich Seafile auf dem Port 8444 und Wordpress auf dem Standardport 443.
Beide Dienste sind per DynDNS von außen erreichbar.
Ich würde nun aber gern Seafile auch über den Port 443 erreichen wollen aber in dem Subdirectory /cloud
Zusätzlich soll auch noch OnlyOffice in Seafile integriert werden.
Ich bin mir nun allerdings unsicher wie ich dies anfangen soll.
Ich dachte zunächst über einen Reverse Proxy, welche ich auf einen Raspi3 vorschalte, nur bräuchte ja dann, wenn ich es richtig verstanden habe, jeder Dienst/Server eine eigene IP Adresse. Dies ist aber bei mir nicht der Fall.
Ich möchte die Dienste eigentlich ungern auf virtuelle Maschinen aufteilen.

Habt ihr eine Idee wie ich das anstellen könnte?
Oder übersehe ich irgendwas?

Viel Grüße

NCC1701

1 Like

Vielleicht mit Docker und Local-IPs ?

Wenn der Server genügend Power hat sollte das kein Problem sein.
Seafile nutz Python, WordPress PHP und Docker für OnlyOffice, alle Nginx als Frontend Server.
Ich empfehle Ubuntu 16 LTS der Einfachheit halber.

Mir geht’s nicht darum, ob es der Server von der Performance her schafft. Das ist kein Problem.
Ich bräuchte Infos wie die NGINX Konfiguration aussehen müsste, um dies zu bewerkstelligen.
Bisher sind die Dienste unter einer IP auf verschiedenen Ports verteilt.
Was ich aber möchte ist eine IP und die Dienste auf unterschiedlichen Subdirectories. Bzw. eben Wordpress unter dem root und Seafile unter z.B. dem Ordner /cloud

Also z.B
https://meinedomain.de für Wordpress
https://meinedomain.de/cloud für Seafile

Ich wäre euch für jeden Tipp dafür dankbar.

Spricht etwas dagegen Subdomains (z.B. cloud.meinedomain.de) zu verwenden? Das ermöglicht Dir eine einfache Trennung der Konfiguration und, sollte es irgendwann notwendig sein, später auch den Betrieb auf unterschiedlichen Servern.

Das möchte ich eigentlich nicht.
Zum einen wird dies nicht für Onlyoffice empfohlen und zum anderen möchte ich nicht mehrere Zertifikate verwalten müssen.
Mit dem Gedanken an sich habe ich aber auch schon gespielt.

Warum wird das nicht empfolen?

Für die meissten Nutzer wird empfohlen ein Unterverzeichnis der Seafile-Domain zu verwenden, also z.B. https://seafile.example.com/onlyoffice. Eine eigene Subdomain für OnlyOffice funktioniert aber auch.

Wie verwaltest Du Dein Zertifikate? Zertifikate von Letsencrypt werden von allen halbwegs modernen Geräten akzeptiert und sind total einfach zu installieren und aktualisieren.

2 Likes

Ich hab Let’s Encrypt für alles privates, für meinen Blog (bald online) werd ich aber erst mal das Inklusivzertifikat benutzen. Dein Idee wiederspricht aber den von Seafile:
https://manual.seafile.com/deploy/only_office.html
https://manual.seafile.com/deploy/deploy_seahub_at_non-root_domain.html

Bei mir läuft alles über nginx und ist von außen über den Port 443 mit Unterverzeichnissen erreichbar:

  • Seafile
  • Wordpress
  • cops (e-books)
  • kanboard (Projektmanagement)
  • airsonic (Streaming)
  • Baikal (CalDAV)
  • PHP Bildergallerie
  • InfCloud (Kalender)

Zu OnlyOffice kann ich leider nichts sagen, weil es keine ARM-Version gibt. Auch aus diesem Grund werde ich vermutlich demnächst auf einen x86 Server umsteigen.

Das klingt sehr interessant. Genauso stelle ich mir das vor. Kannst du bitte die NGINX Konfig hier veröffentlichen und vielleicht mal deine Erfahrungen schildern wo eventuelle Fallstricke lauern.

Hier ist meine Konfiguration. Das meiste habe ich mir selbst aus diversen Tutorials zusammenkopiert. Falls jemand grobe Fehler oder Sicherheitslücken findet, bin ich für jeden Tipp dankbar. Alle Anwendungen, die keine eigene Login-Möglichkeit bieten, habe ich mit nginx abgesichert, so dass ohne Passwort nichts von außen erreichbar ist:

server {
    listen 80;
    server_name nasserver;
    error_page 497  https://$host:$server_port$request_uri;
    client_max_body_size 10G;
    rewrite ^ https://$http_host$request_uri? permanent;
}
server {
    listen 443;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/meindyndnsname.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/meindyndnsname.org/privkey.pem;
    server_name meindyndnsname.org;
    error_page 497  https://$host:$server_port$request_uri;
    client_max_body_size 10G; # set max upload size
location /airsonic {
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host  $http_host;
        proxy_set_header Host              $http_host;
        proxy_max_temp_file_size           0;
        proxy_pass                         http://127.0.0.1:8080/airsonic;
        proxy_redirect                     http:// https://;
    }
location /baikal {
        root /usr/share/nginx/www/baikal;
        index index.php index.html;

        location ~ ^(.+\.php)(.*)$ {
                try_files $fastcgi_script_name =404;
                fastcgi_split_path_info  ^(.+\.php)(.*)$;
                fastcgi_pass   unix:/var/run/php5-fpm.sock;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                include        /etc/nginx/fastcgi_params;
            }

            rewrite ^/.well-known/caldav /dav.php redirect;
            rewrite ^/.well-known/carddav /dav.php redirect;
            charset utf-8;
            location ~ /(\.ht|Core|Specific) {
                deny all;
                return 404;
            }
    }
location /cops {
        auth_basic "Login eBook-Server";
        auth_basic_user_file /usr/share/nginx/www/users.txt;
        root /usr/share/nginx/www;
        index index.php index.html;

        location ~ ^(.+\.php)(.*)$ {
                try_files $fastcgi_script_name =404;
                fastcgi_split_path_info  ^(.+\.php)(.*)$;
                fastcgi_pass   unix:/var/run/php5-fpm.sock;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                include        /etc/nginx/fastcgi_params;
            }

            charset utf-8;

            location ~ /(\.ht|Core|Specific) {
                deny all;
                return 404;
            }
    }
location /wordpress {
        auth_basic "Login Wordpress-Server";
        auth_basic_user_file /usr/share/nginx/www/users.txt;
       root /media/Festplatte/www;
        index index.php index.html;

        location ~ ^(.+\.php)(.*)$ {
                try_files $fastcgi_script_name =404;
                fastcgi_split_path_info  ^(.+\.php)(.*)$;
                fastcgi_pass   unix:/var/run/php5-fpm.sock;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                include        /etc/nginx/fastcgi_params;
            }

            charset utf-8;

            location ~ /(\.ht|Core|Specific) {
                deny all;
                return 404;
            }
    }
location /kanboard {
        root /usr/share/nginx/www;
        index index.php index.html;

        location ~ ^(.+\.php)(.*)$ {
                try_files $fastcgi_script_name =404;
                fastcgi_split_path_info  ^(.+\.php)(.*)$;
                fastcgi_pass   unix:/var/run/php5-fpm.sock;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                include        /etc/nginx/fastcgi_params;
            }

            charset utf-8;

            location ~ /(\.ht|Core|Specific) {
                deny all;
                return 404;
            }
    }
location /pics {
        auth_basic "Login Gallery-Server";
        auth_basic_user_file /usr/share/nginx/www/users.txt;
        root /usr/share/nginx/www;
        index index.php;

        location ~ ^(.+\.php)(.*)$ {
                try_files $fastcgi_script_name =404;
                fastcgi_split_path_info  ^(.+\.php)(.*)$;
                fastcgi_pass   unix:/var/run/php5-fpm.sock;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO        $fastcgi_path_info;
                include        /etc/nginx/fastcgi_params;
            }

            charset utf-8;

            location ~ /(\.ht|Core|Specific) {
                deny all;
                return 404;
            }
    }
location /infcloud {
        root /usr/share/nginx/www;
        index index.html;
        index feed.php;
    }
location /seafile {
      proxy_pass         http://127.0.0.1:8000;
      proxy_set_header   Host $host:$server_port;
      proxy_set_header   X-Real-IP $remote_addr;
      proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Host $server_name;
      proxy_read_timeout  1200s;
      proxy_http_version 1.1;     # not sure if necessary
      proxy_set_header Connection "";

     # used for view/edit office file via Office Online Server
     client_max_body_size 0;

     access_log      /var/log/nginx/seahub.access.log;
     error_log       /var/log/nginx/seahub.error.log;
    }
     location /seafdav {
        fastcgi_pass    127.0.0.1:3000;
        fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
        fastcgi_param   PATH_INFO           $fastcgi_script_name;

        fastcgi_param   SERVER_PROTOCOL     $server_protocol;
        fastcgi_param   QUERY_STRING        $query_string;
        fastcgi_param   REQUEST_METHOD      $request_method;
        fastcgi_param   CONTENT_TYPE        $content_type;
        fastcgi_param   CONTENT_LENGTH      $content_length;
        fastcgi_param   SERVER_ADDR         $server_addr;
        fastcgi_param   SERVER_PORT         $server_port;
        fastcgi_param   SERVER_NAME         $server_name;

        fastcgi_param   HTTPS               on;

        client_max_body_size 0;

        access_log      /var/log/nginx/seafdav.access.log;
        error_log       /var/log/nginx/seafdav.error.log;
    }

    location /seafhttp {
        rewrite ^/seafhttp(.*)$ $1 break;
        proxy_pass http://127.0.0.1:8082;
        client_max_body_size 0;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }

    location /seafmedia {
        rewrite ^/seafmedia(.*)$ /media$1 break;
        root /home/seafile/seafile-server-latest/seahub;
    }

    location /media {
        root /home/seafile/seafile-server-latest/seahub/media;
    }

`

1 Like

You can switch completely to WSGI on Seafile. No need to run it via fastcgi.

Example configuration for SeafDAV at https://manual.seafile.com/extension/webdav.html still uses fastcgi. How should this configuration be altered to switch to WSGI?

I have the following config which works fine.

  location /seafdav {
	proxy_pass                http://127.0.0.1:8080;
	proxy_set_header          Host $host;
	proxy_set_header          X-Real-IP $remote_addr;
	proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_set_header          X-Forwarded-Host $server_name;
	proxy_set_header          X-Forwarded-Proto https;
	proxy_http_version        1.1;
	proxy_connect_timeout     36000s;
	proxy_read_timeout        36000s;
	proxy_send_timeout        36000s;
	send_timeout              36000s;
        client_max_body_size      0;
	proxy_request_buffering   off;

        access_log      /var/log/nginx/seafdav.access.log;
        error_log       /var/log/nginx/seafdav.error.log;
  }

And of course you need to switch off the fastCGI mode for seadav in the config file.

1 Like

Does not work for me. When I try to acces via webdav, I get a bad gateway error.
I took your template, switched the Port to 3000 and deleted the proxy_request_buffering line. Then I switched fastcgi off in config file. Of course I restarted seafile and nginx.
This is what seafdav.error.log says:
2018/02/05 10:21:15 [error] 16729#0: *38 connect() failed (111: Connection refused) while connecting to upstream, client: 88.130.xxx.xxx, server: meindyndnsname.org, request: "PROPFIND /seafdav HTTP/1.1", upstream: "http://127.0.0.1:3000/seafdav", host: "meindyndnsname.org"

Any idea what’s going wrong?

Port changed in seadav config?
Nginx version?

You put the nginx config block within the seafile block, just replaced the old seadav block right?

Please run netstat -tulpn on your server and post results here.

I just replaced the seafdav block in the config file posted this morning. In my sefdav.conf port is set to 3000 and fastcgi set to no. Nginx version is 1.6.2 arm.

This is the resulot of netstat -tulpn:
Aktive Internetverbindungen (Nur Server)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 16878/nginx
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN 2785/xrdp
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 2710/smbd
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 17002/python2.7
tcp 0 0 0.0.0.0:12001 0.0.0.0:* LISTEN 16965/seaf-server
tcp 0 0 0.0.0.0:8200 0.0.0.0:* LISTEN 1518/minidlnad
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 2437/mysqld
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 2710/smbd
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 1973/memcached
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16878/nginx
tcp 0 0 0.0.0.0:10001 0.0.0.0:* LISTEN 16962/ccnet-server
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 16878/nginx
tcp 0 0 0.0.0.0:8082 0.0.0.0:* LISTEN 16965/seaf-server
tcp 0 0 127.0.0.1:3350 0.0.0.0:* LISTEN 2790/xrdp-sesman
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2583/sshd
tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 16964/python2.7
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 19764/1
tcp6 0 0 :::445 :::* LISTEN 2710/smbd
tcp6 0 0 :::139 :::* LISTEN 2710/smbd
tcp6 0 0 :::8080 :::* LISTEN 2908/java
tcp6 0 0 :::22 :::* LISTEN 2583/sshd
tcp6 0 0 ::1:6010 :::* LISTEN 19764/1
udp 0 0 0.0.0.0:1900 0.0.0.0:* 1518/minidlnad
udp 0 0 127.0.0.1:11211 0.0.0.0:* 1973/memcached
udp 0 0 0.0.0.0:68 0.0.0.0:* 1585/dhclient
udp 0 0 0.0.0.0:2650 0.0.0.0:* 1585/dhclient
udp 0 0 192.168.178.42:54900 0.0.0.0:* 1518/minidlnad
udp 0 0 192.168.178.42:123 0.0.0.0:* 2525/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 2525/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 2525/ntpd
udp 0 0 192.168.178.255:137 0.0.0.0:* 1803/nmbd
udp 0 0 192.168.178.42:137 0.0.0.0:* 1803/nmbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 1803/nmbd
udp 0 0 192.168.178.255:138 0.0.0.0:* 1803/nmbd
udp 0 0 192.168.178.42:138 0.0.0.0:* 1803/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 1803/nmbd
udp6 0 0 2003:e5:5bcb:ea00:4:123 :::* 2525/ntpd
udp6 0 0 fe80::44:2ff:fe81:d:123 :::* 2525/ntpd
udp6 0 0 ::1:123 :::* 2525/ntpd
udp6 0 0 :::123 :::* 2525/ntpd
udp6 0 0 :::17563 :::* 1585/dhclient

Das ist ja alles sehr interessant. Nur sind wir hier nicht eigentlich im deutschsprachigen Teil des Forums also warum schreiben wir hier in englisch?

@Tjelfe
Danke für die Serverkonfig.
Meine sieht recht ähnlich aus.
Ich habe es nun auch hinbekommen Seafile in das Subdirectory umzukonfigurieren und OnlyOffice funktioniert auch.
Es hatte sich bei mir ein Tippfehler eingeschlichen.
Leider funktioniert nun Wordpress nicht mehr.
Sehe ich das beider Konfiguration richtig, dass du das root Verzeichnis deiner Domain gar nicht verwendest.
Ist das nicht für eine Wordpressseite ungünstig?