diff --git a/scenario1/Containerfile b/scenario1/Containerfile new file mode 100644 index 0000000..e07cdec --- /dev/null +++ b/scenario1/Containerfile @@ -0,0 +1,23 @@ +FROM edge-registry.itix.fr/demo-edge-retail/generic:latest + +ARG ADMIN_USERNAME=demo \ + ADMIN_PASSWORD=redhat + +RUN <({db_name}) +#RIBBON_COLOR=rgba(255,0,0,.6) +#RIBBON_NAME=PROD
({db_name}) diff --git a/scenario1/root/etc/containers/systemd/configs/odoo-db.env b/scenario1/root/etc/containers/systemd/configs/odoo-db.env new file mode 100644 index 0000000..d77dc61 --- /dev/null +++ b/scenario1/root/etc/containers/systemd/configs/odoo-db.env @@ -0,0 +1,5 @@ +POSTGRES_USER=odoo +POSTGRES_PASSWORD=odoo +POSTGRES_DB=postgres +POSTGRES_HOST_AUTH_METHOD=scram-sha-256 +POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 diff --git a/scenario1/root/etc/containers/systemd/odoo-app.container b/scenario1/root/etc/containers/systemd/odoo-app.container new file mode 100644 index 0000000..fd8c7f5 --- /dev/null +++ b/scenario1/root/etc/containers/systemd/odoo-app.container @@ -0,0 +1,43 @@ +[Unit] +Description=Odoo +Documentation=https://www.odoo.com/documentation/ + +# Require initialization to complete first +Requires=odoo-init.service odoo-db.service +After=odoo-init.service odoo-db.service + +# Only start if initialization has completed +ConditionPathExists=/var/lib/odoo/initialized + +[Container] +ContainerName=odoo-app +Image=docker.io/library/odoo:17 + +# Network configuration +Network=host +AddCapability=CAP_NET_BIND_SERVICE + +# Volume mounts +Volume=/etc/odoo:/etc/odoo:ro +Volume=/var/lib/odoo/data:/var/lib/odoo:z +Volume=/var/lib/odoo/addons:/mnt/extra-addons:z +Volume=/var/log/odoo:/var/log/odoo:z + +# Health check +HealthCmd=curl -fs -o /dev/null -w "%{http_code}\n" http://127.0.0.1/web/login +HealthInterval=30s +HealthTimeout=10s +HealthStartPeriod=60s +HealthRetries=3 + +[Service] +Restart=always +RestartSec=10 +TimeoutStartSec=600 +TimeoutStopSec=30 + +# Wait for PostgreSQL to be ready +ExecStartPre=/bin/sh -c 'exec 2>/dev/null; for try in $(seq 0 12); do if ! /bin/true 5<> /dev/tcp/127.0.0.1/5432; then echo "Waiting for PostgreSQL to be available..."; sleep 5; else exit 0; fi; done; exit 1' + +[Install] +WantedBy=odoo.target diff --git a/scenario1/root/etc/containers/systemd/odoo-db.container b/scenario1/root/etc/containers/systemd/odoo-db.container new file mode 100644 index 0000000..4b8f220 --- /dev/null +++ b/scenario1/root/etc/containers/systemd/odoo-db.container @@ -0,0 +1,37 @@ +[Unit] +Description=PostgreSQL Database Server +Documentation=https://www.postgresql.org/ +After=network.target + +[Container] +ContainerName=odoo-db +Image=docker.io/library/postgres:17-alpine + +# Network configuration +Network=host + +# Security context (equivalent to K8s securityContext) +#NoNewPrivileges=true +#DropCapability=ALL + +# Environment variables from config +EnvironmentFile=/etc/containers/systemd/configs/odoo-db.env + +# Volume mounts +Volume=/var/lib/postgresql/data:/var/lib/postgresql/data:Z + +# Health check +HealthCmd=pg_isready -U odoo +HealthInterval=30s +HealthTimeout=10s +HealthStartPeriod=60s +HealthRetries=3 + +[Service] +Restart=always +RestartSec=10 +TimeoutStartSec=120 +TimeoutStopSec=30 + +[Install] +WantedBy=odoo.target diff --git a/scenario1/root/etc/containers/systemd/odoo-init.container b/scenario1/root/etc/containers/systemd/odoo-init.container new file mode 100644 index 0000000..ef445fa --- /dev/null +++ b/scenario1/root/etc/containers/systemd/odoo-init.container @@ -0,0 +1,48 @@ +[Unit] +Description=Odoo initialization service +Documentation=https://www.odoo.com/documentation/ + +Requires=odoo-db.service +After=odoo-db.service +Before=odoo-app.service + +# Prevent running if already initialized +ConditionPathExists=!/var/lib/odoo/initialized + +[Container] +ContainerName=odoo-init +Image=docker.io/library/odoo:17 + +# Network configuration +Network=host +AddCapability=CAP_NET_BIND_SERVICE + +# Environment variables from secrets and config +EnvironmentFile=/etc/containers/systemd/configs/odoo-config.env + +# Volume mounts +Volume=/etc/odoo:/etc/odoo:ro +Volume=/var/lib/odoo/data:/var/lib/odoo:z +Volume=/var/lib/odoo/addons:/mnt/extra-addons:z +Volume=/var/log/odoo:/var/log/odoo:z + +# Initialization script +Entrypoint=/bin/bash +Exec=/etc/odoo/init.sh + +[Service] +Type=oneshot +Restart=no +RemainAfterExit=yes + +# Flag this service as initialized +ExecStartPost=/bin/touch /var/lib/odoo/initialized + +# Skaffold filesystem + fix permissions +ExecStartPre=/bin/sh -c 'for d in /var/lib/odoo/data /var/lib/odoo/addons /var/log/odoo; do mkdir -p "$d" ; chmod 700 "$d" ; chown 101:101 "$d" ; done' + +# Wait for PostgreSQL to be ready +ExecStartPre=/bin/sh -c 'exec 2>/dev/null; for try in $(seq 0 12); do if ! /bin/true 5<> /dev/tcp/127.0.0.1/5432; then echo "Waiting for PostgreSQL to be available..."; sleep 5; else exit 0; fi; done; exit 1' + +[Install] +WantedBy=odoo.target diff --git a/scenario1/root/etc/odoo/init.sh b/scenario1/root/etc/odoo/init.sh new file mode 100755 index 0000000..ca48af9 --- /dev/null +++ b/scenario1/root/etc/odoo/init.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +## +## This script initializes the Odoo application environment. +## + +set -Eeuo pipefail + +echo "Downloading OCA addons..." +curl -sSfL https://github.com/OCA/web/archive/refs/heads/17.0.tar.gz | tar -xz -C /mnt/extra-addons --strip-components=1 + +echo "Initializing database '$DATABASE'..." +odoo -c /etc/odoo/odoo.conf --logfile=/dev/stdout --no-http --stop-after-init -d $DATABASE --init base + +if [ -n "${RIBBON_NAME}${RIBBON_COLOR}" ]; then + echo "Installing Web Environment Ribbon module..." + odoo -c /etc/odoo/odoo.conf --logfile=/dev/stdout --no-http --stop-after-init -d $DATABASE --init web_environment_ribbon +fi + +echo "Installing Point of Sale module..." +odoo -c /etc/odoo/odoo.conf --logfile=/dev/stdout --no-http --stop-after-init -d $DATABASE --init point_of_sale + +echo "Setting admin password and ribbon color..." +odoo shell -c /etc/odoo/odoo.conf -d $DATABASE <