diff --git a/docker-compose.yml b/docker-compose.yml old mode 100755 new mode 100644 index ecc4706..67c48ee --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,37 +1,93 @@ -# AUTHOR: Kris -# NOTE: -# Permission fix for linux based operating systems (If you are using local-space instead of mounted volumes). -# sudo chown -R 1000:1000 ./n8n_data -# sudo chmod 755 ./n8n_data -# then, restart docker compose container -# This configuration is set to mounted volume by default. +volumes: + db_storage: + n8n_storage: + redis_storage: + +x-shared: &shared + restart: unless-stopped + image: docker.n8n.io/n8nio/n8n + environment: + - DB_TYPE=postgresdb + - DB_POSTGRESDB_HOST=n8n_postgres + - DB_POSTGRESDB_PORT=5432 + - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} + - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} + - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} + - EXECUTIONS_MODE=queue + - QUEUE_BULL_REDIS_HOST=n8n_redis + - QUEUE_HEALTH_CHECK_ACTIVE=true + - N8N_ENCRYPTION_KEY=${ENCRYPTION_KEY} + - N8N_HOST=${N8N_HOST} + - WEBHOOK_URL=${N8N_WEBHOOK_URL} + - N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL} + - N8N_RUNNERS_ENABLED=true + - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true + - OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true + links: + - n8n_postgres + - n8n_redis + volumes: + - n8n_storage:/home/node/.n8n + depends_on: + n8n_redis: + condition: service_healthy + n8n_postgres: + condition: service_healthy services: - n8n: - image: n8nio/n8n:stable - container_name: n8n - ports: - - "5678:${N8N_PORT}" - user: "1000:1000" - environment: - - N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE} - - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER} - - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD} - - N8N_HOST=${N8N_HOST} - - N8N_PORT=${N8N_PORT} - - N8N_PROTOCOL=${N8N_PROTOCOL} - - N8N_EDITOR_BASE_URL=${N8N_EDITOR_BASE_URL} - - TZ=${TZ} - # For security. Set default values for the following environment variables. - - N8N_RUNNERS_ENABLED=true - - N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true - volumes: - - n8n_data:/home/node/.n8n:rw + n8n_postgres: + container_name: n8n_postgres + image: postgres:16 restart: unless-stopped + environment: + - POSTGRES_USER + - POSTGRES_PASSWORD + - POSTGRES_DB + - POSTGRES_NON_ROOT_USER + - POSTGRES_NON_ROOT_PASSWORD + volumes: + - db_storage:/var/lib/postgresql/data + - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh + healthcheck: + test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}'] + interval: 5s + timeout: 5s + retries: 10 + deploy: + resources: + limits: + cpus: "${POSTGRES_LIMIT_CPUS}" + memory: "${POSTGRES_LIMIT_MEMORY}" + reservations: + cpus: "${POSTGRES_RESERVE_CPUS}" + memory: "${POSTGRES_RESERVE_MEMORY}" - # We do this since we are not autoscaling. - # We can autoscale with kubernetes or k8s in the future. - # This is to prevent your host PC or VPS from draining its resources. + n8n_redis: + container_name: n8n_redis + image: redis:6-alpine + restart: unless-stopped + volumes: + - redis_storage:/data + healthcheck: + test: ['CMD', 'redis-cli', 'ping'] + interval: 5s + timeout: 5s + retries: 10 + deploy: + resources: + limits: + cpus: "${REDIS_LIMIT_CPUS}" + memory: "${REDIS_LIMIT_MEMORY}" + reservations: + cpus: "${REDIS_RESERVE_CPUS}" + memory: "${REDIS_RESERVE_MEMORY}" + + n8n_main: + <<: *shared + restart: unless-stopped + container_name: n8n_main + ports: + - ${N8N_PORT}:5678 deploy: resources: limits: @@ -41,5 +97,19 @@ services: cpus: "${N8N_RESERVE_CPUS}" memory: "${N8N_RESERVE_MEMORY}" -volumes: - n8n_data: + n8n_worker: + <<: *shared + restart: unless-stopped + container_name: n8n_worker + command: worker + depends_on: + - n8n_main + deploy: + resources: + limits: + cpus: "${N8N_WORKER_LIMIT_CPUS}" + memory: "${N8N_WORKER_LIMIT_MEMORY}" + reservations: + cpus: "${N8N_WORKER_RESERVE_CPUS}" + memory: "${N8N_WORKER_RESERVE_MEMORY}" + \ No newline at end of file diff --git a/env.default b/env.default index 05b947e..7ee16e7 100644 --- a/env.default +++ b/env.default @@ -1,23 +1,47 @@ -# Rename to ".env" -# ----- System Variables -N8N_BASIC_AUTH_ACTIVE=true -N8N_BASIC_AUTH_USER=admin -N8N_BASIC_AUTH_PASSWORD=changeme -N8N_HOST=localhost -N8N_PORT=5678 -N8N_PROTOCOL=http -N8N_EDITOR_BASE_URL=http://localhost:5678 -TZ=Asia/Manila +POSTGRES_USER=changethis +POSTGRES_PASSWORD=changethis +POSTGRES_DB=n8n +POSTGRES_NON_ROOT_USER=changethis +POSTGRES_NON_ROOT_PASSWORD=changethis +ENCRYPTION_KEY=changethis +N8N_HOST=localhost +N8N_WEBHOOK_URL=http://localhost:5678/ +N8N_EDITOR_BASE_URL=http://localhost:5678 +N8N_PORT=5678 # ----- Resources + +# --- N8N # - Limits N8N_LIMIT_CPUS=0.25 N8N_LIMIT_MEMORY=512MB - # - Reservations N8N_RESERVE_CPUS=0.25 N8N_RESERVE_MEMORY=512MB +# --- N8N Worker +# - Limits +N8N_WORKER_LIMIT_CPUS=0.25 +N8N_WORKER_LIMIT_MEMORY=256MB +# - Reservations +N8N_WORKER_RESERVE_CPUS=0.25 +N8N_WORKER_RESERVE_MEMORY=256MB + +# --- Redis +# - Limits +REDIS_LIMIT_CPUS=0.25 +REDIS_LIMIT_MEMORY=128MB +# - Reservations +REDIS_RESERVE_CPUS=0.25 +REDIS_RESERVE_MEMORY=128MB + +# --- Postgres +# - Limits +POSTGRES_LIMIT_CPUS=0.25 +POSTGRES_LIMIT_MEMORY=256MB +# - Reservations +POSTGRES_RESERVE_CPUS=0.25 +POSTGRES_RESERVE_MEMORY=256MB \ No newline at end of file diff --git a/init-data.sh b/init-data.sh new file mode 100644 index 0000000..7f2e382 --- /dev/null +++ b/init-data.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e; + + +if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}'; + GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER}; + GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER}; + EOSQL +else + echo "SETUP INFO: No Environment variables given!" +fi \ No newline at end of file