Merge pull request #2 from codeagencybe/feat/keydb-cache

Code Agency | Feature | KeyDB (Redis) Integration+ PgAdmin Upgrades
This commit is contained in:
Yhael S
2023-09-30 03:27:14 -06:00
committed by GitHub
18 changed files with 429 additions and 59 deletions

View File

@@ -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

3
.gitignore vendored
View File

@@ -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

View File

@@ -11,7 +11,7 @@ services:
restart: 'no'
ports:
- 5432:5432
nginx:
restart: 'no'

View File

@@ -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

View File

@@ -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:

View File

@@ -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;
}
}

View File

@@ -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
#---------------------#

View File

@@ -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',

View File

@@ -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'

View File

@@ -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}

View File

@@ -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
)

View File

@@ -1,2 +1,3 @@
debugpy
websocket-client
redis

2
odoo/third-party-addons.sh Executable file
View File

@@ -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

32
pgadmin/Dockerfile Normal file
View File

@@ -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

89
pgadmin/start_pgadmin.sh Executable file
View File

@@ -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

View File

@@ -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

View File

@@ -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."