Private Cloud mit Seafile und Radicale auf einem Raspberry Pi (Teil 3)

In den ersten beiden Teilen der Artikelserie „Private Cloud mit Seafile und Radicale auf einem Raspberry Pi“ hatte ich mich mit der Einrichtung des Raspberry Pi und dem Aufsetzen des Caldav- und Carddav-Servers Radicale befasst. In diesem Teil soll es nun um die Einrichtung von Seafile als Cloud-Laufwerk gehen. Grundvoraussetzung ist ein Webserver, dessen Einrichtung ich bereits in Teil 2 beschrieben habe. Zur Absicherung der Kommunikation mit Seafile ist die Benutzung eines SSL-Zertifikats empfehlenswert. Auch dies wurde im zweiten Teil gezeigt. Zur weiteren Einrichtung von Seafile sind folgende größeren Schritte notwendig:

Schritt 1: Seafile installieren

Schritt 1a: Benutzer „seafile“ anlegen
Bevor man mit allem loslegt, müssen noch einige Pakete installiert werden:

sudo apt-get install python2.7 python-setuptools python-imaging python-urllib3 sqlite3

Dann legt man einen neuen Benutzer „seafile“ an. Den Login für diesen kann man deaktivieren, da man sich nicht per SSH mit diesem Benutzernamen einloggen muss. Die darauffolgenden Fragen kann man mit Enter alle bestätigen. Mit dem Befehl su wechselt man in diesen Benutzer:

sudo adduser seafile --disabled-login
sudo su seafile

 

Schritt 1b: Seafile herunterladen und entpacken
Im nächsten Schritt wechselt man in das Home-Verzeichnis des Benutzers seafile und lädt Seafile von der Downloadseite herunter (auf die Raspberry-Pi-Variante achten!!!). Das Tar-Archiv kann dann an Ort und Stelle entpackt werden. Nachdem es entpackt wurde, kann dass Archiv gelöscht werden:

cd /home/seafile
wget https://github.com/haiwen/seafile-rpi/releases/download/v6.2.3/seafile-server_6.2.3_stable_pi.tar.gz
tar -xvf seafile-server_6.2.3_stable_pi.tar.gz
rm seafile-server_6.2.3_stable_pi.tar.gz

 

Schritt 1c: Seafile installieren
Nun wechselt man in das entpackte Verzeichnis und startet das Installations-Skript.

cd seafile-server-6.2.3
./setup-seafile.sh

Es folgen einige Fragen, die man folgend beantwortet:

  • server name: hier kann ein beliebiger Name stehen
  • server’s ip or domain: hier nimmt man die DynDNS-Adresse bzw. die Domain, die auf den Server zeigen soll (in meinen bisherigen Beispielen war dies cloud.hotzpotz.de)
  • Speicherort seafile data: Alle Dateien, die in der Cloud landen werden, sollen auf dem PiDrive gespeichert werden. Daher nimmt man folgenden Pfad: /mnt/data/seafile-data
  • TCP-Port seafile fileserver: mit Enter kann man den vorgeschlagenen default-Port 8082 einfach übernehmen

Zum testen, ob alles ordnungsgemäß funktioniert kann man nun den Seafile-Dienst und das Webinterface (Seahub) starten. Beim Start von Seahub muss man ein Administrator-Konto anlegen, indem man eine E-Mail-Adresse und ein Passwort vergeben muss.

./seafile.sh start
./seahub.sh start

Nachdem beides gestartet wurde, kann man über die lokale IP-Adresse des RaspPi im Netzwerk mit dem Port 8000 das Webinterface in einem Browser starten (z.B. http://192.168.178.100:8000) und sich mit dem eben angelegten Administrator-Konto anmelden.

 

Schritt 2: Seahub mit Nginx und SSL konfigurieren

Um Seafile auch von außerhalb des Netzwerkes (sicher) erreichbar zu machen, muss Nginx eine neue Konfiguration hinzugefügt und Seafile nachkonfiguriert werden.

Schritt 2a: Seafile-Konfiguration anpassen
Da man noch als Benutzer „seafile“ angemeldet ist, macht es Sinn, gleich noch Änderungen für die spätere Benutzung mit Nginx und SSL vorzunehmen. Dafür stoppt man zunächst den Seafile-Server und Seahub:

./seahub.sh stop
./seafile.sh stop

Dann ändert man in der Datei ccnet.conf die Variable SERVICE_URL, welche ja nun ein https beinhalten muss:

nano /home/seafile/conf/ccnet.conf

SERVICE_URL = https://cloud.hotzpotz.de:8000

Mit Strg+X, Y und Enter wird die Datei gespeichert. Weiterhin muss man in der Datei seahub_settings.py eine Zeile hinzufügen (dabei die eigene Domain mit https angeben):

nano /home/seafile/conf/seahub_settings.py

FILE_SERVER_ROOT = 'https://cloud.hotzpotz.de/seafhttp'

Wieder wird die Datei mit Strg+X, Y und Enter gespeichert. Nun muss noch in der Konfiguration des Seafile Fileservers im Abschnitt [fileserver] eine Zeile hinzugefügt werden:

nano /home/seafile/conf/seafile.conf

[fileserver]
host = 127.0.0.1

Mit Strg+X, Y und Enter wird die Datei gespeichert. Damit sind die Änderungen an der Seafile-Konfiguration abgeschlossen und man kann den Seafile-Server und Seahub wieder starten:

./seafile.sh start
./seahub.sh start

Nun kann man sich als Nutzer „seafile“ mit dem Befehl exit abmelden, denn alle folgenden Eingaben muss man wieder als Standard-Nutzer vornehmen.

Schritt 2b: Nginx neue Konfiguration hinzufügen
Zur besseren Absicherung der SSL-Verbindung kann man einen Schlüssel für das Diffie-Hellman-Protokoll erzeugen. Das dauert einige Zeit. Ist er erzeugt, verschiebt man diesen in das Nginx-Verzeichnis:

openssl dhparam 2048
sudo mv /home/hotzenplotz/dhparam.pem /etc/nginx/dhparam.pem

Danach erstellt man eine neue Konfigurationsdatei:

sudo nano /etc/nginx/sites-available/seahub

welche folgenden Inhalt hat:

    server {
        listen       80;
        server_name  cloud.hotzpotz.de;
        rewrite ^ https://$http_host$request_uri? permanent;    # force redirect http to https
        server_tokens off;
    }
    server {
        listen 443;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/cloud.hotzpotz.de/fullchain.pem;        # path to your cacert.pem
        ssl_certificate_key /etc/letsencrypt/live/cloud.hotzpotz.de/privkey.pem;    # path to your privkey.pem
        server_name cloud.hotzpotz.de;
        ssl_session_timeout 5m;
        ssl_session_cache shared:SSL:5m;

        # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
        ssl_dhparam /etc/nginx/dhparam.pem;

        # secure settings (A+ at SSL Labs ssltest at time of writing)
        # see https://wiki.mozilla.org/Security/Server_Side_TLS#Nginx
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS';
        ssl_prefer_server_ciphers on;

        proxy_set_header X-Forwarded-For $remote_addr;

        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
        server_tokens off;

        location / {
            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_set_header   X-Forwarded-Proto https;

            access_log      /var/log/nginx/seahub.access.log;
            error_log       /var/log/nginx/seahub.error.log;

            proxy_read_timeout  1200s;

            client_max_body_size 0;
        }

        location /seafhttp {
            rewrite ^/seafhttp(.*)$ $1 break;
            proxy_pass http://127.0.0.1:8082;
            client_max_body_size 0;
            proxy_connect_timeout  36000s;
            proxy_read_timeout  36000s;
            proxy_send_timeout  36000s;
            send_timeout  36000s;
        }
    }

Mit Strg+X, Y und Enter wird diese Konfigurationsdatei gespeichert. Sie muss noch aktiviert werden, sodass danach der Nginx-Server neu gestartet werden kann:

sudo ln -s /etc/nginx/sites-available/seahub /etc/nginx/sites-enabled/seahub
sudo /etc/init.d/nginx restart

Seafile müsste nun über das Webinterface in einem Browser über eine SSL-geschützte Verbindung aufrufbar sein (in meinem Beispiel wäre dies dann https://cloud.hotzpotz.de)

 

Schritt 3: Seafile als Dienst einrichten

Damit bei einem Neustart des RasPi Seafile nicht immer manuell gestartet werden muss, kann man es als Dienst einrichten, sodass es automatisch mit gestartet wird. Dafür erstellt man einen systemd-Dienst für den Seafile-Server:

sudo nano /etc/systemd/system/seafile.service

mit folgendem Inhalt:

[Unit]
Description=Seafile
After=network.target postgresql.service

[Service]
Type=oneshot
ExecStart=/home/seafile/seafile-server-latest/seafile.sh start
ExecStop=/home/seafile/seafile-server-latest/seafile.sh stop
RemainAfterExit=yes
User=seafile
Group=seafile

[Install]
WantedBy=multi-user.target

Mit Strg+X, Y und Enter wird die Datei gespeichert. Dann erstellt man einen weiteren Dienst für Seahub:

sudo nano /etc/systemd/system/seahub.service

mit folgendem Inhalt:

[Unit]
Description=Seafile hub
After=network.target seafile.service

[Service]
Environment="LC_ALL=C"
ExecStart=/home/seafile/seafile-server-latest/seahub.sh start
ExecStop=/home/seafile/seafile-server-latest/seahub.sh stop
User=seafile
Group=seafile
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Auch hier wird die Datei mit Strg+X, Y und Enter gespeichert. Nun müssen die beiden Dienste noch aktiviert werden:

sudo systemctl enable seafile.service
sudo systemctl enable seahub.service

Und damit wäre die Einrichtung von Seafile abgeschlossen. Happy synchronizing!

Private Cloud mit Seafile und Radicale auf einem Raspberry Pi (Teil 3)

17 Gedanken zu „Private Cloud mit Seafile und Radicale auf einem Raspberry Pi (Teil 3)

  1. Markus schreibt:

    Hab dafür Syncthing auf dem Pi laufen, als always on Gerät.
    Ist nicht ganz das selbe Anwendungsgebiet, sondern eher P2P Abgleich zwischen gleichwertigen Geräten ohne zentralen Server.
    Dafür wär das imo um einiges Massentauglicher einzurichten.

  2. Stefan schreibt:

    Bei diesen Zeilen verzweifele ich (als ungeübter Linux-User):
    „openssl dhparam 2048“
    „sudo mv /home/hotzenplotz/dhparam.pem /etc/nginx/dhparam.pem“
    Beim zweiten Befehl kann die Datei „dhparam.pem“ nicht gefunden werden.
    Ich habe daher die Datei mit diesem Befehl angelegt: „openssl dhparam -out /etc/nginx/dhparam.pem 2048“ und mir den mv-Befehl erspart.

    1. Stefan schreibt:

      Nachtrag:
      Natürlich muss noch ein „sudo“ vor die Zeile „openssl dhparam -out /etc/nginx/dhparam.pem 2048“.

      In dieser Zeile steckt außerdem auch noch ein Fehler:
      ssl_ciphers ‚ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDS$
      Ist das Dollar-Zeichen durch copy-and-paste aus dem nano-Editor da rein gekommen? Die Zeile ist außerdem nicht mit einem Semikolon abgeschlossen.

      1. Da hast du vollkommen Recht. Da muss etwas beim Kopieren gründlich schief gegangen sein. Die Zeile ist abgeschnitten worden. Ich habe sie jetzt vollständig eingefügt. Danke für den Hinweis!

    2. Kann es sein, dass du dabei noch als Benutzer „seafile“ angemeldet warst (s. Schritt 1a). Am Ende von Schritt 2b müsstest du dich eigentlich wieder abmelden. Wenn du das nicht gemacht hast, legt er das Zertifikat natürlich im home-Verzeichnis vom Benutzer „seafile“ ab und kann es somit auch nicht im home-Verzeichnis von hotzenplotz finden.

      1. Stefan schreibt:

        Kann ich jetzt gerade nicht mehr nachvollziehen. Ich meine ich habe sowohl im Home-Ordner von ’seafile‘, als auch von ‚pi‘ nachgesehen.
        Ich denke wenn du die Befehlszeile einfach in „sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048“ abänderst wäre gut. Ist ein Befehl weniger und funktioniert auf jeden Fall.

        Ansonsten möchte ich hier auch gerne noch mitteilen, dass ich deine Anleitung super finde. Für meine Bedürfnisse (Raspi, Seafile, SSL) und meine Kenntnisse (Linux-Newbie) genau richtig. Danke dafür!

  3. Frederic schreibt:

    Nach einem Update auf die aktuelle Seafile-Version (6.2.3 auf 6.3.2) erhalte ich folgende Fehlermeldung beim Login:

    Verboten (403)
    CSRF-Verifizierung fehlgeschlagen. Anfrage abgebrochen.

    Woran kann das liegen? Wie kann ich das beheben?
    Danke im Voraus!

  4. Dr.-Ing. Jörg Söhner schreibt:

    kann mir denn jemand sagen, wie ich mit dem MariaDB-Problem unter dem neuesten Stretch umgehe, wenn ich seafile mit Mysql installieren möchte. Er akzeptiert einfach das root-Passwort nicht 🙁

    DANKE und LG, Jörg

  5. Dr.-Ing. Jörg Söhner schreibt:

    uff, jetzt bin ich die komplette Installationsanleitung mit einigen Stolpersteinen durch und war voller Erwartung, dass es klappt (zwischendurch mal mysql installiert, dabei wure apache installiert – den wieder deinstalliert und und und) und nun kommt beim Aufruf meine Domain nachwievor die Begrüßungsseite von nginx.

    Hat jemand einen Tipp für mich, was ich da machen kann und wo ich nachschauen müsste? Ich weiss, es gibt viele Fehlerquellen 😉

    Danke und LG, Jörg

    1. Dr.-Ing. Jörg Söhner schreibt:

      wenn ich übrigens in den Browser den Port mit angebe:
      soehner-cloud.ddns.net:8000
      dann erscheit seafile, aber ohne und mit https:// kommt nginx, also muss es wohl irgendwo an der nginx Konfiguration liegen?

      LG, Jörg

        1. Dr.-Ing. Jörg Söhner schreibt:

          für alle die Kollegen, die mit einem ähnlichen Problem kämpfen, ich konnte den Fehler beheben.
          Es gab eine Kollision in der nginx-Konfiguration, dadurch, dass es noch die Datei default gab und diese in /etc/nginx/site-enabled verfügbar war.

          Man muss die location für radicale in die neue seahub Definition übertragen und dann nur noch die seahub Datei in /etc/nginx/site-enabled belassen.

          nach einem Restart des nginx kann man mit „sudo nginx -t“ die Konfiguration testen. Die zuvor erscheinenden Warnings sind dann mit samt dem Fehler verschwunden. Ab jetzt funzt alles wunderbar 🙂

  6. Pi.RAT schreibt:

    Hallöchen,
    da bin ich endlich auf Seite 3 der Anleitung angekommen und konnte ein paar Klipppen umschiffen und stelle nun fest, dass weder „openssl dhparam 4096“
    noch „sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096“
    den gewünschten Erfolg beschert.
    Ich kann ums Verrecken keine erzeugte Datei ausfindig machen, die ich z.B. mit „cat dhparam.pem“ anzeigen lassen könnte.
    Weder im Verzeichnis durch „ls“ oder Suchbefehle wie „find / -iname „dhparam.*“.
    Bin als normaler user angemeldet, nachdem ich user seafile ge-exited habe.
    Hat jemand eine Idee, wie man dem abhelfen könnte?
    Bekommt dem Pi die 4096bit nicht so gut? Besser 2048?
    Braucht es zur Berechnung evtl. Internet? Das habe ich nämlich rausgezogen bis die Kiste sicher läuft…

    Danke Pi.RAT

  7. Pi.RAT schreibt:

    Also mit eingestecktem Internet braucht es ca. 5 Minuten bei 2048 bit zur Berechnung.
    Ohne Internet ca. 30 min.
    Der Grund dafür, dass keine Datei geschrieben wurde, lag wohl daran, dass ich per Putty/SSH angemeldet war und nach Absenden des Befehls den Netzwerkstecker am Pi zog. Hab jetzt nen Monitor und ne Tastatur dran und die Datei wird auch auch erzeugt.
    Zumindest bei 2048. 4096 rechnet grad noch.
    Man, man, man…

  8. Pi.RAT schreibt:

    Hallo,
    da die Dienste (seafile+seahub) nach anlegen lt. Anleitung nicht mitstarten, habe ich noch folgendes gemacht:

    sudo nano /etc/rc.local
    —>folgende Befehle eingetragen:
    sudo /etc/init.d/nginx start
    su seafile -c ‚/home/seafile/seafile/seafile-server-latest/seafile.sh start‘
    su seafile -c ‚/home/seafile/seafile/seafile-server-latest/seahub.sh start-fastcgi‘

    su seafile -c /etc/systemd/system/seafile.service
    su seafile -c /etc/systemd/system/seahub.service

    mit
    sudo systemctl status seafile.service
    und
    sudo systemctl status seahub.service
    wird aber immer noch eine Fehlermeldung ausgegeben. Die Dienst scheinen nicht mit einem reboot mitgestartet zu werden.
    Woran kann das liegen? Fehl etwa irgendeine Berechtigung?
    Des Weiteren ist die nginx startseite und radicale ausschließlich über https erreichbar.
    Seafile jedoch nur über http. Liegt das evtl. am nicht gestarteten Dienst?

Schreibe einen Kommentar zu Marc Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert