Docker Compse Deployment with External MariaDB

Good morning,

I have been having, what seems like a simple, issue getting ERPNext deployed using a remote MariaDB via docker compose for a few days now. The issue I’m running into is
pymysql.err.OperationalError: (1819, ‘Your password does not satisfy the current policy requirements: [Include special characters]’)
I can confirm my password has special characters in it and they are escaped with a backslash in the command section within the create-site-1 container. I have done THOROUGH research and have tried everything I could find but still end up with the same result. I think the compose is trying to create a new DB instead f connect with the remote DB, despite me having a preconfigured common_site_config.json file in the /sites/_data directory. I’m using the pwd.yml compose file from the frappe_docker github repo with the db container service removed. The backend and configurator container services environment variables have been updated to include db_name, db_user, db_password, db_type. I have also added bench set-config variable sets for each of these new variables in the configurator command section. I have modified the bench new-site command in the create-site-1 container to:
bench new-site SITE --force --db-type mariadb --db-host DB IP --db-port DB PORT --db-name DB NAME --mariadb-root-username DB ROOT USER --mariadb-root-password DB PASSWORD --admin-password admin --install-app erpnext;

Could someone spot what I’m obviously missing and help me get this deployed???

Hi,

It might help to post your pwd, redact the database ip and password. and anything else that is sensitive.

In your backend container try: mysql -h(ip.of.the.server) -u(username) -p(password) to make sure the connection is succeeding and the character escaping is working.

Yes, I’m able to connect to the db from the backend container’s cli. Here is the pwd.yml file I’m using:

services:
backend:
image: frappe/erpnext:v15.48.2
networks:
- frappe
deploy:
restart_policy:
condition: on-failure
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
environment:
DB_HOST: ‘db_ip-address’
DB_PORT: ‘db_port’
DB_NAME: ‘db_name’
DB_USER: ‘db_user’
DB_PASSWORD: ‘db_password’
DB_TYPE: mariadb

configurator:
image: frappe/erpnext:v15.48.2
networks:
- frappe
deploy:
restart_policy:
condition: none
entrypoint:
- bash
- -c
command:
- >
ls -1 apps > sites/apps.txt;
bench set-config -g db_host $$DB_HOST;
bench set-config -gp db_port $$DB_PORT;
bench set-config -g db_name $$DB_NAME;
bench set-config -g db_user $$DB_USER;
bench set-config -g db_password $$DB_PASSWORD;
bench set-config -g db_type $$DB_TYPE;
bench set-config -g redis_cache “redis://$$REDIS_CACHE”;
bench set-config -g redis_queue “redis://$$REDIS_QUEUE”;
bench set-config -g redis_socketio “redis://$$REDIS_QUEUE”;
bench set-config -gp socketio_port $$SOCKETIO_PORT;
environment:
DB_HOST: ‘db_ip-address’
DB_PORT: ‘db_port’
DB_NAME: ‘db_name’
DB_USER: ‘db_user’
DB_PASSWORD: ‘db_password’
DB_TYPE: “mariadb”
REDIS_CACHE: redis-cache:6379
REDIS_QUEUE: redis-queue:6379
SOCKETIO_PORT: “9000”
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

create-site:
image: frappe/erpnext:v15.48.2
networks:
- frappe
deploy:
restart_policy:
condition: none
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
entrypoint:
- bash
- -c
command:
- >
wait-for-it -t 120 'db_ip-address:db_port;
wait-for-it -t 120 redis-cache:6379;
wait-for-it -t 120 redis-queue:6379;
export start=date +%s;
until [[ -n grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty" ]] &&
[[ -n grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty" ]] &&
[[ -n grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty" ]];
do
echo “Waiting for sites/common_site_config.json to be created”;
sleep 5;
if (( date +%s-start > 120 )); then
echo “could not find sites/common_site_config.json with required keys”;
exit 1
fi
done;
echo “sites/common_site_config.json found”;
bench new-site SITE --db-name DB_NAME --db-root-username DB_ROOT_USER --db-root-password DB_ROOT_PASSWORD --db-host DB_IP-ADDRESS --db-port DB_PORT --admin-password admin --install-app erpnext --force;

frontend:
image: frappe/erpnext:v15.48.2
networks:
- frappe
depends_on:
- websocket
deploy:
restart_policy:
condition: on-failure
command:
- nginx-entrypoint.sh
environment:
BACKEND: backend:8000
FRAPPE_SITE_NAME_HEADER:
SOCKETIO: websocket:9000
UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1
UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
UPSTREAM_REAL_IP_RECURSIVE: “off”
PROXY_READ_TIMEOUT: 120
CLIENT_MAX_BODY_SIZE: 50m
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
ports:
- “8080:8080”

queue-long:
image: frappe/erpnext:v15.48.2
networks:
- frappe
deploy:
restart_policy:
condition: on-failure
command:
- bench
- worker
- --queue
- long,default,short
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

queue-short:
image: frappe/erpnext:v15.48.2
networks:
- frappe
deploy:
restart_policy:
condition: on-failure
command:
- bench
- worker
- --queue
- short,default
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

redis-queue:
image: redis:6.2-alpine
networks:
- frappe
deploy:
restart_policy:
condition: on-failure
volumes:
- redis-queue-data:/data

redis-cache:
image: redis:6.2-alpine
networks:
- frappe
deploy:
restart_policy:
condition: on-failure
volumes:
- redis-cache-data:/data

scheduler:
image: frappe/erpnext:v15.48.2
networks:
- frappe
deploy:
restart_policy:
condition: on-failure
command:
- bench
- schedule
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

websocket:
image: frappe/erpnext:v15.48.2
networks:
- frappe
deploy:
restart_policy:
condition: on-failure
command:
- node
- /home/frappe/frappe-bench/apps/frappe/socketio.js
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs

volumes:
db-data:
redis-queue-data:
redis-cache-data:
sites:
logs:

networks:
frappe:
driver: bridge

There’s probably better ways to troubleshoot it, but maybe try : docker compose exec backend bench new-site (add the parameters verbatim) and see if it succeeds. If it does, you’ll know the yml has syntax issues.

what are the logs of this container.

The bench set-config command may not executed properly due to special characters?

check the command for that container how it is executed, you can change it as you need.

Same result so I can conclude there isn’t a syntax issue isolated to the .yml file

the configurator isn’t generating a log BUT it does exit with code - 0 AND I can tell the bench set-config is being executed properly because the common_site_config,json file contains the correct variables.

Does your db setup needs strong password?

I don’t have any plugins for password requirements in my DB.

Setup MariaDB Server · frappe/frappe Wiki · GitHub works for me.

Official MariaDB containers and bitnami/mariadb containers also work.

Using Frappe with Amazon RDS (or any other DBaaS) · frappe/frappe Wiki · GitHub works with AWS RDS MariaDB.

If you enter the container and mysql -h , -u, -p and it works, but with the same values in docker compose ( not DB_User etc, the actual username and password) the same pymysql error 1819 results?

I’m wondering if Mariadb has different escape characters or the ` and ’ are mixed up?

I don’t think so because I have deployed the pwd.yml directly from the github repo (using the db service container). The ONLY change I made was the root password that has special characters escaped with a back slash and the deployment works without ANY issues.

The “Setup MariaDB Server” is for an Ubuntu host OS whereas my MariaDB is hosted on my Synology NAS. Also, according to the create-site-1 container log, the connection to my MariaDB is successful but I’m still being met with the password requirements error. This is what confuses me.
The “Using Frappe with Amazon…” Wiki relies on the “common_site_config.json” file in the “sites” directory which I have pre-configured for the frappe bench to grab during deployment.