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 @@
+
+
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 @@
+
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 @@
+
\ 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: 'warningtruesystemENGINE = 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