Pour cet exercice, un VPS Ubuntu récent avec 1 vCore, 1 Go de RAM et 20 Go de disque suffit. C’est aussi un point de départ raisonnable pour une petite équipe peu sollicitée ; surveillez ensuite la mémoire, les pièces jointes et le nombre d’utilisateurs connectés. Comparez par exemple une offre CloudServer, puis associez-lui un nom de domaine, gratuit ou peu coûteux, chez votre fournisseur habituel — par exemple o2switch. Odoo Community est libre : le coût régulier vient du VPS, du domaine et du temps d’exploitation.
Ce qui tourne où
Ne publiez ni PostgreSQL ni le port Odoo. Docker fait communiquer Odoo et PostgreSQL sur son réseau privé. Nginx est le seul service visible depuis Internet : il reçoit HTTPS, gère le certificat TLS et transmet la requête à Odoo sur la machine locale.
https://votre-domaine.fr
certificat TLS
conteneur Docker
conteneur Docker · 5432 privé
127.0.0.1:8069 et PostgreSQL n’a aucun port publié.Oui, un conteneur peut écouter directement sur 443. Ce serait moins pratique : Nginx sépare le certificat et le proxy de l’application, et vous laisse remplacer ou mettre à jour Odoo sans reconfigurer l’accès HTTPS.
1. Créez un accès administrateur et fermez l’accès root
Connectez-vous une seule fois avec le compte root fourni par l’hébergeur. Les commandes suivantes s’exécutent sur le VPS. Remplacez la clé d’exemple par votre clé publique SSH ; gardez votre clé privée sur votre poste, jamais sur le serveur.
apt update && apt upgrade -y
apt install -y ca-certificates curl git nginx certbot python3-certbot-nginx ufw
adduser deploy
usermod -aG sudo deploy
install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
printf '%s\n' 'COLLEZ_ICI_VOTRE_CLE_PUBLIQUE_ED25519' \
> /home/deploy/.ssh/authorized_keys
chown deploy:deploy /home/deploy/.ssh/authorized_keys
chmod 600 /home/deploy/.ssh/authorized_keys
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw --force enableOuvrez un second terminal sur votre poste et vérifiez d’abord que ssh deploy@ADRESSE_DU_VPS fonctionne avec votre clé. Ne fermez pas la session root tant que ce test n’a pas réussi.
cat > /etc/ssh/sshd_config.d/99-no-root.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF
sshd -t && systemctl reload sshSi la connexion avec deploy échoue, supprimez ce fichier de configuration dans la session root encore ouverte et corrigez la clé. Désactiver root avant ce test peut vous couper du VPS.
2. Importez votre workspace et démarrez Odoo avec Docker Compose
Les commandes suivantes s’exécutent sur le VPS, connecté avec deploy. Nous n’installons pas PostgreSQL sur Ubuntu : le service db du fichier Compose est PostgreSQL. Cela évite de gérer deux installations de la même base.
Installez Docker et le plugin Compose
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
printf '%s\n' \
'Types: deb' \
'URIs: https://download.docker.com/linux/ubuntu' \
"Suites: $(. /etc/os-release && echo \"$VERSION_CODENAME\")" \
'Components: stable' \
'Signed-By: /etc/apt/keyrings/docker.asc' | \
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo docker compose versionRécupérez le dépôt et créez les fichiers de déploiement
Le dépôt Git contient votre code, notamment custom_addons/. L’image officielle fournit Odoo 19 ; vous ne copiez donc pas src/odoo/ sur le VPS pour cet exercice.
sudo install -d -m 755 -o deploy -g deploy /srv/odoo
cd /srv/odoo
git clone URL_DE_VOTRE_DEPOT_GIT workspace
cd workspace
mkdir -p deployment/config
nano deployment/.env
chmod 600 deployment/.env
nano deployment/config/odoo.conf
nano deployment/compose.yamlPOSTGRES_DB=postgres
POSTGRES_USER=odoo
POSTGRES_PASSWORD=REMPLACEZ_PAR_UN_LONG_SECRET_ALEATOIRE
ODOO_MASTER_PASSWORD=REMPLACEZ_PAR_UN_AUTRE_LONG_SECRET_ALEATOIRE[options]
admin_passwd = REMPLACEZ_PAR_LA_VALEUR_ODOO_MASTER_PASSWORD
addons_path = /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons
proxy_mode = Trueservices:
db:
image: postgres:16
restart: unless-stopped
env_file: .env
volumes:
- postgres-data:/var/lib/postgresql/data
odoo:
image: odoo:19.0
restart: unless-stopped
depends_on:
- db
env_file: .env
environment:
HOST: db
USER: ${POSTGRES_USER}
PASSWORD: ${POSTGRES_PASSWORD}
ports:
- "127.0.0.1:8069:8069"
volumes:
- odoo-data:/var/lib/odoo
- ../custom_addons:/mnt/extra-addons:ro
- ./config/odoo.conf:/etc/odoo/odoo.conf:ro
volumes:
postgres-data:
odoo-data:Créez les deux secrets avec un gestionnaire de mots de passe ou openssl rand -base64 32. Le mot de passe maître Odoo sert aux opérations de base : gardez-le hors de Git, avec les autres secrets.
cd /srv/odoo/workspace/deployment
sudo docker compose config
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs -f odooÀ observer : db et odoo sont running. Depuis le VPS, curl -I http://127.0.0.1:8069 doit obtenir une réponse HTTP. Ne rendez pas ce port accessible dans le firewall.
3. Branchez le domaine, Nginx et HTTPS
Dans la zone DNS de votre domaine, créez un enregistrement A pour odoo.votre-domaine.fr qui pointe vers l’IP du VPS. Attendez que ce nom réponde sur Internet avant de demander le certificat.
server {
listen 80;
server_name odoo.votre-domaine.fr;
location / {
proxy_pass http://127.0.0.1:8069;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}sudo ln -s /etc/nginx/sites-available/odoo /etc/nginx/sites-enabled/odoo
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d odoo.votre-domaine.fr
sudo systemctl status certbot.timerCertbot ajoute le certificat et la redirection HTTP vers HTTPS à la configuration Nginx. Vérifiez ensuite https://odoo.votre-domaine.fr dans un navigateur et créez votre base Odoo depuis cette adresse. Une fois la base créée, ajoutez un dbfilter adapté à son nom et désactivez la liste des bases. Conservez les volumes Docker : ils portent la base PostgreSQL et le filestore ; le dépôt Git ne remplace pas une sauvegarde de ces données.
Vous avez une instance Odoo accessible par votre domaine en HTTPS, avec PostgreSQL privé, Odoo limité à 127.0.0.1:8069, et un compte SSH sans connexion root ni mot de passe. Pour mettre à jour le code plus tard : git pull --ff-only, puis sudo docker compose up -d depuis deployment/, après une sauvegarde testée.