Mise en place de Seafile Community + OnlyOffice

Prérequis : 

 

 Avoir une base de donnée  MariaDB  déployé en local

 

 Voir déploiement MariaDB 

 

 

 Avoir un nom de domaine

 

 Dans notre cas le nom de domaine utilisé est :  miraceti.net 

 

 

 

 

 Il existe plusieurs manière de mettre en place  Seafile Docker. Dans notre cas nous allons utiliser une base de données MySQL déjà déployé avec Docker car nous allons utiliser la version community de Seafile. 

 Configuration nom de domaine 

 Grâce à notre nom de domaine, nous allons pouvoir créer des sous domaine (en CNAME  A ). 

 Sur le site de nom de domaine respectif, dans la section DNS, ajouter l'entrée suivante :  

 

 drive.miraceti.net      A       ip.adress.server

 

 Sera utilisé pour redirigé sur l'interface Web de Seafile 

 

 

 office.miraceti.net      A       ip.adress.server

 

 Sera utilisé pour éditer les documents avec onlyoffice 

 

 

 

 

 Configuration Docker Compose 

 Pour accéder à notre base de données externe, nous devons importer le  network 

lié à la base de donnée (dans notre cas le network est " bddnetwork ").  

 Fichier  docker-compose.yaml :  

 services:

 

 # Service de cache pour Seafile

 memcached:

 image: memcached:1.6

 container_name: seafile-memcached

 restart: unless-stopped

 networks:

 - seafile-net

 entrypoint: memcached -m 256

 seafile:

 image: seafileltd/seafile-mc:latest

 container_name: seafile

 restart: unless-stopped

 depends_on:

 - memcached

 ports:

 - "8082:80" # Port HTTP Seafile (interface web)

 - "8083:8080" # Port WebDAV (SeafDAV)

 environment:

 DB_HOST: mariadb

 DB_ROOT_PASSWD: myRootPasswordMariaDB

 SEAFILE_SERVER_LETSENCRYPT: "false"

 SEAFILE_SERVER_HOSTNAME: drive.miraceti.net

 TIME_ZONE: Europe/Paris

 MEMCACHED_HOST: seafile-memcached # Nom du conteneur de cache

 volumes:

 - /my/path/to/seafile/data:/shared # Emplacement des conf + data

 networks:

 - bddnetwork

 - seafile-net

 onlyoffice:

 image: onlyoffice/documentserver:latest

 container_name: onlyoffice

 restart: unless-stopped

 depends_on:

 - seafile

 ports:

 - "8081:80"

 environment:

 - JWT_ENABLED=true

 - JWT_SECRET=MyJwtTokenSecretGenerateByOnlyOffice

 - JWT_HEADER=Authorization

 volumes:

 - /my/path/to/onlyoffice/data:/var/www/onlyoffice/Data

 - /my/path/to/onlyoffice/logs:/var/log/onlyoffice

 networks:

 - seafile-net

networks:

 seafile-net: # Réseau interne de seafile

 bddnetwork:

 external: true 

 Le mot de passe DB_ROOT_PASSWD est nécessaire seulement la première fois pour initialiser les bases de données et créer l'utilisateur. 

 Démarrage de seafile 

 Nous allons démarrer seulement le service seafile du docker compose pour initialiser la base de donnée et générer les fichiers de configuration.  

 docker compose up -d seafile 

 Les logs doivent ressembler à :  

 ocker compose logs seafile

seafile | *** Running /etc/my_init.d/01_create_data_links.sh...

seafile | *** Booting runit daemon...

seafile | *** Runit started as PID 21

seafile | *** Running /scripts/enterpoint.sh...

seafile | 2025-10-09 16:48:48 Nginx ready 

seafile | 2025-10-09 16:48:48 This is an idle script (infinite loop) to keep container running. 

seafile | [2025-10-09 16:48:48] Skip running setup-seafile-mysql.py because there is existing seafile-data folder.

seafile | [10/09/2025 16:48:48][upgrade]: The container was recreated, start fix the media symlinks

seafile | [10/09/2025 16:48:48][upgrade]: Done

seafile | 

seafile | Starting seafile server, please wait ...

seafile | Seafile server started

seafile | 

seafile | Done.

seafile | 

seafile | Starting seahub at port 8000 ...

seafile | 

seafile | Seahub is started

seafile | 

seafile | Done.

seafile | 

 Pour retrouver le mot de passe créé par l'initialisation des bases de données Seafile , il faut se rendre dans le fichier de configuration seafile.conf (voir ci-dessous) 

 Si les logs ne commence pas de cette manière, cela signifie que l'image seafile n'a pas démarré correctement, peut être du à la connexion à la base de donnée.  

 Maintenant nous pouvons éteindre le service ( docker compose stop ) pour passer à l'édition des fichiers de configurations.  

 Edition des fichier de configuration Seafile 

 seafile.conf 

 Editer le fichier se trouvant au chemin /my/path/to/seafile/data/seafile/conf/seafile.conf pour y mettre la configuration suivante :  

 [fileserver]

port = 8082

[database]

type = mysql

host = mariadb

port = 3306

user = seafile

password = 123456789-b891-4071-8cf5-123456789

db_name = seafile_db

connection_charset = utf8

[notification]

enabled = false

host = 127.0.0.1

port = 8083

log_level = info

jwt_private_key = ***************** 

 seahub_settings.py 

 Editer le fichier se trouvant au chemin /my/path/to/seafile/data/seafile/conf/seahub_settings.py pour y mettre la configuration suivante : 

 # -*- coding: utf-8 -*-

SECRET_KEY = "l*********************************@u#"

SERVICE_URL = "https://drive.miraceti.net"

DATABASES = {

 'default': {

 'ENGINE': 'django.db.backends.mysql',

 'NAME': 'seahub_db',

 'USER': 'seafile',

 'PASSWORD': '123456789-b891-4071-8cf5-123456789',

 'HOST': 'mariadb',

 'PORT': '3306',

 'OPTIONS': {'charset': 'utf8mb4'},

 }

}

CACHES = {

 'default': {

 'BACKEND': 'django_pylibmc.memcached.PyLibMCCache',

 'LOCATION': 'memcached:11211',

 },

 'locmem': {

 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

 },

}

COMPRESS_CACHE_BACKEND = 'locmem'

TIME_ZONE = 'Europe/Paris'

# Security Settings

ALLOWED_HOSTS = ['.miraceti.net']

# Whether to use a secure cookie for the CSRF cookie

CSRF_COOKIE_SECURE = True

# The value of the SameSite flag on the CSRF cookie

CSRF_COOKIE_SAMESITE = 'Strict'

CSRF_TRUSTED_ORIGINS = ['https://drive.miraceti.net', 'https://office.miraceti.net']

# OnlyOffice integration

ENABLE_ONLYOFFICE = True

VERIFY_ONLYOFFICE_CERTIFICATE = False

ONLYOFFICE_APIJS_URL = 'https://office.miraceti.net/web-apps/apps/api/documents/api.js'

ONLYOFFICE_FILE_EXTENSION = ('doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx', 'odt', 'fodt', 'odp', 'fodp', 'ods', 'fods', 'csv', 'ppsx', 'pps')

ONLYOFFICE_EDIT_FILE_EXTENSION = ('doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods')

ONLYOFFICE_JWT_SECRET = '<replace_by_your_jwt_token>'

ONLYOFFICE_JWT_HEADER = 'Authorization'

# Mail configuration

EMAIL_USE_SSL = True

EMAIL_HOST = '' # smpt server

EMAIL_HOST_USER = '' # username and domain

EMAIL_HOST_PASSWORD = '' # password

EMAIL_PORT = 526

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

SERVER_EMAIL = EMAIL_HOST_USER

# Webdav configuration

ENABLE_SEAFDAV = True

SEAFDAV_HOST = '0.0.0.0'

SEAFDAV_PORT = 8080

SEAFDAV_SSL = False

FILE_SERVER_ROOT = 'https://drive.miraceti.net/seafhttp' 

 seafdav.conf 

 Editer le fichier se trouvant au chemin /my/path/to/seafile/data/seafile/conf/seafdav.conf pour y mettre la configuration suivante : 

 [WEBDAV]

enabled = true

port = 8080

host = 0.0.0.0

workers = 5

timeout = 1200

share_name = /seafdav 

 

 Démarrer le docker compose devrait rendre Nextcloud accessible en local, ou sur l'adresse IP de votre serveur sur le réseau local, sur le port  8082 .

 

 

 Configuration Apache2 

 Création des nouveaux hosts dans /etc/apache2/sites-available avec les noms suivant cloud.miraceti.net.conf  et office.miraceti.net.conf . 

 Nous allons nous concentrer sur la partie SSL de chaque host : 

 cloud.miraceti.net-le-ssl.conf 

 <VirtualHost *:443>

 ServerName drive.miraceti.net

 ErrorLog ${APACHE_LOG_DIR}/drive.miraceti.net.log

 CustomLog ${APACHE_LOG_DIR}/drive.miraceti.net.log combined

	# Reverse Proxy Seafile (interface Web)

 ProxyPreserveHost On

 ProxyPass / http://localhost:8082/

 ProxyPassReverse / http://localhost:8082/

	# Reverse Proxy WebDav

	ProxyPass /seafdav http://localhost:8086/seafdav

	ProxyPassReverse /seafdav http://localhost:8086/seafdav

	

	# --- En-têtes nécessaires

	RequestHeader set X-Forwarded-Proto "https"

	RequestHeader set X-Forwarded-Host "drive.miraceti.net"

 # Reverse Proxy WebSocket (important pour notifications temps réel)

 ProxyPass /seafhttp ws://localhost:8082/seafhttp

 ProxyPassReverse /seafhttp ws://localhost:8082/seafhttp

	# --- CORS pour OnlyOffice et rclone

	<Location /seafdav>

		Header always set Access-Control-Allow-Origin "*"

		Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"

		Header always set Access-Control-Allow-Headers "Authorization, Content-Type"

		Header always set Access-Control-Allow-Credentials "true"

	</Location>

SSLCertificateFile /etc/letsencrypt/live/drive.miraceti.net/fullchain.pem

SSLCertificateKeyFile /etc/letsencrypt/live/drive.miraceti.net/privkey.pem

Include /etc/letsencrypt/options-ssl-apache.conf

</VirtualHost> 

 office.miraceti.net-le-ssl.conf 

 <VirtualHost *:443>

 ServerName office.miraceti.net

 ErrorLog ${APACHE_LOG_DIR}/office.miraceti.net.error.log

 CustomLog ${APACHE_LOG_DIR}/office.miraceti.net.access.log combined

 # ===== En-têtes HTTPS et Proxy =====

 RequestHeader set X-Forwarded-Proto "https"

 RequestHeader set X-Forwarded-Ssl "on"

 ProxyPreserveHost On

 ProxyRequests Off

 SSLProxyEngine on

 # ===== Gestion CORS =====

 <Location />

 Header always set Access-Control-Allow-Origin "https://drive.miraceti.net"

 Header always set Access-Control-Allow-Methods "GET, POST, PUT, OPTIONS, DELETE"

 Header always set Access-Control-Allow-Headers "Authorization, Content-Type, Accept, Origin, Referer, User-Agent"

 Header always set Access-Control-Allow-Credentials "true"

 </Location>

 # ===== Rediriger les WebSockets =====

 # (WebSocket = wss:// = port 443)

# ProxyPassMatch "^/([0-9a-zA-Z\.\-]+)/doc/[0-9a-f\-]+/c/(.*)/websocket$" "ws://127.0.0.1:8081/$1/doc/$2/websocket"

 ProxyPassMatch "^/(.*)/websocket$" "ws://127.0.0.1:8081/$1/websocket"

 # ===== Reverse Proxy classique =====

 ProxyPass / http://127.0.0.1:8081/

 ProxyPassReverse / http://127.0.0.1:8081/

 # ===== Sécurité SSL =====

 SSLEngine on

SSLCertificateFile /etc/letsencrypt/live/office.miraceti.net/fullchain.pem

SSLCertificateKeyFile /etc/letsencrypt/live/office.miraceti.net/privkey.pem

Include /etc/letsencrypt/options-ssl-apache.conf

</VirtualHost>