Seafile 12 installation with docker and traefik is easy, Collabora integreation very problematic

Hello friends

I gave seafile another chance and found a very good tutorial to install seafile with docker and traefik https://goneuland.de/seafile-server-mit-docker-compose-und-traefik-installieren/. The installation with the code below is done within 5 minutes.

Now I have trouble with the integration of collabora. A similar topic doesn´t help me.

If I click e.g. on an odt-file, I got

Bildschirmfoto 2025-07-22 um 20.26.06
Domain Details Page - no api or wopi in the url (chatgpt said it should be in the url).

I tried with chatgpt (I hate its positivity, which doesn´t help at all …)

I have no idea where to search for the error …

Thank you all very much!!!

My installation routine

mkdir seafile
cat <<'EOF' > ~/seafile/docker-compose.yml
services:
  seafile-mysql:
    image: ${SEAFILE_DB_IMAGE}
    container_name: seafile-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD}
      - MYSQL_LOG_CONSOLE=true
      - MARIADB_AUTO_UPGRADE=1
    volumes:
      - ./seafile-mysql:/var/lib/mysql
    networks:
      - seafile_net
    healthcheck:
      test:
        [
          "CMD",
          "/usr/local/bin/healthcheck.sh",
          "--connect",
          "--mariadbupgrade",
          "--innodb_initialized",
        ]
      interval: 20s
      start_period: 30s
      timeout: 5s
      retries: 10

  seafile-memcached:
    image: ${SEAFILE_MEMCACHED_IMAGE}
    container_name: seafile-memcached
    entrypoint: memcached -m 256
    networks:
      - seafile_net

  seafile-elasticsearch:
    image: ${SEAFILE_ELASTICSEARCH_IMAGE}
    container_name: seafile-elasticsearch
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
      - "xpack.security.enabled=false"
    volumes:
      - ./seafile-elasticsearch/data:/usr/share/elasticsearch/data
    networks:
      - seafile_net
    ulimits:
      memlock:
        soft: -1
        hard: -1
    mem_limit: 4g

  seafile:
    image: ${SEAFILE_IMAGE}
    container_name: seafile
    volumes:
      - ./seafile-data:/shared
#      - ./seafile-data/seafile/conf/seahub_settings.py:/shared/seafile/conf/seahub_settings.py
    environment:
      - DB_HOST=${SEAFILE_MYSQL_DB_HOST}
      - DB_PORT=${SEAFILE_MYSQL_DB_PORT}
      - DB_USER=${SEAFILE_MYSQL_DB_USER}
      - DB_ROOT_PASSWD=${INIT_SEAFILE_MYSQL_ROOT_PASSWORD}
      - DB_PASSWORD=${SEAFILE_MYSQL_DB_PASSWORD}
      - SEAFILE_MYSQL_DB_CCNET_DB_NAME=${SEAFILE_MYSQL_DB_CCNET_DB_NAME}
      - SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME}
      - SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME}
      - TIME_ZONE=${TIME_ZONE}
      - INIT_SEAFILE_ADMIN_EMAIL=${INIT_SEAFILE_ADMIN_EMAIL}
      - INIT_SEAFILE_ADMIN_PASSWORD=${INIT_SEAFILE_ADMIN_PASSWORD}
      - SEAFILE_SERVER_HOSTNAME=${SEAFILE_SERVER_HOSTNAME}
      - SEAFILE_SERVER_PROTOCOL=${SEAFILE_SERVER_PROTOCOL}
      - SITE_ROOT=${SITE_ROOT}
      - NON_ROOT=${NON_ROOT}
      - JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY}
      - SEAFILE_LOG_TO_STDOUT=${SEAFILE_LOG_TO_STDOUT}
    depends_on:
      - seafile-mysql
      - seafile-memcached
      - seafile-elasticsearch
    networks:
      - seafile_net
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.seafile.rule=Host(`${SEAFILE_SERVER_HOSTNAME}`)"
      - "traefik.http.routers.seafile.entrypoints=websecure"
      - "traefik.http.routers.seafile.tls=true"
      - "traefik.http.routers.seafile.tls.certresolver=http_resolver"
      - "traefik.http.services.seafile.loadbalancer.server.port=80"
      - "traefik.docker.network=proxy"
networks:
  seafile_net:
    driver: bridge
  proxy:
    external: true
EOF

.env-file

cat <<'EOF' > ~/seafile/.env
### Seafile admin user
INIT_SEAFILE_ADMIN_EMAIL=x@gmail.com
INIT_SEAFILE_ADMIN_PASSWORD=x

SEAFILE_SERVER_HOSTNAME=seafile.x.de

## Images
SEAFILE_IMAGE=seafileltd/seafile-mc:12.0-latest
SEAFILE_DB_IMAGE=mariadb:10.11
SEAFILE_MEMCACHED_IMAGE=memcached:1.6.29
SEAFILE_ELASTICSEARCH_IMAGE=elasticsearch:8.15.0

## Database
SEAFILE_MYSQL_DB_HOST=seafile-mysql
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_PASSWORD=x
SEAFILE_MYSQL_DB_PORT=3306
SEAFILE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=seahub_db

## Scheme
SEAFILE_SERVER_PROTOCOL=https
SITE_ROOT=/
NON_ROOT=false
SEAFILE_LOG_TO_STDOUT=false

## Startup parameters
TIME_ZONE=Europe/Berlin
JWT_PRIVATE_KEY=x

### Database root password
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=x

# Collabora Einstellungen
COLLABORA_IMAGE=collabora/code:24.04.5.1.1
COLLABORA_PORT=6232
COLLABORA_USERNAME=admin
COLLABORA_PASSWORD=x
COLLABORA_ENABLE_ADMIN_CONSOLE=true
COLLABORA_REMOTE_FONT=
COLLABORA_ENABLE_FILE_LOGGING=false
EOF
docker compose -f ~/seafile/docker-compose.yml down && docker compose -f ~/seafile/docker-compose.yml up -d

Collabora docker-compose

mkdir collabora
cat <<'EOF' > ~/collabora/docker-compose.yml
services:
  collabora:
    image: collabora/code
    container_name: collabora_app
    networks:
      - proxy
#      - seafile_net
    cap_add:
      - MKNOD
    environment:
      - aliasgroup1=https://seafile.x.de
      - username=admin
      - password=x
      - dictionaries=de_DE en_GB en_US es_ES
#      - extra_params=--o:ssl.enable=false --o:ssl.termination=true --o:wopi.allow_hosts=seafile.x.de
      - "extra_params=--o:ssl.enable=false --o:ssl.termination=true"
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.collabora.entrypoints=websecure"
      - "traefik.http.routers.collabora.rule=(Host(`collabora.x.de`))"
#      - "traefik.http.routers.collabora.rule=Host(`collabora.x.de`) && (PathPrefix(`/hosting/discovery`) || PathPrefix(`/lool`) || PathPrefix(`/loleaflet`) || PathPrefix(`/browser`) || PathPrefix(`/cool`))"
      - "traefik.http.routers.collabora.tls=true"
      - "traefik.http.routers.collabora.tls.certresolver=http_resolver"
      - "traefik.http.routers.collabora.service=collabora"
      - "traefik.http.services.collabora.loadbalancer.server.port=9980"
      - "traefik.docker.network=proxy"
networks:
  proxy:
    external: true
#  seafile_net:
#    external: true
EOF
docker compose -f ~/collabora/docker-compose.yml up -d && docker compose -f ~/seafile/docker-compose.yml down && docker compose -f ~/seafile/docker-compose.yml up -d && docker restart seafile

seahub_settings.py

sudo nano ~/seafile/seafile-data/seafile/conf/seahub_settings.py 
## ganz unten folgendes eingeben:
# Collabora Integration
OFFICE_SERVER_TYPE = 'CollaboraOffice'
ENABLE_OFFICE_WEB_APP = True
OFFICE_WEB_APP_BASE_URL = 'http://collabora:9980/hosting/discovery'
#OFFICE_WEB_APP_BASE_URL = 'http://collabora.x.de/hosting/discovery'
WOPI_ACCESS_TOKEN_EXPIRATION = 30 * 60   # seconds
OFFICE_WEB_APP_FILE_EXTENSION = ('odp', 'ods', 'odt', 'xls', 'xlsb', 'xlsm', 'xlsx','ppsx', 'ppt', 'pptm', 'pptx', 'doc', 'docm', 'docx')
ENABLE_OFFICE_WEB_APP_EDIT = True
OFFICE_WEB_APP_EDIT_FILE_EXTENSION = ('odp', 'ods', 'odt', 'xls', 'xlsb', 'xlsm', 'xlsx','ppsx', 'ppt', 'pptm', 'pptx', 'doc', 'docm', 'docx')

If something is going wrong

## LÖSCHEN
docker ps -a --filter "name=seafile" --format "{{.ID}}" | xargs -r docker stop
docker ps -a --filter "name=collabora" --format "{{.ID}}" | xargs -r docker stop
docker ps -a --filter "name=seafile" --format "{{.ID}}" | xargs -r docker rm
docker ps -a --filter "name=collabora" --format "{{.ID}}" | xargs -r docker rm
docker images --filter=reference="*seafile*" --format "{{.ID}}" | xargs -r docker rmi -f
docker images --filter=reference="*collabora*" --format "{{.ID}}" | xargs -r docker rmi -f
docker volume ls --filter name=seafile --format "{{.Name}}" | xargs -r docker volume rm
docker volume ls --filter name=collabora --format "{{.Name}}" | xargs -r docker volume rm
docker network ls --filter name=seafile --format "{{.Name}}" | xargs -r docker network rm
docker network ls --filter name=collabora --format "{{.Name}}" | xargs -r docker network rm
docker rmi -f $(docker images --filter=reference='collabora/*' --quiet)
docker rmi -f $(docker images --filter=reference='seafileltd/*' --quiet)
sudo rm -rf ~/seafile
sudo rm -rf ~/collabora

# Kontrolle
docker ps -a | grep -iE 'seafile|collabora'
docker images | grep -iE 'seafile|collabora'
docker volume ls | grep -iE 'seafile|collabora'
docker network ls | grep -iE 'seafile|collabora'
ls -ld ~/seafile ~/collabora
1 Like

I’m not familiar with traefik.

From my understanding of your installation process, you put Seafile and Collabora into different docker network. In this way, Seafile cannot connect Collabora by the URL in your settings:

OFFICE_WEB_APP_BASE_URL = 'http://collabora:9980/hosting/discovery'

You can try to change OFFICE_WEB_APP_BASE_URL to the external reachable URL of your collabora instance, like

OFFICE_WEB_APP_BASE_URL='https://your-domain/collabora/hosting/discovery'