diff --git a/.env.example b/.env.example index 69f7ecc..c9d2947 100644 --- a/.env.example +++ b/.env.example @@ -1,20 +1,29 @@ -# PostgreSQL Configuration +# ============================= +# Development Environment +# ============================= +# PostgreSQL (development) POSTGRES_USER=temporal POSTGRES_PASSWORD=temporal POSTGRES_DB=temporal POSTGRES_PORT=5432 +POSTGRES_DB_N8N=n8n +POSTGRES_USER_N8N=n8n +POSTGRES_PASSWORD_N8N=n8n_password +POSTGRES_DB_TEMPORAL=temporal +POSTGRES_USER_TEMPORAL=temporal +POSTGRES_PASSWORD_TEMPORAL=temporal -# n8n Configuration +# n8n (development) N8N_WEBHOOK_URL=http://localhost:5678/ N8N_ENCRYPTION_KEY=a_random_string_for_encryption N8N_PORT=5678 N8N_HOST=n8n.example.com -# OpenSearch Configuration +# OpenSearch (development) DISABLE_SECURITY_PLUGIN=true OPENSEARCH_PORT=9200 -# Temporal Configuration +# Temporal (development) TEMPORAL_PORT=7233 TEMPORAL_UI_PORT=8080 @@ -26,3 +35,28 @@ OAUTH2_PROXY_REDIRECT_URL=https://your-domain/oauth2/callback # GitHub MCP Server configuration GITHUB_PERSONAL_ACCESS_TOKEN=github_access_token + +# ============================= +# Production Environment +# ============================= +# n8n (production) +N8N_WEBHOOK_URL= +N8N_ENCRYPTION_KEY= +N8N_HOST= +POSTGRES_HOST= +POSTGRES_PORT=5432 +POSTGRES_DB_N8N= +POSTGRES_USER_N8N= +POSTGRES_PASSWORD_N8N= + +# opensearch (production) +OPENSEARCH_PORT=9200 + +# temporal (production) +TEMPORAL_PORT=7233 + +# temporal-ui (production) +TEMPORAL_UI_PORT=8080 +POSTGRES_DB_TEMPORAL= +POSTGRES_USER_TEMPORAL= +POSTGRES_PASSWORD_TEMPORAL= diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 4e6efea..e60a760 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,26 +1,43 @@ services: n8n: + depends_on: !reset null environment: - WEBHOOK_URL=${N8N_WEBHOOK_URL:?N8N_WEBHOOK_URL is required} - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY:?N8N_ENCRYPTION_KEY is required} - - N8N_HOST=n8n.speedandfunction.com + - N8N_HOST=${N8N_HOST:?N8N_HOST is required} + - DB_POSTGRESDB_HOST=${POSTGRES_HOST:?POSTGRES_HOST is required} + - DB_POSTGRESDB_PORT=${POSTGRES_PORT:-5432} + - DB_POSTGRESDB_DATABASE=${POSTGRES_DB_N8N:?POSTGRES_DB_N8N is required} + - DB_POSTGRESDB_USER=${POSTGRES_USER_N8N:?POSTGRES_USER_N8N is required} + - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD_N8N:?POSTGRES_PASSWORD_N8N is required} opensearch: environment: - OPENSEARCH_PORT=${OPENSEARCH_PORT:?OPENSEARCH_PORT is required} - postgresql: - environment: - - POSTGRES_USER=${POSTGRES_USER:?POSTGRES_USER is required} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} - - POSTGRES_DB=${POSTGRES_DB:?POSTGRES_DB is required} + postgresql: !reset null temporal: + depends_on: !reset null environment: - TEMPORAL_PORT=${TEMPORAL_PORT:?TEMPORAL_PORT is required} + - POSTGRES_SEEDS=${POSTGRES_HOST:?POSTGRES_HOST is required} + - DB_PORT=${POSTGRES_PORT:-5432} + - DBNAME=${POSTGRES_DB_TEMPORAL:?POSTGRES_DB_TEMPORAL is required} + - POSTGRES_USER=${POSTGRES_USER_TEMPORAL:?POSTGRES_USER_TEMPORAL is required} + - POSTGRES_PWD=${POSTGRES_PASSWORD_TEMPORAL:?POSTGRES_PASSWORD_TEMPORAL is required} + - ES_SEEDS=opensearch + - ES_VERSION=v7 + - DB=postgresql + - ENABLE_ES=true temporal-ui: environment: - TEMPORAL_UI_PORT=${TEMPORAL_UI_PORT:?TEMPORAL_UI_PORT is required} + - POSTGRES_SEEDS=${POSTGRES_HOST:?POSTGRES_HOST is required} + - DB_PORT=${POSTGRES_PORT:-5432} + - DBNAME=${POSTGRES_DB_TEMPORAL:?POSTGRES_DB_TEMPORAL is required} + - POSTGRES_USER=${POSTGRES_USER_TEMPORAL:?POSTGRES_USER_TEMPORAL is required} + - POSTGRES_PWD=${POSTGRES_PASSWORD_TEMPORAL:?POSTGRES_PASSWORD_TEMPORAL is required} ports: !reset [] oauth2-proxy: @@ -92,9 +109,3 @@ volumes: type: none o: bind device: /data/opensearch - postgresql-data: - driver: local - driver_opts: - type: none - o: bind - device: /data/postgresql diff --git a/docker-compose.yml b/docker-compose.yml index 23e1123..7af8132 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,6 +8,9 @@ services: restart: unless-stopped ports: - "${N8N_PORT:-5678}:5678" + depends_on: + postgresql: + condition: service_healthy environment: - WEBHOOK_URL=${N8N_WEBHOOK_URL:-http://localhost:5678/} - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY:-a_random_string_for_encryption} @@ -18,6 +21,14 @@ services: - N8N_METRICS=true - N8N_HEALTH_CHECK_ENDPOINT=true - N8N_EXPRESS_TRUST_PROXY=true + - DB_TYPE=postgresdb + - DB_POSTGRESDB_HOST=postgresql + - DB_POSTGRESDB_PORT=5432 + - DB_POSTGRESDB_DATABASE=${POSTGRES_DB_N8N:-n8n} + - DB_POSTGRESDB_USER=${POSTGRES_USER_N8N:-n8n} + - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD_N8N:-n8n_password} + - N8N_LOG_LEVEL=debug + - N8N_LOG_OUTPUT=console volumes: - n8n_data:/home/node/.n8n networks: @@ -64,18 +75,23 @@ services: image: postgres:14 restart: unless-stopped environment: - POSTGRES_USER: ${POSTGRES_USER:-temporal} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-temporal} - POSTGRES_DB: ${POSTGRES_DB:-temporal} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_DB_N8N: ${POSTGRES_DB_N8N:-n8n} + POSTGRES_USER_N8N: ${POSTGRES_USER_N8N:-n8n} + POSTGRES_PASSWORD_N8N: ${POSTGRES_PASSWORD_N8N:-n8n_password} + POSTGRES_DB_TEMPORAL: ${POSTGRES_DB_TEMPORAL:-temporal} + POSTGRES_USER_TEMPORAL: ${POSTGRES_USER_TEMPORAL:-temporal} + POSTGRES_PASSWORD_TEMPORAL: ${POSTGRES_PASSWORD_TEMPORAL:-temporal} ports: - ${POSTGRES_PORT:-5432}:5432 volumes: - postgresql-data:/var/lib/postgresql/data + - ./scripts/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh networks: - app-network user: postgres healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-temporal}"] + test: ["CMD-SHELL", "psql -U ${POSTGRES_USER_N8N:-n8n} -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname='${POSTGRES_DB_N8N:-n8n}'\" | grep -q 1 && psql -U ${POSTGRES_USER_TEMPORAL:-temporal} -d postgres -tAc \"SELECT 1 FROM pg_database WHERE datname='${POSTGRES_DB_TEMPORAL:-temporal}'\" | grep -q 1"] interval: 5s timeout: 5s retries: 5 @@ -96,16 +112,17 @@ services: opensearch: condition: service_healthy environment: - - TEMPORAL_PORT=${TEMPORAL_PORT:-7233} - - DB_PORT=${POSTGRES_PORT:-5432} - - POSTGRES_USER=${POSTGRES_USER:-temporal} - - POSTGRES_PWD=${POSTGRES_PASSWORD:-temporal} - - ES_SEEDS=opensearch - - ES_VERSION=v7 - - DB=postgresql - - POSTGRES_SEEDS=postgresql - - ENABLE_ES=true - - HOST=temporal + TEMPORAL_PORT: ${TEMPORAL_PORT:-7233} + POSTGRES_SEEDS: postgresql + DB_PORT: ${POSTGRES_PORT:-5432} + DBNAME: ${POSTGRES_DB_TEMPORAL:-temporal} + POSTGRES_USER: ${POSTGRES_USER_TEMPORAL:-temporal} + POSTGRES_PWD: ${POSTGRES_PASSWORD_TEMPORAL:-temporal} + ES_SEEDS: opensearch + ES_VERSION: v7 + DB: postgresql + ENABLE_ES: "true" + HOST: temporal ports: - "${TEMPORAL_PORT:-7233}:7233" networks: diff --git a/scripts/init-db.sh b/scripts/init-db.sh new file mode 100755 index 0000000..eda439b --- /dev/null +++ b/scripts/init-db.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -e + +psql -v ON_ERROR_STOP=1 --username "postgres" <<-EOSQL + CREATE USER "$POSTGRES_USER_N8N" WITH ENCRYPTED PASSWORD '$POSTGRES_PASSWORD_N8N'; + CREATE DATABASE "$POSTGRES_DB_N8N" OWNER "$POSTGRES_USER_N8N"; + GRANT ALL PRIVILEGES ON DATABASE "$POSTGRES_DB_N8N" TO "$POSTGRES_USER_N8N"; + + CREATE USER "$POSTGRES_USER_TEMPORAL" WITH ENCRYPTED PASSWORD '$POSTGRES_PASSWORD_TEMPORAL'; + CREATE DATABASE "$POSTGRES_DB_TEMPORAL" OWNER "$POSTGRES_USER_TEMPORAL"; + GRANT ALL PRIVILEGES ON DATABASE "$POSTGRES_DB_TEMPORAL" TO "$POSTGRES_USER_TEMPORAL"; +EOSQL