Hello there,
anybody was able to deploy Frappe CRM and ERPNext via Coolify on his VPS?
Any suggestions?
Thanks
Hello there,
anybody was able to deploy Frappe CRM and ERPNext via Coolify on his VPS?
Any suggestions?
Thanks
Hello,
Use go to coolify.africa, create new Docker Based application with Docker Image and put in frappe/erpnext:version-15 on the name, then click next and create. It will pull docker with erpnext version and install it to your coolify.africa domain.
use empty docker compose
services:
backend:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
healthcheck:
test: |
curl --fail -H “Host: $$FRAPPE_SITE_NAME_HEADER” http://localhost:8000/api/method/ping | jq ‘.message == “pong”’ | grep true || exit 1
deploy:
restart_policy:
condition: on-failure
environment:
FRAPPE_SITE_NAME_HEADER: my-erpnext
# Coolify does not pick up these interpolation variables from the image: key,
# so we need to set them here. They are not used by any command in the container.
ERPNEXT_IMAGE: ${ERPNEXT_IMAGE:-frappe/erpnext}
ERPNEXT_IMAGE_TAG: ${ERPNEXT_IMAGE_TAG:-latest}
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
configurator:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
deploy:
restart_policy:
condition: none
exclude_from_hc: true
entrypoint:
- bash
- -c
# add redis_socketio for backward compatibility
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 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
DB_PORT: “3306”
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
createsite:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
deploy:
restart_policy:
condition: none
exclude_from_hc: true
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
entrypoint:
- bash
- -c
command:
- >
wait-for-it -t 120 db:3306;
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 --no-mariadb-socket
–admin-password=$$ADMIN_PASSWORD
–db-root-password=$$MARIADB_ROOT_PW
–install-app erpnext
–set-default
my-erpnext;
environment:
- ADMIN_PASSWORD=${SERVICE_PASSWORD_CREATESITE}
- MARIADB_ROOT_PW=${SERVICE_PASSWORD_DB}
db:
image: mariadb:10.6
healthcheck:
test: mysqladmin ping -h localhost --password=‘$$MYSQL_ROOT_PASSWORD’
interval: 1s
retries: 20
deploy:
restart_policy:
condition: on-failure
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --skip-character-set-client-handshake
- --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6
environment:
- MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_DB}
volumes:
- db-data:/var/lib/mysql
frontend:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
depends_on:
- websocket
deploy:
restart_policy:
condition: on-failure
command:
- nginx-entrypoint.sh
healthcheck:
test: |
curl --fail -H “Host: $$FRAPPE_SITE_NAME_HEADER” http://localhost:8080/api/method/ping | jq ‘.message == “pong”’ | grep true || exit 1
environment:
BACKEND: backend:8000
SOCKETIO: websocket:9000
FRAPPE_SITE_NAME_HEADER: my-erpnext
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
SERVICE_FQDN_FRONTEND_8080:
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
queue-worker-long:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
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-worker-short:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
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
deploy:
restart_policy:
condition: on-failure
healthcheck:
test: redis-cli ping
interval: 5s
retries: 10
timeout: 2s
volumes:
- redis-queue-data:/data
redis-cache:
image: redis:6.2-alpine
deploy:
restart_policy:
condition: on-failure
healthcheck:
test: redis-cli ping
interval: 5s
retries: 10
timeout: 2s
volumes:
- redis-cache-data:/data
scheduler:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
deploy:
restart_policy:
condition: on-failure
command:
- bench
- schedule
volumes:
- sites:/home/frappe/frappe-bench/sites
- logs:/home/frappe/frappe-bench/logs
websocket:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
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
migration:
image: “${ERPNEXT_IMAGE}:${ERPNEXT_IMAGE_TAG}”
deploy:
restart_policy:
condition: none
exclude_from_hc: true
entrypoint: [“bash”, “-c”]
command:
- |
bench --site all set-config -p maintenance_mode 1
bench --site all set-config -p pause_scheduler 1
bench --site all migrate
bench --site all set-config -p maintenance_mode 0
bench --site all set-config -p pause_scheduler 0
volumes:
- sites:/home/frappe/frappe-bench/sites
volumes:
db-data:
redis-queue-data:
redis-cache-data:
sites:
logs:
@ralfdigitalagency you can also add any other image or your on image on line 2 inside the part which starts with container after the :-