Skip to content

elmeriniemela/deploy-manager

Repository files navigation

Deployment Manager for Odoo images

Abstract

This project automates self-hosted Odoo deployments on a Linux host. It provides a custom Odoo Docker image, host bootstrap scripts (Docker/PostgreSQL/nginx/systemd), and an XML-RPC deployment manager for instance lifecycle tasks such as create/reset/restart/upgrade, hostname-to-port routing updates, and SSL certificate management. It also handles database and filestore backup/restore workflows using pg_dump/pg_restore and rclone, with scheduled retention cleanup.

The XML-RPC API can be used from an Odoo instance to do self upgrades of Odoo source code.

System architecture

flowchart LR
    GHCR["GHCR odoo-src image"]
    User["Users and Browsers"]
    DNS["DNS and Hostname"]
    Nginx["NGINX routing and SSL"]
    Odoo["Odoo instances"]
    PG["PostgreSQL databases"]
    FS["Filestore volumes"]
    DeployManager["Deployment Manager"]
    Backup["Backups"]
    Rclone["rclone to S3 storage"]
    Monitoring["Prometheus Grafana Loki"]
    Metrics["System metrics"]
    Logs["Logging (promtail)"]
    Modules["Odoo modules"]

    GHCR --> Docker
    Docker --> Odoo
    Modules -->|self upgrades| Odoo

    User --> DNS
    DNS --> Nginx
    Nginx -->|hostname -> port| Odoo
    Odoo --> PG
    Odoo --> FS
    Odoo -->|cloudflare api| DNS
    Odoo --> DeployManager

    Backup --> PG
    Backup --> FS

    DeployManager --> Docker
    DeployManager --> Nginx
    DeployManager --> Backup
    DeployManager -->|git| Modules
    Backup --> Rclone

    Docker --> Metrics
    Docker --> Logs

    Metrics --> Monitoring
    Logs --> Monitoring


    subgraph OdooHost["Linux VPS - Odoo"]
        Docker
        Odoo
        PG
        FS
        DeployManager
        Modules
        Nginx
        Backup
        Metrics
        Logs
    end


    subgraph MonHost["Linux VPS - Monitoring"]
      Monitoring
    end


Loading

Installation

Creating a personal github access token (READ only):

Prerequisite

  • scp .gitconfig agent18.eniemela.fi:
  • cd .ssh && ssh-keygen -f id_ecdsa -t ecdsa -b 521
  • cat id_ecdsa.pub
  • go to github / settings / SSH keys / Add 'Odoo 18.0 Hetzner Server key'
  • mkdir -p /root/.config/rclone/
  • cp rclone.conf /root/.config/rclone/rclone.conf
  • vim /root/.config/rclone/rclone.conf
  • cp cloudflare.ini /root/cloudflare.ini
  • vim /root/cloudflare.ini

Installation

  • git clone -b 18.0 --recurse-submodules --shallow-submodules https://github.com/elmeriniemela/deploy-manager.git /opt/odoo-agent
  • cd /opt/odoo-agent
  • ./ubuntu-install.sh
  • systemctl edit docker.service
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375 --containerd=/run/containerd/containerd.sock
  • systemctl daemon-reload
  • systemctl restart docker.service
  • systemctl restart postgresql
  • su - postgres -c "createuser -s root"
  • source /root/agent-venv/bin/activate
  • python agentd/api.py ssl_wildcard
  • systemctl restart nginx

Promtail setup (TODO: deprecated, migrate to Alloy)

Prometheus node exporter monitoring:

  • Prometheus exporter for hardware and OS metrics exposed by *NIX kernels, written in Go with pluggable metric collectors: https://github.com/prometheus/node_exporter
  • docker run -d
    --net="host"
    --pid="host"
    -v "/:/host:ro,rslave"
    --restart unless-stopped
    quay.io/prometheus/node-exporter:latest
    --path.rootfs=/host

Building the image

Backup setup:

  • crontab -e
  • 30 00 * * * cd /opt/odoo-agent && /root/agent-venv/bin/python ./agentd/backup.py

Other notes

Pulling the image

  • docker pull ghcr.io/elmeriniemela/odoo-src:18.0

DB isolation:

Local setup

  • sudo docker run
    -v /home/elmeri/Odoo/src/16:/mnt:ro
    -v /var/run/postgresql:/var/run/postgresql
    -v /home/elmeri/Odoo/src/16/own-docker.conf:/etc/odoo/odoo.conf:ro
    -v /home/elmeri/.local/share/Odoo:/var/lib/odoo
    -p 127.0.0.1:8016:8069
    -p 127.0.0.1:9016:8072
    --name eniemela_16 -ti ghcr.io/elmeriniemela/odoo-src:18.0
  • sudo docker restart eniemela_16 && sudo docker attach eniemela_16
  • sudo docker exec -it -u root eniemela_16 bash
  • sudo docker restart eniemela_16 && sudo docker exec -it -u root eniemela_16 odoo -u investment_portfolio --http-port=9999 --stop-after-init && sudo docker restart eniemela_16 && sudo docker attach eniemela_16

Local mermaid-cli installation for AGENTS.md verification of the diagram:

  • sudo pacman -S nodejs npm
  • sudo npm install -g @mermaid-js/mermaid-cli
  • npx puppeteer browsers install chrome-headless-shell@131.0.6778.204. NOTE: mmdc pins to a specific version, adapt if needed.
  • See AGENTS.md for usage.

Random notes

About

Deployment manager for Odoo images

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors