Étape 1 sur 1 · déploiement de référence

Déployer Odoo sur un VPS

Vous allez installer une petite instance Odoo avec Docker, PostgreSQL et Nginx. Le serveur garde Odoo privé sur le port 8069 ; votre nom de domaine sert le site en HTTPS sur le port 443.

Ce qu’il vous faut

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.

Navigateur
https://votre-domaine.fr
Nginx
certificat TLS
Odoo
conteneur Docker
PostgreSQL
conteneur Docker · 5432 privé
Nginx expose le port 443. Odoo reste lié à 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.

VPS Ubuntu · session root initiale
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 enable

Ouvrez 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.

VPS Ubuntu · seulement après le test SSH du compte deploy
cat > /etc/ssh/sshd_config.d/99-no-root.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
EOF

sshd -t && systemctl reload ssh
Point de sécurité

Si 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

VPS Ubuntu · compte deploy avec sudo
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 version

Ré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.

VPS Ubuntu · compte deploy
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.yaml
/srv/odoo/workspace/deployment/.env · ne jamais committer ce fichier
POSTGRES_DB=postgres
POSTGRES_USER=odoo
POSTGRES_PASSWORD=REMPLACEZ_PAR_UN_LONG_SECRET_ALEATOIRE
ODOO_MASTER_PASSWORD=REMPLACEZ_PAR_UN_AUTRE_LONG_SECRET_ALEATOIRE
/srv/odoo/workspace/deployment/config/odoo.conf
[options]
admin_passwd = REMPLACEZ_PAR_LA_VALEUR_ODOO_MASTER_PASSWORD
addons_path = /usr/lib/python3/dist-packages/odoo/addons,/mnt/extra-addons
proxy_mode = True
/srv/odoo/workspace/deployment/compose.yaml
services:
  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.

VPS Ubuntu · dossier deployment
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.

/etc/nginx/sites-available/odoo · VPS Ubuntu
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;
    }
}
VPS Ubuntu · compte deploy avec sudo
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.timer

Certbot 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.

Résultat attendu

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.