ownCloud 10 en Docker : migration de 568 Go avec rsync progressif et zéro perte de données

Published by David on






ownCloud 10 en Docker — migration {{TAILLE_DONNEES}} vers Docker Compose avec rsync progressif et reverse proxy MyVestaCP

ownCloud 10 en Docker — migration {{TAILLE_DONNEES}} avec rsync progressif

Septième étape : migrer ownCloud 10.16 ({{TAILLE_DONNEES}} de données utilisateur, PostgreSQL)
depuis une installation standalone VestaCP vers Docker Compose sur le serveur centralisé,
avec transfert progressif rsync et reverse proxy MyVestaCP.

Paramètres à personnaliser

Remplacez chaque {{VARIABLE}} par vos propres valeurs avant d’utiliser ce guide.

Variable Description Exemple
{{IP_ANCIEN}} IP du serveur source 203.0.113.10
{{IP_NOUVEAU}} IP du serveur cible 198.51.100.20
{{HOSTNAME_ANCIEN}} Hostname de l’ancien serveur ns1234567
{{HOSTNAME_NOUVEAU}} Hostname du nouveau serveur ns7654321
{{PORT_SSH}} Port SSH pour rsync 22222
{{DOMAINE_OWNCLOUD}} Domaine ownCloud owncloud.exemple.com
{{USER_VESTA_OC}} Utilisateur VestaCP (ancien serveur) myocuser
{{USER_VESTA}} Utilisateur MyVestaCP (nouveau serveur) admin
{{DB_USER}} Utilisateur et base PostgreSQL oc_user
{{DB_PASSWORD}} Mot de passe PostgreSQL S3cur3P@ss!
{{ADMIN_TEMP_PASSWORD}} Mot de passe admin temporaire TempP@ss123!
{{OC_INSTANCEID}} instanceid ownCloud abc123def456
{{OC_PASSWORDSALT}} passwordsalt ownCloud randomSaltValue123...
{{OC_SECRET}} secret ownCloud longSecretKey456...
{{SMTP_HOST}} Serveur SMTP smtp.provider.com
{{SMTP_DOMAIN}} Domaine expéditeur SMTP exemple.com
{{SMTP_PASSWORD}} Mot de passe SMTP SmtpP@ss!
{{OC_USER}} Utilisateur ownCloud (cron cleanup) mon-utilisateur
{{TAILLE_DONNEES}} Taille des données utilisateur 100 Go

Contexte

L’instance ownCloud 10.16.0 Community Edition tourne actuellement sur l’ancien serveur dédié
({{IP_ANCIEN}}, {{HOSTNAME_ANCIEN}}) géré par VestaCP, sous le chemin
/home/{{USER_VESTA_OC}}/web/{{DOMAINE_OWNCLOUD}}/public_html/.

Elle utilise PostgreSQL (pas MySQL), Redis pour le file locking,
et stocke {{TAILLE_DONNEES}} de fichiers utilisateur.
On migre vers Docker Compose sur le nouveau serveur ({{IP_NOUVEAU}}, {{HOSTNAME_NOUVEAU}}, SSH port {{PORT_SSH}}),
où tournent déjà Odoo 17, Odoo 8 et Akeneo PIM.

Architecture cible : 4 conteneurs —
owncloud/server:10.16 (port 8490),
postgres:13,
redis:7-alpine,
docker:27-cli (crons custom).
Les données utilisateur ({{TAILLE_DONNEES}}) sont en bind mount direct sur le disque
pour éviter la surcharge des volumes Docker sur HDD.

Stratégie rsync 2 passes : avec {{TAILLE_DONNEES}} de données sur HDD,
un transfert complet prend plusieurs heures. On fait un premier rsync pendant
que l’ancien serveur est encore en production
(aucune interruption de service),
puis un second rsync rapide (delta seulement) après avoir activé le mode maintenance.
Résultat : fenêtre de maintenance réduite à ~30 minutes au lieu de plusieurs heures.


1) Collecter les informations sur l’ancien serveur

Avant de commencer, on récupère les informations clés sur l’ancien serveur.

1.1 Vérifier la version PostgreSQL

La version PostgreSQL détermine quelle image Docker utiliser.
Prendre une version égale ou supérieure (ex : si le serveur a PostgreSQL 11, utiliser postgres:13).

1.2 Relever les valeurs critiques de config.php

Les trois valeurs obligatoires à préserver :

  • instanceid — identifiant unique de l’instance (utilisé par les clients de synchronisation)
  • passwordsalt — sel pour le hachage des mots de passe (sans lui, aucun utilisateur ne peut se connecter)
  • secret — clé de chiffrement pour les données sensibles

Ces trois valeurs sont irremplaçables. Si elles ne correspondent pas
entre la base de données importée et le config.php du nouveau serveur,
les utilisateurs ne pourront plus se connecter et les données chiffrées seront inaccessibles.
Notez-les précieusement.

1.3 Vérifier la taille des données et les apps marketplace

Résumé de notre installation :

  • Version : ownCloud 10.16.0 Community Edition
  • Base de données : PostgreSQL 13, base {{DB_USER}}, utilisateur {{DB_USER}} (3,8 Go)
  • Données utilisateur : {{TAILLE_DONNEES}} dans /home/{{USER_VESTA_OC}}/.../public_html/data/
  • Apps marketplace (apps-external) : files_texteditor, gallery, twofactor_totp
  • Cache : APCu (local) + Redis (file locking)
  • SMTP : {{SMTP_HOST}} port 465 (SSL)
  • Domaine : {{DOMAINE_OWNCLOUD}}

Phase 1 : Préparation (ancien serveur en production)

Toutes les étapes suivantes se font sans interrompre le service
sur l’ancien serveur.

2) Créer le domaine dans MyVestaCP

  1. Se connecter à MyVestaCP sur https://{{IP_NOUVEAU}}:8083
  2. Aller dans WEBAdd Web Domain
  3. Domaine : {{DOMAINE_OWNCLOUD}}
  4. Cocher DNS Support
  5. Ne pas cocher « Enable SSL » pour l’instant

DNS Support doit être coché même si le DNS est géré ailleurs (OVH, Cloudflare, etc.).
Sans cette case, MyVestaCP ne crée pas la zone DNS locale et le template Nginx
ne résout pas correctement le domaine en interne.

3) Créer les templates Nginx

On crée deux templates pour que MyVestaCP route le trafic vers le conteneur ownCloud
sur le port 8490. Pas de WebSocket ni de longpolling — juste du proxy HTTP classique.

3.1 Template HTTP

Contenu :

3.2 Template HTTPS

Contenu :

Points importants :

  • client_max_body_size 16G — ownCloud supporte l’upload de gros fichiers via chunking,
    mais la limite Nginx doit être suffisamment haute pour ne pas bloquer les chunks
  • proxy_buffering off et proxy_request_buffering off — empêchent Nginx
    de mettre en cache les uploads sur le disque (critique sur HDD pour éviter la double écriture)
  • proxy_read_timeout 600s — les opérations sur de gros fichiers peuvent prendre du temps

3.3 Appliquer le template

Dans MyVestaCP → WEB → cliquer sur {{DOMAINE_OWNCLOUD}}
Edit → champ Nginx Template
sélectionner owncloud-8490Save.

3.4 Vérifier les ports générés dans la config Nginx

Après avoir appliqué le template, MyVestaCP génère les fichiers de configuration
Nginx réels. Vérifier impérativement les ports :

Les fichiers doivent contenir listen {{IP_NOUVEAU}}:80 (HTTP)
et listen {{IP_NOUVEAU}}:443 ssl (HTTPS).

Piège fréquent : ports 8080/8443 au lieu de 80/443.
MyVestaCP utilise les variables %web_port% et %web_ssl_port%
dans les templates. Sur certaines configurations, ces variables résolvent vers
8080 et 8443 — qui sont les ports du backend Apache,
pas du frontend Nginx. Si Nginx tente d’écouter sur 8080/8443, il échoue avec
bind() failed (98: Address already in use) car Apache occupe déjà ces ports.

Correction : si les fichiers contiennent 8080 ou 8443, les corriger :

4) Créer la structure des répertoires Docker

Docker Compose v2 : si Docker Compose v2 est déjà installé (vérifier avec
docker compose version), pas besoin de le réinstaller.

5) Créer les fichiers de configuration

5.1 Fichier docker-compose.yml

Contenu :

Points clés :

  • owncloud/server:10.16 — image officielle ownCloud (Ubuntu, Apache + PHP intégrés, port 8080)
  • postgres:13 — on garde PostgreSQL comme sur l’ancien serveur
    (convertir de PostgreSQL vers MariaDB serait risqué et inutile)
  • redis:7-alpine — pour le file locking et le cache (comme sur l’ancien serveur)
  • docker:27-cli — conteneur léger (Alpine avec client Docker) pour exécuter les crons custom
    (versions:cleanup, files:scan) en appelant docker exec sur le conteneur ownCloud
  • ./data:/mnt/databind mount pour les {{TAILLE_DONNEES}} de données
    (même performance I/O qu’un accès natif, pas de surcharge Docker sur HDD)
  • OWNCLOUD_SKIP_CHOWN: "true" et OWNCLOUD_SKIP_CHMOD: "true"
    critique, sans cela le conteneur exécute un chown -R récursif
    sur les {{TAILLE_DONNEES}} à chaque démarrage, ce qui prendrait des heures sur HDD
  • start_period: 600s — 10 minutes de grâce pour le healthcheck
    (le premier démarrage après migration peut être long)

OWNCLOUD_ADMIN_USERNAME / OWNCLOUD_ADMIN_PASSWORD :
ces valeurs ne sont utilisées que lors de la première initialisation (installation vierge).
Après l’import de la base de données, ce sont les comptes de l’ancienne base qui s’appliquent.
On met des valeurs temporaires ici car elles seront ignorées.

OWNCLOUD_SKIP_CHOWN : en activant cette option, on prend la responsabilité
de gérer les permissions nous-mêmes. Tous les fichiers dans /mnt/data doivent appartenir
à www-data (UID 33, GID 33).
L’image owncloud/server est basée sur Ubuntu — le UID 33 correspond à www-data.

5.2 Fichier crontab pour les crons custom

Créer un fichier de crontab pour les tâches de maintenance custom ownCloud
(nettoyage des anciennes versions, scan de fichiers). Ces crons s’exécutent dans
le conteneur owncloud-cron et appellent le conteneur principal via docker exec.

Contenu :

Cron system:cron déjà intégré :
l’image owncloud/server:10.16 inclut un cron interne qui exécute
occ system:cron toutes les 15 minutes (tâches de fond, nettoyage de sessions, etc.).
Pas besoin de l’ajouter ici — seuls les crons custom spécifiques doivent être définis.

Ligne vide obligatoire à la fin : le crond de BusyBox (Alpine Linux)
exige que le fichier crontab se termine par une ligne vide. Sans cela, la dernière
entrée cron n’est pas prise en compte. Vérifiez qu’il y a bien une ligne vide après
la dernière ligne de cron.

6) Lancer le rsync initial (en arrière-plan)

Cette étape est la plus longue (plusieurs heures pour {{TAILLE_DONNEES}}).
On la lance pendant que l’ancien serveur est encore en production
les utilisateurs continuent à travailler normalement.

6.1 Préparer l’accès SSH

Depuis le nouveau serveur, vérifier qu’on peut se connecter à l’ancien sans mot de passe :

6.2 Lancer le premier rsync

Depuis le nouveau serveur :

Le flag -t est critique : il préserve les timestamps
des fichiers. Sans ce flag, tous les fichiers auront la date du transfert, et les clients
de synchronisation ownCloud considéreront que chaque fichier a été modifié,
déclenchant un re-téléchargement complet des {{TAILLE_DONNEES}} sur tous les postes clients.

Estimation de durée : entre serveurs OVH (réseau interne ~1 Gbps),
{{TAILLE_DONNEES}} prennent environ 1h30 à 3h.
La vitesse réelle dépend des HDD (lectures aléatoires sur beaucoup de petits fichiers = plus lent).
Pour suivre la progression, rattacher le screen.

6.3 Transférer les apps marketplace

Le répertoire apps-external/ contient 3 apps marketplace :
files_texteditor, gallery et twofactor_totp.
Les transférer :

Mapping des répertoires : sur l’ancien serveur, les apps marketplace sont dans
apps-external/. Dans le conteneur Docker, elles vont dans /mnt/data/apps/
(bind mounté vers /home/docker/owncloud/data/apps/ sur l’hôte).
Les apps core (apps/) sont déjà incluses dans l’image Docker.


Phase 2 : Basculement (fenêtre de maintenance)

À partir d’ici, le service ownCloud est interrompu sur l’ancien serveur.
Objectif : terminer en ~30 minutes.

7) Activer le mode maintenance sur l’ancien serveur

Quel utilisateur pour occ ?
Sur VestaCP, chaque domaine a son propre utilisateur système. Ici c’est {{USER_VESTA_OC}}
(propriétaire des fichiers). Si la commande échoue avec Permission denied,
essayer avec sudo -u www-data à la place.

Vérifier :

Doit afficher : Maintenance mode is enabled.

Attendre 5 minutes après l’activation pour que les clients de synchronisation
détectent le mode maintenance et arrêtent les uploads. Sinon, des fichiers pourraient
être modifiés entre le dump de la base et le rsync final, créant des incohérences.

8) Exporter la base PostgreSQL

Vérifier la taille du dump :

--no-owner --no-acl : ces flags suppriment les commandes
ALTER OWNER et GRANT/REVOKE du dump. Cela évite les warnings
liés au fait que l’ancien rôle PostgreSQL (créé par VestaCP) n’existe pas dans le conteneur Docker.
Toutes les tables seront créées sous le rôle {{DB_USER}} défini dans le docker-compose.

9) Rsync final + transfert du dump

Depuis le nouveau serveur, on lance le rsync final qui ne transfère
que les fichiers modifiés depuis le premier rsync (delta) :

--delete : supprime sur le nouveau serveur les fichiers qui ont été
supprimés sur l’ancien entre le premier et le second rsync.
Cela garantit une copie exacte.

10) Démarrer PostgreSQL et importer la base

10.1 Démarrer uniquement PostgreSQL et Redis

Attendre que PostgreSQL soit prêt :

Attendre le message database system is ready to accept connections, puis Ctrl+C.

10.2 Importer le dump

Le flag -T désactive l’allocation de pseudo-TTY,
nécessaire pour la redirection stdin (<) vers le conteneur.

Doublons possibles : si le conteneur PostgreSQL a déjà créé des tables vides
pour la base {{DB_USER}}, le dump peut échouer avec relation already exists.
Dans ce cas, vider d'abord la base :

10.3 Vérifier l'import

11) Corriger les permissions du volume de données

Les fichiers transférés par rsync appartiennent à root (ou à l'ancien utilisateur {{USER_VESTA_OC}}).
Le conteneur Docker s'exécute en tant que www-data (UID 33).

Cette commande prend du temps sur {{TAILLE_DONNEES}} de fichiers (10-30 minutes sur HDD).
C'est précisément pour éviter que le conteneur fasse ce chown à chaque démarrage
qu'on a activé OWNCLOUD_SKIP_CHOWN=true.
On le fait une seule fois ici, manuellement.

Vérifier que .ocdata existe : ce fichier marqueur doit être présent
dans le répertoire des données pour qu'ownCloud le reconnaisse comme un datadirectory valide.

S'il n'existe pas :

11.1 Pré-configurer les valeurs critiques de migration

Cette étape est obligatoire AVANT le premier démarrage.
L'entrypoint du conteneur génère un nouveau instanceid,
passwordsalt et secret. Mais la base de données importée
contient des mots de passe hachés avec l'ancien passwordsalt
et des données chiffrées avec l'ancien secret.
Si les valeurs ne correspondent pas, aucun utilisateur ne pourra se connecter.

On crée un fichier de configuration supplémentaire que ownCloud charge
après le config.php généré par l'entrypoint,
écrasant les valeurs générées par les bonnes :

Vérification importante : après création, vérifiez que le tag PHP
est correct avec hexdump -C /home/docker/owncloud/data/config/migration.config.php | head -1.
La ligne doit commencer par 3c 3f 70 68 70 ().
Si vous voyez 26 6c 74 3b 3f 70 68 70, c'est que le fichier contient
l'entité HTML < au lieu du caractère <
il faut le recréer en copiant depuis la page rendue du navigateur, pas depuis le code source HTML.

Pourquoi un fichier séparé et pas éditer config.php directement ?
Parce que l'entrypoint du conteneur régénère config.php
à chaque démarrage via gomplate (templates + variables d'environnement).
Les fichiers *.config.php dans le même répertoire sont chargés par ordre
alphabétique après config.php et écrasent ses valeurs.
migration.config.php (m > c) sera donc toujours chargé en dernier.

12) Premier démarrage ownCloud

Surveiller les logs :

Le premier démarrage prend quelques minutes. L'entrypoint du conteneur :

  1. Génère config.php à partir des variables d'environnement
  2. Détecte la base existante (importée en étape 10)
  3. Configure Redis et les paramètres système

Attendre que les conteneurs soient healthy :

Les 4 conteneurs doivent être Up : owncloud-server, owncloud-db, owncloud-redis, owncloud-cron.

12.1 Corriger les permissions du répertoire de sessions PHP

Le conteneur crée le répertoire /mnt/data/sessions au premier démarrage,
mais il peut être créé avec root:root comme propriétaire.
PHP (qui tourne en tant que www-data) ne peut alors pas y écrire de fichiers de session,
ce qui provoque une erreur 500 sur toutes les pages
(SessionNotAvailableException).

Vérification rapide : tester avec curl -s http://127.0.0.1:8490/status.php.
Si la réponse est vide (Content-Length: 0) avec un code 500, c'est très probablement
ce problème de permissions sur le répertoire de sessions.
Après correction, la réponse doit être un JSON :
{"installed":true,"maintenance":false,...}.

12.2 Désactiver l'app files_antivirus

Si l'ancien serveur utilisait l'app files_antivirus (ClamAV),
elle est toujours activée dans la base de données importée.
En Docker, le socket ClamAV n'est pas disponible, ce qui génère des erreurs
en continu dans les logs :
Failed to connect to "/var/run/clamav/clamd.ctl".

Autres apps à vérifier : toute app qui dépend d'un service
système local (antivirus, LDAP, etc.) devra être désactivée ou reconfigurée
pour fonctionner dans l'environnement Docker.

13) Compléter la configuration

Les valeurs critiques (instanceid, passwordsalt, secret)
sont déjà en place grâce au fichier migration.config.php créé à l'étape 11.1.
Il reste à configurer le SMTP, la rétention et vérifier le tout.

13.1 Restaurer la configuration SMTP

Mot de passe SMTP : la valeur ci-dessus provient directement de l'ancien config.php.

13.2 Restaurer les paramètres de rétention

13.3 Ajouter le nouveau serveur aux domaines de confiance

Permet l'accès via l'IP directe pendant les tests (avant la bascule DNS).
Le domaine {{DOMAINE_OWNCLOUD}} est déjà configuré via la variable
OWNCLOUD_TRUSTED_DOMAINS.

13.4 Activer le cron en arrière-plan

Cron intégré : l'image owncloud/server:10.16 inclut un cron interne
qui exécute occ system:cron toutes les 15 minutes (tâches de fond, nettoyage de sessions, etc.).
Les crons custom spécifiques (versions:cleanup, files:scan) sont gérés par le conteneur
owncloud-cron séparé (voir section 5.2).

Vérifier que le conteneur cron est actif :

Le conteneur owncloud-cron doit être Up et les logs doivent montrer
crond: crond (busybox 1.x.x) started, log level 8.

13.5 Vérifier la configuration complète

Vérifier que :

  • instanceid retourne {{OC_INSTANCEID}}
  • memcache.locking retourne \OC\Memcache\Redis
  • redis host retourne redis
  • Les apps files_texteditor, gallery et twofactor_totp apparaissent dans la liste

14) Lancer l'upgrade et le scan de fichiers

14.1 Activer le mode maintenance

14.2 Exécuter l'upgrade

Si la version de la base correspond déjà à la version de l'image (10.16.0),
cette commande répondra ownCloud is already latest version. C'est normal.

14.3 Réparer la base de données

Cette commande répare les partages cassés, les entrées orphelines dans le cache de fichiers,
les index manquants et les incohérences d'apps. Indispensable après une migration.

14.4 Corriger les chemins utilisateur dans la base

La base de données importée contient les chemins absolus de l'ancien serveur
dans la table oc_accounts. Chaque utilisateur a un champ home
qui pointe encore vers /home/{{USER_VESTA_OC}}/web/.../public_html/data/
au lieu de /mnt/data/files/ (le datadirectory Docker).
Sans cette correction, files:scan échouera avec
« Home storage for user X not writable » pour tous les utilisateurs migrés.

Pourquoi cette étape est nécessaire :
ownCloud stocke le chemin absolu du répertoire personnel de chaque utilisateur
dans la colonne home de oc_accounts. Lors d'une migration,
le datadirectory dans config.php est bien mis à jour
(via la variable d'environnement Docker), mais la base de données conserve
les anciens chemins. Le storage résout alors un chemin qui n'existe pas dans
le conteneur, ce qui déclenche une ForbiddenException dans le scanner.
Seul l'utilisateur admin (créé après le premier démarrage Docker)
aura déjà le bon chemin.

14.5 Scanner tous les fichiers

Scan long : avec {{TAILLE_DONNEES}} de données, le scan peut prendre
15 à 60 minutes selon le nombre de fichiers et la vitesse du HDD.
Il enregistre dans la base tous les fichiers copiés manuellement par rsync.
Ne pas interrompre cette commande.

14.6 Nettoyer les entrées orphelines

Pourquoi files:cleanup ?
Le rsync en 2 passes peut laisser quelques incohérences : des fichiers supprimés
entre le premier et le second rsync restent référencés dans la base.
Cette commande nettoie ces entrées orphelines.

14.7 Désactiver le mode maintenance

15) Tester localement

Réponse attendue :

Vérifier aussi l'état des conteneurs :

Les 4 conteneurs doivent être Up (healthy) : owncloud-server, owncloud-db, owncloud-redis, owncloud-cron.

Vérifier le statut ownCloud :

Doit afficher :

16) Basculer le DNS

Modifier l'enregistrement DNS A de {{DOMAINE_OWNCLOUD}}
pour pointer vers la nouvelle IP :

  • Type : A
  • Nom : owncloud
  • Valeur : {{IP_NOUVEAU}}
  • TTL : 300 (5 minutes, pour propager rapidement)

Vérifier la propagation :

Doit retourner {{IP_NOUVEAU}}.

17) Activer Let's Encrypt

Après la propagation DNS (vérifier avec dig) :

  1. MyVestaCP → WEB{{DOMAINE_OWNCLOUD}}Edit
  2. Cocher Enable SSL
  3. Cocher Let's Encrypt Support
  4. Save

Vérifier :

18) Vérification post-migration

18.1 Se connecter à l'interface web

Ouvrir https://{{DOMAINE_OWNCLOUD}} dans un navigateur.
Se connecter avec un compte existant de l'ancien serveur.
Vérifier :

  • Les fichiers sont présents et les aperçus fonctionnent
  • Les partages entre utilisateurs sont intacts
  • L'administration est accessible

18.2 Vérifier les clients de synchronisation

Les clients de synchronisation ownCloud détectent automatiquement le changement de serveur
via le DNS. Puisqu'on a préservé l'instanceid, ils ne demandent pas de reconfiguration.

Si un client demande de se reconnecter : cela signifie que l'instanceid
ne correspond pas. Vérifier avec docker compose exec owncloud occ config:system:get instanceid
qu'il retourne bien {{OC_INSTANCEID}}.

18.3 Arrêter l'ancien serveur ownCloud

Une fois la migration validée, désactiver ownCloud sur l'ancien serveur :


Dépannage

Les valeurs instanceid / passwordsalt sont incorrectes

Vérifier que le fichier migration.config.php (créé en section 11.1)
est bien présent et contient les bonnes valeurs :

Si instanceid ne retourne pas {{OC_INSTANCEID}},
le fichier n'est pas chargé. Vérifier les permissions (chown 33:33)
et que le fichier est bien dans /home/docker/owncloud/data/config/.

Erreur SQLSTATE: permission denied for table oc_*

L'ancien dump contenait des ALTER OWNER pour un rôle différent.
Vérifier que le dump a été exporté avec --no-owner --no-acl.
Si le problème persiste, changer le propriétaire de toutes les tables :

Erreur 500 au premier accès

Vérifier les logs :

Causes fréquentes :

  • Permission deniedchown -R 33:33 /home/docker/owncloud/data/
  • Database connection failed → vérifier que le conteneur db est running
    et que les credentials correspondent
  • .ocdata file not foundtouch /home/docker/owncloud/data/files/.ocdata && chown 33:33 /home/docker/owncloud/data/files/.ocdata

Le scan files:scan est extrêmement lent

Sur HDD avec beaucoup de petits fichiers, le scan peut être très lent.
Scanner utilisateur par utilisateur pour suivre la progression :

Apps marketplace incompatibles

Si occ upgrade échoue à cause d'une app marketplace,
désactiver l'app problématique et relancer :

Erreur 500 avec SessionNotAvailableException

Symptômes : toutes les pages retournent un code 500, curl -v http://127.0.0.1:8490/status.php
montre un Content-Length: 0, et les headers contiennent un Set-Cookie qui crée
puis supprime immédiatement le cookie de session.

Diagnostiquer :

Cause : le répertoire /mnt/data/sessions appartient à root:root.
PHP (www-data, UID 33) ne peut pas y écrire les fichiers de session.

Nginx refuse de démarrer : Address already in use sur 8080/8443

Symptôme : systemctl restart nginx échoue avec
bind() to {{IP_NOUVEAU}}:8080 failed (98: Address already in use).

Diagnostiquer :

Cause : les ports 8080 et 8443 sont occupés par Apache
(le backend MyVestaCP). Le template Nginx généré par MyVestaCP utilise
%web_port% (8080) et %web_ssl_port% (8443) au lieu de 80/443.
Tous les autres domaines sur ce serveur utilisent correctement le port 80 pour Nginx.

Logs inondés par files_antivirus : « Failed to connect to socket »

Symptôme : les logs ownCloud sont remplis de messages
Failed to connect to "/var/run/clamav/clamd.ctl" toutes les quelques secondes.

Cause : l'app files_antivirus était activée sur l'ancien serveur
(où ClamAV était installé). En Docker, le socket ClamAV n'existe pas.

Conteneur ownCloud bloque au démarrage (unhealthy)

Avec OWNCLOUD_SKIP_CHOWN=true, si des fichiers n'appartiennent pas à UID 33,
le conteneur peut démarrer mais être unhealthy.
Vérifier les permissions :

Erreur « Home storage for user X not writable » sur files:scan

Cette erreur apparaît quand les chemins utilisateur dans la table oc_accounts
pointent encore vers l'ancien serveur. Le message est trompeur — il ne s'agit pas
d'un problème de permissions fichiers mais d'un chemin qui n'existe pas dans le conteneur.

Diagnostiquer :

Si la colonne home contient des chemins comme
/home/{{USER_VESTA_OC}}/web/.../data/username au lieu de
/mnt/data/files/username, appliquer la correction de la section 14.4 :

Puis relancer le scan : docker compose exec owncloud occ files:scan --all


Récapitulatif de l'architecture finale

Ports utilisés sur le serveur :

  • 8069-8369 — Odoo 17 (4 instances)
  • 8469 — Odoo 8
  • 8480 — Akeneo PIM 7
  • 8490 — ownCloud 10

À suivre

ownCloud est maintenant opérationnel en Docker avec {{TAILLE_DONNEES}} de données,
reverse proxy et SSL. Dans les prochains articles :

  • Serveurs de jeux (Counter-Strike 1.6, TeamSpeak 3, EmuLinker)
  • Sauvegardes automatisées et stratégie de rétention
  • Monitoring et alertes

Article précédent : Akeneo PIM 6 → 7 en Docker — migration et upgrade vers Docker Compose.



Catégories : Non classé

0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *