Seafile-Docker hinter eigenem reverse proxy betreiben

Guten Tag,

derzeit suche ich eine Alternative zu Dropbox & Co., welche selbst gehostet werden soll. Hierbei ist wichtig, dass die Lösung als Docker-Container auf einem lokalen Server genutzt und hinter einem bestehenden nginx reverse proxy betrieben werden kann. Dieser nginx übernimmt SSL Offloading etc.

Nun ist es so, dass die Docker-Container von Seafile einen eigenen nginx mitbringen und ich davon absehen möchte eigene Container zu bauen. Ich konnte jedoch keine Informationen dazu finden, ob der Betrieb eines eigenen nginx vor dem “offiziellen seafile nginx” zu Problemen führen kann.

Ein Gedanke von mir war z.B. den Docker-Container so zu starten, dass nicht die Ports 80 und 443 nach außen gereicht werden, sondern direkt die Ports 8000 usw., welche dann vom bestehenden nginx angesprochen werden.

Dadurch habe ich im Container zwar ein nginx laufen, welcher jedoch nicht genutzt wird, da ihn keine Anfragen erreichen.

Leider musste ich die Erfahrung machen, dass nicht bei jeder Software solche trivialen Dinge problemlos klappen und ich wollte einmal nachfragen, ob hierzu Erfahrungen bestehen oder gar Tipps?

Sollte sich dies nicht sauber realisieren lassen, wäre meine alternative wohl nextcloud, wobei die Software die Anforderungen nicht ganz so sauber erfüllt wie Seafile.

Ich habe für ein kleines Haus-Setup erfolgreich vor dem offiziellen Docker-Container laufen, und zwar mittels docker-compose und traefik, letzterer übernimmt dann die SSL-Anfragen und leitet sie per HTTP an den Docker-NGINX weiter. Soweit ich verstehe, ist das auch gut so, da der NGINX im Container ein einen Demultiplex des Filesync-Protokolls macht, welcher intern auf einem anderen Port im Container läuft. Wenn man also das SSL-Zeug abschaltet, nutzt man zwar immer noch einen zweiten Reverse-Proxy, allerdings nur noch für diese Aufgabe.

Meine erste Idee war auch, den internen Proxy ganz abzuschalten, das erhöht aber den Konfigurationsaufwand, da man das Multiplexing in den primären Proxy auslagern muss. Momentan ist mir der Overhead aber egal…

Hi,
könntest Du bitte den compose mal posten oder verlinken?
Bin nämlich auch gerade am selbem Problem.

1 Like

Ich hab das ganze ähnlich wie fungs laufen, nur unter Kubernetes mit traefik als Ingress. Da es nur ein kleines Setup mit <10 Usern ist stört mich der interne nginx auch nicht sonderlich. Ich weiß nicht ob das jemandem hilft, aber hier ist die spec vom Seafile Container:

spec:
  containers:
  - name: seafile
    image: seafileltd/seafile-mc:7.0.5

    ports:
    - name: http
      containerPort: 80

    env:
    - name: DB_HOST
      value: "127.0.0.1"
    - name: DB_ROOT_PASSWD
      value: <Datenbank Passwort>
    - name: TIME_ZONE
      value: Europe/Berlin
    - name: SEAFILE_SERVER_LETSENCRYPT
      value: "false"
    - name: SEAFILE_SERVER_HOSTNAME
      value: cloud.example.com

    volumeMounts:
    - name: data
      mountPath: /shared

    resources:
      requests:
        cpu: 200m
        memory: 1Gi
      limits:
        cpu: 1
        memory: 2Gi

Im Falle von Docker könnte man also einfach ein

docker run -p 8080:80 -d -e "SEAFILE_SERVER_LETSENCRYPT=false" \
-e "SEAFILE_SERVER_HOSTNAME=cloud.example.com" seafileltd/seafile-mc:7.0.5

ausführen und davor einen Reverse Proxy klemmen.

+1

Danke schonmal! :slight_smile:

Ich melde mich auch einmal zu Wort:

In zwischen habe ich das Problem selbst gelöst indem ich MySQL und Seafile unter einem Debian 10 selbst installiert habe und den vorhandenen nginx nutze um die Verbindung zu Seafile herzustellen. Jedoch kam ich letztendlich nicht um einen nginx unter Debian 10 herum, da die Media-Files leider innerhalb von Seafile liegen und der Reverse Proxy so natürlich nicht darauf zugreifen konnte. Diese Dateien von extern beim Reverse Proxy zu mounten war mir nicht so eine schöne Vorstellung.

Letztendlich bin ich jedoch mit der Lösung zufrieden und bereue es nicht mich gegen die Docker-Lösung entschieden zu haben, auch wenn ich mehr Zeit investieren musste. Ich habe mich in dem Zuge dann hingesetzt und die Installation und Konfiguration per Ansible realisiert, weswegen ich die VM jederzeit im Katastrophen-Fall wiederherstellen kann.

In der Automatisierung konnte ich dann auch direkt fail2ban, clamav, logrotate, Vorschau-Funktion, Auslagerung per NFS, Backup etc. berücksichtigen, so dass alles dokumentiert vorliegt. Hat mich ca. 3 Tage gekostet aber nun weiß ich wenigstens wie der Hase läuft und wo die Dokumentation von Seafile nicht ganz so gut ist. Hilft dabei Seafile besser einzuschätzen.

Dazu war mir letztendlich der Gedanke nicht mehr sooo geheuer einen Docker-Container, wo ich nicht das Dockerfile zu einsehen kann, bei mir zu starten. Zumindest habe ich es nicht gefunden, vielleicht habe ich es übersehen. Aber solang ich das Dockerfile dazu nicht sehe, traue ich dem Container keine 5 Meter weit. Letztendlich könnte dort alles drin stecken :wink:

Die derzeit angebotene Docker Version ist aus meiner Sicht auch alles andere als zufriedenstellend.

Dieses ist übrigens unter https://github.com/haiwen/seafile-docker verfügbar.

1 Like

Okay, das Dockerfile habe ich in dem Unterverzeichnis nicht gefunden. Das Repo hatte ich gesehen, jedoch in dem Verzeichnis “image” nicht die Dateien vermutet. Mein Fehler tatsächlich.

Tut mir leid, dass ich deine Anfrage nicht gesehen hatte: Ich poste hier mal mein Setup mittels docker-compose, für alle, die es so umsetzten wollen. Bis jetzt läuft es sehr stabil und ohne Probleme bei Versions-Updates. Diese Updates mache ich übrigens immer explizit über eine Änderung der Tags im Config. Von der Verwendung von latest als Tag würde ich in den meisten Fällen abraten.

Übrigens gehe ich einen Mittelweg und lasse Seafile via Docker in einem dedizierten LXC-Container auf meinem Server laufen. Klingt kompliziert, vereinfacht die Neuinstallation und Wartung inklusive Netzwerk-Topologie aber nochmals. Configs, Backend-Daten und MySQL-Datenbank werden zusammen auf einem dedizierten BTRFS-Subvolume außerhalb des LXC-Containers abgelegt und zusammen per Snapshot gesichert (LXC-Container vorher herunterfahren). So kann man einfache Rollbacks machen und ältere Versionsstände vorhalten. Die Langzeitsicherung erfolgt dann vom letzten Snapshot, ohne dass der laufende Betrieb beeinflusst wird.

seafile.yml:

version: "3"

services:
  db:
    image: mariadb:10.1
    container_name: seafile-mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD='FILL'  # Requested, set the root's password of MySQL service.
      - MYSQL_LOG_CONSOLE=true
    volumes:
      - /service/seafile/mysql:/var/lib/mysql  # Requested, specifies the path to MySQL data persistent store.
    networks:
      - service-seafile

  memcached:
    image: memcached:1.5.6
    container_name: seafile-memcached
    restart: unless-stopped
    entrypoint: memcached -m 256
    networks:
      - service-seafile
          
  seafile:
    image: seafileltd/seafile-mc:8.0.7

traefik.yml:

    container_name: seafile
    restart: unless-stopped
    ports:
      - "8888:80"
    volumes:
      - /service/seafile/data:/shared   # Requested, specifies the path to Seafile data persistent store.
    environment:
      - DB_HOST=db
      - DB_ROOT_PASSWD='FILL'  # Requested, the value shuold be root's password of MySQL service.
      - SEAFILE_ADMIN_EMAIL='FILL' # Specifies Seafile admin user, default is 'me@example.com'.
      - SEAFILE_ADMIN_PASSWORD='FILL'     # Specifies Seafile admin password, default is 'asecret'.
      - SEAFILE_SERVER_LETSENCRYPT=false   # Whether to use https or not.

    depends_on:
      - db
      - memcached
    networks:
      - service-seafile
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.port=8888"
      - "traefik.docker.network=docker-compose_proxy"
      - "traefik.http.routers.seafile.tls.certresolver=letsencrypt"
      - "traefik.http.routers.seafile.tls=true"
      - "traefik.http.routers.seafile.tls.options=default"
      - "traefik.http.routers.seafile.rule=Host(`FILL`)"
      - "traefik.http.routers.seafile.entrypoints=websecure"

networks:
  service-seafile:
  proxy:
    external:
      name: docker-compose_proxy

traefik.yml:

version: "3"

services:
  traefik:
    image: traefik:2.2
    container_name: traefik
    restart: unless-stopped
    command:
      # enable debug mode
      - "--log.level=DEBUG"

      # docker network config
      - "--providers.docker=true"
      - "--providers.docker.network=docker-compose_proxy"
      - "--providers.docker.exposedbydefault=false"

      # incoming connections
      - "--entrypoints.websecure.address=:443"

      # expose traefik API (port 8080)
      - "--api=true"
      
      # Let's Encrypt certificate management      
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.email=FILL"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - "/service/dockerhost/letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    networks:
      - proxy

networks:
  proxy:
    external:
      name: docker-compose_proxy