Compare commits

...

10 commits

Author SHA1 Message Date
Luc PIERSON
38cc40d216
Update docker-compose.yml 2026-04-09 22:23:53 +02:00
Luc PIERSON
553ec4ccc7
Update docker-compose.yml 2026-04-09 20:48:42 +02:00
Luc PIERSON
ed58fc9f2f
Update README.md 2025-07-30 08:44:29 +02:00
Luc PIERSON
a90f6ee104
Update README.md 2025-07-29 19:03:20 +02:00
Luc PIERSON
548218143d
Update 7 README.md 2025-07-29 18:31:51 +02:00
Luc PIERSON
b02e7c19f9
Update 6 README.md 2025-07-29 09:58:09 +02:00
Luc PIERSON
4d55412399
Update 5 README.md 2025-07-29 09:54:38 +02:00
Luc PIERSON
165f3a5494
Update 4 README.md 2025-07-29 09:53:39 +02:00
Luc PIERSON
dc6b04162b
Add files via upload 2025-07-29 09:42:48 +02:00
Luc PIERSON
e81f08ce91
Update 3 README.md 2025-07-29 09:07:17 +02:00
21 changed files with 763 additions and 24 deletions

View file

@ -1,62 +1,70 @@
# odoo17-to-18-community-upgrade-docker
# odoo community V17 upgrade to V18 using docker envs
July 28th 2025
I couldn't find clear explanations and I don't have a devl odoo env.
This is a description of the actions I did to upgrade a odoo community v17 to v18 with standard docker containers
0) to avoid any module problem, remove the custom V17 installations:
- in the odoo env, go to apps, look for all modules installed and remove the custom ones. You may find the list in your ./custom (the folder which links to /mnt/extra-addons in your docker-compose)
1) upgrade your current env to last V17 version (see in V187 folder):
2) upgrade your current env to last V17 version (see in V17 folder):
a) with provided latest V18 Dokerfile, entrypoint.sh and wait-for-psql.py, create new image, run existing V17 on a docker from that new image
- see in V17 folder the build command and docker-compose.yml odoo.conf related
- remember on which docker runs your pstgres (in my case postgres-20250725-mylucdatabase)
- with provided latest V17 Dokerfile, entrypoint.sh and wait-for-psql.py, create new image, run existing V17 on a docker from that new image
* see in V17 folder the build command and docker-compose.yml odoo.conf related
* remember on which docker runs your pstgres (in my case postgres-20250725-mylucdatabase)
3) Create a Migration env based on V18 (see in V18-MIG folder):
you need a dedicated Dockerfile based on latest provided odoo V18 (in my case 20250725)
a) update your V18 Dockerfile
4) Create a Migration env based on V18 called V18-MIG (with provided latest V18 Dokerfile):
a) update your V18-MIG Dockerfile
- add vim, curl, git, unzip in the early installation
- create a directory for OpenUpgrade scripts (line 95)
- add the install of openupgradelib (line 96)
- add the reference to directory /var/lib/odoo/OpenUpgrade (line 98)
b) update your v18 entrypoint.sh
b) update your V18-MIG entrypoint.sh
- you need to add the migration instruction (see at the end)
c) update you docker-compose.yml
c) create or update you V18-MIG docker-compose.yml
- you need to run once only (no restart)
- you need to add reference to the local unzipped folder V18 OpenUpgrade
- you need to run once only (==> no restart)
- you need to add reference to the local ./OpenUpgrade
d) update your odoo.conf with references to the running postgresql
d) update your V18-MIG odoo.conf with references to the running postgresql
- you need to reference your V17 postgresql running docker and the db_name to migrate
- you need to add variables
- you need to reference your V17 postgresql running docker and the db_name to migrate
- you need to add variables
e) download the OCA OpenUpgrade Scripts
e) download the OCA OpenUpgrade Scripts in your V18-MIG folder
- download and unzip or git clone the OpenUpgrade V18 env to the local folder (in my case ./OpenUpgrade/ )
e) run the migration:
- Build your image for migration (see command in build.odoo.image.txt)
- launch the docker (docker-compose up -d)
- monitor the logs (tail -f ./logs/odoo.log)
5) Create a V18 env based on V18 (see in V18 folder):
6) Create a V18 env based on V18 (see in V18 folder):
- Based on latest Dokerfile, entrypoint.sh and wait-for-psql.py
- copy the filestore content to the new V18 env
- Create your docker image
- run the new v18 docker and monitor the logs (tail -f ./logs/odoo.log)
- Get the latest V18 Dokerfile, entrypoint.sh and wait-for-psql.py
- Build your docker image
- Create your docker-compose.yml with only the odoo service (postgres already running)
- copy (cp -r) the odoo-filestore of V17 folder to the new V18 folder
- run the new V18 docker (docker-compose up -d)
- monitor the logs (tail -f ./logs/odoo.log)
links :
docker images : https://hub.docker.com/_/odoo
odoo Docker images : https://hub.docker.com/_/odoo
OCA Openupgrade : https://github.com/OCA/OpenUpgrade/tree/18.0
Please note that for the migration purpose, I run postgres on 5444 port and expose odoo on 8569 (you may keep you 5432/8069 usual ports)
This is provided as indication only, HTH, best, Luc
Special Thanks to Odoo Tech (yt channel : https://www.youtube.com/@Odoo_tech_akash)

104
V17/Dockerfile Normal file
View file

@ -0,0 +1,104 @@
FROM ubuntu:jammy
MAINTAINER Odoo S.A. <info@odoo.com>
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]
# Generate locale C.UTF-8 for postgres and general locale data
ENV LANG en_US.UTF-8
# Retrieve the target architecture to install the correct wkhtmltopdf package
ARG TARGETARCH
# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
dirmngr \
fonts-noto-cjk \
gnupg \
libssl-dev \
node-less \
npm \
python3-magic \
python3-num2words \
python3-odf \
python3-pdfminer \
python3-pip \
python3-phonenumbers \
python3-pyldap \
python3-qrcode \
python3-renderpm \
python3-setuptools \
python3-slugify \
python3-vobject \
python3-watchdog \
python3-xlrd \
python3-xlwt \
xz-utils && \
if [ -z "${TARGETARCH}" ]; then \
TARGETARCH="$(dpkg --print-architecture)"; \
fi; \
WKHTMLTOPDF_ARCH=${TARGETARCH} && \
case ${TARGETARCH} in \
"amd64") WKHTMLTOPDF_ARCH=amd64 && WKHTMLTOPDF_SHA=967390a759707337b46d1c02452e2bb6b2dc6d59 ;; \
"arm64") WKHTMLTOPDF_SHA=90f6e69896d51ef77339d3f3a20f8582bdf496cc ;; \
"ppc64le" | "ppc64el") WKHTMLTOPDF_ARCH=ppc64el && WKHTMLTOPDF_SHA=5312d7d34a25b321282929df82e3574319aed25c ;; \
esac \
&& curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_${WKHTMLTOPDF_ARCH}.deb \
&& echo ${WKHTMLTOPDF_SHA} wkhtmltox.deb | sha1sum -c - \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb
# install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ jammy-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client \
&& rm -f /etc/apt/sources.list.d/pgdg.list \
&& rm -rf /var/lib/apt/lists/*
# Install rtlcss (on Debian buster)
RUN npm install -g rtlcss
# Install Odoo
ENV ODOO_VERSION 17.0
ARG ODOO_RELEASE=20250725
ARG ODOO_SHA=776c9e48afff1348a0410628a17d0552cb4599a3
RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
&& echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
&& apt-get update \
&& apt-get -y install --no-install-recommends ./odoo.deb \
&& rm -rf /var/lib/apt/lists/* odoo.deb
# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
COPY ./odoo.conf /etc/odoo/
# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons
RUN chown odoo /etc/odoo/odoo.conf \
&& mkdir -p /mnt/extra-addons \
&& chown -R odoo /mnt/extra-addons
VOLUME ["/var/lib/odoo", "/mnt/extra-addons"]
# Expose Odoo services
EXPOSE 8069 8071 8072
# Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf
COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py
# Set default user when running the container
USER odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

9
V17/Dockerfile.postgres Normal file
View file

@ -0,0 +1,9 @@
# Utiliser l'image officielle PostgreSQL 15
FROM postgres:15
# Changer le port d'écoute dans la configuration PostgreSQL
RUN sed -i 's/^#port = 5432/port = 5444/' /usr/share/postgresql/postgresql.conf.sample
# Copier la configuration dans le répertoire de configuration PostgreSQL
CMD ["postgres", "-c", "config_file=/usr/share/postgresql/postgresql.conf.sample"]

1
V17/buildimage.odoo.txt Normal file
View file

@ -0,0 +1 @@
docker build -t odoo17-20250725-image .

View file

@ -0,0 +1 @@
docker build -t postgres15-5444-image .

37
V17/docker-compose.yml Normal file
View file

@ -0,0 +1,37 @@
version: '3'
services:
odoo-mylucdatabase: # Configuration du container Odoo
image: odoo17-20250725-image:latest # Nom de notre image personnalisée
container_name: odoo-20250207-mylucdatabase
restart: unless-stopped
user: root
depends_on:
- postgres # L'exécution de notre service dépend de celui de postgres
ports:
- "8569:8069" # Le port 8069 est exposé pour accéder à l'application Odoo
networks:
- moustyLocalNetwork
volumes:
- ./:/etc/odoo:z
- ./odoo-filestore:/var/lib/odoo/filestore:z
- ./custom:/mnt/extra-addons:z
- ./logs:/var/log/odoo:z
postgres: # Configuration de notre service PostgreSQL
image: postgres15-5444-image:latest # Image postgres 15 de Docker hub
container_name: postgres-20250725-mylucdatabase
restart: unless-stopped
networks:
- moustyLocalNetwork
environment:
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo
- POSTGRES_DB=postgres
volumes:
- ./postgresql:/var/lib/postgresql/data:z
networks:
moustyLocalNetwork:
external: true

49
V17/entrypoint.sh Normal file
View file

@ -0,0 +1,49 @@
#!/bin/bash
set -e
if [ -v PASSWORD_FILE ]; then
PASSWORD="$(< $PASSWORD_FILE)"
fi
# set the postgres database host, port, user and password according to the environment
# and pass them as arguments to the odoo process if not present in the config file
: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}
: ${PORT:=${DB_PORT_5432_TCP_PORT:=5434}}
: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}
: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}}
DB_ARGS=()
function check_config() {
param="$1"
value="$2"
if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then
value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g')
fi;
DB_ARGS+=("--${param}")
DB_ARGS+=("${value}")
}
check_config "db_host" "$HOST"
check_config "db_port" "$PORT"
check_config "db_user" "$USER"
check_config "db_password" "$PASSWORD"
case "$1" in
-- | odoo)
shift
if [[ "$1" == "scaffold" ]] ; then
exec odoo "$@"
else
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo "$@" "${DB_ARGS[@]}"
fi
;;
-*)
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo "$@" "${DB_ARGS[@]}"
;;
*)
exec "$@"
esac
exit 1

16
V17/odoo.conf Normal file
View file

@ -0,0 +1,16 @@
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
limit_time_real = 1200
log_handler = [':INFO']
log_level = info
logfile = /var/log/odoo/odoo.log
proxy_mode = True
admin_passwd = Douthinkimtupid
db_host = postgres-20250725-mylucdatabase
db_port = 5444
debug_mode = True
longpolling_port = 8072
xmlrpc_port = 8069
xmlrpcs_port = 8071

32
V17/wait-for-psql.py Normal file
View file

@ -0,0 +1,32 @@
#!/usr/bin/env python3
import argparse
import psycopg2
import sys
import time
if __name__ == '__main__':
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--db_host', required=True)
arg_parser.add_argument('--db_port', required=True)
arg_parser.add_argument('--db_user', required=True)
arg_parser.add_argument('--db_password', required=True)
arg_parser.add_argument('--timeout', type=int, default=5)
args = arg_parser.parse_args()
start_time = time.time()
while (time.time() - start_time) < args.timeout:
try:
conn = psycopg2.connect(user=args.db_user, host=args.db_host, port=args.db_port, password=args.db_password, dbname='postgres')
error = ''
break
except psycopg2.OperationalError as e:
error = e
else:
conn.close()
time.sleep(1)
if error:
print("Database connection failure: %s" % error, file=sys.stderr)
sys.exit(1)

112
V18-MIG/Dockerfile Normal file
View file

@ -0,0 +1,112 @@
FROM ubuntu:noble
MAINTAINER Odoo S.A. <info@odoo.com>
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]
# Generate locale C.UTF-8 for postgres and general locale data
ENV LANG en_US.UTF-8
# Retrieve the target architecture to install the correct wkhtmltopdf package
ARG TARGETARCH
# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
vim \
git \
dirmngr \
fonts-noto-cjk \
gnupg \
libssl-dev \
node-less \
npm \
unzip \
python3-magic \
python3-num2words \
python3-odf \
python3-pdfminer \
python3-pip \
python3-phonenumbers \
python3-pyldap \
python3-qrcode \
python3-renderpm \
python3-setuptools \
python3-slugify \
python3-vobject \
python3-watchdog \
python3-xlrd \
python3-xlwt \
xz-utils && \
if [ -z "${TARGETARCH}" ]; then \
TARGETARCH="$(dpkg --print-architecture)"; \
fi; \
WKHTMLTOPDF_ARCH=${TARGETARCH} && \
case ${TARGETARCH} in \
"amd64") WKHTMLTOPDF_ARCH=amd64 && WKHTMLTOPDF_SHA=967390a759707337b46d1c02452e2bb6b2dc6d59 ;; \
"arm64") WKHTMLTOPDF_SHA=90f6e69896d51ef77339d3f3a20f8582bdf496cc ;; \
"ppc64le" | "ppc64el") WKHTMLTOPDF_ARCH=ppc64el && WKHTMLTOPDF_SHA=5312d7d34a25b321282929df82e3574319aed25c ;; \
esac \
&& curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_${WKHTMLTOPDF_ARCH}.deb \
&& echo ${WKHTMLTOPDF_SHA} wkhtmltox.deb | sha1sum -c - \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb
# install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ noble-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client \
&& rm -f /etc/apt/sources.list.d/pgdg.list \
&& rm -rf /var/lib/apt/lists/*
# Install rtlcss (on Debian buster)
RUN npm install -g rtlcss
# Install Odoo
ENV ODOO_VERSION 18.0
ARG ODOO_RELEASE=20250725
ARG ODOO_SHA=52215335b04ab9a0991ad1af37be6e07a5b3b276
RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
&& echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
&& apt-get update \
&& apt-get -y install --no-install-recommends ./odoo.deb \
&& rm -rf /var/lib/apt/lists/* odoo.deb
# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
COPY ./odoo.conf /etc/odoo/
# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons
RUN chown odoo /etc/odoo/odoo.conf \
&& mkdir -p /mnt/extra-addons \
&& chown -R odoo /mnt/extra-addons
VOLUME ["/var/lib/odoo", "/mnt/extra-addons"]
RUN mkdir -p /var/lib/odoo/OpenUpgrade
RUN pip install --break-system-packages git+https://github.com/OCA/openupgradelib.git@master#egg=openupgradelib
VOLUME ["/var/lib/odoo", "/mnt/extra-addons", "/var/lib/odoo/OpenUpgrade"]
# Expose Odoo services
EXPOSE 8069 8071 8072
# Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf
COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py
# Set default user when running the container
USER odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

View file

@ -0,0 +1 @@
docker build -t odoo18-augmente-20250725-image .

View file

@ -0,0 +1,30 @@
version: '3'
services:
odoo-18-AugmenteForUpgrade: #Configuration du container Odoo
image: odoo18-augmente-20250725-image:latest # Nom de notre image personnalisée
restart: "no"
container_name: odoo-18-AugmenteForUpgrade
user: root
ports:
- "8569:8069" # Le port 8069 est exposé pour accéder à l'application Odoo
- "8571:8071" # Le port 8071 est exposé pour accéder à l'application Odoo
- "8572:8072" # Le port 8072 est exposé pour accéder à l'application Odoo
networks:
- moustyLocalNetwork # éseau dans lequel notre service communiquera
command: >
odoo
-d mylucdatabase
# --update=all --stop-after-init --load=base,web,openupgrade_framework # pour upgrade to 18
# -i web_enterprise --stop-after-init # pour upgrade à Enterprise
volumes:
- ./:/etc/odoo:z
- ./odoo-filestore:/var/lib/odoo/filestore:z
- ./custom:/mnt/extra-addons:z
- ./OpenUpgrade:/var/lib/odoo/OpenUpgrade
- ./logs:/var/log/odoo:z
networks:
moustyLocalNetwork:
external: true

54
V18-MIG/entrypoint.sh Normal file
View file

@ -0,0 +1,54 @@
#!/bin/bash
set -e
if [ -v PASSWORD_FILE ]; then
PASSWORD="$(< $PASSWORD_FILE)"
fi
# set the postgres database host, port, user and password according to the environment
# and pass them as arguments to the odoo process if not present in the config file
: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}
: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}}
: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}
: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}}
DB_ARGS=()
function check_config() {
param="$1"
value="$2"
if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then
value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g')
fi;
DB_ARGS+=("--${param}")
DB_ARGS+=("${value}")
}
check_config "db_host" "$HOST"
check_config "db_port" "$PORT"
check_config "db_user" "$USER"
check_config "db_password" "$PASSWORD"
case "$1" in
-- | odoo)
shift
if [[ "$1" == "scaffold" ]] ; then
exec odoo "$@"
else
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo \
--upgrade-path=/var/lib/odoo/OpenUpgrade/openupgrade_scripts/scripts \
--update=all \
--stop-after-init \
--load=base,web,openupgrade_framework \
"$@" "${DB_ARGS[@]}"
fi
;;
-*)
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo "$@" "${DB_ARGS[@]}"
;;
*)
exec "$@"
esac
exit 1

25
V18-MIG/odoo.conf Normal file
View file

@ -0,0 +1,25 @@
[options]
addons_path = /mnt/extra-addons,/var/lib/odoo/OpenUpgrade
data_dir = /var/lib/odoo
limit_time_real = 1200
log_handler = [':INFO']
log_level = info
logfile = /var/log/odoo/odoo.log
proxy_mode = True
db_host = postgres-20250725-mylucdatabase
db_port = 5444
db_name = mylucdatabase
db_user = odoo
db_password = odoo
debug_mode = True
longpolling_port = False
gevent_port = 8072
xmlrpc_port = 8069
xmlrpcs_port = 8071
admin_passwd = Douthinkimtupid
upgrade_path = /var/lib/odoo/OpenUpgrade/openupgrade_scripts/scripts
limit_memory_hard = 0
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 60
limit_time_real_cron = -1

32
V18-MIG/wait-for-psql.py Normal file
View file

@ -0,0 +1,32 @@
#!/usr/bin/env python3
import argparse
import psycopg2
import sys
import time
if __name__ == '__main__':
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--db_host', required=True)
arg_parser.add_argument('--db_port', required=True)
arg_parser.add_argument('--db_user', required=True)
arg_parser.add_argument('--db_password', required=True)
arg_parser.add_argument('--timeout', type=int, default=5)
args = arg_parser.parse_args()
start_time = time.time()
while (time.time() - start_time) < args.timeout:
try:
conn = psycopg2.connect(user=args.db_user, host=args.db_host, port=args.db_port, password=args.db_password, dbname='postgres')
error = ''
break
except psycopg2.OperationalError as e:
error = e
else:
conn.close()
time.sleep(1)
if error:
print("Database connection failure: %s" % error, file=sys.stderr)
sys.exit(1)

104
V18/Dockerfile Normal file
View file

@ -0,0 +1,104 @@
FROM ubuntu:noble
MAINTAINER Odoo S.A. <info@odoo.com>
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]
# Generate locale C.UTF-8 for postgres and general locale data
ENV LANG en_US.UTF-8
# Retrieve the target architecture to install the correct wkhtmltopdf package
ARG TARGETARCH
# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive \
apt-get install -y --no-install-recommends \
ca-certificates \
curl \
dirmngr \
fonts-noto-cjk \
gnupg \
libssl-dev \
node-less \
npm \
python3-magic \
python3-num2words \
python3-odf \
python3-pdfminer \
python3-pip \
python3-phonenumbers \
python3-pyldap \
python3-qrcode \
python3-renderpm \
python3-setuptools \
python3-slugify \
python3-vobject \
python3-watchdog \
python3-xlrd \
python3-xlwt \
xz-utils && \
if [ -z "${TARGETARCH}" ]; then \
TARGETARCH="$(dpkg --print-architecture)"; \
fi; \
WKHTMLTOPDF_ARCH=${TARGETARCH} && \
case ${TARGETARCH} in \
"amd64") WKHTMLTOPDF_ARCH=amd64 && WKHTMLTOPDF_SHA=967390a759707337b46d1c02452e2bb6b2dc6d59 ;; \
"arm64") WKHTMLTOPDF_SHA=90f6e69896d51ef77339d3f3a20f8582bdf496cc ;; \
"ppc64le" | "ppc64el") WKHTMLTOPDF_ARCH=ppc64el && WKHTMLTOPDF_SHA=5312d7d34a25b321282929df82e3574319aed25c ;; \
esac \
&& curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.jammy_${WKHTMLTOPDF_ARCH}.deb \
&& echo ${WKHTMLTOPDF_SHA} wkhtmltox.deb | sha1sum -c - \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb
# install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ noble-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client \
&& rm -f /etc/apt/sources.list.d/pgdg.list \
&& rm -rf /var/lib/apt/lists/*
# Install rtlcss (on Debian buster)
RUN npm install -g rtlcss
# Install Odoo
ENV ODOO_VERSION 18.0
ARG ODOO_RELEASE=20250725
ARG ODOO_SHA=52215335b04ab9a0991ad1af37be6e07a5b3b276
RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
&& echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
&& apt-get update \
&& apt-get -y install --no-install-recommends ./odoo.deb \
&& rm -rf /var/lib/apt/lists/* odoo.deb
# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
COPY ./odoo.conf /etc/odoo/
# Set permissions and Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons
RUN chown odoo /etc/odoo/odoo.conf \
&& mkdir -p /mnt/extra-addons \
&& chown -R odoo /mnt/extra-addons
VOLUME ["/var/lib/odoo", "/mnt/extra-addons"]
# Expose Odoo services
EXPOSE 8069 8071 8072
# Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf
COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py
# Set default user when running the container
USER odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

1
V18/build.odoo.image.txt Normal file
View file

@ -0,0 +1 @@
docker build -t odoo18-20250725-image .

24
V18/docker-compose.yml Normal file
View file

@ -0,0 +1,24 @@
version: '3'
services:
odoo-18-NORMAL: #Configuration du container Odoo
image: odoo18-20250725-image:latest # Nom de notre image personnalisée
restart: unless-stopped
container_name: odoo-18-mylucdatabase-migree
user: root
ports:
- "8569:8069" # Le port 8069 est exposé pour accéder à l'application Odoo
- "8571:8071" # Le port 8071 est exposé pour accéder à l'application Odoo
- "8572:8072" # Le port 8072 est exposé pour accéder à l'application Odoo
networks:
- moustyLocalNetwork # éseau dans lequel notre service communiquera
volumes:
- ./:/etc/odoo:z
- ./odoo-filestore:/var/lib/odoo/filestore:z
- ./custom:/mnt/extra-addons:z
- ./logs:/var/log/odoo:z
networks:
moustyLocalNetwork:
external: true

49
V18/entrypoint.sh Normal file
View file

@ -0,0 +1,49 @@
#!/bin/bash
set -e
if [ -v PASSWORD_FILE ]; then
PASSWORD="$(< $PASSWORD_FILE)"
fi
# set the postgres database host, port, user and password according to the environment
# and pass them as arguments to the odoo process if not present in the config file
: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}
: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}}
: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}
: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}}
DB_ARGS=()
function check_config() {
param="$1"
value="$2"
if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then
value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g')
fi;
DB_ARGS+=("--${param}")
DB_ARGS+=("${value}")
}
check_config "db_host" "$HOST"
check_config "db_port" "$PORT"
check_config "db_user" "$USER"
check_config "db_password" "$PASSWORD"
case "$1" in
-- | odoo)
shift
if [[ "$1" == "scaffold" ]] ; then
exec odoo "$@"
else
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo "$@" "${DB_ARGS[@]}"
fi
;;
-*)
wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec odoo "$@" "${DB_ARGS[@]}"
;;
*)
exec "$@"
esac
exit 1

18
V18/odoo.conf Normal file
View file

@ -0,0 +1,18 @@
[options]
addons_path = /mnt/extra-addons
data_dir = /var/lib/odoo
limit_time_real = 1200
log_handler = [':INFO']
log_level = info
logfile = /var/log/odoo/odoo.log
proxy_mode = True
db_host = postgres-20250725-mylucdatabase
db_port = 5444
db_user = odoo
db_password = odoo
debug_mode = True
longpolling_port = False
gevent_port = 8072
xmlrpc_port = 8069
xmlrpcs_port = 8071
admin_passwd = Douthinkimtupid

32
V18/wait-for-psql.py Normal file
View file

@ -0,0 +1,32 @@
#!/usr/bin/env python3
import argparse
import psycopg2
import sys
import time
if __name__ == '__main__':
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--db_host', required=True)
arg_parser.add_argument('--db_port', required=True)
arg_parser.add_argument('--db_user', required=True)
arg_parser.add_argument('--db_password', required=True)
arg_parser.add_argument('--timeout', type=int, default=5)
args = arg_parser.parse_args()
start_time = time.time()
while (time.time() - start_time) < args.timeout:
try:
conn = psycopg2.connect(user=args.db_user, host=args.db_host, port=args.db_port, password=args.db_password, dbname='postgres')
error = ''
break
except psycopg2.OperationalError as e:
error = e
else:
conn.close()
time.sleep(1)
if error:
print("Database connection failure: %s" % error, file=sys.stderr)
sys.exit(1)