diff --git a/app/Models/Service.php b/app/Models/Service.php index ecba7b383b..2ced7ad2b9 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -1154,7 +1154,7 @@ class Service extends BaseModel break; case $image->contains('coollabsio/openclaw'): $data = collect([]); - $username = $this->environment_variables()->where('key', 'AUTH_USERNAME')->first(); + $username = $this->environment_variables()->where('key', 'SERVICE_USER_OPENCLAW')->first(); $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_OPENCLAW')->first(); $gateway_token = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_64_GATEWAYTOKEN')->first(); if ($username) { diff --git a/public/svgs/9router.svg b/public/svgs/9router.svg new file mode 100644 index 0000000000..a72e45bef3 --- /dev/null +++ b/public/svgs/9router.svg @@ -0,0 +1,11 @@ + + + 9 + + + + + + + + diff --git a/public/svgs/denoKV.svg b/public/svgs/deno-kv.svg similarity index 100% rename from public/svgs/denoKV.svg rename to public/svgs/deno-kv.svg diff --git a/public/svgs/docling.png b/public/svgs/docling.png new file mode 100644 index 0000000000..8763d71896 Binary files /dev/null and b/public/svgs/docling.png differ diff --git a/public/svgs/engram.png b/public/svgs/engram.png new file mode 100644 index 0000000000..7a6342d93e Binary files /dev/null and b/public/svgs/engram.png differ diff --git a/public/svgs/honcho.svg b/public/svgs/honcho.svg new file mode 100644 index 0000000000..6998fd8af2 --- /dev/null +++ b/public/svgs/honcho.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/public/svgs/lidarr.svg b/public/svgs/lidarr.svg new file mode 100644 index 0000000000..0332ddf2df --- /dev/null +++ b/public/svgs/lidarr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/svgs/linkwarden.svg b/public/svgs/linkwarden.svg new file mode 100644 index 0000000000..866080d6e6 --- /dev/null +++ b/public/svgs/linkwarden.svg @@ -0,0 +1 @@ +Linkwarden diff --git a/public/svgs/obsidian.svg b/public/svgs/obsidian.svg new file mode 100644 index 0000000000..33b702cad2 --- /dev/null +++ b/public/svgs/obsidian.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/svgs/openwa.png b/public/svgs/openwa.png new file mode 100644 index 0000000000..4a2bf74057 Binary files /dev/null and b/public/svgs/openwa.png differ diff --git a/public/svgs/snipe-it.webp b/public/svgs/snipe-it.webp new file mode 100644 index 0000000000..8cb0a7c18b Binary files /dev/null and b/public/svgs/snipe-it.webp differ diff --git a/public/svgs/zero.svg b/public/svgs/zero.svg new file mode 100644 index 0000000000..270406b0bc --- /dev/null +++ b/public/svgs/zero.svg @@ -0,0 +1,4 @@ + + + + diff --git a/svgs/bulwark.svg b/svgs/bulwark.svg new file mode 100644 index 0000000000..a3f6e5238a --- /dev/null +++ b/svgs/bulwark.svg @@ -0,0 +1,3 @@ + + + diff --git a/svgs/peertube.svg b/svgs/peertube.svg new file mode 100644 index 0000000000..dd7af546cf --- /dev/null +++ b/svgs/peertube.svg @@ -0,0 +1 @@ +PeerTube \ No newline at end of file diff --git a/svgs/portabase.svg b/svgs/portabase.svg new file mode 100644 index 0000000000..d35bc45ad1 --- /dev/null +++ b/svgs/portabase.svg @@ -0,0 +1,4 @@ + + + + diff --git a/templates/compose/9router.yaml b/templates/compose/9router.yaml new file mode 100644 index 0000000000..31b71a3ddd --- /dev/null +++ b/templates/compose/9router.yaml @@ -0,0 +1,28 @@ +# documentation: https://github.com/decolua/9router +# slogan: Free AI coding gateway. Routes Claude Code, Codex, Cursor, Cline, Copilot requests to 40+ LLM providers with auto-fallback and token savings. +# category: ai +# tags: ai, gateway, routing, coding, llm, providers +# logo: svgs/9router.svg +# port: 20128 + +services: + 9router: + image: decolua/9router:0.5.65 + volumes: + - '9router:/app/data' + environment: + - SERVICE_URL_9ROUTER_20128 + - DATA_DIR=/app/data + - INITIAL_PASSWORD=${SERVICE_PASSWORDWITHSYMBOLS_PASSWORD} + - JWT_SECRET=${SERVICE_PASSWORDWITHSYMBOLS_64_JWTSECRET} + - API_KEY_SECRET=${SERVICE_PASSWORDWITHSYMBOLS_KEYSECRET} + - MACHINE_ID_SALT=${SERVICE_HEX_64_HMACSALT} + healthcheck: + test: + - CMD + - wget + - --spider + - 'http://127.0.0.1:20128/' + interval: 5s + timeout: 10s + retries: 5 diff --git a/templates/compose/affine.yaml b/templates/compose/affine.yaml index 92231d41ad..9fa6c2abd0 100644 --- a/templates/compose/affine.yaml +++ b/templates/compose/affine.yaml @@ -78,15 +78,13 @@ services: image: pgvector/pgvector:pg16 volumes: - affine-postgres-data:/var/lib/postgresql/data - healthcheck: - test: - - CMD-SHELL - - 'pg_isready -U affine' - interval: 10s - timeout: 5s - retries: 5 environment: - POSTGRES_USER=${SERVICE_USER_POSTGRES} - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} - POSTGRES_DB=${POSTGRES_DB:-affine} - PGDATA=/var/lib/postgresql/data/pgdata + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 20s + retries: 10 diff --git a/templates/compose/appwrite.yaml b/templates/compose/appwrite.yaml index 4f60baa11e..c84821dc15 100644 --- a/templates/compose/appwrite.yaml +++ b/templates/compose/appwrite.yaml @@ -7,69 +7,98 @@ services: appwrite: - image: appwrite/appwrite:1.7.4 - container_name: appwrite - volumes: - - appwrite-uploads:/storage/uploads:rw - - appwrite-imports:/storage/imports:rw - - appwrite-cache:/storage/cache:rw - - appwrite-config:/storage/config:rw - - appwrite-certificates:/storage/certificates:rw - - appwrite-functions:/storage/functions:rw - - appwrite-sites:/storage/sites:rw - - appwrite-builds:/storage/builds:rw - depends_on: - - appwrite-mariadb - - appwrite-redis + image: appwrite/appwrite:2.0.0 environment: - - SERVICE_URL_APPWRITE=/ + - SERVICE_URL_APPWRITE=/v1 - _APP_ENV=${_APP_ENV:-production} + - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} + - _APP_USAGE_PASS=$SERVICE_PASSWORD_CLICKHOUSE + - _APP_CONNECTIONS_DB_USAGE=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite + - _APP_POOL_SIZE_USAGE=${_APP_POOL_SIZE_USAGE:-2} + - _APP_EXECUTIONS_DUAL_WRITE=${_APP_EXECUTIONS_DUAL_WRITE:-enabled} + - _APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite + - _APP_POOL_SIZE_EXECUTIONS=${_APP_POOL_SIZE_EXECUTIONS:-2} + - _APP_MAINTENANCE_RETENTION_USAGE_TTL=${_APP_MAINTENANCE_RETENTION_USAGE_TTL:-180} + - _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage} + - _APP_STATS_RESOURCES_QUEUE_NAME=${_APP_STATS_RESOURCES_QUEUE_NAME:-v1-stats-resources} + - _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL:-3600} - _APP_EDITION=${_APP_EDITION:-self-hosted} - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} + - _APP_POOL_ADAPTER=${_APP_POOL_ADAPTER:-stack} - _APP_LOCALE=${_APP_LOCALE:-en} + - _APP_COMPRESSION_ENABLED=${_APP_COMPRESSION_ENABLED:-enabled} - _APP_COMPRESSION_MIN_SIZE_BYTES=${_APP_COMPRESSION_MIN_SIZE_BYTES} - _APP_CONSOLE_WHITELIST_ROOT=${_APP_CONSOLE_WHITELIST_ROOT:-enabled} - _APP_CONSOLE_WHITELIST_EMAILS=${_APP_CONSOLE_WHITELIST_EMAILS} - - _APP_CONSOLE_SESSION_ALERTS=${_APP_CONSOLE_SESSION_ALERTS} + - _APP_CONSOLE_SESSION_ALERTS=${_APP_CONSOLE_SESSION_ALERTS:-disabled} - _APP_CONSOLE_WHITELIST_IPS=${_APP_CONSOLE_WHITELIST_IPS} - _APP_CONSOLE_HOSTNAMES=${_APP_CONSOLE_HOSTNAMES} + - _APP_CONSOLE_SCHEMA=${_APP_CONSOLE_SCHEMA:-appwriteio} + - _APP_CONSOLE_GITHUB_APP_ID=${_APP_CONSOLE_GITHUB_APP_ID} + - _APP_CONSOLE_GITHUB_SECRET=${_APP_CONSOLE_GITHUB_SECRET} + - _APP_CONSOLE_GITLAB_APP_ID=${_APP_CONSOLE_GITLAB_APP_ID} + - _APP_CONSOLE_GITLAB_SECRET=${_APP_CONSOLE_GITLAB_SECRET} + - _APP_CONSOLE_GITLAB_ENDPOINT=${_APP_CONSOLE_GITLAB_ENDPOINT} + - _APP_CONSOLE_BITBUCKET_APP_ID=${_APP_CONSOLE_BITBUCKET_APP_ID} + - _APP_CONSOLE_BITBUCKET_SECRET=${_APP_CONSOLE_BITBUCKET_SECRET} + - _APP_CONSOLE_GOOGLE_APP_ID=${_APP_CONSOLE_GOOGLE_APP_ID} + - _APP_CONSOLE_GOOGLE_SECRET=${_APP_CONSOLE_GOOGLE_SECRET} - _APP_SYSTEM_EMAIL_NAME=${_APP_SYSTEM_EMAIL_NAME:-Appwrite} - - _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-team@appwrite.io} + - _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-noreply@appwrite.io} - _APP_SYSTEM_TEAM_EMAIL=${_APP_SYSTEM_TEAM_EMAIL:-team@appwrite.io} - - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-certs@appwrite.io} + - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-security@appwrite.io} - _APP_SYSTEM_RESPONSE_FORMAT=${_APP_SYSTEM_RESPONSE_FORMAT} - _APP_OPTIONS_ABUSE=${_APP_OPTIONS_ABUSE:-enabled} + - _APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=${_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS} - _APP_OPTIONS_ROUTER_PROTECTION=${_APP_OPTIONS_ROUTER_PROTECTION:-disabled} - - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled} + - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-enabled} - _APP_OPTIONS_ROUTER_FORCE_HTTPS=${_APP_OPTIONS_ROUTER_FORCE_HTTPS:-disabled} + - _APP_ROUTER_AUTO_CERTIFICATES=${_APP_ROUTER_AUTO_CERTIFICATES:-disabled} - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN} + - _APP_NOTIFICATIONS_TRACKING_SECRET=$SERVICE_PASSWORD_64_NOTIFICATIONS - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} + - _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN} + - _APP_CONSOLE_URL_SCHEME=root + - _APP_CONSOLE_TRUSTED_PROJECTS=${_APP_CONSOLE_TRUSTED_PROJECTS} - _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost} - _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1} - _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1} - _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA} - - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} - _APP_DNS=${_APP_DNS} + - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - _APP_REDIS_USER=${_APP_REDIS_USER} - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} + - _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql} + - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql} + - _APP_DB_PORT=${_APP_DB_PORT:-5432} - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB + - _APP_DB_USER=$SERVICE_USER_POSTGRES + - _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES + - _APP_DB_ADAPTER_VECTORSDB=${_APP_DB_ADAPTER_VECTORSDB:-postgresql} + - _APP_DB_HOST_VECTORSDB=${_APP_DB_HOST_VECTORSDB:-appwrite-postgresql} + - _APP_DB_PORT_VECTORSDB=${_APP_DB_PORT_VECTORSDB:-5432} + - _APP_DB_SCHEMA_VECTORSDB=${_APP_DB_SCHEMA_VECTORSDB:-appwrite} + - _APP_DB_USER_VECTORSDB=$SERVICE_USER_POSTGRES + - _APP_DB_PASS_VECTORSDB=$SERVICE_PASSWORD_POSTGRES + - _APP_DB_ADAPTER_DOCUMENTSDB=${_APP_DB_ADAPTER_DOCUMENTSDB:-mongodb} + - _APP_DB_HOST_DOCUMENTSDB=${_APP_DB_HOST_DOCUMENTSDB} + - _APP_DB_PORT_DOCUMENTSDB=${_APP_DB_PORT_DOCUMENTSDB:-27017} + - _APP_DB_SCHEMA_DOCUMENTSDB=${_APP_DB_SCHEMA_DOCUMENTSDB} + - _APP_DB_USER_DOCUMENTSDB=${_APP_DB_USER_DOCUMENTSDB} + - _APP_DB_PASS_DOCUMENTSDB=${_APP_DB_PASS_DOCUMENTSDB} + - _APP_CONNECTIONS_DATABASE_DOCUMENTSDB=${_APP_CONNECTIONS_DATABASE_DOCUMENTSDB} + - _APP_CONNECTIONS_DATABASE_VECTORSDB=${_APP_CONNECTIONS_DATABASE_VECTORSDB} - _APP_SMTP_HOST=${_APP_SMTP_HOST} - _APP_SMTP_PORT=${_APP_SMTP_PORT} - _APP_SMTP_SECURE=${_APP_SMTP_SECURE} - _APP_SMTP_USERNAME=${_APP_SMTP_USERNAME} - _APP_SMTP_PASSWORD=${_APP_SMTP_PASSWORD} - - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} - _APP_STORAGE_LIMIT=${_APP_STORAGE_LIMIT:-30000000} - _APP_STORAGE_PREVIEW_LIMIT=${_APP_STORAGE_PREVIEW_LIMIT:-20000000} - _APP_STORAGE_ANTIVIRUS=${_APP_STORAGE_ANTIVIRUS:-disabled} - - _APP_STORAGE_ANTIVIRUS_HOST=${_APP_STORAGE_ANTIVIRUS_HOST:-appwrite-clamav} + - _APP_STORAGE_ANTIVIRUS_HOST=${_APP_STORAGE_ANTIVIRUS_HOST} - _APP_STORAGE_ANTIVIRUS_PORT=${_APP_STORAGE_ANTIVIRUS_PORT:-3310} - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY} @@ -96,18 +125,22 @@ services: - _APP_COMPUTE_SIZE_LIMIT=${_APP_COMPUTE_SIZE_LIMIT:-30000000} - _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900} - _APP_SITES_TIMEOUT=${_APP_SITES_TIMEOUT:-900} - - _APP_COMPUTE_BUILD_TIMEOUT=${_APP_COMPUTE_BUILD_TIMEOUT:-900} + - _APP_COMPUTE_BUILD_TIMEOUT=${_APP_COMPUTE_BUILD_TIMEOUT:-2700} - _APP_COMPUTE_CPUS=${_APP_COMPUTE_CPUS:-0} - _APP_COMPUTE_MEMORY=${_APP_COMPUTE_MEMORY:-0} - - _APP_FUNCTIONS_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES:-node-20.0,php-8.2,python-3.11,ruby-3.2} - - _APP_SITES_RUNTIMES=${_APP_SITES_RUNTIMES} + - _APP_FUNCTIONS_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES:-node-22} + - _APP_SITES_RUNTIMES=${_APP_SITES_RUNTIMES:-static-1,node-22} - _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE} - - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE - - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} + - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_EXECUTOR + - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://openruntimes-executor/v1} + - _APP_BUILDS_VOLUME=${COMPOSE_PROJECT_NAME}_appwrite-builds + - _APP_JOBS_HOST=${_APP_JOBS_HOST:-http://orchestrator:8080} + - _APP_JOBS_SECRET=$SERVICE_PASSWORD_64_JOBS + - _APP_JOBS_ENDPOINT=${_APP_JOBS_ENDPOINT:-http://appwrite} - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} + - _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty} + - _APP_LOCKING_ENABLED=${_APP_LOCKING_ENABLED:-enabled} - _APP_MAINTENANCE_INTERVAL=${_APP_MAINTENANCE_INTERVAL:-86400} - - _APP_MAINTENANCE_DELAY=${_APP_MAINTENANCE_DELAY} - - _APP_MAINTENANCE_START_TIME=${_APP_MAINTENANCE_START_TIME} - _APP_MAINTENANCE_RETENTION_EXECUTION=${_APP_MAINTENANCE_RETENTION_EXECUTION:-1209600} - _APP_MAINTENANCE_RETENTION_CACHE=${_APP_MAINTENANCE_RETENTION_CACHE:-2592000} - _APP_MAINTENANCE_RETENTION_ABUSE=${_APP_MAINTENANCE_RETENTION_ABUSE:-86400} @@ -117,6 +150,7 @@ services: - _APP_MAINTENANCE_RETENTION_SCHEDULES=${_APP_MAINTENANCE_RETENTION_SCHEDULES:-86400} - _APP_SMS_PROVIDER=${_APP_SMS_PROVIDER} - _APP_SMS_FROM=${_APP_SMS_FROM} + - _APP_GRAPHQL_INTROSPECTION=${_APP_GRAPHQL_INTROSPECTION:-enabled} - _APP_GRAPHQL_MAX_BATCH_SIZE=${_APP_GRAPHQL_MAX_BATCH_SIZE:-10} - _APP_GRAPHQL_MAX_COMPLEXITY=${_APP_GRAPHQL_MAX_COMPLEXITY:-250} - _APP_GRAPHQL_MAX_DEPTH=${_APP_GRAPHQL_MAX_DEPTH:-3} @@ -126,156 +160,204 @@ services: - _APP_VCS_GITHUB_WEBHOOK_SECRET=${_APP_VCS_GITHUB_WEBHOOK_SECRET} - _APP_VCS_GITHUB_CLIENT_SECRET=${_APP_VCS_GITHUB_CLIENT_SECRET} - _APP_VCS_GITHUB_CLIENT_ID=${_APP_VCS_GITHUB_CLIENT_ID} + - _APP_VCS_GITEA_ENDPOINT=${_APP_VCS_GITEA_ENDPOINT} + - _APP_VCS_GITEA_BROWSER_ENDPOINT=${_APP_VCS_GITEA_BROWSER_ENDPOINT} + - _APP_VCS_GITEA_CLIENT_ID=${_APP_VCS_GITEA_CLIENT_ID} + - _APP_VCS_GITEA_CLIENT_SECRET=${_APP_VCS_GITEA_CLIENT_SECRET} + - _APP_VCS_GITEA_WEBHOOK_SECRET=${_APP_VCS_GITEA_WEBHOOK_SECRET} + - _APP_VCS_GITLAB_ENDPOINT=${_APP_VCS_GITLAB_ENDPOINT} + - _APP_VCS_GITLAB_CLIENT_ID=${_APP_VCS_GITLAB_CLIENT_ID} + - _APP_VCS_GITLAB_CLIENT_SECRET=${_APP_VCS_GITLAB_CLIENT_SECRET} + - _APP_VCS_GITLAB_WEBHOOK_SECRET=${_APP_VCS_GITLAB_WEBHOOK_SECRET} + - _APP_VCS_BITBUCKET_CLIENT_ID=${_APP_VCS_BITBUCKET_CLIENT_ID} + - _APP_VCS_BITBUCKET_CLIENT_SECRET=${_APP_VCS_BITBUCKET_CLIENT_SECRET} + - _APP_VCS_BITBUCKET_WEBHOOK_SECRET=${_APP_VCS_BITBUCKET_WEBHOOK_SECRET} + - _APP_VCS_ORIGIN_CLIENT_ID=${_APP_VCS_ORIGIN_CLIENT_ID} + - _APP_VCS_ORIGIN_PRIVATE_KEY=${_APP_VCS_ORIGIN_PRIVATE_KEY} + - _APP_VCS_WEBHOOK_URL=${_APP_VCS_WEBHOOK_URL} - _APP_MIGRATIONS_FIREBASE_CLIENT_ID=${_APP_MIGRATIONS_FIREBASE_CLIENT_ID} - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=${_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET} - _APP_ASSISTANT_OPENAI_API_KEY=${_APP_ASSISTANT_OPENAI_API_KEY} - - _APP_MESSAGE_SMS_TEST_DSN=${_APP_MESSAGE_SMS_TEST_DSN} - - _APP_MESSAGE_EMAIL_TEST_DSN=${_APP_MESSAGE_EMAIL_TEST_DSN} - - _APP_MESSAGE_PUSH_TEST_DSN=${_APP_MESSAGE_PUSH_TEST_DSN} - _APP_CONSOLE_COUNTRIES_DENYLIST=${_APP_CONSOLE_COUNTRIES_DENYLIST} - _APP_EXPERIMENT_LOGGING_PROVIDER=${_APP_EXPERIMENT_LOGGING_PROVIDER} - _APP_EXPERIMENT_LOGGING_CONFIG=${_APP_EXPERIMENT_LOGGING_CONFIG} - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - - _APP_DATABASE_SHARED_TABLES_V1=${_APP_DATABASE_SHARED_TABLES_V1} - _APP_DATABASE_SHARED_NAMESPACE=${_APP_DATABASE_SHARED_NAMESPACE} - _APP_FUNCTIONS_CREATION_ABUSE_LIMIT=${_APP_FUNCTIONS_CREATION_ABUSE_LIMIT} - - _APP_CUSTOM_DOMAIN_DENY_LIST=${_APP_CUSTOM_DOMAIN_DENY_LIST} + - _APP_CUSTOM_DOMAIN_DENY_LIST=${_APP_CUSTOM_DOMAIN_DENY_LIST:-example.com,test.com,app.example.com} + - _APP_TRUSTED_HEADERS=${_APP_TRUSTED_HEADERS:-x-forwarded-for} + - _APP_MIGRATION_HOST=${_APP_MIGRATION_HOST:-appwrite} + - _APP_GEO_SECRET=$SERVICE_PASSWORD_64_GEO + - _APP_GEO_ENDPOINT=${_APP_GEO_ENDPOINT:-http://appwrite-geo/v1} + - _APP_LIMIT_DATABASE_BATCH=${_APP_LIMIT_DATABASE_BATCH:-100} + - _APP_DOCUMENTSDB=${_APP_DOCUMENTSDB:-disabled} + - _APP_VECTORSDB=${_APP_VECTORSDB:-disabled} + - _APP_EMBEDDING=${_APP_EMBEDDING:-disabled} + volumes: + - appwrite-uploads:/storage/uploads:rw + - appwrite-imports:/storage/imports:rw + - appwrite-cache:/storage/cache:rw + - appwrite-config:/storage/config:rw + - appwrite-certificates:/storage/certificates:rw + - appwrite-functions:/storage/functions:rw + - appwrite-sites:/storage/sites:rw + - appwrite-builds:/storage/builds:rw + depends_on: + appwrite-postgresql: + condition: service_healthy + appwrite-redis: + condition: service_healthy + appwrite-clickhouse: + condition: service_healthy + appwrite-geo: + condition: service_healthy healthcheck: - test: ["CMD-SHELL", "curl -fsI http://localhost:80 | head -n 1 | grep -E '^HTTP/.* 3[0-9]{2} ' || exit 1"] + test: ["CMD-SHELL", "curl -fsS -o /dev/null http://localhost/v1/health/version || exit 1"] interval: 20s timeout: 5s - retries: 3 + retries: 6 + start_period: 120s appwrite-console: - image: appwrite/console:6.1.28 - container_name: appwrite-console + image: appwrite/new:1.1.16 environment: - - SERVICE_URL_APPWRITE=/console + - SERVICE_URL_APPWRITE_3000=/ + - VITE_CONSOLE_PROFILE=self-hosted + - APPWRITE_ENDPOINT_SAME_ORIGIN=true + - VITE_GROWTH_ENDPOINT=${VITE_GROWTH_ENDPOINT:-https://growth.appwrite.io/v1} + depends_on: + appwrite: + condition: service_healthy healthcheck: - test: ["CMD-SHELL", "curl -fsI http://localhost:80 | head -n 1 | grep -E '^HTTP/.* 3[0-9]{2} ' || exit 1"] + test: ["CMD-SHELL", "bun -e \"fetch('http://localhost:3000').then(r => process.exit(r.status < 500 ? 0 : 1)).catch(() => process.exit(1))\""] interval: 20s timeout: 5s retries: 3 appwrite-realtime: - image: appwrite/appwrite:1.7.4 + image: appwrite/appwrite:2.0.0 entrypoint: realtime - container_name: appwrite-realtime - depends_on: - - appwrite-mariadb - - appwrite-redis environment: - SERVICE_URL_APPWRITE=/v1/realtime - _APP_ENV=${_APP_ENV:-production} + - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} + - _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage} - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - _APP_OPTIONS_ABUSE=${_APP_OPTIONS_ABUSE:-enabled} - _APP_OPTIONS_ROUTER_PROTECTION=${_APP_OPTIONS_ROUTER_PROTECTION:-disabled} + - _APP_CONSOLE_HOSTNAMES=${_APP_CONSOLE_HOSTNAMES} + - _APP_REALTIME_TAIL_RATE=${_APP_REALTIME_TAIL_RATE:-50} - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - _APP_REDIS_USER=${_APP_REDIS_USER} - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} + - _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql} + - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql} + - _APP_DB_PORT=${_APP_DB_PORT:-5432} - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} + - _APP_DB_USER=$SERVICE_USER_POSTGRES + - _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES + - _APP_DB_ADAPTER_VECTORSDB=${_APP_DB_ADAPTER_VECTORSDB:-postgresql} + - _APP_DB_HOST_VECTORSDB=${_APP_DB_HOST_VECTORSDB:-appwrite-postgresql} + - _APP_DB_PORT_VECTORSDB=${_APP_DB_PORT_VECTORSDB:-5432} + - _APP_DB_SCHEMA_VECTORSDB=${_APP_DB_SCHEMA_VECTORSDB:-appwrite} + - _APP_DB_USER_VECTORSDB=$SERVICE_USER_POSTGRES + - _APP_DB_PASS_VECTORSDB=$SERVICE_PASSWORD_POSTGRES + - _APP_DB_ADAPTER_DOCUMENTSDB=${_APP_DB_ADAPTER_DOCUMENTSDB:-mongodb} + - _APP_DB_HOST_DOCUMENTSDB=${_APP_DB_HOST_DOCUMENTSDB} + - _APP_DB_PORT_DOCUMENTSDB=${_APP_DB_PORT_DOCUMENTSDB:-27017} + - _APP_DB_SCHEMA_DOCUMENTSDB=${_APP_DB_SCHEMA_DOCUMENTSDB} + - _APP_DB_USER_DOCUMENTSDB=${_APP_DB_USER_DOCUMENTSDB} + - _APP_DB_PASS_DOCUMENTSDB=${_APP_DB_PASS_DOCUMENTSDB} + - _APP_CONNECTIONS_DATABASE_DOCUMENTSDB=${_APP_CONNECTIONS_DATABASE_DOCUMENTSDB} + - _APP_CONNECTIONS_DATABASE_VECTORSDB=${_APP_CONNECTIONS_DATABASE_VECTORSDB} - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} + - _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty} + - _APP_LOGGING_CONFIG_REALTIME=${_APP_LOGGING_CONFIG_REALTIME} - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} + - _APP_LIMIT_DATABASE_BATCH=${_APP_LIMIT_DATABASE_BATCH:-100} + - _APP_DOCUMENTSDB=${_APP_DOCUMENTSDB:-disabled} + - _APP_VECTORSDB=${_APP_VECTORSDB:-disabled} + - _APP_EMBEDDING=${_APP_EMBEDDING:-disabled} + - _APP_POOL_ADAPTER=swoole + depends_on: + appwrite-postgresql: + condition: service_healthy + appwrite-redis: + condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -s localhost > /dev/null || exit 1"] interval: 20s timeout: 5s retries: 3 - appwrite-worker-audits: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-audits - container_name: appwrite-worker-audits - depends_on: - - appwrite-redis - - appwrite-mariadb + appwrite-worker: + image: appwrite/appwrite:2.0.0 + entrypoint: worker environment: - _APP_ENV=${_APP_ENV:-production} + - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} + - _APP_USAGE_PASS=$SERVICE_PASSWORD_CLICKHOUSE + - _APP_CONNECTIONS_DB_USAGE=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite + - _APP_POOL_SIZE_USAGE=${_APP_POOL_SIZE_USAGE:-2} + - _APP_EXECUTIONS_DUAL_WRITE=${_APP_EXECUTIONS_DUAL_WRITE:-enabled} + - _APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite + - _APP_POOL_SIZE_EXECUTIONS=${_APP_POOL_SIZE_EXECUTIONS:-2} + - _APP_MAINTENANCE_RETENTION_USAGE_TTL=${_APP_MAINTENANCE_RETENTION_USAGE_TTL:-180} + - _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage} + - _APP_STATS_RESOURCES_QUEUE_NAME=${_APP_STATS_RESOURCES_QUEUE_NAME:-v1-stats-resources} + - _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL:-3600} + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=78 - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} + - _APP_POOL_ADAPTER=${_APP_POOL_ADAPTER:-stack} - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} + - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-security@appwrite.io} + - _APP_EMAIL_CERTIFICATES=${_APP_EMAIL_CERTIFICATES} + - _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql} + - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql} + - _APP_DB_PORT=${_APP_DB_PORT:-5432} - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-audits' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - - appwrite-worker-webhooks: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-webhooks - container_name: appwrite-worker-webhooks - depends_on: - - appwrite-redis - - appwrite-mariadb - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-certs@appwrite.io} - - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=${_APP_SYSTEM_SECURITY_EMAIL_ADDRESS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB + - _APP_DB_USER=$SERVICE_USER_POSTGRES + - _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES + - _APP_DB_ADAPTER_VECTORSDB=${_APP_DB_ADAPTER_VECTORSDB:-postgresql} + - _APP_DB_HOST_VECTORSDB=${_APP_DB_HOST_VECTORSDB:-appwrite-postgresql} + - _APP_DB_PORT_VECTORSDB=${_APP_DB_PORT_VECTORSDB:-5432} + - _APP_DB_SCHEMA_VECTORSDB=${_APP_DB_SCHEMA_VECTORSDB:-appwrite} + - _APP_DB_USER_VECTORSDB=$SERVICE_USER_POSTGRES + - _APP_DB_PASS_VECTORSDB=$SERVICE_PASSWORD_POSTGRES + - _APP_DB_ADAPTER_DOCUMENTSDB=${_APP_DB_ADAPTER_DOCUMENTSDB:-mongodb} + - _APP_DB_HOST_DOCUMENTSDB=${_APP_DB_HOST_DOCUMENTSDB} + - _APP_DB_PORT_DOCUMENTSDB=${_APP_DB_PORT_DOCUMENTSDB:-27017} + - _APP_DB_SCHEMA_DOCUMENTSDB=${_APP_DB_SCHEMA_DOCUMENTSDB} + - _APP_DB_USER_DOCUMENTSDB=${_APP_DB_USER_DOCUMENTSDB} + - _APP_DB_PASS_DOCUMENTSDB=${_APP_DB_PASS_DOCUMENTSDB} + - _APP_CONNECTIONS_DATABASE_DOCUMENTSDB=${_APP_CONNECTIONS_DATABASE_DOCUMENTSDB} + - _APP_CONNECTIONS_DATABASE_VECTORSDB=${_APP_CONNECTIONS_DATABASE_VECTORSDB} - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - _APP_REDIS_USER=${_APP_REDIS_USER} - _APP_REDIS_PASS=${_APP_REDIS_PASS} - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_WEBHOOK_MAX_FAILED_ATTEMPTS=${_APP_WEBHOOK_MAX_FAILED_ATTEMPTS} + - _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty} + - _APP_LOGGING_PROVIDER=${_APP_LOGGING_PROVIDER} + - _APP_QUEUE_NAME=${_APP_QUEUE_NAME} - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-webhooks' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-worker-deletes: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-deletes - container_name: appwrite-worker-deletes - depends_on: - - appwrite-redis - - appwrite-mariadb - volumes: - - appwrite-uploads:/storage/uploads:rw - - appwrite-cache:/storage/cache:rw - - appwrite-functions:/storage/functions:rw - - appwrite-sites:/storage/sites:rw - - appwrite-builds:/storage/builds:rw - - appwrite-certificates:/storage/certificates:rw - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB + - _APP_CONSOLE_URL_SCHEME=root + - _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN} + - _APP_CONSOLE_TRUSTED_PROJECTS=${_APP_CONSOLE_TRUSTED_PROJECTS} + - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} + - _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost} + - _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1} + - _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1} + - _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA} + - _APP_DNS=${_APP_DNS} + - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} + - _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE} + - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-enabled} + - _APP_OPTIONS_ROUTER_FORCE_HTTPS=${_APP_OPTIONS_ROUTER_FORCE_HTTPS:-disabled} + - _APP_WEBHOOK_MAX_FAILED_ATTEMPTS=${_APP_WEBHOOK_MAX_FAILED_ATTEMPTS:-10} - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY} - _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} @@ -298,356 +380,166 @@ services: - _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} - _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1} - _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE - - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - - _APP_DATABASE_SHARED_TABLES_V1=${_APP_DATABASE_SHARED_TABLES_V1} - - _APP_EMAIL_CERTIFICATES=${_APP_EMAIL_CERTIFICATES} - - _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600} - - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=${_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-deletes' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-worker-databases: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-databases - container_name: appwrite-worker-databases - depends_on: - - appwrite-redis - - appwrite-mariadb - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_WORKERS_NUM=${_APP_WORKERS_NUM} - - _APP_QUEUE_NAME=${_APP_QUEUE_NAME} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-databases' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - - appwrite-worker-builds: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-builds - container_name: appwrite-worker-builds - depends_on: - - appwrite-redis - - appwrite-mariadb - volumes: - - appwrite-functions:/storage/functions:rw - - appwrite-sites:/storage/sites:rw - - appwrite-builds:/storage/builds:rw - - appwrite-uploads:/storage/uploads:rw - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE - - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} + - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_EXECUTOR + - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://openruntimes-executor/v1} + - _APP_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME} + - _APP_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD} + - _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900} + - _APP_SITES_TIMEOUT=${_APP_SITES_TIMEOUT:-900} + - _APP_COMPUTE_BUILD_TIMEOUT=${_APP_COMPUTE_BUILD_TIMEOUT:-2700} + - _APP_COMPUTE_CPUS=${_APP_COMPUTE_CPUS:-0} + - _APP_COMPUTE_MEMORY=${_APP_COMPUTE_MEMORY:-0} + - _APP_OPEN_RUNTIMES_NFT=${_APP_OPEN_RUNTIMES_NFT:-enabled} + - _APP_COMPUTE_SIZE_LIMIT=${_APP_COMPUTE_SIZE_LIMIT:-30000000} - _APP_VCS_GITHUB_APP_NAME=${_APP_VCS_GITHUB_APP_NAME} - _APP_VCS_GITHUB_PRIVATE_KEY=${_APP_VCS_GITHUB_PRIVATE_KEY} - _APP_VCS_GITHUB_APP_ID=${_APP_VCS_GITHUB_APP_ID} - - _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900} - - _APP_SITES_TIMEOUT=${_APP_SITES_TIMEOUT:-900} - - _APP_COMPUTE_BUILD_TIMEOUT=${_APP_COMPUTE_BUILD_TIMEOUT:-900} - - _APP_COMPUTE_CPUS=${_APP_COMPUTE_CPUS:-0} - - _APP_COMPUTE_MEMORY=${_APP_COMPUTE_MEMORY:-0} - - _APP_COMPUTE_SIZE_LIMIT=${_APP_COMPUTE_SIZE_LIMIT:-30000000} - - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled} - - _APP_OPTIONS_ROUTER_FORCE_HTTPS=${_APP_OPTIONS_ROUTER_FORCE_HTTPS:-disabled} - - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} - - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} - - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY} - - _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} - - _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1} - - _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} - - _APP_STORAGE_S3_ENDPOINT=${_APP_STORAGE_S3_ENDPOINT} - - _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} - - _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} - - _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1} - - _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} - - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} - - _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} - - _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004} - - _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} - - _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} - - _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} - - _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1} - - _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} - - _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} - - _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} - - _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1} - - _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - - _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE} - - _APP_BROWSER_HOST=${_APP_BROWSER_HOST} - - _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-builds' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-worker-certificates: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-certificates - container_name: appwrite-worker-certificates - depends_on: - - appwrite-redis - - appwrite-mariadb - volumes: - - appwrite-config:/storage/config:rw - - appwrite-certificates:/storage/certificates:rw - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} - - _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME} - - _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA} - - _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A} - - _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA} - - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} - - _APP_DNS=${_APP_DNS} - - _APP_EMAIL_CERTIFICATES=${_APP_EMAIL_CERTIFICATES:-enabled} - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-certificates' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-worker-functions: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-functions - container_name: appwrite-worker-functions - depends_on: - - appwrite-redis - - appwrite-mariadb - - openruntimes-executor - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} - - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled} - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900} - - _APP_SITES_TIMEOUT=${_APP_SITES_TIMEOUT:-900} - - _APP_COMPUTE_BUILD_TIMEOUT=${_APP_COMPUTE_BUILD_TIMEOUT:-900} - - _APP_COMPUTE_CPUS=${_APP_COMPUTE_CPUS:-0} - - _APP_COMPUTE_MEMORY=${_APP_COMPUTE_MEMORY:-0} - - _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE - - _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://appwrite-executor/v1} - - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} - - _APP_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME} - - _APP_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD} - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_LOGGING_PROVIDER=${_APP_LOGGING_PROVIDER} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-functions' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-worker-mails: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-mails - container_name: appwrite-worker-mails - depends_on: - - appwrite-redis - - appwrite-mariadb - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE + - _APP_VCS_GITEA_ENDPOINT=${_APP_VCS_GITEA_ENDPOINT} + - _APP_VCS_GITEA_BROWSER_ENDPOINT=${_APP_VCS_GITEA_BROWSER_ENDPOINT} + - _APP_VCS_GITEA_CLIENT_ID=${_APP_VCS_GITEA_CLIENT_ID} + - _APP_VCS_GITEA_CLIENT_SECRET=${_APP_VCS_GITEA_CLIENT_SECRET} + - _APP_VCS_GITEA_WEBHOOK_SECRET=${_APP_VCS_GITEA_WEBHOOK_SECRET} + - _APP_VCS_GITLAB_ENDPOINT=${_APP_VCS_GITLAB_ENDPOINT} + - _APP_VCS_GITLAB_CLIENT_ID=${_APP_VCS_GITLAB_CLIENT_ID} + - _APP_VCS_GITLAB_CLIENT_SECRET=${_APP_VCS_GITLAB_CLIENT_SECRET} + - _APP_VCS_GITLAB_WEBHOOK_SECRET=${_APP_VCS_GITLAB_WEBHOOK_SECRET} + - _APP_VCS_BITBUCKET_CLIENT_ID=${_APP_VCS_BITBUCKET_CLIENT_ID} + - _APP_VCS_BITBUCKET_CLIENT_SECRET=${_APP_VCS_BITBUCKET_CLIENT_SECRET} + - _APP_VCS_BITBUCKET_WEBHOOK_SECRET=${_APP_VCS_BITBUCKET_WEBHOOK_SECRET} + - _APP_VCS_ORIGIN_CLIENT_ID=${_APP_VCS_ORIGIN_CLIENT_ID} + - _APP_VCS_ORIGIN_PRIVATE_KEY=${_APP_VCS_ORIGIN_PRIVATE_KEY} + - _APP_VCS_WEBHOOK_URL=${_APP_VCS_WEBHOOK_URL} + - _APP_BUILDS_VOLUME=${COMPOSE_PROJECT_NAME}_appwrite-builds + - _APP_JOBS_HOST=${_APP_JOBS_HOST:-http://orchestrator:8080} + - _APP_JOBS_SECRET=$SERVICE_PASSWORD_64_JOBS + - _APP_JOBS_ENDPOINT=${_APP_JOBS_ENDPOINT:-http://appwrite} + - _APP_BROWSER_HOST=${_APP_BROWSER_HOST:-http://appwrite-browser:3000/v1} + - _APP_WORKER_SCREENSHOTS_ROUTER=${_APP_WORKER_SCREENSHOTS_ROUTER:-http://appwrite} + - _APP_NOTIFICATIONS_TRACKING_SECRET=$SERVICE_PASSWORD_64_NOTIFICATIONS - _APP_SYSTEM_EMAIL_NAME=${_APP_SYSTEM_EMAIL_NAME:-Appwrite} - - _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-team@appwrite.io} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} + - _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-noreply@appwrite.io} - _APP_SMTP_HOST=${_APP_SMTP_HOST} - _APP_SMTP_PORT=${_APP_SMTP_PORT} - _APP_SMTP_SECURE=${_APP_SMTP_SECURE} - _APP_SMTP_USERNAME=${_APP_SMTP_USERNAME} - _APP_SMTP_PASSWORD=${_APP_SMTP_PASSWORD} - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} - - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-mails' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - - appwrite-worker-messaging: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-messaging - container_name: appwrite-worker-messaging - volumes: - - appwrite-uploads:/storage/uploads:rw - depends_on: - - appwrite-redis - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - _APP_SMS_FROM=${_APP_SMS_FROM} - _APP_SMS_PROVIDER=${_APP_SMS_PROVIDER} - _APP_SMS_PROJECTS_DENY_LIST=${_APP_SMS_PROJECTS_DENY_LIST} - - _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} - - _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY} - - _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} - - _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1} - - _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} - - _APP_STORAGE_S3_ENDPOINT=${_APP_STORAGE_S3_ENDPOINT} - - _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} - - _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} - - _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1} - - _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} - - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} - - _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} - - _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004} - - _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} - - _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} - - _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} - - _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1} - - _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} - - _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} - - _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} - - _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1} - - _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} + - _APP_MIGRATIONS_FIREBASE_CLIENT_ID=${_APP_MIGRATIONS_FIREBASE_CLIENT_ID} + - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=${_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET} + - _APP_MIGRATION_HOST=${_APP_MIGRATION_HOST:-appwrite} + - _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600} + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=${_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE} + - _APP_LIMIT_DATABASE_BATCH=${_APP_LIMIT_DATABASE_BATCH:-100} + - _APP_DOCUMENTSDB=${_APP_DOCUMENTSDB:-disabled} + - _APP_VECTORSDB=${_APP_VECTORSDB:-disabled} + - _APP_EMBEDDING=${_APP_EMBEDDING:-disabled} + volumes: + - appwrite-uploads:/storage/uploads:rw + - appwrite-imports:/storage/imports:rw + - appwrite-cache:/storage/cache:rw + - appwrite-config:/storage/config:rw + - appwrite-certificates:/storage/certificates:rw + - appwrite-functions:/storage/functions:rw + - appwrite-sites:/storage/sites:rw + - appwrite-builds:/storage/builds:rw + depends_on: + appwrite-postgresql: + condition: service_healthy + appwrite-redis: + condition: service_healthy + appwrite-clickhouse: + condition: service_healthy + openruntimes-executor: + condition: service_healthy + orchestrator: + condition: service_healthy healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-messaging' || exit 1"] + test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"] interval: 20s timeout: 5s retries: 3 - - appwrite-worker-migrations: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-migrations - container_name: appwrite-worker-migrations - volumes: - - appwrite-imports:/storage/imports:rw - depends_on: - - appwrite-mariadb + + appwrite-task-scheduler: + image: appwrite/appwrite:2.0.0 + entrypoint: schedule environment: - _APP_ENV=${_APP_ENV:-production} + - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} + - _APP_USAGE_PASS=$SERVICE_PASSWORD_CLICKHOUSE + - _APP_CONNECTIONS_DB_USAGE=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite + - _APP_POOL_SIZE_USAGE=${_APP_POOL_SIZE_USAGE:-2} + - _APP_EXECUTIONS_DUAL_WRITE=${_APP_EXECUTIONS_DUAL_WRITE:-enabled} + - _APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite + - _APP_POOL_SIZE_EXECUTIONS=${_APP_POOL_SIZE_EXECUTIONS:-2} + - _APP_MAINTENANCE_RETENTION_USAGE_TTL=${_APP_MAINTENANCE_RETENTION_USAGE_TTL:-180} + - _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage} + - _APP_STATS_RESOURCES_QUEUE_NAME=${_APP_STATS_RESOURCES_QUEUE_NAME:-v1-stats-resources} + - _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL:-3600} + - _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty} + - _APP_WORKER_MAX_COROUTINES=8 - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} + - _APP_POOL_ADAPTER=${_APP_POOL_ADAPTER:-stack} - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE + - _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-enabled} - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} - - _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME} - - _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA} - - _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A} - - _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA} - - _APP_DNS=${_APP_DNS} - - _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-certs@appwrite.io} + - _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN} + - _APP_CONSOLE_SCHEMA=${_APP_CONSOLE_SCHEMA:-appwriteio} + - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} + - _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE} + - _APP_MIGRATION_HOST=${_APP_MIGRATION_HOST:-appwrite} - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - _APP_REDIS_USER=${_APP_REDIS_USER} - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} + - _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql} + - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql} + - _APP_DB_PORT=${_APP_DB_PORT:-5432} - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_MIGRATIONS_FIREBASE_CLIENT_ID=${_APP_MIGRATIONS_FIREBASE_CLIENT_ID} - - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=${_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET} + - _APP_DB_USER=$SERVICE_USER_POSTGRES + - _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - exclude_from_hc: true + - _APP_FUNCTIONS_SCHEDULE_SPREAD=${_APP_FUNCTIONS_SCHEDULE_SPREAD:-0} + depends_on: + appwrite-postgresql: + condition: service_healthy + appwrite-redis: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"] + interval: 20s + timeout: 5s + retries: 3 appwrite-task-maintenance: - image: appwrite/appwrite:1.7.4 + image: appwrite/appwrite:2.0.0 entrypoint: maintenance - container_name: appwrite-task-maintenance - depends_on: - - appwrite-redis environment: - _APP_ENV=${_APP_ENV:-production} + - _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty} - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} + - _APP_POOL_ADAPTER=${_APP_POOL_ADAPTER:-stack} - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} - - _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME} - - _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA} - - _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A} + - _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost} + - _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1} + - _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1} - _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA} - - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} - _APP_DNS=${_APP_DNS} + - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} + - _APP_EDITION=${_APP_EDITION:-self-hosted} + - _APP_ROUTER_AUTO_CERTIFICATES=${_APP_ROUTER_AUTO_CERTIFICATES:-disabled} - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - _APP_REDIS_USER=${_APP_REDIS_USER} - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} + - _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql} + - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql} + - _APP_DB_PORT=${_APP_DB_PORT:-5432} - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB + - _APP_DB_USER=$SERVICE_USER_POSTGRES + - _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES - _APP_MAINTENANCE_INTERVAL=${_APP_MAINTENANCE_INTERVAL:-86400} - _APP_MAINTENANCE_RETENTION_EXECUTION=${_APP_MAINTENANCE_RETENTION_EXECUTION:-1209600} - _APP_MAINTENANCE_RETENTION_CACHE=${_APP_MAINTENANCE_RETENTION_CACHE:-2592000} @@ -658,280 +550,151 @@ services: - _APP_MAINTENANCE_RETENTION_SCHEDULES=${_APP_MAINTENANCE_RETENTION_SCHEDULES:-86400} - _APP_MAINTENANCE_START_TIME=${_APP_MAINTENANCE_START_TIME} - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} + depends_on: + appwrite-postgresql: + condition: service_healthy + appwrite-redis: + condition: service_healthy healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[m]aintenance' || exit 1"] + test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"] interval: 20s timeout: 5s retries: 3 - - appwrite-task-stats-resources: - image: appwrite/appwrite:1.7.4 - container_name: appwrite-task-stats-resources - entrypoint: stats-resources - depends_on: - - appwrite-redis - - appwrite-mariadb + appwrite-task-interval: + image: appwrite/appwrite:2.0.0 + entrypoint: interval environment: - _APP_ENV=${_APP_ENV:-production} + - _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty} - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} + - _APP_POOL_ADAPTER=${_APP_POOL_ADAPTER:-stack} + - _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE} + - _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost} + - _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1} + - _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1} + - _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA} + - _APP_DNS=${_APP_DNS} + - _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE} + - _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE} - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - _APP_REDIS_USER=${_APP_REDIS_USER} - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} + - _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql} + - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql} + - _APP_DB_PORT=${_APP_DB_PORT:-5432} + - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} + - _APP_DB_USER=$SERVICE_USER_POSTGRES + - _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - - _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[s]tats-resources' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-worker-stats-resources: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-stats-resources - container_name: appwrite-worker-stats-resources + - _APP_INTERVAL_DOMAIN_VERIFICATION=${_APP_INTERVAL_DOMAIN_VERIFICATION:-120} + - _APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=${_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS:-300} depends_on: - - appwrite-redis - - appwrite-mariadb - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL} + appwrite-postgresql: + condition: service_healthy + appwrite-redis: + condition: service_healthy healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-stats-resources' || exit 1"] + test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"] interval: 20s timeout: 5s retries: 3 - appwrite-worker-stats-usage: - image: appwrite/appwrite:1.7.4 - entrypoint: worker-stats-usage - container_name: appwrite-worker-stats-usage - depends_on: - - appwrite-redis - - appwrite-mariadb + appwrite-geo: + image: appwrite/geo:0.3.1 environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled} - - _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - _APP_USAGE_AGGREGATION_INTERVAL=${_APP_USAGE_AGGREGATION_INTERVAL:-30} - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} + - GEO_SECRET=$SERVICE_PASSWORD_64_GEO healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[w]orker-stats-usage' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - - appwrite-task-scheduler-functions: - image: appwrite/appwrite:1.7.4 - entrypoint: schedule-functions - container_name: appwrite-task-scheduler-functions - depends_on: - - appwrite-mariadb - - appwrite-redis - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[s]chedule-functi' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-task-scheduler-executions: - image: appwrite/appwrite:1.7.4 - entrypoint: schedule-executions - container_name: appwrite-task-scheduler-executions - depends_on: - - appwrite-mariadb - - appwrite-redis - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[s]chedule-execut' || exit 1"] - interval: 20s - timeout: 5s - retries: 3 - - appwrite-task-scheduler-messages: - image: appwrite/appwrite:1.7.4 - entrypoint: schedule-messages - container_name: appwrite-task-scheduler-messages - depends_on: - - appwrite-mariadb - - appwrite-redis - environment: - - _APP_ENV=${_APP_ENV:-production} - - _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6} - - _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE - - _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis} - - _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379} - - _APP_REDIS_USER=${_APP_REDIS_USER} - - _APP_REDIS_PASS=${_APP_REDIS_PASS} - - _APP_DB_HOST=${_APP_DB_HOST:-appwrite-mariadb} - - _APP_DB_PORT=${_APP_DB_PORT:-3306} - - _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite} - - _APP_DB_USER=$SERVICE_USER_MARIADB - - _APP_DB_PASS=$SERVICE_PASSWORD_MARIADB - - _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES} - healthcheck: - test: ["CMD-SHELL", "ps aux | grep -q '[s]chedule-messag' || exit 1"] + test: ["CMD-SHELL", "php -r \"exit(json_decode(file_get_contents('http://localhost/v1/health'))->status === 'ok' ? 0 : 1);\""] interval: 20s timeout: 5s retries: 3 + start_period: 10s appwrite-assistant: - image: appwrite/assistant:0.8.3 - container_name: appwrite-assistant + image: appwrite/assistant:0.8.4 environment: - _APP_ASSISTANT_OPENAI_API_KEY=${_APP_ASSISTANT_OPENAI_API_KEY} - healthcheck: - test: ["CMD-SHELL", "wget --spider -q http://127.0.0.1:3003 || exit 0"] - interval: 20s - timeout: 5s - retries: 3 + exclude_from_hc: true appwrite-browser: - image: appwrite/browser:0.2.4 - container_name: appwrite-browser - hostname: appwrite-browser - healthcheck: - test: ["CMD", "node", "-e", "import('http').then(http => http.get('http://localhost:3000', res => process.exit(0)).on('error', () => process.exit(1)))"] - interval: 20s - timeout: 5s - retries: 3 - + image: appwrite/browser:0.3.4 + exclude_from_hc: true openruntimes-executor: - container_name: openruntimes-executor - hostname: appwrite-executor + image: openruntimes/executor:0.29.0 + hostname: openruntimes-executor stop_signal: SIGINT - image: openruntimes/executor:0.8.6 - networks: - - runtimes + environment: + - OPR_EXECUTOR_IMAGES=${_APP_EXECUTOR_IMAGES:-openruntimes/node:v5-22,openruntimes/static:v5-1} + - OPR_EXECUTOR_INACTIVE_THRESHOLD=${_APP_COMPUTE_INACTIVE_THRESHOLD:-600} + - OPR_EXECUTOR_MAINTENANCE_INTERVAL=${_APP_COMPUTE_MAINTENANCE_INTERVAL:-600} + - OPR_EXECUTOR_NETWORK=${_APP_COMPUTE_RUNTIMES_NETWORK:-runtimes} + - OPR_EXECUTOR_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME} + - OPR_EXECUTOR_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD} + - OPR_EXECUTOR_ENV=${_APP_ENV:-production} + - OPR_EXECUTOR_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES:-node-22},${_APP_SITES_RUNTIMES:-static-1,node-22} + - OPR_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_EXECUTOR + - OPR_EXECUTOR_RUNTIME_VERSIONS=v5 + - OPEN_RUNTIMES_NFT=${_APP_OPEN_RUNTIMES_NFT:-enabled} + - OPR_EXECUTOR_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} + - OPR_EXECUTOR_CONNECTION_STORAGE=${_APP_EXECUTOR_CONNECTION_STORAGE:-local://localhost} + - OPR_EXECUTOR_CONNECTION_BUILD_CACHE_STORAGE= volumes: - /var/run/docker.sock:/var/run/docker.sock - appwrite-builds:/storage/builds:rw - appwrite-functions:/storage/functions:rw - appwrite-sites:/storage/sites:rw - /tmp:/tmp:rw - environment: - - OPR_EXECUTOR_IMAGE_PULL=disabled - - OPR_EXECUTOR_INACTIVE_TRESHOLD=${_APP_COMPUTE_INACTIVE_THRESHOLD} - - OPR_EXECUTOR_MAINTENANCE_INTERVAL=${_APP_COMPUTE_MAINTENANCE_INTERVAL} - - OPR_EXECUTOR_NETWORK=${_APP_COMPUTE_RUNTIMES_NETWORK:-runtimes} - - OPR_EXECUTOR_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME} - - OPR_EXECUTOR_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD} - - OPR_EXECUTOR_ENV=${_APP_ENV:-production} - - OPR_EXECUTOR_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES},${_APP_SITES_RUNTIMES} - - OPR_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_APPWRITE - - OPR_EXECUTOR_RUNTIME_VERSIONS=v5 - - OPR_EXECUTOR_LOGGING_CONFIG=${_APP_LOGGING_CONFIG} - - OPR_EXECUTOR_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local} - - OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY} - - OPR_EXECUTOR_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET} - - OPR_EXECUTOR_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION} - - OPR_EXECUTOR_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET} - - OPR_EXECUTOR_STORAGE_S3_ENDPOINT=${_APP_STORAGE_S3_ENDPOINT} - - OPR_EXECUTOR_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY} - - OPR_EXECUTOR_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET} - - OPR_EXECUTOR_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION} - - OPR_EXECUTOR_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET} - - OPR_EXECUTOR_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY} - - OPR_EXECUTOR_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET} - - OPR_EXECUTOR_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION} - - OPR_EXECUTOR_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET} - - OPR_EXECUTOR_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY} - - OPR_EXECUTOR_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET} - - OPR_EXECUTOR_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION} - - OPR_EXECUTOR_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET} - - OPR_EXECUTOR_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY} - - OPR_EXECUTOR_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET} - - OPR_EXECUTOR_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION} - - OPR_EXECUTOR_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET} - - appwrite-mariadb: - image: mariadb:10.11 - container_name: appwrite-mariadb - volumes: - - appwrite-mariadb:/var/lib/mysql:rw - environment: - - MYSQL_ROOT_PASSWORD=$SERVICE_PASSWORD_MARIADBROOT - - MYSQL_DATABASE=${_APP_DB_SCHEMA:-appwrite} - - MYSQL_USER=$SERVICE_USER_MARIADB - - MYSQL_PASSWORD=$SERVICE_PASSWORD_MARIADB - - MARIADB_AUTO_UPGRADE=1 - command: 'mysqld --innodb-flush-method=fsync' healthcheck: - test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + test: ["CMD-SHELL", "curl -fsS -H \"Authorization: Bearer $$OPR_EXECUTOR_SECRET\" http://localhost/v1/health > /dev/null || exit 1"] interval: 20s - timeout: 10s - retries: 5 + timeout: 5s + retries: 3 + start_period: 10s + + orchestrator: + image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.0.1 + hostname: orchestrator + user: root + environment: + - ORCHESTRATOR_BACKEND=docker + - ORCHESTRATOR_NETWORK=${COMPOSE_PROJECT_NAME} + - DOCKER_NETWORK=${COMPOSE_PROJECT_NAME} + - ARTIFACT_ENDPOINT=http://orchestrator:8080 + - S3_ENDPOINT=${_APP_STORAGE_S3_ENDPOINT} + - S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1} + - S3_ACCESS_KEY_ID=${_APP_STORAGE_S3_ACCESS_KEY} + - S3_SECRET_ACCESS_KEY=${_APP_STORAGE_S3_SECRET} + volumes: + - /var/run/docker.sock:/var/run/docker.sock + healthcheck: + test: ["CMD", "/ko-app/orchestrator", "-check-ready"] + interval: 20s + timeout: 5s + retries: 3 + start_period: 10s + + appwrite-postgresql: + image: appwrite/postgres:0.1.0 + environment: + - POSTGRES_DB=${_APP_DB_SCHEMA:-appwrite} + - POSTGRES_USER=$SERVICE_USER_POSTGRES + - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES + volumes: + - appwrite-postgresql:/var/lib/postgresql:rw + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 10s appwrite-redis: - image: redis:7.2.4-alpine - container_name: appwrite-redis - command: > - redis-server - --maxmemory 512mb - --maxmemory-policy allkeys-lru - --maxmemory-samples 5 + image: redis:7.4.7-alpine + command: redis-server --maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples 5 volumes: - appwrite-redis:/data:rw healthcheck: @@ -940,6 +703,22 @@ services: timeout: 10s retries: 5 -networks: - runtimes: - name: runtimes \ No newline at end of file + appwrite-clickhouse: + image: clickhouse/clickhouse-server:26.4.3-alpine + environment: + - CLICKHOUSE_DB=appwrite + - CLICKHOUSE_USER=appwrite + - CLICKHOUSE_PASSWORD=$SERVICE_PASSWORD_CLICKHOUSE + - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 + volumes: + - appwrite-clickhouse:/var/lib/clickhouse:rw + ulimits: + nofile: + soft: 262144 + hard: 262144 + healthcheck: + test: ["CMD-SHELL", "clickhouse-client --user \"$$CLICKHOUSE_USER\" --password \"$$CLICKHOUSE_PASSWORD\" --query \"SELECT 1\" > /dev/null || exit 1"] + interval: 10s + timeout: 5s + retries: 20 + start_period: 30s diff --git a/templates/compose/authentik.yaml b/templates/compose/authentik.yaml index 830ed8e8ab..1580ee7798 100644 --- a/templates/compose/authentik.yaml +++ b/templates/compose/authentik.yaml @@ -7,7 +7,7 @@ services: authentik-server: - image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2025.10.3} + image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2026.5.6} restart: unless-stopped command: server environment: @@ -27,13 +27,13 @@ services: - AUTHENTIK_EMAIL__TIMEOUT=${AUTHENTIK_EMAIL__TIMEOUT} - AUTHENTIK_EMAIL__FROM=${AUTHENTIK_EMAIL__FROM} volumes: - - ./media:/media + - ./data:/data - ./custom-templates:/templates depends_on: postgresql: condition: service_healthy authentik-worker: - image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2025.10.3} + image: ghcr.io/goauthentik/server:${AUTHENTIK_TAG:-2026.5.6} restart: unless-stopped command: worker environment: @@ -60,7 +60,7 @@ services: user: root volumes: - /var/run/docker.sock:/var/run/docker.sock - - ./media:/media + - ./data:/data - ./certs:/certs - ./custom-templates:/templates depends_on: diff --git a/templates/compose/autobase.yaml b/templates/compose/autobase.yaml index ad8b5384a5..9c09ff8727 100644 --- a/templates/compose/autobase.yaml +++ b/templates/compose/autobase.yaml @@ -7,12 +7,13 @@ services: autobase: - image: autobase/console_ui:2.5.2 + image: autobase/console_ui:2.11.0 platform: linux/amd64 environment: - SERVICE_FQDN_AUTOBASE_80 - PG_CONSOLE_AUTHORIZATION_TOKEN=${SERVICE_PASSWORD_UI} - PG_CONSOLE_API_HOST=autobase-api + - PG_CONSOLE_DBDESK_STUDIO_HOST=dbdesk-studio healthcheck: test: [ "CMD", "curl", "http://localhost:80/" ] interval: 10s @@ -23,7 +24,7 @@ services: condition: service_healthy autobase-db: - image: autobase/console_db:2.5.2 + image: autobase/console_db:2.11.0 platform: linux/amd64 environment: - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} @@ -36,7 +37,7 @@ services: retries: 10 autobase-api: - image: autobase/console_api:2.5.2 + image: autobase/console_api:2.11.0 platform: linux/amd64 environment: - PG_CONSOLE_DB_HOST=autobase-db @@ -58,3 +59,23 @@ services: depends_on: autobase-db: condition: service_healthy + + dbdesk-studio: + image: docker.io/bhavikagarwal2001/dbdesk-studio:0.1.5 + container_name: dbdesk-studio + environment: + - PORT=6789 + - CORS_ORIGIN=${CORS_ORIGIN:-*} + - NODE_ENV=production + - DEFAULT_SSL_MODE=require + - STORAGE_PATH=/opt/dbdesk-studio/data + volumes: + - dbdesk_studio_data:/opt/dbdesk-studio + healthcheck: + test: ["CMD", "curl", "-fsS", "http://localhost:6789/health"] + interval: 10s + timeout: 5s + retries: 5 + depends_on: + autobase-api: + condition: service_healthy diff --git a/templates/compose/beszel-agent.yaml b/templates/compose/beszel-agent.yaml index a8391094d3..0d1b525c52 100644 --- a/templates/compose/beszel-agent.yaml +++ b/templates/compose/beszel-agent.yaml @@ -6,16 +6,16 @@ services: beszel-agent: - image: 'henrygd/beszel-agent:0.18.7' # Released on 6 April 2026 + image: 'henrygd/beszel-agent:0.19.0' # Released on 3 September 2026 network_mode: host # Network stats graphs won't work if agent cannot access host system network stack environment: # Required - - LISTEN=/beszel_socket/beszel.sock - - HUB_URL=$SERVICE_URL_BESZEL + - LISTEN=${LISTEN:-/beszel_socket/beszel.sock} # Must stay inside the beszel_socket volume + - HUB_URL=${HUB_URL:-$SERVICE_URL_BESZEL} # Defaults to the hub from the beszel template - TOKEN=${TOKEN} # From hub token settings - KEY=${KEY} # SSH public key(s) from hub # Optional - - DISABLE_SSH=${DISABLE_SSH:-false} # Disable SSH + - DISABLE_SSH=${DISABLE_SSH:-false} # Disable SSH - LOG_LEVEL=${LOG_LEVEL:-warn} # Logging level - SKIP_GPU=${SKIP_GPU:-false} # Skip GPU monitoring - SYSTEM_NAME=${SYSTEM_NAME} # Custom system name diff --git a/templates/compose/budibase.yaml b/templates/compose/budibase.yaml index 9b7258438f..52c4d84a1a 100644 --- a/templates/compose/budibase.yaml +++ b/templates/compose/budibase.yaml @@ -90,7 +90,6 @@ services: - WORKER_UPSTREAM_URL=http://worker-service:4003 - MINIO_UPSTREAM_URL=http://minio-service:9000 - COUCHDB_UPSTREAM_URL=http://couchdb-service:5984 - - WATCHTOWER_UPSTREAM_URL=http://watchtower-service:8080 - RESOLVER=127.0.0.11 depends_on: - minio-service @@ -105,7 +104,7 @@ services: start_period: 10s couchdb-service: - image: budibase/couchdb + image: budibase/database environment: - COUCHDB_PASSWORD=$SERVICE_PASSWORD_COUCHDB - COUCHDB_USER=$SERVICE_USER_COUCHDB @@ -117,7 +116,7 @@ services: retries: 5 start_period: 10s volumes: - - couchdb3_data:/opt/couchdb/data + - couchdb3_data:/data redis-service: image: redis @@ -131,17 +130,3 @@ services: timeout: 15s retries: 5 start_period: 10s - - watchtower-service: - restart: always - image: containrrr/watchtower - volumes: - - /var/run/docker.sock:/var/run/docker.sock - command: --debug --http-api-update bbapps bbworker bbproxy - environment: - - WATCHTOWER_HTTP_API=true - - WATCHTOWER_HTTP_API_TOKEN=$SERVICE_PASSWORD_WATCHTOWER - - WATCHTOWER_CLEANUP=true - labels: - - "com.centurylinklabs.watchtower.enable=false" - exclude_from_hc: true diff --git a/templates/compose/bugsink.yaml b/templates/compose/bugsink.yaml index bd928224d6..4fc000fe3b 100644 --- a/templates/compose/bugsink.yaml +++ b/templates/compose/bugsink.yaml @@ -10,10 +10,10 @@ services: image: 'mysql:latest' restart: unless-stopped environment: - - MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_ROOT} + - MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_MYSQLROOT} - MYSQL_DATABASE=${MYSQL_DATABASE:-bugsink} - - MYSQL_USER=${SERVICE_USER_BUGSINK} - - MYSQL_PASSWORD=${SERVICE_PASSWORD_BUGSINK} + - MYSQL_USER=${SERVICE_USER_MYSQL} + - MYSQL_PASSWORD=${SERVICE_PASSWORD_MYSQL} volumes: - my-datavolume:/var/lib/mysql healthcheck: @@ -26,21 +26,32 @@ services: interval: 5s timeout: 20s retries: 10 + web: image: bugsink/bugsink restart: unless-stopped environment: - SECRET_KEY=$SERVICE_PASSWORD_64_BUGSINK - - CREATE_SUPERUSER=admin:$SERVICE_PASSWORD_BUGSINK + - CREATE_SUPERUSER=${BUGSINK_ADMIN_EMAIL:?}:$SERVICE_PASSWORD_BUGSINK - SERVICE_URL_BUGSINK_8000 - BASE_URL=$SERVICE_URL_BUGSINK - - DATABASE_URL=mysql://${SERVICE_USER_BUGSINK}:$SERVICE_PASSWORD_BUGSINK@mysql:3306/${MYSQL_DATABASE:-bugsink} + - DATABASE_URL=mysql://${SERVICE_USER_MYSQL}:$SERVICE_PASSWORD_MYSQL@mysql:3306/${MYSQL_DATABASE:-bugsink} - BEHIND_HTTPS_PROXY=True - depends_on: - mysql: - condition: service_healthy + - SITE_TITLE=${SITE_TITLE:-Bugsink} + - TIME_ZONE=${TIME_ZONE:-UTC} + - PHONEHOME=${PHONEHOME:-False} + - EMAIL_HOST=${EMAIL_HOST} + - EMAIL_PORT=${EMAIL_PORT:-587} + - EMAIL_HOST_USER=${EMAIL_HOST_USER} + - EMAIL_HOST_PASSWORD=${EMAIL_HOST_PASSWORD} + - EMAIL_USE_TLS=${EMAIL_USE_TLS:-True} + - EMAIL_USE_SSL=${EMAIL_USE_SSL:-False} + - DEFAULT_FROM_EMAIL=${DEFAULT_FROM_EMAIL} healthcheck: test: ["CMD-SHELL", "python -c 'import requests; requests.get(\"http://localhost:8000/\").raise_for_status()'"] interval: 5s timeout: 20s retries: 10 + depends_on: + mysql: + condition: service_healthy diff --git a/templates/compose/bulwark.yaml b/templates/compose/bulwark.yaml new file mode 100644 index 0000000000..13e188260d --- /dev/null +++ b/templates/compose/bulwark.yaml @@ -0,0 +1,23 @@ +# documentation: https://bulwarkmail.org/docs +# slogan: Modern webmail platform +# category: Mail +# tags: mail,webmail,jmap,email,messaging +# logo: svgs/bulwark.svg +# port: 3000 + +services: + bulwark: + image: 'ghcr.io/bulwarkmail/webmail:v1.8.1' + environment: + - SERVICE_URL_BULWARK_3000 + - JMAP_SERVER_URL='${JMAP_SERVER_URL:?}' + - SESSION_SECRET='${SERVICE_HEX_64_BULWARK}' + volumes: + - 'bulwark-config:/app/data/admin' + - 'bulwark-state:/app/data/admin-state' + healthcheck: + test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1:3000/api/health"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s diff --git a/templates/compose/buzz.yaml b/templates/compose/buzz.yaml index 6423f6400f..f65fee9087 100644 --- a/templates/compose/buzz.yaml +++ b/templates/compose/buzz.yaml @@ -16,7 +16,7 @@ services: - RELAY_URL=wss://${SERVICE_FQDN_BUZZ} - BUZZ_MEDIA_BASE_URL=${SERVICE_URL_BUZZ}/media - BUZZ_MEDIA_SERVER_DOMAIN=${SERVICE_FQDN_BUZZ} - - BUZZ_CORS_ORIGINS=${SERVICE_URL_BUZZ} + - BUZZ_CORS_ORIGINS=${SERVICE_URL_BUZZ},tauri://localhost,http://tauri.localhost - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-buzz} - REDIS_URL=redis://:${SERVICE_PASSWORD_REDIS}@redis:6379 - BUZZ_S3_ENDPOINT=http://minio:9000 diff --git a/templates/compose/chatwoot.yaml b/templates/compose/chatwoot.yaml index 87aaa2c052..37ce2fa385 100644 --- a/templates/compose/chatwoot.yaml +++ b/templates/compose/chatwoot.yaml @@ -84,7 +84,7 @@ services: volumes: - rails-data:/app/storage healthcheck: - test: ["CMD-SHELL", "bundle exec rails runner 'puts Sidekiq.redis(&:info)' > /dev/null 2>&1"] + test: ["CMD-SHELL", "bundle exec sidekiqmon processes | grep -q 'sidekiq'"] interval: 30s timeout: 10s retries: 3 diff --git a/templates/compose/chibisafe.yaml b/templates/compose/chibisafe.yaml index 60bb8a7d72..41e8b83fda 100644 --- a/templates/compose/chibisafe.yaml +++ b/templates/compose/chibisafe.yaml @@ -50,7 +50,7 @@ services: retries: 3 start_period: 10s volumes: - - uploads:/app/uploads:ro + - chibisafe-uploads:/app/uploads:ro - type: bind source: ./Caddyfile target: /etc/caddy/Caddyfile diff --git a/templates/compose/cyberchef.yaml b/templates/compose/cyberchef.yaml index 22bfad22b8..5288a70963 100644 --- a/templates/compose/cyberchef.yaml +++ b/templates/compose/cyberchef.yaml @@ -3,14 +3,14 @@ # category: security # tags: encryption, encoding, compression, data analysis, tools, development # logo: svgs/cyberchef.jpeg -# port: 80 +# port: 8080 services: cyberchef: image: ghcr.io/gchq/cyberchef:latest platform: linux/amd64 environment: - - SERVICE_URL_CYBERCHEF_80 + - SERVICE_URL_CYBERCHEF_8080 volumes: - cyberchef-data:/app/data healthcheck: @@ -18,7 +18,7 @@ services: - CMD - curl - '-f' - - 'http://127.0.0.1:80' + - 'http://127.0.0.1:8080' interval: 30s timeout: 10s retries: 3 diff --git a/templates/compose/denoKV.yaml b/templates/compose/deno-kv.yaml similarity index 96% rename from templates/compose/denoKV.yaml rename to templates/compose/deno-kv.yaml index f4563d6ea1..d34b4ed094 100644 --- a/templates/compose/denoKV.yaml +++ b/templates/compose/deno-kv.yaml @@ -2,7 +2,7 @@ # slogan: The Denoland key-value database # category: database # tags: deno, kv, key-value, database -# logo: svgs/denokv.svg +# logo: svgs/deno-kv.svg # port: 4512 services: diff --git a/templates/compose/docling.yaml b/templates/compose/docling.yaml new file mode 100644 index 0000000000..e87099a64e --- /dev/null +++ b/templates/compose/docling.yaml @@ -0,0 +1,25 @@ +# documentation: https://github.com/DS4SD/docling-serve +# slogan: Convert documents (PDF, DOCX, PPTX, images, HTML) to Markdown, JSON, and more using AI-powered document processing. +# category: ai +# tags: ai, document, pdf, ocr, markdown, extraction, ibm, rag, nlp +# logo: svgs/docling.png +# port: 5001 + +services: + docling-serve: + image: ghcr.io/docling-project/docling-serve-cpu:latest + environment: + - SERVICE_URL_DOCLING_5001 + - DOCLING_SERVE_ENABLE_UI=${DOCLING_SERVE_ENABLE_UI:-true} + - DOCLING_SERVE_LOG_LEVEL=${DOCLING_SERVE_LOG_LEVEL:-WARNING} + - DOCLING_NUM_THREADS=${DOCLING_NUM_THREADS:-4} + healthcheck: + test: + - CMD + - wget + - "-qO-" + - "http://127.0.0.1:5001/health" + interval: 30s + timeout: 30s + retries: 10 + start_period: 120s diff --git a/templates/compose/dozzle-with-auth.yaml b/templates/compose/dozzle-with-auth.yaml index de2b323cfe..318301253f 100644 --- a/templates/compose/dozzle-with-auth.yaml +++ b/templates/compose/dozzle-with-auth.yaml @@ -22,7 +22,7 @@ services: admin: email: test@email.com name: Admin - # A sha-256 hash of the password you want to use. Can be computed with "echo -n password | shasum -a 256". Default password is "Test". + # A bcrypt hash of the password you want to use. Can be computed with "python3 -c 'import bcrypt;print(bcrypt.hashpw(b"your-password",bcrypt.gensalt(11)).decode())' ". Default password is "test". password: $2a$11$viucCvFLlHWvBNOOI6uypuVU.D09UWb.zswRxEg0MkDPi1q/bKbdG healthcheck: diff --git a/templates/compose/emqx-enterprise.yaml b/templates/compose/emqx-enterprise.yaml index 01d063b6f5..e0ac58762b 100644 --- a/templates/compose/emqx-enterprise.yaml +++ b/templates/compose/emqx-enterprise.yaml @@ -7,7 +7,7 @@ services: emqx: - image: emqx/emqx-enterprise:6.2.0 + image: emqx/emqx-enterprise:6.2.2 environment: - SERVICE_URL_EMQX_18083 - EMQX_DASHBOARD__DEFAULT_PASSWORD=${SERVICE_PASSWORD_EMQX} diff --git a/templates/compose/engram.yaml b/templates/compose/engram.yaml new file mode 100644 index 0000000000..2d706e2f3b --- /dev/null +++ b/templates/compose/engram.yaml @@ -0,0 +1,41 @@ +# documentation: https://github.com/Gentleman-Programming/engram +# slogan: Persistent memory sync server for AI coding agents (MCP). +# category: ai +# tags: ai, memory, mcp, agents, self-hosted, postgres +# logo: svgs/engram.png +# port: 8080 + +services: + engram: + image: ghcr.io/gentleman-programming/engram:1.20.0 + command: + - cloud + - serve + environment: + - SERVICE_FQDN_ENGRAM_8080 + - ENGRAM_CLOUD_HOST=0.0.0.0 + - ENGRAM_PORT=8080 + - ENGRAM_DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgresql:5432/${POSTGRES_DB}?sslmode=disable + - ENGRAM_JWT_SECRET=${SERVICE_BASE64_64_JWTSECRET} + - ENGRAM_CLOUD_TOKEN=${SERVICE_PASSWORD_64_CLOUDTOKEN} + - ENGRAM_CLOUD_ADMIN=${SERVICE_PASSWORD_64_ADMIN} + - ENGRAM_CLOUD_ALLOWED_PROJECTS=${ENGRAM_CLOUD_ALLOWED_PROJECTS:-*} + depends_on: + postgresql: + condition: service_healthy + + postgresql: + image: postgres:18-alpine + environment: + - POSTGRES_USER=${SERVICE_USER_POSTGRES} + - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} + - POSTGRES_DB=${POSTGRES_DB:-engram-db} + volumes: + - engram-postgresql-data:/var/lib/postgresql + healthcheck: + test: + - CMD-SHELL + - "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}" + interval: 5s + timeout: 20s + retries: 10 diff --git a/templates/compose/fider.yaml b/templates/compose/fider.yaml index 62d2b0b2d1..d736663582 100644 --- a/templates/compose/fider.yaml +++ b/templates/compose/fider.yaml @@ -10,7 +10,7 @@ services: image: getfider/fider:stable environment: - SERVICE_URL_FIDER_3000 - - BASE_URL=$SERVICE_URL_FIDER_3000 + - BASE_URL=$SERVICE_URL_FIDER - DATABASE_URL=postgres://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@database:5432/fider?sslmode=disable - JWT_SECRET=$SERVICE_PASSWORD_64_FIDER - EMAIL_NOREPLY=${EMAIL_NOREPLY:-noreply@example.com} diff --git a/templates/compose/garage.yaml b/templates/compose/garage.yaml index e3292dffcf..a287cb9f76 100644 --- a/templates/compose/garage.yaml +++ b/templates/compose/garage.yaml @@ -7,7 +7,12 @@ services: garage: - image: dxflrs/garage:v2.1.0 + image: dxflrs/garage:v2.3.0 + command: + - /garage + - server + - '--single-node' + - '--default-bucket' environment: - GARAGE_S3_API_URL=$GARAGE_S3_API_URL - GARAGE_WEB_URL=$GARAGE_WEB_URL @@ -16,6 +21,9 @@ services: - GARAGE_ADMIN_TOKEN=$SERVICE_PASSWORD_GARAGE - GARAGE_METRICS_TOKEN=$SERVICE_PASSWORD_GARAGEMETRICS - GARAGE_ALLOW_WORLD_READABLE_SECRETS=true + - GARAGE_DEFAULT_ACCESS_KEY=${SERVICE_USER_GARAGE} + - GARAGE_DEFAULT_SECRET_KEY=${SERVICE_PASSWORD_64_GARAGE} + - GARAGE_DEFAULT_BUCKET=${GARAGE_DEFAULT_BUCKET:-default} - RUST_LOG=${RUST_LOG:-garage=info} volumes: - garage-meta:/var/lib/garage/meta diff --git a/templates/compose/hermes-agent-with-webui.yaml b/templates/compose/hermes-agent-with-webui.yaml index a55b8c79a7..caba7c36a7 100644 --- a/templates/compose/hermes-agent-with-webui.yaml +++ b/templates/compose/hermes-agent-with-webui.yaml @@ -1,49 +1,66 @@ -# documentation: https://github.com/nesquena/hermes-webui -# slogan: Hermes Agent — autonomous AI agent with persistent memory, scheduling, and a self-hosted web chat UI. -# category: ai -# tags: ai, agent, llm, chatbot, hermes, openrouter, anthropic, openai -# logo: svgs/hermes-agent.png -# port: 8787 - -services: - hermes-agent: - image: 'nousresearch/hermes-agent@sha256:2f1f2f1725e5dc9a61cf6a2dea5aca52a776ec4d022cb29679e6aa3ff303e77a' # v2026.5.29 - command: gateway run - environment: - - HERMES_HOME=/home/hermes/.hermes - - HERMES_UID=1000 - - HERMES_GID=1000 - - OPENROUTER_API_KEY=${OPENROUTER_API_KEY} - - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} - - OPENAI_API_KEY=${OPENAI_API_KEY} - - GOOGLE_API_KEY=${GOOGLE_API_KEY} - volumes: - - hermes-home:/home/hermes/.hermes - - hermes-agent-src:/opt/hermes - healthcheck: - test: ["CMD-SHELL", "test -d /home/hermes/.hermes || exit 1"] - interval: 10s - timeout: 5s - retries: 5 - - hermes-webui: - image: ghcr.io/nesquena/hermes-webui:0.51.92 - depends_on: - - hermes-agent - environment: - - SERVICE_URL_HERMESWEBUI_8787 - - HERMES_WEBUI_HOST=0.0.0.0 - - HERMES_WEBUI_PORT=8787 - - HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui - - WANTED_UID=1000 - - WANTED_GID=1000 - - HERMES_WEBUI_PASSWORD=${SERVICE_PASSWORD_HERMESWEBUI} - volumes: - - hermes-home:/home/hermeswebui/.hermes - - hermes-agent-src:/home/hermeswebui/.hermes/hermes-agent:ro - - hermes-workspace:/workspace - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1:8787/health"] - interval: 30s - timeout: 5s - retries: 3 +# documentation: https://github.com/nesquena/hermes-webui +# slogan: Hermes Agent - autonomous AI agent with persistent memory, scheduling, and a self-hosted web chat UI. +# category: ai +# tags: ai, agent, llm, chatbot, hermes, openrouter, anthropic, openai +# logo: svgs/hermes-agent.png +# port: 8787 + +services: + hermes-agent: + image: 'nousresearch/hermes-agent:v2026.6.5' + command: 'gateway run' + environment: + - HERMES_HOME=/home/hermes/.hermes + - WIKI_PATH=/home/hermes/.hermes/wiki + - GATEWAY_ALLOW_ALL_USERS=true + - HERMES_REDACT_SECRETS=true + - HERMES_UID=1000 + - HERMES_GID=1000 + - 'HERMES_ENABLE_PROJECT_PLUGINS=${HERMES_ENABLE_PROJECT_PLUGINS:-true}' + - 'HERMES_OPTIONAL_SKILLS=${HERMES_OPTIONAL_SKILLS:-}' + - 'HERMES_ALLOW_PRIVATE_URLS=${HERMES_ALLOW_PRIVATE_URLS:-false}' + - 'FIRECRAWL_API_KEY=${FIRECRAWL_API_KEY:-}' + - 'FIRECRAWL_API_URL=${FIRECRAWL_API_URL:-https://api.firecrawl.dev}' + - 'OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}' + - 'ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}' + - 'OPENAI_API_KEY=${OPENAI_API_KEY:-}' + - 'GOOGLE_API_KEY=${GOOGLE_API_KEY:-}' + volumes: + - 'hermes-home:/home/hermes/.hermes' + - 'hermes-skills:/home/hermes/.hermes/skills' + - 'hermes-agent-src:/opt/hermes' + healthcheck: + test: + - CMD-SHELL + - 'test -d /home/hermes/.hermes || exit 1' + interval: 10s + timeout: 5s + retries: 5 + hermes-webui: + image: 'ghcr.io/nesquena/hermes-webui:0.51.489' + depends_on: + - hermes-agent + environment: + - SERVICE_URL_HERMESWEBUI_8787 + - SERVICE_USER_HERMESWEBUI + - SERVICE_PASSWORD_HERMESWEBUI + - HERMES_WEBUI_HOST=0.0.0.0 + - HERMES_WEBUI_PORT=8787 + - HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui + - WANTED_UID=1000 + - WANTED_GID=1000 + - HERMES_WEBUI_USERNAME=${SERVICE_USER_HERMESWEBUI} + - HERMES_WEBUI_PASSWORD=${SERVICE_PASSWORD_HERMESWEBUI} + volumes: + - 'hermes-home:/home/hermeswebui/.hermes' + - 'hermes-agent-src:/home/hermeswebui/.hermes/hermes-agent:ro' + - 'hermes-workspace:/workspace' + healthcheck: + test: + - CMD + - curl + - '-f' + - 'http://127.0.0.1:8787/health' + interval: 30s + timeout: 5s + retries: 3 diff --git a/templates/compose/hermes-agent.yaml b/templates/compose/hermes-agent.yaml new file mode 100644 index 0000000000..6491f3d79b --- /dev/null +++ b/templates/compose/hermes-agent.yaml @@ -0,0 +1,41 @@ +# documentation: https://github.com/NousResearch/hermes-agent +# slogan: Hermes Agent - autonomous AI agent with persistent memory, scheduling, and built-in web dashboard. +# category: ai +# tags: ai, agent, llm, chatbot, hermes, openrouter, anthropic, openai +# logo: svgs/hermes-agent.png +# port: 9119 + +services: + hermes-agent: + image: 'nousresearch/hermes-agent:v2026.8.3' + command: 'gateway run' + environment: + - SERVICE_URL_HERMESAGENT_9119 + - HERMES_DASHBOARD=1 + - HERMES_DASHBOARD_HOST=0.0.0.0 + - HERMES_DASHBOARD_PORT=9119 + - 'HERMES_DASHBOARD_BASIC_AUTH_USERNAME=${SERVICE_USER_HERMESAGENT}' + - 'HERMES_DASHBOARD_BASIC_AUTH_PASSWORD=${SERVICE_PASSWORD_HERMESAGENT}' + - 'HERMES_DASHBOARD_BASIC_AUTH_SECRET=${SERVICE_BASE64_64_HERMESAGENT}' + - HERMES_HOME=/opt/data + - GATEWAY_ALLOW_ALL_USERS=true + - HERMES_REDACT_SECRETS=true + - HERMES_UID=1000 + - HERMES_GID=1000 + - 'HERMES_ENABLE_PROJECT_PLUGINS=${HERMES_ENABLE_PROJECT_PLUGINS:-true}' + - 'HERMES_ALLOW_PRIVATE_URLS=${HERMES_ALLOW_PRIVATE_URLS:-false}' + - 'FIRECRAWL_API_KEY=${FIRECRAWL_API_KEY:-}' + - 'FIRECRAWL_API_URL=${FIRECRAWL_API_URL:-https://api.firecrawl.dev}' + - 'OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-}' + - 'ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}' + - 'OPENAI_API_KEY=${OPENAI_API_KEY:-}' + - 'GOOGLE_API_KEY=${GOOGLE_API_KEY:-}' + volumes: + - 'hermes-home:/opt/data' + healthcheck: + test: + - CMD-SHELL + - 'test -d /opt/data || exit 1' + interval: 10s + timeout: 5s + retries: 5 diff --git a/templates/compose/homarr.yaml b/templates/compose/homarr.yaml index 5934e97994..82fb46e322 100644 --- a/templates/compose/homarr.yaml +++ b/templates/compose/homarr.yaml @@ -7,8 +7,9 @@ services: homarr: - image: ghcr.io/homarr-labs/homarr:v1.40.0 + image: ghcr.io/homarr-labs/homarr:v1.74.0 environment: + - SECRET_ENCRYPTION_KEY=$SERVICE_HEX_64_ENCRYPTION - SERVICE_URL_HOMARR_7575 - 'SECRET_ENCRYPTION_KEY=${SERVICE_HEX_64_HOMARR}' volumes: diff --git a/templates/compose/honcho.yaml b/templates/compose/honcho.yaml new file mode 100644 index 0000000000..241c940a95 --- /dev/null +++ b/templates/compose/honcho.yaml @@ -0,0 +1,74 @@ +# documentation: https://honcho.dev/docs/v3/contributing/self-hosting +# slogan: Honcho is a developer tool to build personalized AI agents with production-ready memory, dialectic reasoning, and stateful dialogue. +# category: ai +# tags: ai, memory, llm, agents, rag, postgres, pgvector, redis +# logo: svgs/honcho.svg +# port: 8000 + +services: + api: + image: ghcr.io/plastic-labs/honcho:v3.0.12 + entrypoint: ["sh", "docker/entrypoint.sh"] + environment: + - SERVICE_URL_API_8000 + - DB_CONNECTION_URI=postgresql+psycopg://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@database:5432/postgres + - CACHE_URL=redis://redis:6379/0?suppress=true + - CACHE_ENABLED=true + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - AUTH_USE_AUTH=false + - LLM_OPENAI_API_KEY=${LLM_OPENAI_API_KEY} + - VECTOR_STORE_TYPE=pgvector + healthcheck: + test: ["CMD", "/app/.venv/bin/python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health', timeout=2).read()"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + depends_on: + database: + condition: service_healthy + redis: + condition: service_healthy + + deriver: + image: ghcr.io/plastic-labs/honcho:v3.0.12 + entrypoint: ["/app/.venv/bin/python", "-m", "src.deriver"] + environment: + - DB_CONNECTION_URI=postgresql+psycopg://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@database:5432/postgres + - CACHE_URL=redis://redis:6379/0?suppress=true + - CACHE_ENABLED=true + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - AUTH_USE_AUTH=false + - LLM_OPENAI_API_KEY=${LLM_OPENAI_API_KEY} + - VECTOR_STORE_TYPE=pgvector + depends_on: + api: + condition: service_healthy + database: + condition: service_healthy + redis: + condition: service_healthy + + database: + image: pgvector/pgvector:pg15 + environment: + - POSTGRES_DB=postgres + - POSTGRES_USER=${SERVICE_USER_POSTGRES} + - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} + volumes: + - honcho_pgdata:/var/lib/postgresql/data/ + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 5 + + redis: + image: redis:8.2 + volumes: + - honcho_redis_data:/data + healthcheck: + test: ["CMD-SHELL", "redis-cli ping"] + interval: 5s + timeout: 5s + retries: 5 diff --git a/templates/compose/karakeep.yaml b/templates/compose/karakeep.yaml index dc3930a39c..9623ed79d9 100644 --- a/templates/compose/karakeep.yaml +++ b/templates/compose/karakeep.yaml @@ -7,7 +7,7 @@ services: web: - image: ghcr.io/karakeep-app/karakeep:release + image: ghcr.io/karakeep-app/karakeep:0.33.2 volumes: - karakeep-data:/data environment: @@ -22,17 +22,17 @@ services: - DATA_DIR=/data chrome: - image: gcr.io/zenika-hub/alpine-chrome:124 + image: ghcr.io/karakeep-app/karakeep-chrome:release command: - '--no-sandbox' - '--disable-gpu' - '--disable-dev-shm-usage' - - '--remote-debugging-address=0.0.0.0' - - '--remote-debugging-port=9222' - '--hide-scrollbars' + - '--disable-blink-features=AutomationControlled' + - '--window-size=1440,900' meilisearch: - image: getmeili/meilisearch:v1.13.3 + image: getmeili/meilisearch:v1.41.0 environment: - MEILI_NO_ANALYTICS=${MEILI_NO_ANALYTICS:-true} - NEXTAUTH_SECRET=${SERVICE_PASSWORD_KARAKEEPNEXTAUTH} diff --git a/templates/compose/lidarr.yml b/templates/compose/lidarr.yml new file mode 100644 index 0000000000..c3b3a670e3 --- /dev/null +++ b/templates/compose/lidarr.yml @@ -0,0 +1,28 @@ +# documentation: https://hub.docker.com/r/linuxserver/lidarr +# slogan: Lidarr - a music collection manager for Usenet and BitTorrent users +# category: media +# tags: media, server, music, audio +# logo: svgs/lidarr.svg +# port: 8686 + +services: + lidarr: + image: 'lscr.io/linuxserver/lidarr:3.1.0.4875-ls40' + environment: + - SERVICE_URL_LIDARR_8686 + - PUID=1000 + - PGID=1000 + - 'TZ=${TZ:-America/Toronto}' + volumes: + - 'lidarr-config:/config' + - 'lidarr-music:/music' + - 'lidarr-downloads:/downloads' + healthcheck: + test: + - CMD + - curl + - '-f' + - 'http://localhost:8686' + interval: 2s + timeout: 10s + retries: 15 diff --git a/templates/compose/linkwarden.yaml b/templates/compose/linkwarden.yaml new file mode 100644 index 0000000000..44634649eb --- /dev/null +++ b/templates/compose/linkwarden.yaml @@ -0,0 +1,54 @@ +# documentation: https://docs.linkwarden.app/self-hosting/setup +# slogan: A self-hostable collaborative bookmark manager to collect, organize, and preserve web pages. +# category: productivity +# tags: bookmarks,collaboration,archive,links,self-hosted +# logo: svgs/linkwarden.svg +# port: 3000 + +services: + linkwarden: + image: ghcr.io/linkwarden/linkwarden:v2.16.1 + environment: + - SERVICE_URL_LINKWARDEN_3000 + - NEXTAUTH_URL=${SERVICE_URL_LINKWARDEN_3000}/api/v1/auth + - NEXTAUTH_SECRET=${SERVICE_PASSWORD_LINKWARDENNEXTAUTH} + - MEILI_MASTER_KEY=${SERVICE_PASSWORD_MEILI} + - DATABASE_URL=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgresql:5432/${POSTGRES_DB:-linkwarden} + volumes: + - linkwarden-data:/data/data + depends_on: + postgresql: + condition: service_healthy + meilisearch: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:3000"] + interval: 10s + timeout: 20s + retries: 10 + + postgresql: + image: postgres:16-alpine + volumes: + - postgresql-data:/var/lib/postgresql/data + environment: + - POSTGRES_USER=$SERVICE_USER_POSTGRES + - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES + - POSTGRES_DB=${POSTGRES_DB:-linkwarden} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 20s + retries: 10 + + meilisearch: + image: getmeili/meilisearch:v1.12.8 + environment: + - MEILI_MASTER_KEY=${SERVICE_PASSWORD_MEILI} + volumes: + - meilisearch-data:/meili_data + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:7700/health"] + interval: 5s + timeout: 10s + retries: 10 diff --git a/templates/compose/mattermost.yaml b/templates/compose/mattermost.yaml index 26faa2098f..1cf0da2464 100644 --- a/templates/compose/mattermost.yaml +++ b/templates/compose/mattermost.yaml @@ -4,6 +4,7 @@ # tags: mattermost,slack,alternative # logo: svgs/mattermost.svg # port: 8065 +# amd_only: true services: mattermost: diff --git a/templates/compose/obsidian.yaml b/templates/compose/obsidian.yaml new file mode 100644 index 0000000000..6d10f31d6d --- /dev/null +++ b/templates/compose/obsidian.yaml @@ -0,0 +1,30 @@ +# documentation: https://docs.linuxserver.io/images/docker-obsidian +# slogan: Note-taking app with linking, organizing, and hundreds of plugins - runs in your browser via remote desktop +# category: productivity +# tags: notes,obsidian,markdown,desktop,gui,productivity +# logo: svgs/obsidian.svg +# port: 3000 + +services: + obsidian: + image: lscr.io/linuxserver/obsidian:latest + environment: + - SERVICE_URL_OBSIDIAN_3000 + - PUID=${PUID:-1000} + - PGID=${PGID:-1000} + - TZ=${TZ:-Etc/UTC} + - CUSTOM_USER=${SERVICE_USER_OBSIDIAN} + - PASSWORD=${SERVICE_PASSWORD_OBSIDIAN} + volumes: + - obsidian-config:/config + # Required for Electron/Chromium shared memory + shm_size: "1gb" + # Needed on hosts with older kernels or libseccomp; safe to remove on modern hosts + security_opt: + - seccomp=unconfined + healthcheck: + test: ["CMD", "curl", "-s", "-o", "/dev/null", "http://127.0.0.1:3000/"] + interval: 5s + timeout: 20s + retries: 10 + start_period: 90s diff --git a/templates/compose/openwa-with-postgresql-and-redis.yaml b/templates/compose/openwa-with-postgresql-and-redis.yaml new file mode 100644 index 0000000000..15fedfb1c7 --- /dev/null +++ b/templates/compose/openwa-with-postgresql-and-redis.yaml @@ -0,0 +1,113 @@ +# documentation: https://github.com/rmyndharis/OpenWA +# slogan: Production OpenWA with PostgreSQL, Redis, and bundled dashboard. +# category: messaging +# tags: whatsapp,api,gateway,messaging,automation,webhooks,postgresql,redis +# logo: svgs/openwa.png +# port: 2785 +# Production stack with PostgreSQL + Redis. Coolify/Traefik handle routing; no docker-proxy needed. + +services: + openwa: + image: ghcr.io/rmyndharis/openwa:0.23.1 + restart: unless-stopped + stop_grace_period: 45s + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + cap_add: + - CHOWN + - DAC_OVERRIDE + - FOWNER + - SETGID + - SETUID + read_only: true + tmpfs: + - /tmp + pids_limit: ${OPENWA_PIDS_LIMIT:-2048} + mem_limit: ${OPENWA_MEM_LIMIT:-2g} + environment: + - SERVICE_URL_OPENWA_2785 + - NODE_ENV=production + - HOME=/tmp + - XDG_CONFIG_HOME=/tmp/.config + - XDG_CACHE_HOME=/tmp/.cache + - PORT=2785 + - LOG_LEVEL=${LOG_LEVEL:-info} + - BASE_URL=${SERVICE_URL_OPENWA} + - DASHBOARD_URL=${SERVICE_URL_OPENWA} + - API_MASTER_KEY=${SERVICE_PASSWORD_OPENWA} + - DATABASE_TYPE=postgres + - DATABASE_HOST=postgresql + - DATABASE_PORT=5432 + - DATABASE_USERNAME=$SERVICE_USER_POSTGRES + - DATABASE_PASSWORD=$SERVICE_PASSWORD_POSTGRES + - DATABASE_NAME=${POSTGRES_DB:-openwa} + - DATABASE_SYNCHRONIZE=false + - POSTGRES_SCHEMA=public + - ENGINE_TYPE=${ENGINE_TYPE:-whatsapp-web.js} + - SESSION_DATA_PATH=./data/sessions + - PUPPETEER_HEADLESS=true + - PUPPETEER_ARGS=--no-sandbox,--disable-setuid-sandbox,--disable-dev-shm-usage + - PUPPETEER_EXECUTABLE_PATH=/usr/local/bin/puppeteer-chrome + - STORAGE_TYPE=local + - STORAGE_LOCAL_PATH=./data/media + - REDIS_ENABLED=true + - REDIS_HOST=openwa-redis + - REDIS_PORT=6379 + - QUEUE_ENABLED=true + - CACHE_ENABLED=true + - AUTO_START_SESSIONS=${AUTO_START_SESSIONS:-false} + volumes: + - openwa-data:/app/data + depends_on: + postgresql: + condition: service_healthy + openwa-redis: + condition: service_healthy + healthcheck: + test: + - CMD + - node + - -e + - "require('http').get('http://localhost:2785/api/health/ready', (r) => process.exit(r.statusCode === 200 ? 0 : 1))" + interval: 30s + timeout: 10s + retries: 3 + start_period: 45s + + postgresql: + image: postgres:16-alpine + restart: unless-stopped + security_opt: + - no-new-privileges:true + environment: + - POSTGRES_USER=$SERVICE_USER_POSTGRES + - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES + - POSTGRES_DB=${POSTGRES_DB:-openwa} + volumes: + - postgresql-data:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 3s + retries: 5 + + openwa-redis: + image: redis:7-alpine + restart: unless-stopped + security_opt: + - no-new-privileges:true + command: redis-server --appendonly yes --maxmemory-policy noeviction + volumes: + - redis-data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 5s + timeout: 3s + retries: 5 + +volumes: + openwa-data: + postgresql-data: + redis-data: diff --git a/templates/compose/openwa.yaml b/templates/compose/openwa.yaml new file mode 100644 index 0000000000..58481c93e1 --- /dev/null +++ b/templates/compose/openwa.yaml @@ -0,0 +1,63 @@ +# documentation: https://github.com/rmyndharis/OpenWA +# slogan: Free, open source, self-hosted WhatsApp API gateway with bundled dashboard. +# category: messaging +# tags: whatsapp,api,gateway,messaging,automation,webhooks,open,source +# logo: svgs/openwa.png +# port: 2785 + +services: + openwa: + image: ghcr.io/rmyndharis/openwa:0.23.1 + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + cap_add: + - CHOWN + - DAC_OVERRIDE + - FOWNER + - SETGID + - SETUID + read_only: true + tmpfs: + - /tmp + pids_limit: ${OPENWA_PIDS_LIMIT:-2048} + mem_limit: ${OPENWA_MEM_LIMIT:-2g} + environment: + - SERVICE_URL_OPENWA_2785 + - NODE_ENV=production + - HOME=/tmp + - XDG_CONFIG_HOME=/tmp/.config + - XDG_CACHE_HOME=/tmp/.cache + - PORT=2785 + - LOG_LEVEL=${LOG_LEVEL:-info} + - BASE_URL=${SERVICE_URL_OPENWA} + - DASHBOARD_URL=${SERVICE_URL_OPENWA} + - API_MASTER_KEY=${SERVICE_PASSWORD_OPENWA} + - DATABASE_TYPE=sqlite + - DATABASE_NAME=./data/openwa.sqlite + - DATABASE_SYNCHRONIZE=true + - DATABASE_LOGGING=false + - ENGINE_TYPE=${ENGINE_TYPE:-whatsapp-web.js} + - SESSION_DATA_PATH=./data/sessions + - PUPPETEER_HEADLESS=true + - PUPPETEER_ARGS=--no-sandbox,--disable-setuid-sandbox,--disable-dev-shm-usage + - PUPPETEER_EXECUTABLE_PATH=/usr/local/bin/puppeteer-chrome + - STORAGE_TYPE=local + - STORAGE_LOCAL_PATH=./data/media + - REDIS_ENABLED=false + - QUEUE_ENABLED=false + - CACHE_ENABLED=false + - AUTO_START_SESSIONS=${AUTO_START_SESSIONS:-false} + volumes: + - openwa-data:/app/data + healthcheck: + test: + - CMD + - node + - -e + - "require('http').get('http://localhost:2785/api/health/ready', (r) => process.exit(r.statusCode === 200 ? 0 : 1))" + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s diff --git a/templates/compose/osticket.yaml b/templates/compose/osticket.yaml index 7d502989a5..f17e81457f 100644 --- a/templates/compose/osticket.yaml +++ b/templates/compose/osticket.yaml @@ -1,3 +1,4 @@ +# ignore: true # documentation: https://docs.osticket.com/en/latest/ # slogan: osTicket is a widely-used open source support ticket system. # category: helpdesk diff --git a/templates/compose/peertube.yaml b/templates/compose/peertube.yaml new file mode 100644 index 0000000000..264a5ea15e --- /dev/null +++ b/templates/compose/peertube.yaml @@ -0,0 +1,84 @@ +# documentation: https://docs.joinpeertube.org/install/docker +# slogan: Free, open-source and decentralized video platform. +# category: media +# tags: video,fediverse,activitypub,youtube,streaming,self-hosted +# logo: svgs/peertube.svg +# port: 9000 + +services: + peertube: + image: chocobozzz/peertube:v8.2.4 + environment: + - SERVICE_URL_PEERTUBE_9000 + - PEERTUBE_WEBSERVER_HOSTNAME=${SERVICE_FQDN_PEERTUBE} + - PEERTUBE_WEBSERVER_PORT=${PEERTUBE_WEBSERVER_PORT:-443} + - PEERTUBE_WEBSERVER_HTTPS=${PEERTUBE_WEBSERVER_HTTPS:-true} + - PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.16.0.0/12"] + - PEERTUBE_SECRET=${SERVICE_HEX_32_PEERTUBESECRET} + - PEERTUBE_DB_HOSTNAME=postgres + - PEERTUBE_DB_USERNAME=${SERVICE_USER_POSTGRESQL} + - PEERTUBE_DB_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL} + - PEERTUBE_DB_NAME=${POSTGRES_DB:-peertube} + - PEERTUBE_DB_SSL=false + - PEERTUBE_REDIS_HOSTNAME=redis + - PEERTUBE_SMTP_HOSTNAME=postfix + - PEERTUBE_SMTP_PORT=25 + - PEERTUBE_SMTP_FROM=noreply@${SERVICE_FQDN_PEERTUBE} + - PEERTUBE_SMTP_TLS=false + - PEERTUBE_SMTP_DISABLE_STARTTLS=false + - PEERTUBE_ADMIN_EMAIL=${PEERTUBE_ADMIN_EMAIL:?} + volumes: + - peertube-data:/data + - peertube-config:/config + healthcheck: + test: + - CMD + - curl + - -f + - http://localhost:9000/api/v1/ping + interval: 10s + timeout: 5s + retries: 5 + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + restart: always + + postgres: + image: postgres:17-alpine + environment: + - POSTGRES_USER=${SERVICE_USER_POSTGRESQL} + - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRESQL} + - POSTGRES_DB=${POSTGRES_DB:-peertube} + volumes: + - db-data:/var/lib/postgresql/data + healthcheck: + test: + - CMD-SHELL + - pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB:-peertube} + interval: 5s + timeout: 5s + retries: 10 + restart: always + + redis: + image: redis:8-alpine + volumes: + - redis-data:/data + healthcheck: + test: + - CMD + - redis-cli + - ping + interval: 5s + timeout: 5s + retries: 10 + restart: always + + postfix: + image: mwader/postfix-relay:1.2.17 + environment: + - POSTFIX_myhostname=${SERVICE_FQDN_PEERTUBE} + restart: always diff --git a/templates/compose/plausible.yaml b/templates/compose/plausible.yaml index 66b1f0eacc..b4a600361f 100644 --- a/templates/compose/plausible.yaml +++ b/templates/compose/plausible.yaml @@ -68,14 +68,24 @@ services: - plausible-events-data:/var/lib/clickhouse - type: bind source: ./clickhouse/clickhouse-config.xml - target: /etc/clickhouse-server/config.d/logging.xml + target: /etc/clickhouse-server/config.d/logs.xml read_only: true - content: 'warningtrue' + content: 'warningtruesystemquery_log
ENGINE = MergeTree PARTITION BY event_date ORDER BY event_time TTL event_date + interval 30 day SETTINGS ttl_only_drop_parts=17500
' + - type: bind + source: ./clickhouse/clickhouse-ipv4-only.xml + target: /etc/clickhouse-server/config.d/ipv4-only.xml + read_only: true + content: '0.0.0.0' + - type: bind + source: ./clickhouse/clickhouse-low-resources.xml + target: /etc/clickhouse-server/config.d/low-resources.xml + read_only: true + content: '524288000' - type: bind source: ./clickhouse/clickhouse-user-config.xml - target: /etc/clickhouse-server/users.d/logging.xml + target: /etc/clickhouse-server/users.d/default-profile-low-resources-overrides.xml read_only: true - content: '00' + content: '18192100' ulimits: nofile: soft: 262144 diff --git a/templates/compose/portabase.yaml b/templates/compose/portabase.yaml new file mode 100644 index 0000000000..099ff12301 --- /dev/null +++ b/templates/compose/portabase.yaml @@ -0,0 +1,61 @@ +# documentation: https://portabase.io/docs +# slogan: Self-hosted database backup & monitoring platform +# tags: backup, database, monitoring,open-source +# logo: svgs/portabase.svg +# port: 80 + +services: + portabase: + image: portabase/portabase:1.28.1 + restart: always + environment: + - SERVICE_URL_PORTABASE_80 + - 'PROJECT_URL=$SERVICE_URL_PORTABASE' + - PROJECT_SECRET=$SERVICE_PASSWORD_64_PORTABASE + - 'DATABASE_URL=postgresql://$SERVICE_USER_POSTGRES:$SERVICE_PASSWORD_POSTGRES@postgres:5432/${POSTGRES_DB:-portabase}?schema=public' + - PROJECT_NAME=${PROJECT_NAME:-Portabase} + - TZ=${TZ:-Europe/Paris} + - LOG_LEVEL=${LOG_LEVEL:-info} + - RETENTION_CRON=${RETENTION_CRON:-0 7 * * *} + - STALE_BACKUP_THRESHOLD_HOURS=${STALE_BACKUP_THRESHOLD_HOURS:-6} + - BACKUP_FOLDER_NAME=${BACKUP_FOLDER_NAME:-backups} + - TELEMETRY=${TELEMETRY:-true} + - SKIP_ONBOARDING=${SKIP_ONBOARDING:-false} + - API_ENABLED=${API_ENABLED:-false} + - OPENAPI_ENABLED=${OPENAPI_ENABLED:-false} + - MCP_ENABLED=${MCP_ENABLED:-false} + - SMTP_HOST=${SMTP_HOST} + - SMTP_PORT=${SMTP_PORT} + - SMTP_USER=${SMTP_USER} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SMTP_FROM=${SMTP_FROM} + - SMTP_SECURE=${SMTP_SECURE:-false} + volumes: + - portabase-data:/data + depends_on: + postgres: + condition: service_healthy + healthcheck: + test: + - CMD-SHELL + - 'curl -f http://localhost/api/health' + interval: 30s + timeout: 5s + retries: 3 + start_period: 60s + + postgres: + image: 'postgres:18-alpine' + volumes: + - 'postgres-data:/var/lib/postgresql' + environment: + - POSTGRES_DB=${POSTGRES_DB:-portabase} + - POSTGRES_USER=$SERVICE_USER_POSTGRES + - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES + healthcheck: + test: + - CMD-SHELL + - 'pg_isready -U $POSTGRES_USER -d ${POSTGRES_DB}' + interval: 10s + timeout: 5s + retries: 5 diff --git a/templates/compose/pterodactyl-panel.yaml b/templates/compose/pterodactyl-panel.yaml index c86d9d468a..2ee3b74815 100644 --- a/templates/compose/pterodactyl-panel.yaml +++ b/templates/compose/pterodactyl-panel.yaml @@ -1,4 +1,3 @@ -# ignore: true # documentation: https://pterodactyl.io/ # slogan: Pterodactyl is a free, open-source game server management panel # category: media @@ -33,7 +32,7 @@ services: retries: 3 pterodactyl: - image: ghcr.io/pterodactyl/panel:v1.12.0 + image: ghcr.io/pterodactyl/panel:v1.12.3 volumes: - "panel-var:/app/var/" - "panel-nginx:/etc/nginx/http.d/" diff --git a/templates/compose/pterodactyl-with-wings.yaml b/templates/compose/pterodactyl-with-wings.yaml index 20465a1399..f88b671b7f 100644 --- a/templates/compose/pterodactyl-with-wings.yaml +++ b/templates/compose/pterodactyl-with-wings.yaml @@ -1,4 +1,3 @@ -# ignore: true # documentation: https://pterodactyl.io/ # slogan: Pterodactyl is a free, open-source game server management panel # category: media @@ -34,7 +33,7 @@ services: timeout: 1s retries: 3 pterodactyl: - image: 'ghcr.io/pterodactyl/panel:v1.12.0' + image: 'ghcr.io/pterodactyl/panel:v1.12.3' volumes: - 'panel-var:/app/var/' - 'panel-nginx:/etc/nginx/http.d/' diff --git a/templates/compose/rallly.yaml b/templates/compose/rallly.yaml index 45cb51aff1..6ce73e6099 100644 --- a/templates/compose/rallly.yaml +++ b/templates/compose/rallly.yaml @@ -7,9 +7,9 @@ services: rallly_db: - image: postgres:14.2 + image: postgres:18 volumes: - - rallly_db_data:/var/lib/postgresql/data + - postgres-data:/var/lib/postgresql environment: - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} - POSTGRES_USER=${SERVICE_USER_POSTGRES} @@ -25,23 +25,28 @@ services: rallly: image: lukevella/rallly:latest platform: linux/amd64 - depends_on: - rallly_db: - condition: service_healthy environment: - SERVICE_URL_RALLLY_3000 + - PROXY_MODE=external - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@rallly_db:5432/${POSTGRES_DB:-rallly} - SECRET_PASSWORD=${SERVICE_PASSWORD_64_RALLLY} - NEXT_PUBLIC_BASE_URL=${SERVICE_URL_RALLLY} + - REGISTRATION_ENABLED=${REGISTRATION_ENABLED:-true} + - INITIAL_ADMIN_EMAIL=${INITIAL_ADMIN_EMAIL:?} - ALLOWED_EMAILS=${ALLOWED_EMAILS} - - SUPPORT_EMAIL=${SUPPORT_EMAIL:-support@example.com} + - SUPPORT_EMAIL=${SUPPORT_EMAIL:?} - SMTP_HOST=${SMTP_HOST} - SMTP_PORT=${SMTP_PORT} - SMTP_SECURE=${SMTP_SECURE:-false} - SMTP_USER=${SMTP_USER} - SMTP_PWD=${SMTP_PWD} + - SMTP_TLS_ENABLED=${SMTP_TLS_ENABLED:-false} + - BETTER_AUTH_TRUSTED_ORIGINS=${SERVICE_URL_RALLLY} healthcheck: test: ["CMD-SHELL", "bash -c ':> /dev/tcp/127.0.0.1/3000' || exit 1"] interval: 5s timeout: 20s retries: 10 + depends_on: + rallly_db: + condition: service_healthy diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index 45380e88a0..8025670f06 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -7,7 +7,7 @@ services: init-clickhouse: - image: clickhouse/clickhouse-server:25.5.6-alpine + image: clickhouse/clickhouse-server:25.12.5-alpine command: - bash - -c @@ -19,7 +19,6 @@ services: cd /tmp wget -O histogram-quantile.tar.gz "https://github.com/SigNoz/signoz/releases/download/histogram-quantile%2F$${version}/histogram-quantile_$${node_os}_$${node_arch}.tar.gz" tar -xvzf histogram-quantile.tar.gz - mkdir -p /var/lib/clickhouse/user_scripts/histogramQuantile mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile restart: on-failure exclude_from_hc: true @@ -27,6 +26,10 @@ services: options: max-size: 50m max-file: "3" + volumes: + - type: volume + source: user-scripts + target: /var/lib/clickhouse/user_scripts zookeeper: image: signoz/zookeeper:3.9.3 @@ -51,8 +54,7 @@ services: - ZOO_PROMETHEUS_METRICS_PORT_NUMBER=${ZOO_PROMETHEUS_METRICS_PORT_NUMBER:-9141} clickhouse: - # addding non LTS version due to this fix https://github.com/ClickHouse/ClickHouse/commit/32caf8716352f45c1b617274c7508c86b7d1afab - image: clickhouse/clickhouse-server:25.5.6-alpine + image: clickhouse/clickhouse-server:25.12.5-alpine tty: true depends_on: init-clickhouse: @@ -63,8 +65,8 @@ services: test: - CMD - wget - - --spider - -q + - -O- - 0.0.0.0:8123/ping interval: 30s timeout: 5s @@ -79,11 +81,15 @@ services: max-size: 50m max-file: "3" environment: - - "CLICKHOUSE_SKIP_USER_SETUP=1" + - CLICKHOUSE_SKIP_USER_SETUP=1 volumes: - type: volume source: clickhouse target: /var/lib/clickhouse/ + - type: volume + source: user-scripts + target: /var/lib/clickhouse/user_scripts + read_only: true - type: bind source: ./clickhouse/custom-function.xml target: /etc/clickhouse-server/custom-function.xml @@ -115,329 +121,52 @@ services: content: | - zookeeper 2181 - - - - - - - - clickhouse 9000 - - - - - - type: bind - source: ./clickhouse/users.xml - target: /etc/clickhouse-server/users.xml - content: | - - - - - - - - - - 10000000000 - - - random - - - - - 1 - - - - - - - - - - - - - ::/0 - - - - default - - - default - - - - - - - - - - - - - - 3600 - - - 0 - 0 - 0 - 0 - 0 - - - - - - type: bind - source: ./clickhouse/config.xml - target: /etc/clickhouse-server/config.xml - content: | - - - 4096 - 3 - 100 - 5368709120 - 1000 - 134217728 - 10000 - - *_dictionary.xml - *function.xml - /var/lib/clickhouse/user_scripts/ - 8123 - 9000 - 9004 - 9005 - 9009 - - information - - json - - - - 01 - example01-01-1 - - - /metrics - 9363 - true - true - true - true - - - engine MergeTree - partition by toYYYYMM(finish_date) - order by (finish_date, finish_time_us, trace_id) - - - - hide encrypt/decrypt arguments - ((?:aes_)?(?:encrypt|decrypt)(?:_mysql)?)\s*\(\s*(?:'(?:\\'|.)+'|.*?)\s*\) - \1(???) - - - - false - false - https://6f33034cfe684dd7a3ab9875e57b1c8d@o388870.ingest.sentry.io/5226277 - - - 268435456 - true - - - - - users.xml - - - - /var/lib/clickhouse/access/ - - - default - - - /clickhouse/task_queue/ddl - + + 01 + replica01 + + /var/lib/clickhouse/user_scripts/ + *function.xml signoz: - image: signoz/signoz:v0.97.1 + image: signoz/signoz:v0.137.1 depends_on: clickhouse: condition: service_healthy - schema-migrator-sync: + telemetrystore-migrator: condition: service_completed_successfully logging: options: max-size: 50m max-file: "3" - command: - - --config=/root/config/prometheus.yml volumes: - - type: bind - source: ./prometheus.yml - target: /root/config/prometheus.yml - content: | - # my global config - global: - scrape_interval: 5s # Set the scrape interval to every 15 seconds. Default is every 1 minute. - evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. - # scrape_timeout is set to the global default (10s). - - # Alertmanager configuration - alerting: - alertmanagers: - - static_configs: - - targets: - - alertmanager:9093 - - # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. - rule_files: [] - # - "first_rules.yml" - # - "second_rules.yml" - # - 'alerts.yml' - - # A scrape configuration containing exactly one endpoint to scrape: - # Here it's Prometheus itself. - scrape_configs: [] - - remote_read: - - url: tcp://clickhouse:9000/signoz_metrics - type: volume source: sqlite target: /var/lib/signoz/ environment: - SERVICE_URL_SIGNOZ_8080 - - SIGNOZ_JWT_SECRET=${SERVICE_REALBASE64_JWTSECRET} - - SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000 + - SIGNOZ_TOKENIZER_JWT_SECRET=${SERVICE_REALBASE64_JWTSECRET} + - SIGNOZ_SQLSTORE_PROVIDER=sqlite - SIGNOZ_SQLSTORE_SQLITE_PATH=/var/lib/signoz/signoz.db - - DASHBOARDS_PATH=/root/config/dashboards - - STORAGE=clickhouse + - SIGNOZ_TELEMETRYSTORE_PROVIDER=clickhouse + - SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000 - GODEBUG=netdns=go - DEPLOYMENT_TYPE=docker-standalone-amd - SIGNOZ_STATSREPORTER_ENABLED=${SIGNOZ_STATSREPORTER_ENABLED:-true} @@ -463,12 +192,37 @@ services: timeout: 5s retries: 3 - otel-collector: - image: signoz/signoz-otel-collector:v0.129.7 + telemetrystore-migrator: + image: signoz/signoz-otel-collector:v0.144.8 depends_on: clickhouse: condition: service_healthy - schema-migrator-sync: + entrypoint: + - /bin/sh + - -c + command: + - | + /signoz-otel-collector migrate bootstrap --clickhouse-dsn tcp://clickhouse:9000 && + /signoz-otel-collector migrate sync up --clickhouse-dsn tcp://clickhouse:9000 && + /signoz-otel-collector migrate async up --clickhouse-dsn tcp://clickhouse:9000 + environment: + - SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN=tcp://clickhouse:9000 + - SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER=cluster + - SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION=true + - SIGNOZ_OTEL_COLLECTOR_TIMEOUT=10m + restart: on-failure + exclude_from_hc: true + logging: + options: + max-size: 50m + max-file: "3" + + otel-collector: + image: signoz/signoz-otel-collector:v0.144.8 + depends_on: + clickhouse: + condition: service_healthy + telemetrystore-migrator: condition: service_completed_successfully signoz: condition: service_healthy @@ -476,153 +230,135 @@ services: options: max-size: 50m max-file: "3" + entrypoint: + - /bin/sh command: - - --config=/etc/otel-collector-config.yaml - - --manager-config=/etc/manager-config.yaml - - --copy-path=/var/tmp/collector-config.yaml - - --feature-gates=-pkg.translator.prometheus.NormalizeName - volumes: - - type: bind - source: ./otel-collector-config.yaml - target: /etc/otel-collector-config.yaml - content: | - receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - prometheus: - config: - global: - scrape_interval: 60s - scrape_configs: - - job_name: otel-collector - static_configs: - - targets: - - localhost:8888 - labels: - job_name: otel-collector - processors: - batch: - send_batch_size: 10000 - send_batch_max_size: 11000 - timeout: 10s - resourcedetection: - # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. - detectors: [env, system] - timeout: 2s - signozspanmetrics/delta: - metrics_exporter: signozclickhousemetrics - metrics_flush_interval: 60s - latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s ] - dimensions_cache_size: 100000 - aggregation_temporality: AGGREGATION_TEMPORALITY_DELTA - enable_exp_histogram: true - dimensions: - - name: service.namespace - default: default - - name: deployment.environment - default: default - # This is added to ensure the uniqueness of the timeseries - # Otherwise, identical timeseries produced by multiple replicas of - # collectors result in incorrect APM metrics - - name: signoz.collector.id - - name: service.version - - name: browser.platform - - name: browser.mobile - - name: k8s.cluster.name - - name: k8s.node.name - - name: k8s.namespace.name - - name: host.name - - name: host.type - - name: container.name + - -c + - | + set -e + cat > /tmp/otel-config.yaml <<'SIGNOZ_CFG' + connectors: + signozmeter: + metrics_flush_interval: 1h + dimensions: + - name: service.name + - name: deployment.environment + - name: host.name + receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + auth: + authenticator: basicauth/server + processors: + batch: + send_batch_size: 50000 + send_batch_max_size: 55000 + timeout: 5s + batch/meter: + send_batch_size: 20000 + send_batch_max_size: 25000 + timeout: 5s + signozspanmetrics/delta: + metrics_exporter: signozclickhousemetrics + metrics_flush_interval: 60s + latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s] + dimensions_cache_size: 100000 + aggregation_temporality: AGGREGATION_TEMPORALITY_DELTA + enable_exp_histogram: true + dimensions: + - name: service.namespace + default: default + - name: deployment.environment + default: default + # This is added to ensure the uniqueness of the timeseries + # Otherwise, identical timeseries produced by multiple replicas of + # collectors result in incorrect APM metrics + - name: signoz.collector.id + - name: service.version + exporters: + clickhousetraces: + datasource: tcp://clickhouse:9000/signoz_traces + low_cardinal_exception_grouping: false + use_new_schema: true + timeout: 45s + sending_queue: + enabled: false + signozclickhousemetrics: + dsn: tcp://clickhouse:9000/signoz_metrics + timeout: 45s + sending_queue: + enabled: false + clickhouselogsexporter: + dsn: tcp://clickhouse:9000/signoz_logs + use_new_schema: true + timeout: 45s + sending_queue: + enabled: false + signozclickhousemeter: + dsn: tcp://clickhouse:9000/signoz_meter + timeout: 45s + sending_queue: + enabled: false + metadataexporter: + enabled: true + dsn: tcp://clickhouse:9000/signoz_metadata + timeout: 45s + cache: + provider: in_memory + extensions: + signoz_health_check: + endpoint: 0.0.0.0:13133 + pprof: + endpoint: 0.0.0.0:1777 + basicauth/server: + htpasswd: + inline: "$${env:OTEL_BASIC_AUTH}\n" + service: + telemetry: + logs: + encoding: json extensions: - health_check: - endpoint: 0.0.0.0:13133 - pprof: - endpoint: 0.0.0.0:1777 - exporters: - clickhousetraces: - datasource: tcp://clickhouse:9000/signoz_traces - low_cardinal_exception_grouping: ${env:LOW_CARDINAL_EXCEPTION_GROUPING} - use_new_schema: true - signozclickhousemetrics: - dsn: tcp://clickhouse:9000/signoz_metrics - clickhouselogsexporter: - dsn: tcp://clickhouse:9000/signoz_logs - timeout: 10s - use_new_schema: true - service: - telemetry: - logs: - encoding: json - extensions: - - health_check - - pprof - pipelines: - traces: - receivers: [otlp] - processors: [signozspanmetrics/delta, batch] - exporters: [clickhousetraces] - metrics: - receivers: [otlp] - processors: [batch] - exporters: [signozclickhousemetrics] - metrics/prometheus: - receivers: [prometheus] - processors: [batch] - exporters: [signozclickhousemetrics] - logs: - receivers: [otlp] - processors: [batch] - exporters: [clickhouselogsexporter] - - type: bind - source: ./otel-collector-opamp-config.yaml - target: /etc/manager-config.yaml - content: | - server_endpoint: ws://signoz:4320/v1/opamp + - signoz_health_check + - pprof + - basicauth/server + pipelines: + traces: + receivers: [otlp] + processors: [signozspanmetrics/delta, batch] + exporters: [clickhousetraces, signozmeter, metadataexporter] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [signozclickhousemetrics, signozmeter, metadataexporter] + logs: + receivers: [otlp] + processors: [batch] + exporters: [clickhouselogsexporter, signozmeter, metadataexporter] + metrics/meter: + receivers: [signozmeter] + processors: [batch/meter] + exporters: [signozclickhousemeter] + SIGNOZ_CFG + cat > /tmp/opamp-config.yaml <<'SIGNOZ_OPAMP' + server_endpoint: ws://signoz:4320/v1/opamp + SIGNOZ_OPAMP + /signoz-otel-collector migrate sync check + exec /signoz-otel-collector --config=/tmp/otel-config.yaml --manager-config=/tmp/opamp-config.yaml --copy-path=/var/tmp/collector-config.yaml environment: - SERVICE_URL_OTELCOLLECTORHTTP_4318 - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux - LOW_CARDINAL_EXCEPTION_GROUPING=false + - SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_DSN=tcp://clickhouse:9000 + - SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_CLUSTER=cluster + - SIGNOZ_OTEL_COLLECTOR_CLICKHOUSE_REPLICATION=true + - SIGNOZ_OTEL_COLLECTOR_TIMEOUT=10m + - OTEL_BASIC_AUTH=signoz:${SERVICE_PASSWORD_64_OTELAUTH} healthcheck: test: bash -c "exec 6<> /dev/tcp/localhost/13133" interval: 30s timeout: 5s retries: 3 - - schema-migrator-sync: - image: signoz/signoz-schema-migrator:v0.129.7 - command: - - sync - - --dsn=tcp://clickhouse:9000 - - --up= - depends_on: - clickhouse: - condition: service_healthy - restart: on-failure - exclude_from_hc: true - logging: - options: - max-size: 50m - max-file: "3" - - schema-migrator-async: - image: signoz/signoz-schema-migrator:v0.129.7 - depends_on: - clickhouse: - condition: service_healthy - schema-migrator-sync: - condition: service_completed_successfully - restart: on-failure - exclude_from_hc: true - logging: - options: - max-size: 50m - max-file: "3" - command: - - async - - --dsn=tcp://clickhouse:9000 - - --up= diff --git a/templates/compose/snipe-it.yaml b/templates/compose/snipe-it.yaml new file mode 100644 index 0000000000..fad5674105 --- /dev/null +++ b/templates/compose/snipe-it.yaml @@ -0,0 +1,65 @@ +# documentation: https://snipe-it.readme.io/docs/introduction +# slogan: Snipe-IT is an open-source asset management platform built for IT departments. +# category: productivity +# tags: inventory, open-source +# logo: svgs/snipe-it.webp +# port: 80 + +services: + app: + image: snipe/snipe-it:v8.7.1 + environment: + - SERVICE_URL_SNIPEIT_80 + - APP_ENV=production + - APP_DEBUG=false + - APP_KEY=base64:${SERVICE_REALBASE64_32_APPKEY} + - APP_URL=${SERVICE_URL_SNIPEIT} + - APP_TIMEZONE=${APP_TIMEZONE:-UTC} + - APP_LOCALE=${APP_LOCALE:-en-US} + - DB_CONNECTION=mysql + - DB_HOST=mariadb + - DB_PORT=3306 + - DB_DATABASE=${MYSQL_DATABASE:-snipeit} + - DB_USERNAME=${SERVICE_USER_MARIADB} + - DB_PASSWORD=${SERVICE_PASSWORD_MARIADB} + - MAIL_MAILER=${MAIL_MAILER:-smtp} + - MAIL_HOST=${MAIL_HOST:-null} + - MAIL_PORT=${MAIL_PORT:-1025} + - MAIL_USERNAME=${MAIL_USERNAME:-null} + - MAIL_PASSWORD=${MAIL_PASSWORD:-null} + - MAIL_FROM_ADDR=${MAIL_FROM_ADDR:-you@example.com} + - MAIL_FROM_NAME=${MAIL_FROM_NAME:-Snipe-IT} + volumes: + - storage:/var/lib/snipeit + healthcheck: + test: + - CMD + - curl + - -f + - http://localhost/health + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + depends_on: + mariadb: + condition: service_healthy + + mariadb: + image: mariadb:11.8 + environment: + - MYSQL_DATABASE=${MYSQL_DATABASE:-snipeit} + - MYSQL_USER=${SERVICE_USER_MARIADB} + - MYSQL_PASSWORD=${SERVICE_PASSWORD_MARIADB} + - MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_ROOT} + volumes: + - db_data:/var/lib/mysql + healthcheck: + test: + - CMD + - healthcheck.sh + - --connect + - --innodb_initialized + interval: 5s + timeout: 1s + retries: 5 diff --git a/templates/compose/terraria-server.yaml b/templates/compose/terraria-server.yaml index 4718d3494f..95db93a663 100644 --- a/templates/compose/terraria-server.yaml +++ b/templates/compose/terraria-server.yaml @@ -7,20 +7,20 @@ services: terraria-server: - image: 'hexlo/terraria-server-docker:1.4.4.9' + image: hexlo/terraria-server-docker:1.4.5.0 stdin_open: true tty: true ports: - - '7777:7777' + - 7777:7777 volumes: - - 'terraria-server:/root/.local/share/Terraria/Worlds' + - terraria-server:/root/.local/share/Terraria/Worlds environment: - - 'WORLD=${WORLD:-/root/.local/share/Terraria/Worlds/world1.wld}' - - 'AUTOCREATE=${AUTOCREATE:-2}' - - 'WORLDNAME=${WORLDNAME:-world1}' - - 'DIFFICULTY=${DIFFICULTY:-1}' - - 'MAXPLAYERS=${MAXPLAYERS:-8}' - - 'PASSWORD=${PASSWORD:-mypassword}' - - 'MOTD=${MOTD:-Welcome to the server!}' - - 'LANGUAGE=${LANGUAGE:-en/US}' - - 'SECURE=${SECURE:-1}' + - worldpath=${WORLDPATH:-/root/.local/share/Terraria/Worlds} + - autocreate=${AUTOCREATE:-2} + - world=${WORLD:-world1.wld} + - difficulty=${DIFFICULTY:-1} + - maxplayers=${MAXPLAYERS:-8} + - password=${SERVICE_PASSWORD_TERRARIA} + - motd=${MOTD:-Welcome to the server!} + - language=${LANGUAGE:-en/US} + - secure=${SECURE:-1} diff --git a/templates/compose/triliumnext.yaml b/templates/compose/triliumnext.yaml index cc71ffadd7..19b6f69492 100644 --- a/templates/compose/triliumnext.yaml +++ b/templates/compose/triliumnext.yaml @@ -8,18 +8,13 @@ services: triliumnext: image: ghcr.io/triliumnext/trilium:stable - platform: linux/amd64 # https://github.com/TriliumNext/Trilium/issues/6390 environment: - SERVICE_URL_TRILIUMNEXT_8080 - TZ=${TZ:-Europe/Berlin} volumes: - triliumnext_data:/home/node/trilium-data healthcheck: - test: - [ - "CMD-SHELL", - "wget --quiet --tries=1 --spider http://127.0.0.1:8080/api/health-check || exit 1", - ] + test: ["CMD", "node", "/usr/src/app/docker_healthcheck.cjs"] interval: 5s timeout: 20s retries: 10 diff --git a/templates/compose/twenty.yaml b/templates/compose/twenty.yaml index d3e26145dc..af6034d403 100644 --- a/templates/compose/twenty.yaml +++ b/templates/compose/twenty.yaml @@ -64,7 +64,6 @@ services: volumes: - twenty-local-storage:/app/packages/twenty-server/.local-storage environment: - - SERVICE_URL_TWENTY_3000 - SERVER_URL=${SERVICE_URL_TWENTY} - FRONT_BASE_URL=${SERVICE_URL_TWENTY} - APP_SECRET=${SERVICE_BASE64_32_SECRET} diff --git a/templates/compose/vaultwarden.yaml b/templates/compose/vaultwarden.yaml index eeec9066b0..8dea269933 100644 --- a/templates/compose/vaultwarden.yaml +++ b/templates/compose/vaultwarden.yaml @@ -11,7 +11,7 @@ services: environment: - SERVICE_URL_VAULTWARDEN - DOMAIN=${SERVICE_URL_VAULTWARDEN} - - DATABASE_URL=${VAULTWARDEN_DB_URL:-data/db.sqlite3} + - DATABASE_URL=${VAULTWARDEN_DB_URL:-sqlite:///data/db.sqlite3} - SIGNUPS_ALLOWED=${SIGNUP_ALLOWED:-true} - ADMIN_TOKEN=${SERVICE_PASSWORD_64_ADMIN} - IP_HEADER=X-Forwarded-For diff --git a/templates/compose/vikunja-with-postgresql.yaml b/templates/compose/vikunja-with-postgresql.yaml index 7686c67ba4..a7a3483cb6 100644 --- a/templates/compose/vikunja-with-postgresql.yaml +++ b/templates/compose/vikunja-with-postgresql.yaml @@ -11,7 +11,7 @@ services: environment: - SERVICE_URL_VIKUNJA - VIKUNJA_SERVICE_PUBLICURL=$SERVICE_URL_VIKUNJA - - VIKUNJA_SERVICE_JWTSECRET=$SERVICE_PASSWORD_JWTSECRET + - VIKUNJA_SERVICE_SECRET=$SERVICE_PASSWORD_JWTSECRET - VIKUNJA_SERVICE_ENABLEREGISTRATION=true - VIKUNJA_DATABASE_TYPE=postgres - VIKUNJA_DATABASE_HOST=postgresql @@ -20,9 +20,16 @@ services: - VIKUNJA_DATABASE_DATABASE=${POSTGRESQL_DATABASE} volumes: - vikunja-data:/app/vikunja/ + healthcheck: + test: [ "CMD", "/app/vikunja/vikunja", "healthcheck" ] + interval: 30s + timeout: 5s + retries: 3 + start_period: 15s depends_on: postgresql: condition: service_healthy + postgresql: image: postgres:16-alpine volumes: diff --git a/templates/compose/vikunja.yaml b/templates/compose/vikunja.yaml index f5da0897f0..7a6e878225 100644 --- a/templates/compose/vikunja.yaml +++ b/templates/compose/vikunja.yaml @@ -11,7 +11,7 @@ services: environment: - SERVICE_URL_VIKUNJA - VIKUNJA_SERVICE_PUBLICURL=$SERVICE_URL_VIKUNJA - - VIKUNJA_SERVICE_JWTSECRET=$SERVICE_PASSWORD_JWTSECRET + - VIKUNJA_SERVICE_SECRET=$SERVICE_PASSWORD_JWTSECRET - VIKUNJA_SERVICE_ENABLEREGISTRATION=true - VIKUNJA_DATABASE_PATH=/db/vikunja.db - VIKUNJA_DATABASE_TYPE=sqlite @@ -20,9 +20,17 @@ services: - vikunja-sqlite-data:/db depends_on: - init + healthcheck: + test: [ "CMD", "/app/vikunja/vikunja", "healthcheck" ] + interval: 30s + timeout: 5s + retries: 3 + start_period: 15s + init: image: busybox restart: no volumes: + - vikunja-data:/app/vikunja - vikunja-sqlite-data:/db - command: ["sh", "-c", "touch /db/vikunja.db && chown -R 1000 /db"] + command: ["sh", "-c", "touch /db/vikunja.db && chown -R 1000 /db && chown -R 1000 /app/vikunja"] diff --git a/templates/compose/zero.yaml b/templates/compose/zero.yaml new file mode 100644 index 0000000000..f309e6afda --- /dev/null +++ b/templates/compose/zero.yaml @@ -0,0 +1,54 @@ +# documentation: https://zero.rocicorp.dev/docs/deployment +# slogan: Query-driven sync engine for TypeScript apps backed by Postgres. +# category: backend +# tags: sync, realtime, postgres, typescript, local-first +# logo: svgs/zero.svg +# port: 4848 + +services: + zero: + image: rocicorp/zero:1.6.2 + # stop_grace_period: 10m + environment: + - SERVICE_URL_ZERO_4848 + - ZERO_UPSTREAM_DB=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_64_POSTGRES}@postgres:5432/${POSTGRES_DB} + - ZERO_CVR_DB=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_64_POSTGRES}@postgres:5432/${POSTGRES_DB} + - ZERO_CHANGE_DB=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_64_POSTGRES}@postgres:5432/${POSTGRES_DB} + - ZERO_REPLICA_FILE=/data/replica.db + - ZERO_ADMIN_PASSWORD=${SERVICE_PASSWORD_64_ADMIN} + - ZERO_QUERY_URL=${ZERO_QUERY_URL:?Set the URL of your API /query endpoint} + - ZERO_MUTATE_URL=${ZERO_MUTATE_URL:?Set the URL of your API /mutate endpoint} + - ZERO_ENABLE_CRUD_MUTATIONS=${ZERO_ENABLE_CRUD_MUTATIONS:-false} + - ZERO_NUM_SYNC_WORKERS=${ZERO_NUM_SYNC_WORKERS:-1} + - ZERO_APP_ID=${ZERO_APP_ID:-zero} + - ZERO_LOG_LEVEL=${ZERO_LOG_LEVEL:-info} + - ZERO_ENABLE_TELEMETRY=${ZERO_ENABLE_TELEMETRY:-true} + - ZERO_LAZY_STARTUP=${ZERO_LAZY_STARTUP:-false} + - ZERO_QUERY_API_KEY=${ZERO_QUERY_API_KEY:-} + - ZERO_MUTATE_API_KEY=${ZERO_MUTATE_API_KEY:-} + volumes: + - zero-data:/data + healthcheck: + test: ["CMD", "curl", "-f", "http://127.0.0.1:4848/keepalive"] + interval: 5s + timeout: 20s + retries: 10 + start_period: 60s + depends_on: + postgres: + condition: service_healthy + + postgres: + image: postgres:18-alpine + command: ["postgres", "-c", "wal_level=logical"] + environment: + - POSTGRES_USER=${SERVICE_USER_POSTGRES} + - POSTGRES_PASSWORD=${SERVICE_PASSWORD_64_POSTGRES} + - POSTGRES_DB=${POSTGRES_DB:-zero-db} + volumes: + - postgres-data:/var/lib/postgresql + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 10s + timeout: 20s + retries: 10