diff --git a/.env.example b/.env.example index 3974d52..78b2152 100644 --- a/.env.example +++ b/.env.example @@ -5,9 +5,9 @@ APP_ENV=local INIT= UPDATE= -LOAD=base,web +LOAD=base,web,session_redis WORKERS=2 -DEV_MODE=reload,qweb +DEV_MODE=reload,xml DOMAIN=erp.odoocker.test # Enterprise @@ -18,7 +18,7 @@ GITHUB_ACCESS_TOKEN= ADMIN_PASSWD=odoo DB_HOST=postgres DB_PORT=5432 -DB_NAME=odoo +DB_NAME=odoocker DB_USER=odoo DB_PASSWORD=odoo LOAD_LANGUAGE= @@ -31,7 +31,7 @@ LIST_DB=True DBFILTER=.* # Logging -LOG_LEVEL=debug +LOG_LEVEL=info # Additional logs LOG_HANDLER_LEVEL=INFO @@ -52,9 +52,35 @@ SMTP_PASSWORD= EMAIL_FROM= FROM_FILTER= +# Postgres +POSTGRES_MAIN_HOST=${DB_HOST} +POSTGRES_MAIN_PORT=${DB_PORT} +POSTGRES_MAIN_DB=postgres +POSTGRES_MAIN_USER=postgres +POSTGRES_MAIN_PASSWORD=${DB_PASSWORD} + +# Redis +SESSION_REDIS=true +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD= +REDIS_URL= +REDIS_PREFIX=odoo +REDIS_EXPIRATION=604800 +REDIS_EXPIRATION_ANONYMOUS=10800 + # PgAdmin PGADMIN_DOMAIN=pgadmin.odoocker.test -PGADMIN_PASSWORD=odoo +PGADMING_DB_NAME=pgadmin +PGADMING_DB_USER=pgadmin +PGADMIN_DB_PASSWORD=${DB_PASSWORD} +PGADMIN_DB_HOST="'postgresql://${PGADMING_DB_USER}:${PGADMIN_DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${PGADMING_DB_NAME}'" + +PGADMIN_EMAIL=pgadmin@example.com +PGADMIN_PASSWORD=pgadmin + +PGADMIN_SERVERS_JSON= +PGADMIN_CONFIG_SERVER_MODE=True #------------------------------# # Project Configurations # @@ -65,7 +91,7 @@ SUPPORT_EMAIL=mail@example.com # Containers' Tags ODOO_TAG=16.0 -POSTGRES_TAG=15.4 +POSTGRES_TAG=16.0 NGINX_TAG=1.25.2 NGINX_PROXY_TAG=1.3.1 ACME_COMPANION_TAG=2.2.8 @@ -87,6 +113,7 @@ WEBSOCKET_RATE_LIMIT_DELAY=0.2 # Custom paths COMMUNITY_ADDONS=${ROOT_PATH}/addons ENTERPRISE_ADDONS=${ROOT_PATH}/enterprise +THIRD_PARTY_ADDONS=${ROOT_PATH}/third-party-addons EXTRA_ADDONS=${ROOT_PATH}/extra-addons CUSTOM_ADDONS=${ROOT_PATH}/custom-addons LOG_PATH=/var/log/odoo/odoo.log @@ -101,7 +128,7 @@ DEMO=False WITHOUT_DEMO=all IMPORT_PARTIAL=False PIDFILE= -ADDONS_PATH=${COMMUNITY_ADDONS},${ENTERPRISE_ADDONS},${EXTRA_ADDONS},${CUSTOM_ADDONS} +ADDONS_PATH=${COMMUNITY_ADDONS},${ENTERPRISE_ADDONS},${THIRD_PARTY_ADDONS},${EXTRA_ADDONS},${CUSTOM_ADDONS} UPGRADE_PATH= SERVER_WIDE_MODULES=${LOAD} DATA_DIR=/var/lib/odoo @@ -193,11 +220,11 @@ TEMP_DOCKER_SOCK=/tmp/docker.sock #----------------# # Postgres # #----------------# -POSTGRES_HOST=${DB_HOST} -POSTGRES_PORT=${DB_PORT} -POSTGRES_DB=postgres -POSTGRES_USER=${DB_USER} -POSTGRES_PASSWORD=${DB_PASSWORD} +POSTGRES_HOST=${POSTGRES_MAIN_HOST} +POSTGRES_PORT=${POSTGRES_MAIN_PORT} +POSTGRES_DB=${POSTGRES_MAIN_DB} +POSTGRES_USER=${POSTGRES_MAIN_USER} +POSTGRES_PASSWORD=${POSTGRES_MAIN_PASSWORD} PGDATA=/var/lib/postgresql/data/${PROJECT_NAME} #-------------# @@ -210,16 +237,6 @@ LETSENCRYPT_HOST=${DOMAIN} LETSENCRYPT_EMAIL=${SUPPORT_EMAIL} CORS_ALLOWED_DOMAIN=${CORS_ALLOWED_DOMAIN} -#-------------# -# PgAdmin # -#-------------# -PGADMIN_DATA=/var/lib/pgadmin -PGADMIN_VIRTUAL_HOST=${PGADMIN_DOMAIN} -PGADMIN_DEFAULT_EMAIL=${SUPPORT_EMAIL} -PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD} -PGADMIN_LETSENCRYPT_HOST=${PGADMIN_DOMAIN} -LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL} - #-------------------# # Nginx Proxy # #-------------------# @@ -235,3 +252,68 @@ CORS_ALLOWED_DOMAIN=${CORS_ALLOWED_DOMAIN} # ACME Companion # #----------------------# DEFAULT_EMAIL=${SUPPORT_EMAIL} + +#-------------# +# Redis # +#-------------# +ODOO_SESSION_REDIS=${SESSION_REDIS} +ODOO_SESSION_REDIS_HOST=${REDIS_HOST} +ODOO_SESSION_REDIS_PORT=${REDIS_PORT} +ODOO_SESSION_REDIS_PASSWORD=${REDIS_PASSWORD} +ODOO_SESSION_REDIS_URL=${REDIS_URL} +ODOO_SESSION_REDIS_PREFIX=${REDIS_PREFIX} +ODOO_SESSION_REDIS_EXPIRATION=${REDIS_EXPIRATION} +ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS=${REDIS_EXPIRATION_ANONYMOUS} + +#-------------# +# PgAdmin # +#-------------# +# Volume path +PGADMIN_DATA=/var/lib/pgadmin + +# Nginx Proxy Configuration +PGADMIN_VIRTUAL_HOST=${PGADMIN_DOMAIN} +PGADMIN_LETSENCRYPT_HOST=${PGADMIN_DOMAIN} +PGADMIN_LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL} + +# PgAdmin Configuration +PGADMIN_CONFIG_APP_NAME="'pgAdmin 4'" +PGADMIN_CONFIG_SERVER_MODE=${PGADMIN_CONFIG_SERVER_MODE} +PGADMIN_CONFIG_DEFAULT_SERVER="'127.0.0.1'" +PGADMIN_CONFIG_DEFAULT_SERVER_PORT=5050 +PGADMIN_CONFIG_MAX_SESSION_IDLE_TIME=120 +PGADMIN_CONFIG_MAX_QUERY_HIST_STORED=20 +# Security Settings +PGADMIN_CONFIG_PASSWORD_LENGTH_MIN=6 +PGADMIN_CONFIG_ALLOW_SAVE_PASSWORD=True +PGADMIN_CONFIG_ALLOW_SAVE_TUNNEL_PASSWORD=True +PGADMIN_CONFIG_MAX_LOGIN_ATTEMPTS=10 +# DB Configuration +PGADMIN_CONFIG_CONFIG_DATABASE_URI=${PGADMIN_DB_HOST} +PGADMIN_CONFIG_CONFIG_DATABASE_CONNECTION_POOL_SIZE=5 +# Load Shared Servers Configuration into DB +PGADMIN_SERVERS_JSON=${PGADMIN_SERVERS_JSON} + +# Authentication +PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL} +PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD} + +# PgAdmin SMTP Server +PGADMIN_CONFIG_MAIL_SERVER="'localhost'" +PGADMIN_CONFIG_MAIL_PORT=25 +PGADMIN_CONFIG_MAIL_USE_SSL=False +PGADMIN_CONFIG_MAIL_USE_TLS=False +PGADMIN_CONFIG_MAIL_USERNAME="''" +PGADMIN_CONFIG_MAIL_PASSWORD="''" +PGADMIN_CONFIG_MAIL_DEBUG=False +PGADMIN_CONFIG_SECURITY_EMAIL_SENDER="'$PGADMIN_DEFAULT_EMAIL'" + +# Dynamic PgAdmin Servers (Add as many as you need following copying these variables like {DB1}, {DB2}, DB3) +PGADMIN_DB1_NAME=Odoocker +PGADMIN_DB1_HOST=localhost +PGADMIN_DB1_PORT=5432 +PGADMIN_DB1_MAINTENANCE_DB=odoocker +PGADMIN_DB1_USERNAME=odoo +PGADMIN_DB1_TUNNEL_HOST=erp.odoocker.test +PGADMIN_DB1_TUNNEL_PORT=22 +PGADMIN_DB1_TUNNEL_USERNAME=ubuntu diff --git a/.gitignore b/.gitignore index d65093e..fbfe9ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ # Ignores the main configuration file. /.env +# Ignores the pgadmin private key +pgadmin/private_key + # Ignores the docker compose local or production environment. docker-compose.override.yml diff --git a/docker-compose.override.local.yml b/docker-compose.override.local.yml index 6c6c3d8..8a9c1a6 100644 --- a/docker-compose.override.local.yml +++ b/docker-compose.override.local.yml @@ -11,7 +11,7 @@ services: restart: 'no' ports: - 5432:5432 - + nginx: restart: 'no' diff --git a/docker-compose.pgadmin.yml b/docker-compose.pgadmin.yml index 2d55e15..7fccf84 100644 --- a/docker-compose.pgadmin.yml +++ b/docker-compose.pgadmin.yml @@ -1,7 +1,13 @@ services: pgadmin: - image: dpage/pgadmin4:${PGADMIN_TAG} - restart: unless-stopped + build: + context: ./ + dockerfile: ./pgadmin/Dockerfile + args: + - PGADMIN_TAG + depends_on: + - postgres + restart: 'no' expose: - 80 volumes: @@ -11,7 +17,27 @@ services: - PGADMIN_DEFAULT_PASSWORD - VIRTUAL_HOST=${PGADMIN_VIRTUAL_HOST} - LETSENCRYPT_HOST=${PGADMIN_LETSENCRYPT_HOST} - - LETSENCRYPT_EMAIL + - LETSENCRYPT_EMAIL=${PGADMIN_LETSENCRYPT_EMAIL} + - PGADMIN_CONFIG_APP_NAME + - PGADMIN_CONFIG_CONFIG_DATABASE_CONNECTION_POOL_SIZE + - PGADMIN_CONFIG_SERVER_MODE + - PGADMIN_CONFIG_DEFAULT_SERVER + - PGADMIN_CONFIG_DEFAULT_SERVER_PORT + - PGADMIN_CONFIG_PASSWORD_LENGTH_MIN + - PGADMIN_CONFIG_MAX_SESSION_IDLE_TIME + - PGADMIN_CONFIG_CONFIG_DATABASE_URI + - PGADMIN_CONFIG_ALLOW_SAVE_PASSWORD + - PGADMIN_CONFIG_MAX_QUERY_HIST_STORED + - PGADMIN_CONFIG_MAIL_SERVER + - PGADMIN_CONFIG_MAIL_PORT + - PGADMIN_CONFIG_MAIL_USE_SSL + - PGADMIN_CONFIG_MAIL_USE_TLS + - PGADMIN_CONFIG_MAIL_USERNAME + - PGADMIN_CONFIG_MAIL_PASSWORD + - PGADMIN_CONFIG_MAIL_DEBUG + - PGADMIN_CONFIG_SECURITY_EMAIL_SENDER + - PGADMIN_CONFIG_ALLOW_SAVE_TUNNEL_PASSWORD + - PGADMIN_CONFIG_MAX_LOGIN_ATTEMPTS networks: - internal diff --git a/docker-compose.yml b/docker-compose.yml index 171320c..cda6f9d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,16 +10,18 @@ services: - GITHUB_USER - GITHUB_ACCESS_TOKEN - ENTERPRISE_ADDONS + - THIRD_PARTY_ADDONS - LOG_PATH depends_on: - postgres tty: true volumes: - - data-dir:${DATA_DIR} + - odoo-data:${DATA_DIR} - ./odoo/extra-addons:${EXTRA_ADDONS} - ./odoo/custom-addons:${CUSTOM_ADDONS} - ./odoo/entrypoint.sh:/entrypoint.sh - ./odoo/odoorc.sh:/odoorc.sh + - ./odoo/third-party-addons.sh:/third-party-addons.sh env_file: - ./.env networks: @@ -27,8 +29,8 @@ services: postgres: build: - context: ./postgres - dockerfile: Dockerfile + context: ./ + dockerfile: ./postgres/Dockerfile args: - POSTGRES_TAG restart: unless-stopped @@ -41,9 +43,26 @@ services: - POSTGRES_USER - POSTGRES_PASSWORD - PGDATA + - DB_USER + - DB_TEMPLATE + - UNACCENT_TEMPLATE + - PGADMING_DB_NAME + - PGADMING_DB_USER + - PGADMIN_DB_PASSWORD networks: - internal + redis: + image: eqalpha/keydb:latest + platform: linux/amd64 + ports: + - 6379:6379 + restart: unless-stopped + networks: + - internal + volumes: + - redis-data:/var/lib/keydb + nginx: image: nginx:${NGINX_TAG} depends_on: @@ -83,8 +102,9 @@ services: - internal volumes: - data-dir: + odoo-data: pg-data: + redis-data: certs: vhost: html: diff --git a/nginx/default.conf b/nginx/default.conf index dcd7604..3d17cb8 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -22,11 +22,12 @@ server { } location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $host; proxy_pass http://odoo:8069; + proxy_redirect off; + 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; # Add CORS headers add_header 'Access-Control-Allow-Origin' $CORS_ALLOWED_DOMAIN; @@ -39,19 +40,14 @@ server { } } - location ~* /web/static/ { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $host; - proxy_pass http://odoo:8069; - } - location /websocket { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $remote_addr; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host; proxy_pass http://odoo:8072; + proxy_redirect off; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + 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; } } diff --git a/odoo/Dockerfile b/odoo/Dockerfile index 2b7724a..225809e 100644 --- a/odoo/Dockerfile +++ b/odoo/Dockerfile @@ -14,6 +14,7 @@ ARG LOG_PATH ARG GITHUB_USER ARG GITHUB_ACCESS_TOKEN ARG ENTERPRISE_ADDONS +ARG THIRD_PARTY_ADDONS ARG ODOO_RC ENV ODOO_TAG=${ODOO_TAG} \ @@ -21,6 +22,7 @@ ENV ODOO_TAG=${ODOO_TAG} \ GITHUB_USER=${GITHUB_USER} \ GITHUB_ACCESS_TOKEN=${GITHUB_ACCESS_TOKEN} \ ENTERPRISE_ADDONS=${ENTERPRISE_ADDONS} \ + THIRD_PARTY_ADDONS=${THIRD_PARTY_ADDONS} \ ODOO_RC=${ODOO_RC} #------------------------# @@ -55,6 +57,16 @@ RUN if [ -n "$GITHUB_USER" ] && [ -n "$GITHUB_ACCESS_TOKEN" ]; then \ git clone https://${GITHUB_USER}:${GITHUB_ACCESS_TOKEN}@github.com/odoo/enterprise.git ${ENTERPRISE_ADDONS} --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; \ fi +#-------------------------# +# Odoo Extra Addons # +#-------------------------# + +RUN mkdir -p ${THIRD_PARTY_ADDONS} && \ + chown odoo:odoo -R ${THIRD_PARTY_ADDONS} + +COPY --chown=odoo:odoo ./odoo/third-party-addons.sh / +RUN /third-party-addons.sh && chown odoo:odoo ${THIRD_PARTY_ADDONS} + #---------------------# # PIP Dependecies # #---------------------# @@ -64,7 +76,7 @@ RUN pip3 install --upgrade pip # Copy & Install PIP requirements COPY --chown=odoo:odoo ./odoo/requirements.txt /tmp/requirements.txt -RUN python3 -m pip install --upgrade -r /tmp/requirements.txt && \ +RUN python3 -m pip install -r /tmp/requirements.txt && \ rm /tmp/requirements.txt #---------------------# diff --git a/odoo/extra-addons/report_url/__manifest__.py b/odoo/extra-addons/odoocker_base/__manifest__.py similarity index 67% rename from odoo/extra-addons/report_url/__manifest__.py rename to odoo/extra-addons/odoocker_base/__manifest__.py index 061038e..4628660 100644 --- a/odoo/extra-addons/report_url/__manifest__.py +++ b/odoo/extra-addons/odoocker_base/__manifest__.py @@ -1,8 +1,8 @@ { - 'name': 'Report URL', - 'summary': 'Adds Report URL to Odoo Container', + 'name': 'Odoocker Base', + 'summary': 'Supercharge Odoo with Odoocker', 'description': ''' - Odoo Containers doesn't come with report.url param out of the box, so we add it for you to work with Odoocker. + Some Odoocker dependencies require to some custom values that we cover with this Addon for you. ''', 'version': '1.0.0', 'category': 'Technical', diff --git a/odoo/extra-addons/report_url/data/ir_config_parameter.xml b/odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml similarity index 100% rename from odoo/extra-addons/report_url/data/ir_config_parameter.xml rename to odoo/extra-addons/odoocker_base/data/ir_config_parameter.xml diff --git a/odoo/__manifest__.example.py b/odoo/manifest.example.py similarity index 91% rename from odoo/__manifest__.example.py rename to odoo/manifest.example.py index d514518..edc1080 100644 --- a/odoo/__manifest__.example.py +++ b/odoo/manifest.example.py @@ -48,6 +48,11 @@ # ... other qweb templates ], 'assets': { + 'web.assets_frontend': [ + 'module_name/static/src/js/file.js', + 'module_name/static/src/css/style.css' + # ... other assets + ], 'web.assets_backend': [ 'module_name/static/src/js/file.js', 'module_name/static/src/css/style.css' diff --git a/odoo/odoo.example.conf b/odoo/odoo.example.conf index 30d8ee5..bca84c4 100644 --- a/odoo/odoo.example.conf +++ b/odoo/odoo.example.conf @@ -1,4 +1,4 @@ -[options] +options] ;------------------------------------------; ; Options not exposed on the command line. ; ;------------------------------------------; @@ -66,7 +66,6 @@ xmlrpcs_port = {XMLRPCS_PORT} ; --gevent-port | --longpolling_port (deprecated) gevent_port = {GEVENT_PORT} -longpolling_port = False ; --no-http | --no-xmlrpc http_enable = {HTTP_ENABLE} @@ -215,7 +214,7 @@ dbfilter = {DBFILTER} ;------------------; ; Advanced options ; ;------------------; -; --dev (all, reload, qweb, werkzeug, sql, shell, assets, tests) +; --dev (all, reload, xml, qweb, werkzeug, sql, shell, assets, tests) dev_mode = {DEV_MODE} ; --shell-interface @@ -259,3 +258,34 @@ limit_time_real_cron = {LIMIT_TIME_REAL_CRON} ; --limit-request limit_request = {LIMIT_REQUEST} + +;-----------------------------; +; External Integrations ; +;-----------------------------; + +;-------------; +; Redis ; +;-------------; +; -- Possible values: 1 or true +ODOO_SESSION_REDIS = {ODOO_SESSION_REDIS} + +; -- Defaults to is localhost +ODOO_SESSION_REDIS_HOST = {ODOO_SESSION_REDIS_HOST} + +; -- Defaults to 6379 +ODOO_SESSION_REDIS_PORT = {ODOO_SESSION_REDIS_PORT} + +; -- Sets the password for the AUTH command (optional) +ODOO_SESSION_REDIS_PASSWORD = {ODOO_SESSION_REDIS_PASSWORD} + +; -- Alternative way to define the Redis server address like rediss:// protocol. +ODOO_SESSION_REDIS_URL = {ODOO_SESSION_REDIS_URL} + +; -- Prefix for the session keys (optional) +ODOO_SESSION_REDIS_PREFIX = {ODOO_SESSION_REDIS_PREFIX} + +; -- Time in seconds before expiration of the sessions (default is 7 days) +ODOO_SESSION_REDIS_EXPIRATION = {ODOO_SESSION_REDIS_EXPIRATION} + +; -- Time in seconds before expiration of the anonymous sessions (default is 3 hours) +ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS = {ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} diff --git a/odoo/odoorc.sh b/odoo/odoorc.sh index 4358e4f..db971c8 100755 --- a/odoo/odoorc.sh +++ b/odoo/odoorc.sh @@ -100,6 +100,15 @@ defaults=( [LIMIT_TIME_REAL]=${LIMIT_TIME_REAL} [LIMIT_TIME_REAL_CRON]=${LIMIT_TIME_REAL_CRON} [LIMIT_REQUEST]=${LIMIT_REQUEST} + + [ODOO_SESSION_REDIS]=${ODOO_SESSION_REDIS} + [ODOO_SESSION_REDIS_HOST]=${ODOO_SESSION_REDIS_HOST} + [ODOO_SESSION_REDIS_PORT]=${ODOO_SESSION_REDIS_PORT} + [ODOO_SESSION_REDIS_PASSWORD]=${ODOO_SESSION_REDIS_PASSWORD} + [ODOO_SESSION_REDIS_URL]=${ODOO_SESSION_REDIS_URL} + [ODOO_SESSION_REDIS_PREFIX]=${ODOO_SESSION_REDIS_PREFIX} + [ODOO_SESSION_REDIS_EXPIRATION]=${ODOO_SESSION_REDIS_EXPIRATION} + [ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS]=${ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} ) # Define the template @@ -172,7 +181,6 @@ xmlrpcs_port = {XMLRPCS_PORT} ; --gevent-port | --longpolling_port (deprecated) gevent_port = {GEVENT_PORT} -longpolling_port = False ; --no-http | --no-xmlrpc http_enable = {HTTP_ENABLE} @@ -321,7 +329,7 @@ dbfilter = {DBFILTER} ;------------------; ; Advanced options ; ;------------------; -; --dev +; --dev (all, reload, xml, qweb, werkzeug, sql, shell, assets, tests) dev_mode = {DEV_MODE} ; --shell-interface @@ -365,6 +373,38 @@ limit_time_real_cron = {LIMIT_TIME_REAL_CRON} ; --limit-request limit_request = {LIMIT_REQUEST} + +;-----------------------------; +; External Integrations ; +;-----------------------------; + +;-------------; +; Redis ; +;-------------; +; -- Possible values: 1 or true +ODOO_SESSION_REDIS = {ODOO_SESSION_REDIS} + +; -- Defaults to is localhost +ODOO_SESSION_REDIS_HOST = {ODOO_SESSION_REDIS_HOST} + +; -- Defaults to 6379 +ODOO_SESSION_REDIS_PORT = {ODOO_SESSION_REDIS_PORT} + +; -- Sets the password for the AUTH command (optional) +ODOO_SESSION_REDIS_PASSWORD = {ODOO_SESSION_REDIS_PASSWORD} + +; -- Alternative way to define the Redis server address like rediss:// protocol. +ODOO_SESSION_REDIS_URL = {ODOO_SESSION_REDIS_URL} + +; -- Prefix for the session keys (optional) +ODOO_SESSION_REDIS_PREFIX = {ODOO_SESSION_REDIS_PREFIX} + +; -- Time in seconds before expiration of the sessions (default is 7 days) +ODOO_SESSION_REDIS_EXPIRATION = {ODOO_SESSION_REDIS_EXPIRATION} + +; -- Time in seconds before expiration of the anonymous sessions (default is 3 hours) +ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS = {ODOO_SESSION_REDIS_EXPIRATION_ANONYMOUS} + EOF ) diff --git a/odoo/requirements.txt b/odoo/requirements.txt index fb6626a..759b3e9 100644 --- a/odoo/requirements.txt +++ b/odoo/requirements.txt @@ -1,2 +1,3 @@ debugpy websocket-client +redis diff --git a/odoo/third-party-addons.sh b/odoo/third-party-addons.sh new file mode 100755 index 0000000..a5d82d9 --- /dev/null +++ b/odoo/third-party-addons.sh @@ -0,0 +1,2 @@ +git clone https://github.com/camptocamp/odoo-cloud-platform.git --depth 1 --branch ${ODOO_TAG} --single-branch --no-tags; +cp -r odoo-cloud-platform/session_redis ${THIRD_PARTY_ADDONS}/session_redis diff --git a/pgadmin/Dockerfile b/pgadmin/Dockerfile new file mode 100644 index 0000000..7ad3adc --- /dev/null +++ b/pgadmin/Dockerfile @@ -0,0 +1,32 @@ +#------------------------# +# PGAdmin Server # +#------------------------# +ARG PGADMIN_TAG +FROM dpage/pgadmin4:${PGADMIN_TAG} + +# Receive ARGs from docker-compose.yml & convert them into ENVs +ARG PGADMIN_DEFAULT_EMAIL + +ENV PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL} + +# Switch to root user +USER root + +# Install bash +RUN apk add --no-cache bash jq sqlite + +# Conditionally copy the private key if it exists +COPY --chown=pgadmin:root ./pgadmin/private_key /pgadmin4/private_key +# Set permissions for the private key + +# Copy your script file into the Docker image +COPY --chown=pgadmin:root ./.env / +COPY ./pgadmin/start_pgadmin.sh /var/lib/pgadmin/start_pgadmin.sh + +# Make the script executable +RUN chmod +x /var/lib/pgadmin/start_pgadmin.sh +# Run your script +RUN /var/lib/pgadmin/start_pgadmin.sh + +# Expose the necessary port +EXPOSE 80 diff --git a/pgadmin/start_pgadmin.sh b/pgadmin/start_pgadmin.sh new file mode 100755 index 0000000..3a0d7fe --- /dev/null +++ b/pgadmin/start_pgadmin.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +set -e + +# Source environment variables +set -a +source /.env +set +a + +# Check if PGADMIN_DEFAULT_EMAIL is set +if [[ -z $PGADMIN_DEFAULT_EMAIL ]]; then + echo "PGADMIN_DEFAULT_EMAIL is not set. Exiting..." + exit 1 +fi + +# Modify the email to replace @ with _ +DIR_NAME="/var/lib/pgadmin/storage/${PGADMIN_DEFAULT_EMAIL//@/_}" + +# Create the directory using the modified name +mkdir -p "$DIR_NAME" + +cp /pgadmin4/private_key "$DIR_NAME/private_key" +chown -R pgadmin:root "$DIR_NAME/private_key" + +# Generate JSON for each matching variable +DB_PATH="/var/lib/pgadmin/pgadmin4.db" +json_output="{\"Servers\":{" +index=1 +while true; do + name_var="PGADMIN_DB${index}_NAME" + if [[ -z ${!name_var} ]]; then + break + fi + + host_var="PGADMIN_DB${index}_HOST" + port_var="PGADMIN_DB${index}_PORT" + maintenance_db_var="PGADMIN_DB${index}_MAINTENANCE_DB" + username_var="PGADMIN_DB${index}_USERNAME" + tunnel_host_var="PGADMIN_DB${index}_TUNNEL_HOST" + tunnel_port_var="PGADMIN_DB${index}_TUNNEL_PORT" + tunnel_username_var="PGADMIN_DB${index}_TUNNEL_USERNAME" + + json_output+="\"$index\":$(jq -n \ + --arg name "${!name_var}" \ + --arg host "${!host_var:-localhost}" \ + --arg port "${!port_var:-5432}" \ + --arg db "${!maintenance_db_var:-${!name_var}}" \ + --arg username "${!username_var:-odoo}" \ + --arg thost "${!tunnel_host_var}" \ + --arg tport "${!tunnel_port_var:-22}" \ + --arg tuser "${!tunnel_username_var:-ubuntu}" \ + '{ + "Name": $name, + "Group": "Servers", + "Host": $host, + "Port": $port|tonumber, + "MaintenanceDB": $db, + "Username": $username, + "UseSSHTunnel": 1, + "TunnelHost": $thost, + "TunnelPort": $tport, + "TunnelUsername": $tuser, + "TunnelAuthentication": 1, + "KerberosAuthentication": false, + "ConnectionParameters": { + "sslmode": "prefer", + "connect_timeout": 10, + "sslcert": "'"$DIR_NAME"'/.postgresql/postgresql.crt", + "sslkey": "'"$DIR_NAME"'/.postgresql/postgresql.key" + }, + "Shared": true + }')," + + index=$((index + 1)) +done + +# Remove trailing comma and close JSON braces +json_output=${json_output%,} +json_output+="}}" + +# Save the well-formatted JSON to a file using jq +if [[ $PGADMIN_SERVERS_JSON ]]; then + echo $json_output | jq '.' > "$PGADMIN_SERVERS_JSON" + + # Make the Servers.json file readable for all users + chmod 755 "/pgadmin4/servers.json" + + echo "JSON configuration saved to $DIR_NAME/servers.json" +fi diff --git a/postgres/Dockerfile b/postgres/Dockerfile index 94227e6..3eb39ed 100644 --- a/postgres/Dockerfile +++ b/postgres/Dockerfile @@ -8,8 +8,11 @@ FROM postgres:${POSTGRES_TAG} RUN apt-get update && apt-get install -y \ # Unaccent extension dependencies postgresql-contrib \ + apt-utils \ # Clean up the apt cache to reduce the image size && rm -rf /var/lib/apt/lists/* +COPY --chown=postgres:postgres ./.env / + # Copy the script to create the unaccent template -COPY ./entrypoint.sh /docker-entrypoint-initdb.d/entrypoint.sh +COPY ./postgres/entrypoint.sh /docker-entrypoint-initdb.d/entrypoint.sh diff --git a/postgres/entrypoint.sh b/postgres/entrypoint.sh index de38ff1..b232538 100755 --- a/postgres/entrypoint.sh +++ b/postgres/entrypoint.sh @@ -1,3 +1,32 @@ -psql -p 5432 -U odoo -d postgres -c "CREATE DATABASE unaccent_template WITH TEMPLATE = template0" -psql -p 5432 -U odoo -d postgres -c "\\c unaccent_template" -psql -p 5432 -U odoo -d postgres -c "CREATE EXTENSION IF NOT EXISTS unaccent;" +#!/bin/bash + +set -e + +# Source environment variables +set -a +source /.env +set +a + +# Create the $DB_TEMPLATE database +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "CREATE DATABASE $DB_TEMPLATE WITH TEMPLATE = template0;" +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "\\c $DB_TEMPLATE;" +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "CREATE EXTENSION IF NOT EXISTS unaccent;" + +# Create Odoo user and give proper privileges +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';" +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "ALTER USER $DB_USER CREATEDB;" + +# Give Odoo user access to copy $DB_TEMPLATE +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "GRANT ALL PRIVILEGES ON DATABASE $DB_TEMPLATE TO $DB_USER;" +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $DB_TEMPLATE -c "ALTER DATABASE $DB_TEMPLATE OWNER TO $DB_USER;" + +# Create PgAdmin user and give proper privileges +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "CREATE DATABASE $PGADMING_DB_NAME;" +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "CREATE USER $PGADMING_DB_USER WITH PASSWORD '$PGADMIN_DB_PASSWORD';" +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "GRANT ALL PRIVILEGES ON DATABASE $PGADMING_DB_NAME TO $PGADMING_DB_USER;" +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $PGADMING_DB_NAME -c "GRANT ALL PRIVILEGES ON SCHEMA public TO $PGADMING_DB_USER;" + +# Revoke Odoo user's access to pgadmin database +psql -p $POSTGRES_PORT -U $POSTGRES_MAIN_USER -d $POSTGRES_DB -c "REVOKE CONNECT ON DATABASE $PGADMING_DB_NAME FROM $DB_USER;" + +echo "Setup completed."