From f80b1d31f52f83bfe3f505f28ae44810a57c1010 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 25 Oct 2022 15:12:40 +0200 Subject: [PATCH] fixes, dev templates, etc --- apps/api/devTemplates.yaml | 2201 +++++++++++++++++ apps/api/src/index.ts | 23 +- apps/api/src/lib.ts | 4 +- apps/api/src/lib/common.ts | 6 +- apps/api/src/lib/templates.ts | 1505 ----------- apps/api/src/routes/api/v1/handlers.ts | 2 +- apps/api/src/routes/api/v1/index.ts | 2 +- .../src/routes/api/v1/services/handlers.ts | 17 +- .../src/routes/webhooks/traefik/handlers.ts | 46 +- .../routes/services/[id]/_ServiceLinks.svelte | 12 +- apps/ui/src/routes/services/[id]/index.svelte | 14 +- 11 files changed, 2271 insertions(+), 1561 deletions(-) create mode 100644 apps/api/devTemplates.yaml delete mode 100644 apps/api/src/lib/templates.ts diff --git a/apps/api/devTemplates.yaml b/apps/api/devTemplates.yaml new file mode 100644 index 000000000..505abfb60 --- /dev/null +++ b/apps/api/devTemplates.yaml @@ -0,0 +1,2201 @@ +- templateVersion: 1.0.0 + defaultVersion: 1.0.3 + name: Appwrite + documentation: https://appwrite.io/docs + description: Secure Backend Server for Web, Mobile & Flutter Developers. + services: + "$$id": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_WORKER_PER_CORE=$$config__app_worker_per_core + - _APP_LOCALE=$$config__app_locale + - _APP_CONSOLE_WHITELIST_ROOT=$$config__app_console_whitelist_root + - _APP_CONSOLE_WHITELIST_EMAILS=$$config__app_console_whitelist_emails + - _APP_CONSOLE_WHITELIST_IPS=$$config__app_console_whitelist_ips + - _APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name + - _APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address + - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address + - _APP_SYSTEM_RESPONSE_FORMAT=$$config__app_system_response_format + - _APP_OPTIONS_ABUSE=$$config__app_options_abuse + - _APP_OPTIONS_FORCE_HTTPS=$$config__app_options_force_https + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_DOMAIN=$$generate_fqdn + - _APP_DOMAIN_TARGET=$$generate_fqdn + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_SMTP_HOST=$$config__app_smtp_host + - _APP_SMTP_PORT=$$config__app_smtp_port + - _APP_SMTP_SECURE=$$config__app_smtp_secure + - _APP_SMTP_USERNAME=$$config__app_smtp_username + - _APP_SMTP_PASSWORD=$$secret__app_smtp_password + - _APP_USAGE_STATS=$$config__app_usage_stats + - _APP_INFLUXDB_HOST=$$config__app_influxdb_host + - _APP_INFLUXDB_PORT=$$config__app_influxdb_port + - _APP_STORAGE_LIMIT=$$config__app_storage_limit + - _APP_STORAGE_PREVIEW_LIMIT=$$config__app_storage_preview_limit + - _APP_STORAGE_ANTIVIRUS=$$config__app_storage_antivirus_enabled + - _APP_STORAGE_ANTIVIRUS_HOST=$$config__app_storage_antivirus_host + - _APP_STORAGE_ANTIVIRUS_PORT=$$config__app_storage_antivirus_port + - _APP_STORAGE_DEVICE=$$config__app_storage_device + - _APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key + - _APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret + - _APP_STORAGE_S3_REGION=$$config__app_storage_s3_region + - _APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket + - _APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key + - _APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret + - _APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region + - _APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key + - _APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret + - _APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region + - _APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket + - _APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key + - _APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret + - _APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region + - _APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket + - _APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key + - _APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret + - _APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region + - _APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket + - _APP_FUNCTIONS_SIZE_LIMIT=$$config__app_functions_size_limit + - _APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout + - _APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout + - _APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers + - _APP_FUNCTIONS_CPUS=$$config__app_functions_cpus + - _APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated + - _APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap + - _APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes + - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret + - _APP_EXECUTOR_HOST=$$config__app_executor_host + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - _APP_STATSD_HOST=$$config__app_statsd_host + - _APP_STATSD_PORT=$$config__app_statsd_port + - _APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval + - _APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution + - _APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache + - _APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse + - _APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit + - _APP_SMS_PROVIDER=$$config__app_sms_provider + - _APP_SMS_FROM=$$config__app_sms_from + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: + - "$$id-uploads:/storage/uploads" + - "$$id-cache:/storage/cache" + - "$$id-config:/storage/config" + - "$$id-certificates:/storage/certificates" + - "$$id-functions:/storage/functions" + ports: + - '80' + proxy: + - port: '80' + "$$id-executor": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_VERSION=$$config__app_version + - _APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout + - _APP_FUNCTIONS_BUILD_TIMEOUT=$$config__app_functions_build_timeout + - _APP_FUNCTIONS_CONTAINERS=$$config__app_functions_containers + - _APP_FUNCTIONS_RUNTIMES=$$config__app_functions_runtimes + - _APP_FUNCTIONS_CPUS=$$config__app_functions_cpus + - _APP_FUNCTIONS_MEMORY=$$config__app_functions_memory_allocated + - _APP_FUNCTIONS_MEMORY_SWAP=$$config__app_functions_memory_swap + - _APP_FUNCTIONS_INACTIVE_THRESHOLD=$$config__app_functions_inactive_threshold + - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - _APP_STORAGE_DEVICE=$$config__app_storage_device + - _APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key + - _APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret + - _APP_STORAGE_S3_REGION=$$config__app_storage_s3_region + - _APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket + - _APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key + - _APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret + - _APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region + - _APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key + - _APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret + - _APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region + - _APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket + - _APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key + - _APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret + - _APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region + - _APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket + - _APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key + - _APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret + - _APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region + - _APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket + - DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username + - DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: + - "$$id-functions:/storage/functions" + - "$$id-builds:/storage/builds" + - "/var/run/docker.sock:/var/run/docker.sock" + entrypoint: executor + "$$id-influxdb": + image: appwrite/influxdb:1.5.0 + environment: [] + volumes: + - "$$id-influxdb:/var/lib/influxdb" + "$$id-maintenance": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_DOMAIN=$$generate_fqdn + - _APP_DOMAIN_TARGET=$$generate_fqdn + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_MAINTENANCE_INTERVAL=$$config__app_maintenance_interval + - _APP_MAINTENANCE_RETENTION_EXECUTION=$$config__app_maintenance_retention_execution + - _APP_MAINTENANCE_RETENTION_CACHE=$$config__app_maintenance_retention_cache + - _APP_MAINTENANCE_RETENTION_ABUSE=$$config__app_maintenance_retention_abuse + - _APP_MAINTENANCE_RETENTION_AUDIT=$$config__app_maintenance_retention_audit + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: maintenance + "$$id-mariadb": + image: mariadb:10.7 + command: "--innodb-flush-method fsync" + environment: + - MARIADB_ROOT_PASSWORD=$$secret__app_db_root_pass + - MARIADB_DATABASE=$$config__app_db_schema + - MARIADB_USER=$$config__app_db_user + - MARIADB_PASSWORD=$$secret__app_db_pass + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: + - "$$id-mariadb:/var/lib/mysql" + "$$id-realtime": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_WORKER_PER_CORE=$$config__app_worker_per_core + - _APP_OPTIONS_ABUSE=$$config__app_options_abuse + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_USAGE_STATS=$$config__app_usage_stats + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: realtime + proxy: + - port: '80' + pathPrefix: "/v1/realtime" + "$$id-redis": + image: redis:7.0.4-alpine + command: "--maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples + 5" + environment: [] + volumes: + - "$$id-redis:/data" + "$$id-schedule": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: schedule + "$$id-telegraf": + image: appwrite/telegraf:1.4.0 + environment: + - _APP_INFLUXDB_HOST=$$config__app_influxdb_host + - _APP_INFLUXDB_PORT=$$config__app_influxdb_port + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: + - "$$id-influxdb:/var/lib/influxdb" + "$$id-usage-database": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_INFLUXDB_HOST=$$config__app_influxdb_host + - _APP_INFLUXDB_PORT=$$config__app_influxdb_port + - _APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval + - _APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: usage --type database + "$$id-usage-timeseries": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_INFLUXDB_HOST=$$config__app_influxdb_host + - _APP_INFLUXDB_PORT=$$config__app_influxdb_port + - _APP_USAGE_TIMESERIES_INTERVAL=$$config__app_usage_timeseries_interval + - _APP_USAGE_DATABASE_INTERVAL=$$config__app_usage_database_interval + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: usage --type timeseries + "$$id-worker-audits": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: worker-audits + "$$id-worker-builds": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret + - _APP_EXECUTOR_HOST=$$config__app_executor_host + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: worker-builds + "$$id-worker-certificates": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_DOMAIN=$$generate_fqdn + - _APP_DOMAIN_TARGET=$$generate_fqdn + - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: + - "$$id-config:/storage/config" + - "$$id-certificates:/storage/certificates" + entrypoint: worker-certificates + "$$id-worker-databases": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: worker-databases + "$$id-worker-deletes": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_STORAGE_DEVICE=$$config__app_storage_device + - _APP_STORAGE_S3_ACCESS_KEY=$$secret__app_storage_s3_access_key + - _APP_STORAGE_S3_SECRET=$$secret__app_storage_s3_secret + - _APP_STORAGE_S3_REGION=$$config__app_storage_s3_region + - _APP_STORAGE_S3_BUCKET=$$config__app_storage_s3_bucket + - _APP_STORAGE_DO_SPACES_ACCESS_KEY=$$secret__app_storage_do_spaces_access_key + - _APP_STORAGE_DO_SPACES_SECRET=$$secret__app_storage_do_spaces_secret + - _APP_STORAGE_DO_SPACES_REGION=$$config__app_storage_do_spaces_region + - _APP_STORAGE_DO_SPACES_BUCKET=$$config__app_storage_do_spaces_bucket + - _APP_STORAGE_BACKBLAZE_ACCESS_KEY=$$secret__app_storage_backblaze_access_key + - _APP_STORAGE_BACKBLAZE_SECRET=$$secret__app_storage_backblaze_secret + - _APP_STORAGE_BACKBLAZE_REGION=$$config__app_storage_backblaze_region + - _APP_STORAGE_BACKBLAZE_BUCKET=$$config__app_storage_backblaze_bucket + - _APP_STORAGE_LINODE_ACCESS_KEY=$$secret__app_storage_linode_access_key + - _APP_STORAGE_LINODE_SECRET=$$secret__app_storage_linode_secret + - _APP_STORAGE_LINODE_REGION=$$config__app_storage_linode_region + - _APP_STORAGE_LINODE_BUCKET=$$config__app_storage_linode_bucket + - _APP_STORAGE_WASABI_ACCESS_KEY=$$secret__app_storage_wasabi_access_key + - _APP_STORAGE_WASABI_SECRET=$$secret__app_storage_wasabi_secret + - _APP_STORAGE_WASABI_REGION=$$config__app_storage_wasabi_region + - _APP_STORAGE_WASABI_BUCKET=$$config__app_storage_wasabi_bucket + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret + - _APP_EXECUTOR_HOST=$$config__app_executor_host + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: + - "$$id-uploads:/storage/uploads" + - "$$id-cache:/storage/cache" + - "$$id-functions:/storage/functions" + - "$$id-builds:/storage/builds" + - "$$id-certificates:/storage/certificates" + entrypoint: worker-deletes + "$$id-worker-functions": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_DB_HOST=$$config__app_db_host + - _APP_DB_PORT=$$config__app_db_port + - _APP_DB_SCHEMA=$$config__app_db_schema + - _APP_DB_USER=$$config__app_db_user + - _APP_DB_PASS=$$secret__app_db_pass + - _APP_FUNCTIONS_TIMEOUT=$$config__app_functions_timeout + - _APP_EXECUTOR_SECRET=$$secret__app_executor_secret + - _APP_EXECUTOR_HOST=$$config__app_executor_host + - _APP_USAGE_STATS=$$config__app_usage_stats + - DOCKERHUB_PULL_USERNAME=$$config_dockerhub_pull_username + - DOCKERHUB_PULL_PASSWORD=$$secret_dockerhub_pull_password + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: worker-functions + "$$id-worker-mails": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_SYSTEM_EMAIL_NAME=$$config__app_system_email_name + - _APP_SYSTEM_EMAIL_ADDRESS=$$config__app_system_email_address + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_SMTP_HOST=$$config__app_smtp_host + - _APP_SMTP_PORT=$$config__app_smtp_port + - _APP_SMTP_SECURE=$$config__app_smtp_secure + - _APP_SMTP_USERNAME=$$config__app_smtp_username + - _APP_SMTP_PASSWORD=$$secret__app_smtp_password + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: worker-mails + "$$id-worker-messaging": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_SMS_PROVIDER=$$config__app_sms_provider + - _APP_SMS_FROM=$$config__app_sms_from + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: worker-messaging + "$$id-worker-webhooks": + image: appwrite/appwrite:$$core_version + environment: + - _APP_ENV=$$config__app_env + - _APP_OPENSSL_KEY_V1=$$secret__app_openssl_key_v1 + - _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=$$config__app_system_security_email_address + - _APP_REDIS_HOST=$$config__app_redis_host + - _APP_REDIS_PORT=$$config__app_redis_port + - _APP_REDIS_USER=$$config__app_redis_user + - _APP_REDIS_PASS=$$secret__app_redis_pass + - _APP_LOGGING_PROVIDER=$$config__app_logging_provider + - _APP_LOGGING_CONFIG=$$config__app_logging_config + - OPEN_RUNTIMES_NETWORK=$$config_open_runtimes_network + volumes: [] + entrypoint: worker-webhooks + variables: + - id: "$$secret__app_db_root_pass" + name: MARIADB_ROOT_PASSWORD + label: MariaDB | _APP_DB_ROOT_PASS + defaultValue: "$$generate_hex(16)" + description: MariaDB server root password. + - id: "$$config__app_db_schema" + name: MARIADB_DATABASE + label: MariaDB | _APP_DB_SCHEMA + defaultValue: appwrite + description: MariaDB server database schema. + - id: "$$config__app_db_user" + name: MARIADB_USER + label: MariaDB | _APP_DB_USER + defaultValue: user + description: MariaDB server user name. + - id: "$$secret__app_db_pass" + name: MARIADB_PASSWORD + label: MariaDB | _APP_DB_PASS + defaultValue: "$$generate_hex(16)" + description: MariaDB server user password. + - id: "$$config__app_influxdb_host" + name: _APP_INFLUXDB_HOST + label: InfluxDB | _APP_INFLUXDB_HOST + defaultValue: "$$id-influxdb" + description: '' + - id: "$$config__app_influxdb_port" + name: _APP_INFLUXDB_PORT + label: InfluxDB | _APP_INFLUXDB_PORT + defaultValue: '8086' + description: InfluxDB server TCP port. + - id: "$$config__app_env" + name: _APP_ENV + label: General | _APP_ENV + defaultValue: production + description: Set your server running environment. + - id: "$$config__app_worker_per_core" + name: _APP_WORKER_PER_CORE + label: General | _APP_WORKER_PER_CORE + defaultValue: '6' + description: Internal Worker per core for the API, Realtime and Executor containers. + Can be configured to optimize performance. + - id: "$$config__app_locale" + name: _APP_LOCALE + label: General | _APP_LOCALE + defaultValue: en + description: Set your Appwrite's locale. By default, the locale is set to 'en'. + - id: "$$config__app_console_whitelist_root" + name: _APP_CONSOLE_WHITELIST_ROOT + label: General | _APP_CONSOLE_WHITELIST_ROOT + defaultValue: enabled + description: This option allows you to disable the creation of new users on the + Appwrite console. When enabled only 1 user will be able to use the registration + form. New users can be added by inviting them to your project. By default this + option is enabled. + - id: "$$config__app_console_whitelist_emails" + name: _APP_CONSOLE_WHITELIST_EMAILS + label: General | _APP_CONSOLE_WHITELIST_EMAILS + defaultValue: '' + description: This option allows you to limit creation of new users on the Appwrite + console. This option is very useful for small teams or sole developers. To enable + it, pass a list of allowed email addresses separated by a comma. + - id: "$$config__app_console_whitelist_ips" + name: _APP_CONSOLE_WHITELIST_IPS + label: General | _APP_CONSOLE_WHITELIST_IPS + defaultValue: '' + description: This last option allows you to limit creation of users in Appwrite + console for users sharing the same set of IP addresses. This option is very + useful for team working with a VPN service or a company IP.\n\nTo enable/activate + this option, pass a list of allowed IP addresses separated by a comma. + - id: "$$config__app_system_email_name" + name: _APP_SYSTEM_EMAIL_NAME + label: General | _APP_SYSTEM_EMAIL_NAME + defaultValue: Appwrite + description: This is the sender name value that will appear on email messages + sent to developers from the Appwrite console. You can use url encoded strings + for spaces and special chars. + - id: "$$config__app_system_email_address" + name: _APP_SYSTEM_EMAIL_ADDRESS + label: General | _APP_SYSTEM_EMAIL_ADDRESS + defaultValue: team@appwrite.io + description: This is the sender email address that will appear on email messages + sent to developers from the Appwrite console. You should choose an email address + that is allowed to be used from your SMTP server to avoid the server email ending + in the users' SPAM folders. + - id: "$$config__app_system_security_email_address" + name: _APP_SYSTEM_SECURITY_EMAIL_ADDRESS + label: General | _APP_SYSTEM_SECURITY_EMAIL_ADDRESS + defaultValue: certs@appwrite.io + description: This is the email address used to issue SSL certificates for custom + domains or the user agent in your webhooks payload. + - id: "$$config__app_system_response_format" + name: _APP_SYSTEM_RESPONSE_FORMAT + label: General | _APP_SYSTEM_RESPONSE_FORMAT + defaultValue: '' + description: Use this environment variable to set the default Appwrite HTTP response + format to support an older version of Appwrite. This option is useful to overcome + breaking changes between versions. You can also use the X-Appwrite-Response-Format + HTTP request header to overwrite the response for a specific request. This variable + accepts any valid Appwrite version. To use the current version format, leave + the value of the variable empty. + - id: "$$config__app_options_abuse" + name: _APP_OPTIONS_ABUSE + label: General | _APP_OPTIONS_ABUSE + defaultValue: enabled + description: Allows you to disable abuse checks and API rate limiting. By default, + set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not + recommended to disable this check-in a production environment. + - id: "$$config__app_options_force_https" + name: _APP_OPTIONS_FORCE_HTTPS + label: General | _APP_OPTIONS_FORCE_HTTPS + defaultValue: disabled + description: Allows you to force HTTPS connection to your API. This feature redirects + any HTTP call to HTTPS and adds the 'Strict-Transport-Security' header to all + HTTP responses. + - id: "$$secret__app_openssl_key_v1" + name: _APP_OPENSSL_KEY_V1 + label: General | _APP_OPENSSL_KEY_V1 + defaultValue: "$$generate_hex(256)" + description: This is your server private secret key that is used to encrypt all + sensitive data on your server. Appwrite server encrypts all secret data on your + server like webhooks, HTTP passwords, user sessions, and storage files. Keep + it a secret and have a backup for it. + - id: "$$generate_fqdn" + name: _APP_DOMAIN + label: General | _APP_DOMAIN + defaultValue: localhost + description: Your Appwrite domain address. When setting a public suffix domain, + Appwrite will attempt to issue a valid SSL certificate automatically. When used + with a dev domain, Appwrite will assign a self-signed SSL certificate. The default + value is 'localhost'. + - id: "$$generate_fqdn" + name: _APP_DOMAIN_TARGET + label: General | _APP_DOMAIN_TARGET + defaultValue: localhost + description: A DNS A record hostname to serve as a CNAME target for your Appwrite + custom domains. You can use the same value as used for the Appwrite '_APP_DOMAIN' + variable. The default value is 'localhost'. + - id: "$$config__app_redis_host" + name: _APP_REDIS_HOST + label: Redis | _APP_REDIS_HOST + defaultValue: "$$id-redis" + description: '' + - id: "$$config__app_redis_port" + name: _APP_REDIS_PORT + label: Redis | _APP_REDIS_PORT + defaultValue: '6379' + description: Redis server TCP port. + - id: "$$config__app_redis_user" + name: _APP_REDIS_USER + label: Redis | _APP_REDIS_USER + defaultValue: '' + description: Redis server user. This is an optional variable. Default value is + an empty string. + - id: "$$secret__app_redis_pass" + name: _APP_REDIS_PASS + label: Redis | _APP_REDIS_PASS + defaultValue: '' + description: Redis server password. This is an optional variable. Default value + is an empty string. + - id: "$$config__app_db_host" + name: _APP_DB_HOST + label: MariaDB | _APP_DB_HOST + defaultValue: "$$id-mariadb" + description: '' + - id: "$$config__app_db_port" + name: _APP_DB_PORT + label: MariaDB | _APP_DB_PORT + defaultValue: '3306' + description: MariaDB server TCP port. + - id: "$$config__app_db_schema" + name: _APP_DB_SCHEMA + label: MariaDB | _APP_DB_SCHEMA + defaultValue: appwrite + description: MariaDB server database schema. + - id: "$$config__app_db_user" + name: _APP_DB_USER + label: MariaDB | _APP_DB_USER + defaultValue: user + description: MariaDB server user name. + - id: "$$secret__app_db_pass" + name: _APP_DB_PASS + label: MariaDB | _APP_DB_PASS + defaultValue: "$$generate_hex(16)" + description: MariaDB server user password. + - id: "$$config__app_smtp_host" + name: _APP_SMTP_HOST + label: SMTP | _APP_SMTP_HOST + defaultValue: '' + description: SMTP server host name address. Use an empty string to disable all + mail sending from the server. The default value for this variable is an empty + string. + - id: "$$config__app_smtp_port" + name: _APP_SMTP_PORT + label: SMTP | _APP_SMTP_PORT + defaultValue: '' + description: SMTP server TCP port. Empty by default. + - id: "$$config__app_smtp_secure" + name: _APP_SMTP_SECURE + label: SMTP | _APP_SMTP_SECURE + defaultValue: '' + description: SMTP secure connection protocol. Empty by default, change to 'tls' + if running on a secure connection. + - id: "$$config__app_smtp_username" + name: _APP_SMTP_USERNAME + label: SMTP | _APP_SMTP_USERNAME + defaultValue: '' + description: SMTP server user name. Empty by default. + - id: "$$secret__app_smtp_password" + name: _APP_SMTP_PASSWORD + label: SMTP | _APP_SMTP_PASSWORD + defaultValue: '' + description: SMTP server user password. Empty by default. + - id: "$$config__app_usage_stats" + name: _APP_USAGE_STATS + label: General | _APP_USAGE_STATS + defaultValue: enabled + description: This variable allows you to disable the collection and displaying + of usage stats. This value is set to 'enabled' by default, to disable the usage + stats set the value to 'disabled'. When disabled, it's recommended to turn off + the Worker Usage, Influxdb and Telegraf containers for better resource usage. + - id: "$$config__app_storage_limit" + name: _APP_STORAGE_LIMIT + label: Storage | _APP_STORAGE_LIMIT + defaultValue: '30000000' + description: Maximum file size allowed for file upload. The default value is 30MB. + You should pass your size limit value in bytes. + - id: "$$config__app_storage_preview_limit" + name: _APP_STORAGE_PREVIEW_LIMIT + label: Storage | _APP_STORAGE_PREVIEW_LIMIT + defaultValue: '20000000' + description: Maximum file size allowed for file image preview. The default value + is 20MB. You should pass your size limit value in bytes. + - id: "$$config__app_storage_antivirus_enabled" + name: _APP_STORAGE_ANTIVIRUS + label: Storage | _APP_STORAGE_ANTIVIRUS + defaultValue: disabled + description: This variable allows you to disable the internal anti-virus scans. + This value is set to 'disabled' by default, to enable the scans set the value + to 'enabled'. Before enabling, you must add the ClamAV service and depend on + it on main Appwrite service. + - id: "$$config__app_storage_antivirus_host" + name: _APP_STORAGE_ANTIVIRUS_HOST + label: Storage | _APP_STORAGE_ANTIVIRUS_HOST + defaultValue: clamav + description: ClamAV server host name address. + - id: "$$config__app_storage_antivirus_port" + name: _APP_STORAGE_ANTIVIRUS_PORT + label: Storage | _APP_STORAGE_ANTIVIRUS_PORT + defaultValue: '3310' + description: ClamAV server TCP port. + - id: "$$config__app_storage_device" + name: _APP_STORAGE_DEVICE + label: Storage | _APP_STORAGE_DEVICE + defaultValue: Local + description: Select default storage device. The default value is 'Local'. List + of supported adapters are 'Local', 'S3', 'DOSpaces', 'Backblaze', 'Linode' and + 'Wasabi'. + - id: "$$secret__app_storage_s3_access_key" + name: _APP_STORAGE_S3_ACCESS_KEY + label: Storage | _APP_STORAGE_S3_ACCESS_KEY + defaultValue: '' + description: AWS S3 storage access key. Required when the storage adapter is set + to S3. You can get your access key from your AWS console. + - id: "$$secret__app_storage_s3_secret" + name: _APP_STORAGE_S3_SECRET + label: Storage | _APP_STORAGE_S3_SECRET + defaultValue: '' + description: AWS S3 storage secret key. Required when the storage adapter is set + to S3. You can get your secret key from your AWS console. + - id: "$$config__app_storage_s3_region" + name: _APP_STORAGE_S3_REGION + label: Storage | _APP_STORAGE_S3_REGION + defaultValue: us-east-1 + description: AWS S3 storage region. Required when storage adapter is set to S3. + You can find your region info for your bucket from AWS console. + - id: "$$config__app_storage_s3_bucket" + name: _APP_STORAGE_S3_BUCKET + label: Storage | _APP_STORAGE_S3_BUCKET + defaultValue: '' + description: AWS S3 storage bucket. Required when storage adapter is set to S3. + You can create buckets in your AWS console. + - id: "$$secret__app_storage_do_spaces_access_key" + name: _APP_STORAGE_DO_SPACES_ACCESS_KEY + label: Storage | _APP_STORAGE_DO_SPACES_ACCESS_KEY + defaultValue: '' + description: DigitalOcean spaces access key. Required when the storage adapter + is set to DOSpaces. You can get your access key from your DigitalOcean console. + - id: "$$secret__app_storage_do_spaces_secret" + name: _APP_STORAGE_DO_SPACES_SECRET + label: Storage | _APP_STORAGE_DO_SPACES_SECRET + defaultValue: '' + description: DigitalOcean spaces secret key. Required when the storage adapter + is set to DOSpaces. You can get your secret key from your DigitalOcean console. + - id: "$$config__app_storage_do_spaces_region" + name: _APP_STORAGE_DO_SPACES_REGION + label: Storage | _APP_STORAGE_DO_SPACES_REGION + defaultValue: us-east-1 + description: DigitalOcean spaces region. Required when storage adapter is set + to DOSpaces. You can find your region info for your space from DigitalOcean + console. + - id: "$$config__app_storage_do_spaces_bucket" + name: _APP_STORAGE_DO_SPACES_BUCKET + label: Storage | _APP_STORAGE_DO_SPACES_BUCKET + defaultValue: '' + description: DigitalOcean spaces bucket. Required when storage adapter is set + to DOSpaces. You can create spaces in your DigitalOcean console. + - id: "$$secret__app_storage_backblaze_access_key" + name: _APP_STORAGE_BACKBLAZE_ACCESS_KEY + label: Storage | _APP_STORAGE_BACKBLAZE_ACCESS_KEY + defaultValue: '' + description: Backblaze access key. Required when the storage adapter is set to + Backblaze. Your Backblaze keyID will be your access key. You can get your keyID + from your Backblaze console. + - id: "$$secret__app_storage_backblaze_secret" + name: _APP_STORAGE_BACKBLAZE_SECRET + label: Storage | _APP_STORAGE_BACKBLAZE_SECRET + defaultValue: '' + description: Backblaze secret key. Required when the storage adapter is set to + Backblaze. Your Backblaze applicationKey will be your secret key. You can get + your applicationKey from your Backblaze console. + - id: "$$config__app_storage_backblaze_region" + name: _APP_STORAGE_BACKBLAZE_REGION + label: Storage | _APP_STORAGE_BACKBLAZE_REGION + defaultValue: us-west-004 + description: Backblaze region. Required when storage adapter is set to Backblaze. + You can find your region info from your Backblaze console. + - id: "$$config__app_storage_backblaze_bucket" + name: _APP_STORAGE_BACKBLAZE_BUCKET + label: Storage | _APP_STORAGE_BACKBLAZE_BUCKET + defaultValue: '' + description: Backblaze bucket. Required when storage adapter is set to Backblaze. + You can create your bucket from your Backblaze console. + - id: "$$secret__app_storage_linode_access_key" + name: _APP_STORAGE_LINODE_ACCESS_KEY + label: Storage | _APP_STORAGE_LINODE_ACCESS_KEY + defaultValue: '' + description: Linode object storage access key. Required when the storage adapter + is set to Linode. You can get your access key from your Linode console. + - id: "$$secret__app_storage_linode_secret" + name: _APP_STORAGE_LINODE_SECRET + label: Storage | _APP_STORAGE_LINODE_SECRET + defaultValue: '' + description: Linode object storage secret key. Required when the storage adapter + is set to Linode. You can get your secret key from your Linode console. + - id: "$$config__app_storage_linode_region" + name: _APP_STORAGE_LINODE_REGION + label: Storage | _APP_STORAGE_LINODE_REGION + defaultValue: eu-central-1 + description: Linode object storage region. Required when storage adapter is set + to Linode. You can find your region info from your Linode console. + - id: "$$config__app_storage_linode_bucket" + name: _APP_STORAGE_LINODE_BUCKET + label: Storage | _APP_STORAGE_LINODE_BUCKET + defaultValue: '' + description: Linode object storage bucket. Required when storage adapter is set + to Linode. You can create buckets in your Linode console. + - id: "$$secret__app_storage_wasabi_access_key" + name: _APP_STORAGE_WASABI_ACCESS_KEY + label: Storage | _APP_STORAGE_WASABI_ACCESS_KEY + defaultValue: '' + description: Wasabi access key. Required when the storage adapter is set to Wasabi. + You can get your access key from your Wasabi console. + - id: "$$secret__app_storage_wasabi_secret" + name: _APP_STORAGE_WASABI_SECRET + label: Storage | _APP_STORAGE_WASABI_SECRET + defaultValue: '' + description: Wasabi secret key. Required when the storage adapter is set to Wasabi. + You can get your secret key from your Wasabi console. + - id: "$$config__app_storage_wasabi_region" + name: _APP_STORAGE_WASABI_REGION + label: Storage | _APP_STORAGE_WASABI_REGION + defaultValue: eu-central-1 + description: Wasabi region. Required when storage adapter is set to Wasabi. You + can find your region info from your Wasabi console. + - id: "$$config__app_storage_wasabi_bucket" + name: _APP_STORAGE_WASABI_BUCKET + label: Storage | _APP_STORAGE_WASABI_BUCKET + defaultValue: '' + description: Wasabi bucket. Required when storage adapter is set to Wasabi. You + can create buckets in your Wasabi console. + - id: "$$config__app_functions_size_limit" + name: _APP_FUNCTIONS_SIZE_LIMIT + label: Functions | _APP_FUNCTIONS_SIZE_LIMIT + defaultValue: '30000000' + description: The maximum size deployment in bytes. The default value is 30MB. + - id: "$$config__app_functions_timeout" + name: _APP_FUNCTIONS_TIMEOUT + label: Functions | _APP_FUNCTIONS_TIMEOUT + defaultValue: '900' + description: The maximum number of seconds allowed as a timeout value when creating + a new function. The default value is 900 seconds. + - id: "$$config__app_functions_build_timeout" + name: _APP_FUNCTIONS_BUILD_TIMEOUT + label: Functions | _APP_FUNCTIONS_BUILD_TIMEOUT + defaultValue: '900' + description: The maximum number of seconds allowed as a timeout value when building + a new function. The default value is 900 seconds. + - id: "$$config__app_functions_containers" + name: _APP_FUNCTIONS_CONTAINERS + label: Functions | _APP_FUNCTIONS_CONTAINERS + defaultValue: '10' + description: The maximum number of containers Appwrite is allowed to keep alive + in the background for function environments. Running containers allow faster + execution time as there is no need to recreate each container every time a function + gets executed. The default value is 10. + - id: "$$config__app_functions_cpus" + name: _APP_FUNCTIONS_CPUS + label: Functions | _APP_FUNCTIONS_CPUS + defaultValue: '' + description: The maximum number of CPU core a single cloud function is allowed + to use. Please note that setting a value higher than available cores will result + in a function error, which might result in an error. The default value is empty. + When it's empty, CPU limit will be disabled. + - id: "$$config__app_functions_memory_allocated" + name: _APP_FUNCTIONS_MEMORY + label: Functions | _APP_FUNCTIONS_MEMORY + defaultValue: '' + description: The maximum amount of memory a single cloud function is allowed to + use in megabytes. The default value is empty. When it's empty, memory limit + will be disabled. + - id: "$$config__app_functions_memory_swap" + name: _APP_FUNCTIONS_MEMORY_SWAP + label: Functions | _APP_FUNCTIONS_MEMORY_SWAP + defaultValue: '' + description: The maximum amount of swap memory a single cloud function is allowed + to use in megabytes. The default value is empty. When it's empty, swap memory + limit will be disabled. + - id: "$$config__app_functions_runtimes" + name: _APP_FUNCTIONS_RUNTIMES + label: Functions | _APP_FUNCTIONS_RUNTIMES + defaultValue: node-18.0 + description: |- + This option allows you to limit the available environments for cloud functions. This option is very useful for low-cost servers to safe disk space. + To enable/activate this option, pass a list of allowed environments separated by a comma. + Currently, supported environments are: node-14.5, node-16.0, node-18.0, php-8.0, php-8.1, ruby-3.0, ruby-3.1, python-3.8, python-3.9, python-3.10, deno-1.21, deno-1.24, dart-2.15, dart-2.16, dart-2.17, dotnet-3.1, dotnet-6.0, java-8.0, java-11.0, java-17.0, java-18.0, swift-5.5, kotlin-1.6, cpp-17.0 + - id: "$$secret__app_executor_secret" + name: _APP_EXECUTOR_SECRET + label: Functions | _APP_EXECUTOR_SECRET + defaultValue: "$$generate_hex(16)" + description: The secret key used by Appwrite to communicate with the function + executor. + - id: "$$config__app_executor_host" + name: _APP_EXECUTOR_HOST + label: '' + defaultValue: http://$$id-executor/v1 + description: '' + - id: "$$config__app_logging_provider" + name: _APP_LOGGING_PROVIDER + label: General | _APP_LOGGING_PROVIDER + defaultValue: '' + description: This variable allows you to enable logging errors to 3rd party providers. + This value is empty by default, to enable the logger set the value to one of + 'sentry', 'raygun', 'appsignal', 'logowl' + - id: "$$config__app_logging_config" + name: _APP_LOGGING_CONFIG + label: General | _APP_LOGGING_CONFIG + defaultValue: '' + description: This variable configures authentication to 3rd party error logging + providers. If using Sentry, this should be 'SENTRY_API_KEY;SENTRY_APP_ID'. If + using Raygun, this should be Raygun API key. If using AppSignal, this should + be AppSignal API key. If using LogOwl, this should be LogOwl Service Ticket. + - id: "$$config__app_statsd_host" + name: _APP_STATSD_HOST + label: '' + defaultValue: "$$id-telegraf" + description: '' + - id: "$$config__app_statsd_port" + name: _APP_STATSD_PORT + label: StatsD | _APP_STATSD_PORT + defaultValue: '8125' + description: StatsD server TCP port. + - id: "$$config__app_maintenance_interval" + name: _APP_MAINTENANCE_INTERVAL + label: Functions | _APP_MAINTENANCE_INTERVAL + defaultValue: '86400' + description: Interval value containing the number of seconds that the Appwrite + maintenance process should wait before executing system cleanups and optimizations. + The default value is 86400 seconds (1 day). + - id: "$$config__app_maintenance_retention_execution" + name: _APP_MAINTENANCE_RETENTION_EXECUTION + label: Functions | _APP_MAINTENANCE_RETENTION_EXECUTION + defaultValue: '1209600' + description: The maximum duration (in seconds) upto which to retain execution + logs. The default value is 1209600 seconds (14 days). + - id: "$$config__app_maintenance_retention_cache" + name: _APP_MAINTENANCE_RETENTION_CACHE + label: Functions | _APP_MAINTENANCE_RETENTION_CACHE + defaultValue: '2592000' + description: The maximum duration (in seconds) upto which to retain cached files. + The default value is 2592000 seconds (30 days). + - id: "$$config__app_maintenance_retention_abuse" + name: _APP_MAINTENANCE_RETENTION_ABUSE + label: Functions | _APP_MAINTENANCE_RETENTION_ABUSE + defaultValue: '86400' + description: The maximum duration (in seconds) upto which to retain abuse logs. + The default value is 86400 seconds (1 day). + - id: "$$config__app_maintenance_retention_audit" + name: _APP_MAINTENANCE_RETENTION_AUDIT + label: Functions | _APP_MAINTENANCE_RETENTION_AUDIT + defaultValue: '1209600' + description: The maximum duration (in seconds) upto which to retain audit logs. + The default value is 1209600 seconds (14 days). + - id: "$$config__app_sms_provider" + name: _APP_SMS_PROVIDER + label: Phone | _APP_SMS_PROVIDER + defaultValue: '' + description: 'Provider used for delivering SMS for Phone authentication. Use the + following format: ''sms://[USER]:[SECRET]@[PROVIDER]''. Available providers + are twilio, text-magic, telesign, msg91, and vonage.' + - id: "$$config__app_sms_from" + name: _APP_SMS_FROM + label: Phone | _APP_SMS_FROM + defaultValue: '' + description: Phone number used for sending out messages. Must start with a leading + '+' and maximum of 15 digits without spaces (+123456789). + - id: "$$config__app_version" + name: _APP_VERSION + label: Version Tag + defaultValue: 1.0.3 + description: Check out their valid tags at https://hub.docker.com/r/appwrite/appwrite/tags + - id: "$$config__app_functions_inactive_threshold" + name: _APP_FUNCTIONS_INACTIVE_THRESHOLD + label: Functions | _APP_FUNCTIONS_INACTIVE_THRESHOLD + defaultValue: '60' + description: The minimum time a function can be inactive before it's container + is shutdown and put to sleep. The default value is 60 seconds + - id: "$$config_open_runtimes_network" + name: OPEN_RUNTIMES_NETWORK + label: '' + defaultValue: "$$generate_network" + description: '' + - id: "$$config_dockerhub_pull_username" + name: DOCKERHUB_PULL_USERNAME + label: Functions | DOCKERHUB_PULL_USERNAME + defaultValue: '' + description: The username for hub.docker.com. This variable is used to pull images + from hub.docker.com. + - id: "$$secret_dockerhub_pull_password" + name: DOCKERHUB_PULL_PASSWORD + label: Functions | DOCKERHUB_PULL_PASSWORD + defaultValue: '' + description: The password for hub.docker.com. This variable is used to pull images + from hub.docker.com. + - id: "$$config__app_usage_timeseries_interval" + name: _APP_USAGE_TIMESERIES_INTERVAL + label: General | _APP_USAGE_TIMESERIES_INTERVAL + defaultValue: '30' + description: Interval value containing the number of seconds that the Appwrite + usage process should wait before aggregating stats and syncing it to mariadb + from InfluxDB. The default value is 30 seconds. + - id: "$$config__app_usage_database_interval" + name: _APP_USAGE_DATABASE_INTERVAL + label: General | _APP_USAGE_DATABASE_INTERVAL + defaultValue: '900' + description: Interval value containing the number of seconds that the Appwrite + usage process should wait before aggregating stats from data in Appwrite Database. + The default value is 15 minutes. +- templateVersion: 1.0.0 + defaultVersion: latest + name: Weblate + description: '' + services: + $$id: + name: Weblate + depends_on: + - $$id-postgresql + - $$id-redis + image: 'weblate/weblate:$$core_version' + volumes: + - '$$id-data:/app/data' + environment: + - WEBLATE_SITE_DOMAIN=$$config_weblate_site_domain + - WEBLATE_ADMIN_PASSWORD=$$secret_weblate_admin_password + - POSTGRES_PASSWORD=$$secret_postgres_password + - POSTGRES_USER=$$config_postgres_user + - POSTGRES_DATABASE=$$config_postgres_db + - POSTGRES_HOST=$$id-postgresql + - POSTGRES_PORT=5432 + - REDIS_HOST=$$id-redis + ports: + - '8080' + $$id-postgresql: + name: PostgreSQL + depends_on: [] + image: 'postgres:14-alpine' + volumes: + - '$$id-postgresql-data:/var/lib/postgresql/data' + environment: + - POSTGRES_USER=$$config_postgres_user + - POSTGRES_PASSWORD=$$secret_postgres_password + - POSTGRES_DB=$$config_postgres_db + ports: [] + $$id-redis: + name: Redis + depends_on: [] + image: 'redis:7-alpine' + volumes: + - '$$id-redis-data:/data' + environment: [] + ports: [] + variables: + - id: $$config_weblate_site_domain + name: WEBLATE_SITE_DOMAIN + label: Weblate Domain + defaultValue: $$generate_domain + description: '' + - id: $$secret_weblate_admin_password + name: WEBLATE_ADMIN_PASSWORD + label: Weblate Admin Password + defaultValue: $$generate_password + description: '' + showOnUI: true + - id: $$config_postgres_user + main: $$id-postgresql + name: POSTGRES_USER + label: PostgreSQL User + defaultValue: $$generate_username + description: '' + - id: $$secret_postgres_password + main: $$id-postgresql + name: POSTGRES_PASSWORD + label: PostgreSQL Password + defaultValue: $$generate_password + description: '' + showOnUI: true + - id: $$config_postgres_db + main: $$id-postgresql + name: POSTGRES_DB + label: PostgreSQL Database + defaultValue: weblate + description: '' +- templateVersion: 1.0.0 + defaultVersion: 2022.10.14-1a5b0965 + name: SearXNG + description: '' + services: + $$id: + name: SearXNG + depends_on: + - $$id-redis + image: 'searxng/searxng:$$core_version' + volumes: + - '$$id-searxng:/etc/searxng' + environment: + - SEARXNG_BASE_URL=$$config_searxng_base_url + ports: + - '8080' + cap_drop: + - ALL + cap_add: + - CHOWN + - SETGID + - SETUID + - DAC_OVERRIDE + extras: + files: + - source: $$workdir/settings.yml + destination: /etc/searxng/settings.yml + content: |2- + + # see https://docs.searxng.org/admin/engines/settings.html#use-default-settings + use_default_settings: true + server: + secret_key: $$secret_secret_key + limiter: true + image_proxy: true + ui: + static_use_hash: true + redis: + url: redis://:$$secret_redis_password@$$id-redis:6379/0 + $$id-redis: + name: Redis + command: >- + redis-server --requirepass $$secret_redis_password --save "" + --appendonly "no" + depends_on: [] + image: 'redis:7-alpine' + volumes: + - '$$id-redis-data:/data' + environment: + - REDIS_PASSWORD=$$secret_redis_password + ports: [] + cap_drop: + - ALL + cap_add: + - SETGID + - SETUID + - DAC_OVERRIDE + variables: + - id: $$config_searxng_base_url + name: SEARXNG_BASE_URL + label: SearXNG Base URL + defaultValue: $$generate_fqdn + description: '' + - id: $$secret_secret_key + name: SECRET_KEY + label: Secret Key + defaultValue: $$generate_passphrase + description: '' + - id: $$secret_redis_password + name: REDIS_PASSWORD + label: Redis Password + defaultValue: $$generate_password + description: '' +- templateVersion: 1.0.0 + defaultVersion: v2.0.6 + name: GlitchTip + description: '' + services: + $$id: + name: GlitchTip + depends_on: + - $$id-postgresql + - $$id-redis + image: 'glitchtip/glitchtip:$$core_version' + volumes: [] + environment: + - PORT=3000 + - GLITCHTIP_DOMAIN=$$config_glitchtip_domain + - SECRET_KEY=$$secret_secret_key + - DATABASE_URL=$$secret_database_url + - REDIS_URL=$$secret_redis_url + - DEFAULT_FROM_EMAIL=$$config_default_from_email + - EMAIL_HOST=$$config_email_host + - EMAIL_PORT=$$config_email_port + - EMAIL_HOST_USER=$$config_email_host_user + - EMAIL_HOST_PASSWORD=$$secret_email_host_password + - EMAIL_USE_TLS=$$config_email_use_tls + - EMAIL_USE_SSL=$$config_email_use_ssl + - EMAIL_BACKEND=$$config_email_backend + - MAILGUN_API_KEY=$$secret_mailgun_api_key + - SENDGRID_API_KEY=$$secret_sendgrid_api_key + - ENABLE_OPEN_USER_REGISTRATION=$$config_enable_open_user_registration + - DJANGO_SUPERUSER_EMAIL=$$config_django_superuser_email + - DJANGO_SUPERUSER_PASSWORD=$$secret_django_superuser_password + - DJANGO_SUPERUSER_USERNAME=$$config_django_superuser_username + ports: + - '8000' + $$id-postgresql: + name: PostgreSQL + depends_on: [] + image: 'postgres:12-alpine' + volumes: + - '$$id-postgresql-data:/var/lib/postgresql/data' + environment: + - POSTGRES_USER=$$config_postgres_user + - POSTGRES_PASSWORD=$$secret_postgres_password + - POSTGRES_DB=$$config_postgres_db + ports: [] + $$id-redis: + name: Redis + depends_on: [] + image: 'redis:7-alpine' + volumes: + - '$$id-postgresql-redis-data:/data' + environment: [] + ports: [] + variables: + - id: $$config_glitchtip_domain + name: GLITCHTIP_DOMAIN + label: GlitchTip Domain + defaultValue: $$generate_fqdn + description: '' + - id: $$secret_database_url + name: DATABASE_URL + label: Database URL for PostgreSQL + defaultValue: >- + postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db + description: '' + - id: $$secret_redis_url + name: REDIS_URL + label: Redis URL + defaultValue: 'redis://$$id-redis:6379/0' + description: '' + - id: $$config_default_from_email + name: DEFAULT_FROM_EMAIL + label: Default Email Address + defaultValue: noreply@example.com + description: '' + - id: $$config_email_host + name: EMAIL_HOST + label: Email SMTP Host + defaultValue: '' + description: '' + - id: $$config_email_port + name: EMAIL_PORT + label: Email SMTP Port + defaultValue: '25' + description: '' + - id: $$config_email_host_user + name: EMAIL_HOST_USER + label: Email SMTP User + defaultValue: '' + description: '' + - id: $$secret_email_host_password + name: EMAIL_HOST_PASSWORD + label: Email SMTP Password + defaultValue: '' + description: '' + - id: $$config_email_use_tls + name: EMAIL_USE_TLS + label: Email Use TLS + defaultValue: 'false' + description: '' + - id: $$config_email_use_ssl + name: EMAIL_USE_SSL + label: Email Use SSL + defaultValue: 'false' + description: '' + - id: $$secret_email_smtp_password + name: EMAIL_SMTP_PASSWORD + label: SMTP Password + defaultValue: '' + description: '' + - id: $$config_email_backend + name: EMAIL_BACKEND + label: Email Backend + defaultValue: '' + description: '' + - id: $$secret_mailgun_api_key + name: MAILGUN_API_KEY + label: Mailgun API Key + defaultValue: '' + description: '' + - id: $$secret_sendgrid_api_key + name: SENDGRID_API_KEY + label: Sendgrid API Key + defaultValue: '' + description: '' + - id: $$config_enable_open_user_registration + name: ENABLE_OPEN_USER_REGISTRATION + label: Enable Open User Registration + defaultValue: 'true' + description: '' + - id: $$config_django_superuser_email + name: DJANGO_SUPERUSER_EMAIL + label: Django Superuser Email + defaultValue: '' + description: '' + - id: $$config_django_superuser_username + name: DJANGO_SUPERUSER_USERNAME + label: Django Superuser Username + defaultValue: '' + description: '' + - id: $$secret_django_superuser_password + name: DJANGO_SUPERUSER_PASSWORD + label: Django Superuser Password + defaultValue: $$generate_password + description: '' + - id: $$config_postgres_user + main: $$id-postgresql + name: POSTGRES_USER + label: PostgreSQL User + defaultValue: $$generate_username + description: '' + - id: $$secret_postgres_password + main: $$id-postgresql + name: POSTGRES_PASSWORD + label: PostgreSQL Password + defaultValue: '' + description: '' + - id: $$config_postgres_db + main: $$id-postgresql + name: POSTGRES_DB + label: PostgreSQL Database + defaultValue: hasura + description: '' +- templateVersion: 1.0.0 + defaultVersion: v2.13.0 + name: Hasura + description: 'Instant realtime GraphQL APIs on any Postgres application, existing or new.' + services: + $$id: + name: Hasura + depends_on: + - $$id-postgresql + image: 'hasura/graphql-engine:$$core_version' + volumes: [] + environment: + - HASURA_GRAPHQL_ENABLE_CONSOLE=$$config_hasura_graphql_enable_console + - >- + HASURA_GRAPHQL_METADATA_DATABASE_URL=$$secret_hasura_graphql_metadata_database_url + - HASURA_GRAPHQL_ADMIN_PASSWORD=$$secret_hasura_graphql_admin_password + ports: + - '8080' + $$id-postgresql: + name: PostgreSQL + depends_on: [] + image: 'postgres:12-alpine' + volumes: + - '$$id-postgresql-data:/var/lib/postgresql/data' + environment: + - POSTGRES_USER=$$config_postgres_user + - POSTGRES_PASSWORD=$$secret_postgres_password + - POSTGRES_DB=$$config_postgres_db + ports: [] + variables: + - id: $$config_hasura_graphql_enable_console + name: HASURA_GRAPHQL_ENABLE_CONSOLE + label: Enable Hasura Console + defaultValue: 'true' + description: '' + - id: $$secret_hasura_graphql_metadata_database_url + name: HASURA_GRAPHQL_METADATA_DATABASE_URL + label: Hasura Metadata Database URL + defaultValue: >- + postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db + description: '' + - id: $$secret_hasura_graphql_admin_password + name: HASURA_GRAPHQL_ADMIN_PASSWORD + label: Hasura Admin Password + defaultValue: $$generate_password + description: '' + showOnUI: true + - id: $$config_postgres_user + name: POSTGRES_USER + label: PostgreSQL User + defaultValue: $$generate_username + description: '' + - id: $$secret_postgres_password + name: POSTGRES_PASSWORD + label: PostgreSQL Password + defaultValue: $$generate_password + description: '' + - id: $$config_postgres_db + name: POSTGRES_DB + label: PostgreSQL Database + defaultValue: hasura + description: '' +- templateVersion: 1.0.0 + defaultVersion: postgresql-v1.38.0 + name: Umami + description: >- + Umami is a simple, easy to use, self-hosted web analytics solution. The goal + is to provide you with a friendly privacy-focused alternative to Google + Analytics. + services: + $$id: + name: Umami + documentation: 'Official docs are [here](https://umami.is/docs/getting-started)' + depends_on: + - $$id-postgresql + image: 'ghcr.io/umami-software/umami:$$core_version' + volumes: [] + environment: + - ADMIN_PASSWORD=$$secret_admin_password + - DATABASE_URL=$$secret_database_url + - DATABASE_TYPE=postgresql + - HASH_SALT=$$secret_hash_salt + ports: + - '3000' + $$id-postgresql: + name: PostgreSQL + documentation: 'Official docs are [here](https://umami.is/docs/getting-started)' + depends_on: [] + image: 'postgres:12-alpine' + volumes: + - '$$id-postgresql-data:/var/lib/postgresql/data' + environment: + - POSTGRES_USER=$$config_postgres_user + - POSTGRES_PASSWORD=$$secret_postgres_password + - POSTGRES_DB=$$config_postgres_db + ports: [] + extras: + files: + - source: $$workdir/schema.postgresql.sql + destination: /docker-entrypoint-initdb.d/schema.postgresql.sql + content: |2- + + -- CreateTable + CREATE TABLE "account" ( + "user_id" SERIAL NOT NULL, + "username" VARCHAR(255) NOT NULL, + "password" VARCHAR(60) NOT NULL, + "is_admin" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY ("user_id") + ); + + -- CreateTable + CREATE TABLE "event" ( + "event_id" SERIAL NOT NULL, + "website_id" INTEGER NOT NULL, + "session_id" INTEGER NOT NULL, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "url" VARCHAR(500) NOT NULL, + "event_type" VARCHAR(50) NOT NULL, + "event_value" VARCHAR(50) NOT NULL, + + PRIMARY KEY ("event_id") + ); + + -- CreateTable + CREATE TABLE "pageview" ( + "view_id" SERIAL NOT NULL, + "website_id" INTEGER NOT NULL, + "session_id" INTEGER NOT NULL, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "url" VARCHAR(500) NOT NULL, + "referrer" VARCHAR(500), + + PRIMARY KEY ("view_id") + ); + + -- CreateTable + CREATE TABLE "session" ( + "session_id" SERIAL NOT NULL, + "session_uuid" UUID NOT NULL, + "website_id" INTEGER NOT NULL, + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + "hostname" VARCHAR(100), + "browser" VARCHAR(20), + "os" VARCHAR(20), + "device" VARCHAR(20), + "screen" VARCHAR(11), + "language" VARCHAR(35), + "country" CHAR(2), + + PRIMARY KEY ("session_id") + ); + + -- CreateTable + CREATE TABLE "website" ( + "website_id" SERIAL NOT NULL, + "website_uuid" UUID NOT NULL, + "user_id" INTEGER NOT NULL, + "name" VARCHAR(100) NOT NULL, + "domain" VARCHAR(500), + "share_id" VARCHAR(64), + "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY ("website_id") + ); + + -- CreateIndex + CREATE UNIQUE INDEX "account.username_unique" ON "account"("username"); + + -- CreateIndex + CREATE INDEX "event_created_at_idx" ON "event"("created_at"); + + -- CreateIndex + CREATE INDEX "event_session_id_idx" ON "event"("session_id"); + + -- CreateIndex + CREATE INDEX "event_website_id_idx" ON "event"("website_id"); + + -- CreateIndex + CREATE INDEX "pageview_created_at_idx" ON "pageview"("created_at"); + + -- CreateIndex + CREATE INDEX "pageview_session_id_idx" ON "pageview"("session_id"); + + -- CreateIndex + CREATE INDEX "pageview_website_id_created_at_idx" ON "pageview"("website_id", "created_at"); + + -- CreateIndex + CREATE INDEX "pageview_website_id_idx" ON "pageview"("website_id"); + + -- CreateIndex + CREATE INDEX "pageview_website_id_session_id_created_at_idx" ON "pageview"("website_id", "session_id", "created_at"); + + -- CreateIndex + CREATE UNIQUE INDEX "session.session_uuid_unique" ON "session"("session_uuid"); + + -- CreateIndex + CREATE INDEX "session_created_at_idx" ON "session"("created_at"); + + -- CreateIndex + CREATE INDEX "session_website_id_idx" ON "session"("website_id"); + + -- CreateIndex + CREATE UNIQUE INDEX "website.website_uuid_unique" ON "website"("website_uuid"); + + -- CreateIndex + CREATE UNIQUE INDEX "website.share_id_unique" ON "website"("share_id"); + + -- CreateIndex + CREATE INDEX "website_user_id_idx" ON "website"("user_id"); + + -- AddForeignKey + ALTER TABLE "event" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE; + + -- AddForeignKey + ALTER TABLE "event" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; + + -- AddForeignKey + ALTER TABLE "pageview" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE; + + -- AddForeignKey + ALTER TABLE "pageview" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; + + -- AddForeignKey + ALTER TABLE "session" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; + + -- AddForeignKey + ALTER TABLE "website" ADD FOREIGN KEY ("user_id") REFERENCES "account"("user_id") ON DELETE CASCADE ON UPDATE CASCADE; + + insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true); + variables: + - id: $$secret_database_url + name: DATABASE_URL + label: Database URL for PostgreSQL + defaultValue: >- + postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db + description: '' + - id: $$secret_hash_salt + name: HASH_SALT + label: Hash Salt + defaultValue: $$generate_passphrase + description: '' + - id: $$config_postgres_user + name: POSTGRES_USER + label: PostgreSQL User + defaultValue: $$generate_username + description: '' + - id: $$secret_postgres_password + name: POSTGRES_PASSWORD + label: PostgreSQL Password + defaultValue: $$generate_password + description: '' + - id: $$config_postgres_db + name: POSTGRES_DB + label: PostgreSQL Database + defaultValue: umami + description: '' + - id: $$secret_admin_password + name: ADMIN_PASSWORD + label: Initial Admin Password + defaultValue: $$generate_password + description: '' + showOnUI: true +- templateVersion: 1.0.0 + defaultVersion: v0.29.1 + name: MeiliSearch + description: >- + MeiliSearch is a lightning Fast, Ultra Relevant, and Typo-Tolerant Search + Engine + services: + $$id: + name: MeiliSearch + documentation: 'https://docs.meilisearch.com/' + depends_on: [] + image: 'getmeili/meilisearch:$$core_version' + volumes: + - '$$id-datams:/meili_data/data.ms' + - '$$id-data:/meili_data' + - '$$id-snapshot:/snapshot' + - '$$id-dump:/dumps' + environment: + - MEILI_MASTER_KEY=$$secret_meili_master_key + ports: + - '7700' + variables: + - id: $$secret_meili_master_key + name: MEILI_MASTER_KEY + label: Master Key + defaultValue: $$generate_passphrase + description: '' + showOnUI: true +- templateVersion: 1.0.0 + defaultVersion: latest + name: Ghost + description: >- + Ghost is a free and open source blogging platform written in JavaScript and + distributed under the MIT License + services: + $$id: + name: Ghost + documentation: 'Taken from https://docs.ghost.org/' + depends_on: + - $$id-mariadb + image: 'bitnami/ghost:$$core_version' + volumes: + - '$$id-ghost:/bitnami/ghost' + environment: + - url=$$config_url + - GHOST_HOST=$$config_ghost_host + - GHOST_ENABLE_HTTPS=$$config_ghost_enable_https + - GHOST_EMAIL=$$config_ghost_email + - GHOST_PASSWORD=$$secret_ghost_password + - GHOST_DATABASE_HOST=$$config_ghost_database_host + - GHOST_DATABASE_USER=$$config_mariadb_user + - GHOST_DATABASE_PASSWORD=$$secret_ghost_database_password + - GHOST_DATABASE_NAME=$$config_mariadb_database + - GHOST_DATABASE_PORT_NUMBER=3306 + ports: + - '2368' + $$id-mariadb: + name: MariaDB + depends_on: [] + image: 'bitnami/mariadb:latest' + volumes: + - '$$id-mariadb:/bitnami/mariadb' + environment: + - MARIADB_USER=$$config_mariadb_user + - MARIADB_PASSWORD=$$secret_mariadb_password + - MARIADB_DATABASE=$$config_mariadb_database + - MARIADB_ROOT_USER=$$config_mariadb_root_user + - MARIADB_ROOT_PASSWORD=$$secret_mariadb_root_password + ports: [] + variables: + - id: $$config_url + name: url + label: URL + defaultValue: $$generate_fqdn + description: '' + - id: $$config_ghost_host + name: GHOST_HOST + label: Ghost Host + defaultValue: '' + description: '' + - id: $$config_ghost_enable_https + name: GHOST_ENABLE_HTTPS + label: Ghost Enable HTTPS + defaultValue: 'no' + description: '' + - id: $$config_ghost_email + name: GHOST_EMAIL + label: Ghost Default Email + defaultValue: admin@example.com + description: '' + - id: $$secret_ghost_password + name: GHOST_PASSWORD + label: Ghost Default Password + defaultValue: $$generate_password + description: '' + - id: $$config_ghost_database_host + name: GHOST_DATABASE_HOST + label: Ghost Database Host + defaultValue: $$id-mariadb + description: '' + - id: $$config_ghost_database_user + name: GHOST_DATABASE_USER + label: MariaDB User + defaultValue: $$config_mariadb_user + description: '' + - id: $$secret_ghost_database_password + name: GHOST_DATABASE_PASSWORD + label: MariaDB Password + defaultValue: $$secret_mariadb_password + description: '' + - id: $$config_ghost_database_name + name: GHOST_DATABASE_NAME + label: MariaDB Database + defaultValue: $$config_mariadb_database + description: '' + - id: $$config_mariadb_user + name: MARIADB_USER + label: MariaDB User + defaultValue: $$generate_username + description: '' + - id: $$secret_mariadb_password + name: MARIADB_PASSWORD + label: MariaDB Password + defaultValue: $$generate_password + description: '' + - id: $$config_mariadb_database + name: MARIADB_DATABASE + label: MariaDB Database + defaultValue: ghost + description: '' + - id: $$config_mariadb_root_user + name: MARIADB_ROOT_USER + label: MariaDB Root User + defaultValue: $$generate_username + description: '' + - id: $$secret_mariadb_root_password + name: MARIADB_ROOT_PASSWORD + label: MariaDB Root Password + defaultValue: $$generate_password + description: '' +- templateVersion: 1.0.0 + defaultVersion: php8.1 + name: WordPress + description: WordPress is a content management system based on PHP. + services: + $$id: + name: WordPress + documentation: ' Taken from https://docs.docker.com/compose/wordpress/' + depends_on: + - $$id-mysql + image: 'wordpress:$$core_version' + volumes: + - '$$id-wordpress-data:/var/www/html' + environment: + - WORDPRESS_DB_HOST=$$config_wordpress_db_host + - WORDPRESS_DB_USER=$$config_mysql_user + - WORDPRESS_DB_PASSWORD=$$secret_mysql_password + - WORDPRESS_DB_NAME=$$config_mysql_database + - WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra + ports: + - '80' + $$id-mysql: + name: MySQL + depends_on: [] + image: 'mysql:5.7' + volumes: + - '$$id-mysql-data:/var/lib/mysql' + environment: + - MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password + - MYSQL_ROOT_USER=$$config_mysql_root_user + - MYSQL_DATABASE=$$config_mysql_database + - MYSQL_USER=$$config_mysql_user + - MYSQL_PASSWORD=$$secret_mysql_password + ports: [] + variables: + - id: $$config_wordpress_db_host + name: WORDPRESS_DB_HOST + label: WordPress DB Host + defaultValue: $$id-mysql + description: '' + - id: $$config_wordpress_db_user + name: WORDPRESS_DB_USER + label: WordPress DB User + defaultValue: $$config_mysql_user + description: '' + - id: $$secret_wordpress_db_password + name: WORDPRESS_DB_PASSWORD + label: WordPress DB Password + defaultValue: $$secret_mysql_password + description: '' + - id: $$config_wordpress_db_name + name: WORDPRESS_DB_NAME + label: WordPress DB Name + defaultValue: $$config_mysql_database + description: '' + - id: $$config_wordpress_config_extra + name: WORDPRESS_CONFIG_EXTRA + label: WordPress Config Extra + defaultValue: '' + description: '' + - id: $$secret_mysql_root_password + name: MYSQL_ROOT_PASSWORD + label: MySQL Root Password + defaultValue: $$generate_password + description: '' + - id: $$config_mysql_root_user + name: MYSQL_ROOT_USER + label: MySQL Root User + defaultValue: $$generate_username + description: '' + - id: $$config_mysql_database + name: MYSQL_DATABASE + label: MySQL Database + defaultValue: wordpress + description: '' + - id: $$config_mysql_user + name: MYSQL_USER + label: MySQL User + defaultValue: $$generate_username + description: '' + - id: $$secret_mysql_password + name: MYSQL_PASSWORD + label: MySQL Password + defaultValue: $$generate_password + description: '' +- templateVersion: 1.0.0 + defaultVersion: 4.7.1 + name: VSCode Server + description: >- + vscode-server by Coder is VS Code running on a remote server, accessible + through the browser. + services: + $$id: + name: VSCode Server + documentation: 'Taken from https://github.com/coder/code-server/. ' + depends_on: [] + image: 'codercom/code-server:$$core_version' + volumes: + - '$$id-config-data:/home/coder/.local/share/code-server' + - '$$id-vscodeserver-data:/home/coder' + - '$$id-keys-directory:/root/.ssh' + - '$$id-theme-and-plugin-directory:/root/.local/share/code-server' + environment: + - PASSWORD=$$secret_password + ports: + - '8080' + variables: + - id: $$secret_password + name: PASSWORD + label: Password + defaultValue: $$generate_password + description: '' + showOnUI: true +- templateVersion: 1.0.0 + defaultVersion: RELEASE.2022-10-15T19-57-03Z + name: MinIO + description: ' MinIO is a cloud storage server compatible with Amazon S3' + services: + $$id: + name: MinIO + command: 'server /data --console-address :9001' + documentation: 'Taken from https://docs.min.io/docs/minio-docker-quickstart-guide.html' + depends_on: [] + image: 'minio/minio:$$core_version' + volumes: + - '$$id-data-write:/files' + environment: + - MINIO_SERVER_URL=$$coolify_fqdn_minio_console + - MINIO_BROWSER_REDIRECT_URL=$$config_minio_browser_redirect_url + - MINIO_DOMAIN=$$config_minio_domain + - MINIO_ROOT_USER=$$config_minio_root_user + - MINIO_ROOT_PASSWORD=$$secret_minio_root_password + ports: + - '9000' + - '9001' + proxy: + - port: '9000' + domain: $$coolify_fqdn_minio_console + - port: '9001' + variables: + - id: $$coolify_fqdn_minio_console + name: MINIO_SERVER_URL + label: MinIO Server URL + defaultValue: '' + description: 'Specify the URL hostname the MinIO Console should use for connecting to the MinIO Server.' + required: true + - id: $$config_minio_browser_redirect_url + name: MINIO_BROWSER_REDIRECT_URL + label: Browser Redirect URL + defaultValue: $$generate_fqdn + description: '' + - id: $$config_minio_domain + name: MINIO_DOMAIN + label: Domain + defaultValue: $$generate_domain + description: '' + - id: $$config_minio_root_user + name: MINIO_ROOT_USER + label: Root User + defaultValue: $$generate_username + description: '' + - id: $$secret_minio_root_password + name: MINIO_ROOT_PASSWORD + label: Root User Password + defaultValue: $$generate_password + description: '' + showOnUI: true +- templateVersion: 1.0.0 + defaultVersion: 0.21.1 + name: Fider + description: Fider is a platform to collect and organize customer feedback. + services: + $$id: + name: Fider + image: 'getfider/fider:$$core_version' + documentation: 'Taken from https://hub.docker.com/r/getfider/fider/' + depends_on: + - $$id-postgresql + environment: + - BASE_URL=$$config_base_url + - JWT_SECRET=$$secret_jwt_secret + - EMAIL_NOREPLY=$$config_email_noreply + - EMAIL_MAILGUN_API=$$secret_email_mailgun_api + - EMAIL_MAILGUN_REGION=$$config_email_mailgun_region + - EMAIL_MAILGUN_DOMAIN=$$config_email_mailgun_domain + - EMAIL_SMTP_HOST=$$config_email_smtp_host + - EMAIL_SMTP_PORT=$$config_email_smtp_port + - EMAIL_SMTP_USER=$$config_email_smtp_user + - EMAIL_SMTP_PASSWORD=$$secret_email_smtp_password + - EMAIL_SMTP_ENABLE_STARTTLS=$$config_email_smtp_enable_starttls + ports: + - '3000' + $$id-postgresql: + name: PostgreSQL + documentation: 'Taken from https://hub.docker.com/r/getfider/fider/' + depends_on: [] + image: 'postgres:12-alpine' + volumes: + - '$$id-postgresql-data:/var/lib/postgresql/data' + environment: + - POSTGRES_USER=$$config_postgres_user + - POSTGRES_PASSWORD=$$secret_postgres_password + - POSTGRES_DB=$$config_postgres_db + variables: + - id: $$config_base_url + name: BASE_URL + label: Base URL + defaultValue: $$generate_fqdn + description: '' + - id: $$secret_database_url + name: DATABASE_URL + label: Database URL for PostgreSQL + defaultValue: >- + postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db + description: '' + - id: $$secret_jwt_secret + name: JWT_SECRET + label: JWT Secret + defaultValue: $$generate_passphrase + description: '' + - id: $$config_email_noreply + name: EMAIL_NOREPLY + label: No Reply Email Address + defaultValue: noreply@example.com + description: '' + - id: $$secret_email_mailgun_api + name: EMAIL_MAILGUN_API + label: Mailgun API Key + defaultValue: '' + description: '' + - id: $$config_email_mailgun_region + name: EMAIL_MAILGUN_REGION + label: Mailgun Region + defaultValue: EU + description: '' + - id: $$config_email_mailgun_domain + name: EMAIL_MAILGUN_DOMAIN + label: Mailgun Domain + defaultValue: '' + description: '' + - id: $$config_email_smtp_host + name: EMAIL_SMTP_HOST + label: SMTP Host + defaultValue: '' + description: '' + - id: $$config_email_smtp_port + name: EMAIL_SMTP_PORT + label: SMTP Port + defaultValue: '587' + description: '' + - id: $$config_email_smtp_user + name: EMAIL_SMTP_USER + label: SMTP User + defaultValue: '' + description: '' + - id: $$secret_email_smtp_password + name: EMAIL_SMTP_PASSWORD + label: SMTP Password + defaultValue: '' + description: '' + - id: $$config_email_smtp_enable_starttls + name: EMAIL_SMTP_ENABLE_STARTTLS + label: SMTP Enable StartTLS + defaultValue: 'false' + description: '' + - id: $$config_postgres_user + name: POSTGRES_USER + label: PostgreSQL User + defaultValue: $$generate_username + description: '' + - id: $$secret_postgres_password + name: POSTGRES_PASSWORD + label: PostgreSQL Password + defaultValue: $$generate_password + description: '' + - id: $$config_postgres_db + name: POSTGRES_DB + label: PostgreSQL Database + defaultValue: $$generate_username + description: '' +- templateVersion: 1.0.0 + defaultVersion: 0.198.1 + name: n8n.io + description: n8n is a free and open node based Workflow Automation Tool. + services: + $$id: + name: N8n + documentation: 'Taken from https://hub.docker.com/r/n8nio/n8n' + depends_on: [] + image: 'n8nio/n8n:$$core_version' + volumes: + - '$$id-data:/root/.n8n' + - '$$id-data-write:/files' + - '/var/run/docker.sock:/var/run/docker.sock' + environment: + - WEBHOOK_URL=$$config_webhook_url + ports: + - '5678' + variables: + - id: $$config_webhook_url + name: WEBHOOK_URL + label: Webhook URL + defaultValue: $$generate_fqdn + description: '' +- templateVersion: 1.0.0 + defaultVersion: stable + name: PlausibleAnalytics + description: Plausible is a lightweight and open-source website analytics tool. + services: + $$id: + name: Plausible Analytics + documentation: 'Taken from https://plausible.io/' + command: >- + sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db + migrate && /entrypoint.sh db init-admin && /entrypoint.sh run" + depends_on: + - $$id-postgresql + - $$id-clickhouse + image: 'plausible/analytics:$$core_version' + environment: + - ADMIN_USER_EMAIL=$$config_admin_user_email + - ADMIN_USER_NAME=$$config_admin_user_name + - ADMIN_USER_PWD=$$secret_admin_user_pwd + - BASE_URL=$$config_base_url + - SECRET_KEY_BASE=$$secret_secret_key_base + - DISABLE_AUTH=$$config_disable_auth + - DISABLE_REGISTRATION=$$config_disable_registration + - DATABASE_URL=$$secret_database_url + - CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url + ports: + - '8000' + $$id-postgresql: + name: PostgreSQL + documentation: 'Taken from https://plausible.io/' + image: 'bitnami/postgresql:13.2.0' + volumes: + - '$$id-postgresql-data:/bitnami/postgresql' + environment: + - POSTGRESQL_PASSWORD=$$secret_postgresql_password + - POSTGRESQL_USERNAME=$$config_postgresql_username + - POSTGRESQL_DATABASE=$$config_postgresql_database + $$id-clickhouse: + name: Clickhouse + documentation: 'Taken from https://plausible.io/' + volumes: + - '$$id-clickhouse-data:/var/lib/clickhouse' + image: 'yandex/clickhouse-server:21.3.2.5' + ulimits: + nofile: + soft: 262144 + hard: 262144 + extras: + files: + - source: $$workdir/clickhouse-config.xml + destination: /etc/clickhouse-server/users.d/logging.xml + content: >- + warningtrue + - source: $$workdir/clickhouse-user-config.xml + destination: /etc/clickhouse-server/config.d/logging.xml + content: >- + 00 + - source: $$workdir/init.query + destination: /docker-entrypoint-initdb.d/init.query + content: CREATE DATABASE IF NOT EXISTS plausible; + - source: $$workdir/init-db.sh + destination: /docker-entrypoint-initdb.d/init-db.sh + content: >- + clickhouse client --queries-file + /docker-entrypoint-initdb.d/init.query + variables: + - id: $$config_base_url + name: BASE_URL + label: Base URL + defaultValue: $$generate_fqdn + description: >- + You must set this to the FQDN of the Plausible Analytics instance. This + is used to generate the links to the Plausible Analytics instance. + - id: $$secret_database_url + name: DATABASE_URL + label: Database URL for PostgreSQL + defaultValue: >- + postgresql://$$config_postgresql_username:$$secret_postgresql_password@$$id-postgresql:5432/$$config_postgresql_database + description: '' + - id: $$secret_clickhouse_database_url + name: CLICKHOUSE_DATABASE_URL + label: Database URL for Clickhouse + defaultValue: 'http://$$id-clickhouse:8123/plausible' + description: '' + - id: $$config_admin_user_email + name: ADMIN_USER_EMAIL + label: Admin Email Address + defaultValue: admin@example.com + description: This is the admin email. Please change it. + - id: $$config_admin_user_name + name: ADMIN_USER_NAME + label: Admin User Name + defaultValue: $$generate_username + description: This is the admin username. Please change it. + - id: $$secret_admin_user_pwd + name: ADMIN_USER_PWD + label: Admin User Password + defaultValue: $$generate_password + description: This is the admin password. Please change it. + showOnUI: true + - id: $$secret_secret_key_base + name: SECRET_KEY_BASE + label: Secret Key Base + defaultValue: $$generate_passphrase + description: '' + - id: $$config_disable_auth + name: DISABLE_AUTH + label: Disable Authentication + defaultValue: 'false' + description: '' + - id: $$config_disable_registration + name: DISABLE_REGISTRATION + label: Disable Registration + defaultValue: 'true' + description: '' + - id: $$config_postgresql_username + name: POSTGRESQL_USERNAME + label: PostgreSQL Username + defaultValue: postgresql + description: '' + - id: $$secret_postgresql_password + name: POSTGRESQL_PASSWORD + label: PostgreSQL Password + defaultValue: $$generate_password + description: '' + - id: $$config_postgresql_database + name: POSTGRESQL_DATABASE + label: PostgreSQL Database + defaultValue: plausible + description: '' + - id: $$config_scriptName + name: SCRIPT_NAME + label: Custom Script Name + defaultValue: plausible.js + description: This is the default script name. diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index fb13a7868..054b7237e 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -17,6 +17,7 @@ import { verifyRemoteDockerEngineFn } from './routes/api/v1/destinations/handler import { checkContainer } from './lib/docker'; import { migrateServicesToNewTemplate } from './lib'; import { getTemplates } from './lib/services'; +import { refreshTemplates } from './routes/api/v1/handlers'; declare module 'fastify' { interface FastifyInstance { config: { @@ -129,22 +130,21 @@ const host = '0.0.0.0'; try { const { default: got } = await import('got') - let templates = {} try { - const response = await got.get('https://get.coollabs.io/coolify/service-templates.yaml').text() - templates = yaml.load(response) + if (isDev) { + const response = await fs.readFile('./devTemplates.yaml', 'utf8') + await fs.writeFile('./template.json', JSON.stringify(yaml.load(response), null, 2)) + } else { + const response = await got.get('https://get.coollabs.io/coolify/service-templates.yaml').text() + await fs.writeFile('/app/template.json', JSON.stringify(yaml.load(response), null, 2)) + } + } catch (error) { console.log("Couldn't get latest templates.") console.log(error) } - if (isDev) { - await fs.writeFile('./template.json', JSON.stringify(templates, null, 2)) - } else { - await fs.writeFile('/app/template.json', JSON.stringify(templates, null, 2)) - } - const templateJson = await getTemplates() - await migrateServicesToNewTemplate(templateJson) + await migrateServicesToNewTemplate() await fastify.listen({ port, host }) console.log(`Coolify's API is listening on ${host}:${port}`); @@ -169,10 +169,11 @@ const host = '0.0.0.0'; await cleanupStorage() }, 60000 * 10) - // checkProxies and checkFluentBit + // checkProxies, checkFluentBit & refresh templates setInterval(async () => { await checkProxies(); await checkFluentBit(); + await refreshTemplates() }, 10000) setInterval(async () => { diff --git a/apps/api/src/lib.ts b/apps/api/src/lib.ts index df77a81da..208e2a484 100644 --- a/apps/api/src/lib.ts +++ b/apps/api/src/lib.ts @@ -1,10 +1,12 @@ import cuid from "cuid"; import { decrypt, encrypt, generatePassword, getDomain, prisma } from "./lib/common"; +import { getTemplates } from "./lib/services"; import { includeServices } from "./lib/services/common"; -export async function migrateServicesToNewTemplate(templates: any) { +export async function migrateServicesToNewTemplate() { // This function migrates old hardcoded services to the new template based services try { + let templates = await getTemplates() const services: any = await prisma.service.findMany({ include: includeServices }) for (const service of services) { const { id } = service diff --git a/apps/api/src/lib/common.ts b/apps/api/src/lib/common.ts index 1bc1d13b3..e1de6c6f3 100644 --- a/apps/api/src/lib/common.ts +++ b/apps/api/src/lib/common.ts @@ -244,7 +244,11 @@ export async function isDNSValid(hostname: any, domain: string): Promise { } export function getDomain(domain: string): string { - return domain?.replace('https://', '').replace('http://', ''); + if (domain) { + return domain?.replace('https://', '').replace('http://', ''); + } else { + return ''; + } } export async function isDomainConfigured({ diff --git a/apps/api/src/lib/templates.ts b/apps/api/src/lib/templates.ts deleted file mode 100644 index 750092101..000000000 --- a/apps/api/src/lib/templates.ts +++ /dev/null @@ -1,1505 +0,0 @@ -export default [ - { - "templateVersion": "1.0.0", - "defaultVersion": "latest", - "name": "weblate", - "displayName": "Weblate", - "description": "", - "services": { - "$$id": { - "name": "Weblate", - "depends_on": [ - "$$id-postgresql", - "$$id-redis" - ], - "image": "weblate/weblate:$$core_version", - "volumes": [ - "$$id-data:/app/data", - ], - "environment": [ - `WEBLATE_SITE_DOMAIN=$$config_weblate_site_domain`, - `WEBLATE_ADMIN_PASSWORD=$$secret_weblate_admin_password`, - `POSTGRES_PASSWORD=$$secret_postgres_password`, - `POSTGRES_USER=$$config_postgres_user`, - `POSTGRES_DATABASE=$$config_postgres_db`, - `POSTGRES_HOST=$$id-postgresql`, - `POSTGRES_PORT=5432`, - `REDIS_HOST=$$id-redis`, - ], - "ports": [ - "8080" - ] - }, - "$$id-postgresql": { - "name": "PostgreSQL", - "depends_on": [], - "image": "postgres:14-alpine", - "volumes": [ - "$$id-postgresql-data:/var/lib/postgresql/data", - ], - "environment": [ - "POSTGRES_USER=$$config_postgres_user", - "POSTGRES_PASSWORD=$$secret_postgres_password", - "POSTGRES_DB=$$config_postgres_db", - ], - "ports": [] - }, - "$$id-redis": { - "name": "Redis", - "depends_on": [], - "image": "redis:7-alpine", - "volumes": [ - "$$id-redis-data:/data", - ], - "environment": [], - "ports": [], - } - }, - "variables": [ - { - "id": "$$config_weblate_site_domain", - "name": "WEBLATE_SITE_DOMAIN", - "label": "Weblate Domain", - "defaultValue": "$$generate_domain", - "description": "", - }, - { - "id": "$$secret_weblate_admin_password", - "name": "WEBLATE_ADMIN_PASSWORD", - "label": "Weblate Admin Password", - "defaultValue": "$$generate_password", - "description": "", - "extras": { - "isVisibleOnUI": true, - } - }, - { - "id": "$$config_postgres_user", - "name": "POSTGRES_USER", - "label": "PostgreSQL User", - "defaultValue": "$$generate_username", - "description": "", - }, - { - "id": "$$secret_postgres_password", - "name": "POSTGRES_PASSWORD", - "label": "PostgreSQL Password", - "defaultValue": "$$generate_password", - "description": "", - }, - { - "id": "$$config_postgres_db", - "name": "POSTGRES_DB", - "label": "PostgreSQL Database", - "defaultValue": "weblate", - "description": "", - }, - - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "2022.10.14-1a5b0965", - "name": "searxng", - "displayName": "SearXNG", - "description": "", - "services": { - "$$id": { - "name": "SearXNG", - "depends_on": [ - "$$id-redis" - ], - "image": "searxng/searxng:$$core_version", - "volumes": [ - "$$id-searxng:/etc/searxng", - ], - "environment": [ - "SEARXNG_BASE_URL=$$config_searxng_base_url", - ], - "ports": [ - "8080" - ], - "cap_drop": ['ALL'], - "cap_add": ['CHOWN', 'SETGID', 'SETUID', 'DAC_OVERRIDE'], - "extras": { - "files": [ - { - source: "$$workdir/settings.yml", - destination: "/etc/searxng/settings.yml", - content: ` - # see https://docs.searxng.org/admin/engines/settings.html#use-default-settings - use_default_settings: true - server: - secret_key: $$secret_secret_key - limiter: true - image_proxy: true - ui: - static_use_hash: true - redis: - url: redis://:$$secret_redis_password@$$id-redis:6379/0` - } - ] - } - }, - "$$id-redis": { - "name": "Redis", - "command": `redis-server --requirepass $$secret_redis_password --save "" --appendonly "no"`, - "depends_on": [], - "image": "redis:7-alpine", - "volumes": [ - "$$id-redis-data:/data", - ], - "environment": [ - "REDIS_PASSWORD=$$secret_redis_password", - ], - "ports": [], - "cap_drop": ['ALL'], - "cap_add": ['SETGID', 'SETUID', 'DAC_OVERRIDE'], - } - }, - "variables": [ - { - "id": "$$config_searxng_base_url", - "name": "SEARXNG_BASE_URL", - "label": "SearXNG Base URL", - "defaultValue": "$$generate_fqdn", - "description": "", - }, - { - "id": "$$secret_secret_key", - "name": "SECRET_KEY", - "label": "Secret Key", - "defaultValue": "$$generate_passphrase", - "description": "", - }, - { - "id": "$$secret_redis_password", - "name": "REDIS_PASSWORD", - "label": "Redis Password", - "defaultValue": "$$generate_password", - "description": "", - } - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "v2.0.6", - "name": "glitchtip", - "displayName": "GlitchTip", - "description": "", - "services": { - "$$id": { - "name": "GlitchTip", - "depends_on": [ - "$$id-postgresql", - "$$id-redis" - ], - "image": "glitchtip/glitchtip:$$core_version", - "volumes": [], - "environment": [ - "PORT=3000", - "GLITCHTIP_DOMAIN=$$config_glitchtip_domain", - "SECRET_KEY=$$secret_secret_key", - "DATABASE_URL=$$secret_database_url", - "REDIS_URL=$$secret_redis_url", - "DEFAULT_FROM_EMAIL=$$config_default_from_email", - "EMAIL_HOST=$$config_email_host", - "EMAIL_PORT=$$config_email_port", - "EMAIL_HOST_USER=$$config_email_host_user", - "EMAIL_HOST_PASSWORD=$$secret_email_host_password", - "EMAIL_USE_TLS=$$config_email_use_tls", - "EMAIL_USE_SSL=$$config_email_use_ssl", - "EMAIL_BACKEND=$$config_email_backend", - "MAILGUN_API_KEY=$$secret_mailgun_api_key", - "SENDGRID_API_KEY=$$secret_sendgrid_api_key", - "ENABLE_OPEN_USER_REGISTRATION=$$config_enable_open_user_registration", - "DJANGO_SUPERUSER_EMAIL=$$config_django_superuser_email", - "DJANGO_SUPERUSER_PASSWORD=$$secret_django_superuser_password", - "DJANGO_SUPERUSER_USERNAME=$$config_django_superuser_username", - ], - "ports": [ - "8000" - ] - }, - "$$id-postgresql": { - "name": "PostgreSQL", - "depends_on": [], - "image": "postgres:12-alpine", - "volumes": [ - "$$id-postgresql-data:/var/lib/postgresql/data", - ], - "environment": [ - "POSTGRES_USER=$$config_postgres_user", - "POSTGRES_PASSWORD=$$secret_postgres_password", - "POSTGRES_DB=$$config_postgres_db", - ], - "ports": [] - }, - "$$id-redis": { - "name": "Redis", - "depends_on": [], - "image": "redis:7-alpine", - "volumes": [ - "$$id-postgresql-redis-data:/data", - ], - "environment": [], - "ports": [] - } - }, - "variables": [ - { - "id": "$$config_glitchtip_domain", - "name": "GLITCHTIP_DOMAIN", - "label": "GlitchTip Domain", - "defaultValue": "$$generate_fqdn", - "description": "", - }, - { - "id": "$$secret_database_url", - "name": "DATABASE_URL", - "label": "Database URL for PostgreSQL", - "defaultValue": "postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db", - "description": "", - }, - { - "id": "$$secret_redis_url", - "name": "REDIS_URL", - "label": "Redis URL", - "defaultValue": "redis://$$id-redis:6379/0", - "description": "", - }, - { - "id": "$$config_default_from_email", - "name": "DEFAULT_FROM_EMAIL", - "label": "Default Email Address", - "defaultValue": "noreply@example.com", - "description": "", - }, - { - "id": "$$config_email_host", - "name": "EMAIL_HOST", - "label": "Email SMTP Host", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_email_port", - "name": "EMAIL_PORT", - "label": "Email SMTP Port", - "defaultValue": "25", - "description": "", - }, - { - "id": "$$config_email_host_user", - "name": "EMAIL_HOST_USER", - "label": "Email SMTP User", - "defaultValue": "", - "description": "", - }, - { - "id": "$$secret_email_host_password", - "name": "EMAIL_HOST_PASSWORD", - "label": "Email SMTP Password", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_email_use_tls", - "name": "EMAIL_USE_TLS", - "label": "Email Use TLS", - "defaultValue": "false", - "description": "", - }, - { - "id": "$$config_email_use_ssl", - "name": "EMAIL_USE_SSL", - "label": "Email Use SSL", - "defaultValue": "false", - "description": "", - }, - { - "id": "$$secret_email_smtp_password", - "name": "EMAIL_SMTP_PASSWORD", - "label": "SMTP Password", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_email_backend", - "name": "EMAIL_BACKEND", - "label": "Email Backend", - "defaultValue": "", - "description": "", - }, - { - "id": "$$secret_mailgun_api_key", - "name": "MAILGUN_API_KEY", - "label": "Mailgun API Key", - "defaultValue": "", - "description": "", - }, - { - "id": "$$secret_sendgrid_api_key", - "name": "SENDGRID_API_KEY", - "label": "Sendgrid API Key", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_enable_open_user_registration", - "name": "ENABLE_OPEN_USER_REGISTRATION", - "label": "Enable Open User Registration", - "defaultValue": "true", - "description": "", - }, - { - "id": "$$config_django_superuser_email", - "name": "DJANGO_SUPERUSER_EMAIL", - "label": "Django Superuser Email", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_django_superuser_username", - "name": "DJANGO_SUPERUSER_USERNAME", - "label": "Django Superuser Username", - "defaultValue": "", - "description": "", - }, - { - "id": "$$secret_django_superuser_password", - "name": "DJANGO_SUPERUSER_PASSWORD", - "label": "Django Superuser Password", - "defaultValue": "$$generate_password", - "description": "", - }, - { - "id": "$$config_postgres_user", - "name": "POSTGRES_USER", - "label": "PostgreSQL User", - "defaultValue": "$$generate_username", - "description": "", - }, - { - "id": "$$secret_postgres_password", - "name": "POSTGRES_PASSWORD", - "label": "PostgreSQL Password", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_postgres_db", - "name": "POSTGRES_DB", - "label": "PostgreSQL Database", - "defaultValue": "hasura", - "description": "", - }, - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "v2.13.0", - "name": "hasura", - "displayName": "Hasura", - "description": "Instant realtime GraphQL APIs on any Postgres application, existing or new.", - "services": { - "$$id": { - "name": "Hasura", - "depends_on": [ - "$$id-postgresql" - ], - "image": "hasura/graphql-engine:$$core_version", - "volumes": [], - "environment": [ - "HASURA_GRAPHQL_ENABLE_CONSOLE=$$config_hasura_graphql_enable_console", - "HASURA_GRAPHQL_METADATA_DATABASE_URL=$$secret_hasura_graphql_metadata_database_url", - "HASURA_GRAPHQL_ADMIN_PASSWORD=$$secret_hasura_graphql_admin_password", - ], - "ports": [ - "8080" - ] - }, - "$$id-postgresql": { - "name": "PostgreSQL", - "depends_on": [], - "image": "postgres:12-alpine", - "volumes": [ - "$$id-postgresql-data:/var/lib/postgresql/data", - ], - "environment": [ - "POSTGRES_USER=$$config_postgres_user", - "POSTGRES_PASSWORD=$$secret_postgres_password", - "POSTGRES_DB=$$config_postgres_db", - ], - "ports": [] - } - }, - "variables": [ - { - "id": "$$config_hasura_graphql_enable_console", - "name": "HASURA_GRAPHQL_ENABLE_CONSOLE", - "label": "Enable Hasura Console", - "defaultValue": "true", - "description": "", - }, - { - "id": "$$secret_hasura_graphql_metadata_database_url", - "name": "HASURA_GRAPHQL_METADATA_DATABASE_URL", - "label": "Hasura Metadata Database URL", - "defaultValue": "postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db", - "description": "" - }, - { - "id": "$$secret_hasura_graphql_admin_password", - "name": "HASURA_GRAPHQL_ADMIN_PASSWORD", - "label": "Hasura Admin Password", - "defaultValue": "$$generate_password", - "description": "", - "extras": { - "isVisibleOnUI": true, - } - }, - { - "id": "$$config_postgres_user", - "name": "POSTGRES_USER", - "label": "PostgreSQL User", - "defaultValue": "$$generate_username", - "description": "", - }, - { - "id": "$$secret_postgres_password", - "name": "POSTGRES_PASSWORD", - "label": "PostgreSQL Password", - "defaultValue": "$$generate_password", - "description": "", - }, - { - "id": "$$config_postgres_db", - "name": "POSTGRES_DB", - "label": "PostgreSQL Database", - "defaultValue": "hasura", - "description": "", - }, - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "postgresql-v1.38.0", - "name": "umami", - "displayName": "Umami", - "description": "Umami is a simple, easy to use, self-hosted web analytics solution. The goal is to provide you with a friendly privacy-focused alternative to Google Analytics.", - "services": { - "$$id": { - "name": "Umami", - "documentation": "Official docs are [here](https://umami.is/docs/getting-started)", - "depends_on": [ - "$$id-postgresql" - ], - "image": "ghcr.io/umami-software/umami:$$core_version", - "volumes": [], - "environment": [ - "ADMIN_PASSWORD=$$secret_admin_password", - "DATABASE_URL=$$secret_database_url", - "DATABASE_TYPE=postgresql", - "HASH_SALT=$$secret_hash_salt", - ], - "ports": [ - "3000" - ] - }, - "$$id-postgresql": { - "name": "PostgreSQL", - "documentation": "Official docs are [here](https://umami.is/docs/getting-started)", - "depends_on": [], - "image": "postgres:12-alpine", - "volumes": [ - "$$id-postgresql-data:/var/lib/postgresql/data", - ], - "environment": [ - "POSTGRES_USER=$$config_postgres_user", - "POSTGRES_PASSWORD=$$secret_postgres_password", - "POSTGRES_DB=$$config_postgres_db", - ], - "ports": [], - "extras": { - "files": [ - { - source: "$$workdir/schema.postgresql.sql", - destination: "/docker-entrypoint-initdb.d/schema.postgresql.sql", - content: ` - -- CreateTable - CREATE TABLE "account" ( - "user_id" SERIAL NOT NULL, - "username" VARCHAR(255) NOT NULL, - "password" VARCHAR(60) NOT NULL, - "is_admin" BOOLEAN NOT NULL DEFAULT false, - "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - "updated_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - - PRIMARY KEY ("user_id") - ); - - -- CreateTable - CREATE TABLE "event" ( - "event_id" SERIAL NOT NULL, - "website_id" INTEGER NOT NULL, - "session_id" INTEGER NOT NULL, - "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - "url" VARCHAR(500) NOT NULL, - "event_type" VARCHAR(50) NOT NULL, - "event_value" VARCHAR(50) NOT NULL, - - PRIMARY KEY ("event_id") - ); - - -- CreateTable - CREATE TABLE "pageview" ( - "view_id" SERIAL NOT NULL, - "website_id" INTEGER NOT NULL, - "session_id" INTEGER NOT NULL, - "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - "url" VARCHAR(500) NOT NULL, - "referrer" VARCHAR(500), - - PRIMARY KEY ("view_id") - ); - - -- CreateTable - CREATE TABLE "session" ( - "session_id" SERIAL NOT NULL, - "session_uuid" UUID NOT NULL, - "website_id" INTEGER NOT NULL, - "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - "hostname" VARCHAR(100), - "browser" VARCHAR(20), - "os" VARCHAR(20), - "device" VARCHAR(20), - "screen" VARCHAR(11), - "language" VARCHAR(35), - "country" CHAR(2), - - PRIMARY KEY ("session_id") - ); - - -- CreateTable - CREATE TABLE "website" ( - "website_id" SERIAL NOT NULL, - "website_uuid" UUID NOT NULL, - "user_id" INTEGER NOT NULL, - "name" VARCHAR(100) NOT NULL, - "domain" VARCHAR(500), - "share_id" VARCHAR(64), - "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, - - PRIMARY KEY ("website_id") - ); - - -- CreateIndex - CREATE UNIQUE INDEX "account.username_unique" ON "account"("username"); - - -- CreateIndex - CREATE INDEX "event_created_at_idx" ON "event"("created_at"); - - -- CreateIndex - CREATE INDEX "event_session_id_idx" ON "event"("session_id"); - - -- CreateIndex - CREATE INDEX "event_website_id_idx" ON "event"("website_id"); - - -- CreateIndex - CREATE INDEX "pageview_created_at_idx" ON "pageview"("created_at"); - - -- CreateIndex - CREATE INDEX "pageview_session_id_idx" ON "pageview"("session_id"); - - -- CreateIndex - CREATE INDEX "pageview_website_id_created_at_idx" ON "pageview"("website_id", "created_at"); - - -- CreateIndex - CREATE INDEX "pageview_website_id_idx" ON "pageview"("website_id"); - - -- CreateIndex - CREATE INDEX "pageview_website_id_session_id_created_at_idx" ON "pageview"("website_id", "session_id", "created_at"); - - -- CreateIndex - CREATE UNIQUE INDEX "session.session_uuid_unique" ON "session"("session_uuid"); - - -- CreateIndex - CREATE INDEX "session_created_at_idx" ON "session"("created_at"); - - -- CreateIndex - CREATE INDEX "session_website_id_idx" ON "session"("website_id"); - - -- CreateIndex - CREATE UNIQUE INDEX "website.website_uuid_unique" ON "website"("website_uuid"); - - -- CreateIndex - CREATE UNIQUE INDEX "website.share_id_unique" ON "website"("share_id"); - - -- CreateIndex - CREATE INDEX "website_user_id_idx" ON "website"("user_id"); - - -- AddForeignKey - ALTER TABLE "event" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE; - - -- AddForeignKey - ALTER TABLE "event" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; - - -- AddForeignKey - ALTER TABLE "pageview" ADD FOREIGN KEY ("session_id") REFERENCES "session"("session_id") ON DELETE CASCADE ON UPDATE CASCADE; - - -- AddForeignKey - ALTER TABLE "pageview" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; - - -- AddForeignKey - ALTER TABLE "session" ADD FOREIGN KEY ("website_id") REFERENCES "website"("website_id") ON DELETE CASCADE ON UPDATE CASCADE; - - -- AddForeignKey - ALTER TABLE "website" ADD FOREIGN KEY ("user_id") REFERENCES "account"("user_id") ON DELETE CASCADE ON UPDATE CASCADE; - - insert into account (username, password, is_admin) values ('admin', '$$hashed$$secret_admin_password', true);` - }, - ] - } - } - }, - "variables": [ - { - "id": "$$secret_database_url", - "name": "DATABASE_URL", - "label": "Database URL for PostgreSQL", - "defaultValue": "postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db", - "description": "", - }, - { - "id": "$$secret_hash_salt", - "name": "HASH_SALT", - "label": "Hash Salt", - "defaultValue": "$$generate_passphrase", - "description": "", - }, - { - "id": "$$config_postgres_user", - "name": "POSTGRES_USER", - "label": "PostgreSQL User", - "defaultValue": "$$generate_username", - "description": "", - }, - { - "id": "$$secret_postgres_password", - "name": "POSTGRES_PASSWORD", - "label": "PostgreSQL Password", - "defaultValue": "$$generate_password", - "description": "", - }, - { - "id": "$$config_postgres_db", - "name": "POSTGRES_DB", - "label": "PostgreSQL Database", - "defaultValue": "umami", - "description": "", - }, - { - "id": "$$secret_admin_password", - "name": "ADMIN_PASSWORD", - "label": "Initial Admin Password", - "defaultValue": "$$generate_password", - "description": "", - "extras": { - "isVisibleOnUI": true, - } - }, - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "v0.29.1", - "name": "meilisearch", - "displayName": "MeiliSearch", - "description": "MeiliSearch is a lightning Fast, Ultra Relevant, and Typo-Tolerant Search Engine", - "services": { - "$$id": { - "name": "MeiliSearch", - "documentation": "https://docs.meilisearch.com/", - "depends_on": [], - "image": "getmeili/meilisearch:$$core_version", - "volumes": [ - "$$id-datams:/meili_data/data.ms", - "$$id-data:/meili_data", - "$$id-snapshot:/snapshot", - "$$id-dump:/dumps" - ], - "environment": [ - "MEILI_MASTER_KEY=$$secret_meili_master_key", - ], - "ports": [ - "7700" - ] - } - }, - "variables": [ - { - "id": "$$secret_meili_master_key", - "name": "MEILI_MASTER_KEY", - "label": "Master Key", - "defaultValue": "$$generate_passphrase", - "description": "", - "extras": { - "isVisibleOnUI": true, - } - } - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "latest", - "name": "ghost", - "displayName": "Ghost", - "description": "Ghost is a free and open source blogging platform written in JavaScript and distributed under the MIT License", - "services": { - "$$id": { - "name": "Ghost", - "documentation": "Taken from https://docs.ghost.org/", - "depends_on": [ - "$$id-mariadb" - ], - "image": "bitnami/ghost:$$core_version", - "volumes": [ - "$$id-ghost:/bitnami/ghost", - ], - "environment": [ - "url=$$config_url", - "GHOST_HOST=$$config_ghost_host", - "GHOST_ENABLE_HTTPS=$$config_ghost_enable_https", - "GHOST_EMAIL=$$config_ghost_email", - "GHOST_PASSWORD=$$secret_ghost_password", - "GHOST_DATABASE_HOST=$$config_ghost_database_host", - "GHOST_DATABASE_USER=$$config_mariadb_user", - "GHOST_DATABASE_PASSWORD=$$secret_ghost_database_password", - "GHOST_DATABASE_NAME=$$config_mariadb_database", - "GHOST_DATABASE_PORT_NUMBER=3306", - - ], - "ports": [ - "2368" - ] - }, - "$$id-mariadb": { - "name": "MariaDB", - "depends_on": [], - "image": "bitnami/mariadb:latest", - "volumes": [ - "$$id-mariadb:/bitnami/mariadb", - ], - "environment": [ - "MARIADB_USER=$$config_mariadb_user", - "MARIADB_PASSWORD=$$secret_mariadb_password", - "MARIADB_DATABASE=$$config_mariadb_database", - "MARIADB_ROOT_USER=$$config_mariadb_root_user", - "MARIADB_ROOT_PASSWORD=$$secret_mariadb_root_password" - ], - "ports": [] - } - }, - "variables": [ - { - "id": "$$config_url", - "name": "url", - "label": "URL", - "defaultValue": "$$generate_fqdn", - "description": "" - }, - { - "id": "$$config_ghost_host", - "name": "GHOST_HOST", - "label": "Ghost Host", - "defaultValue": "", - "description": "" - }, - { - "id": "$$config_ghost_enable_https", - "name": "GHOST_ENABLE_HTTPS", - "label": "Ghost Enable HTTPS", - "defaultValue": "no", - "description": "" - }, - { - "id": "$$config_ghost_email", - "name": "GHOST_EMAIL", - "label": "Ghost Default Email", - "defaultValue": "admin@example.com", - "description": "" - }, - { - "id": "$$secret_ghost_password", - "name": "GHOST_PASSWORD", - "label": "Ghost Default Password", - "defaultValue": "$$generate_password", - "description": "" - }, - { - "id": "$$config_ghost_database_host", - "name": "GHOST_DATABASE_HOST", - "label": "Ghost Database Host", - "defaultValue": "$$id-mariadb", - "description": "" - }, - { - "id": "$$config_ghost_database_user", - "name": "GHOST_DATABASE_USER", - "label": "MariaDB User", - "defaultValue": "$$config_mariadb_user", - "description": "" - }, - { - "id": "$$secret_ghost_database_password", - "name": "GHOST_DATABASE_PASSWORD", - "label": "MariaDB Password", - "defaultValue": "$$secret_mariadb_password", - "description": "" - }, - { - "id": "$$config_ghost_database_name", - "name": "GHOST_DATABASE_NAME", - "label": "MariaDB Database", - "defaultValue": "$$config_mariadb_database", - "description": "" - }, - { - "id": "$$config_mariadb_user", - "name": "MARIADB_USER", - "label": "MariaDB User", - "defaultValue": "$$generate_username", - "description": "" - }, - { - "id": "$$secret_mariadb_password", - "name": "MARIADB_PASSWORD", - "label": "MariaDB Password", - "defaultValue": "$$generate_password", - "description": "" - }, - { - "id": "$$config_mariadb_database", - "name": "MARIADB_DATABASE", - "label": "MariaDB Database", - "defaultValue": "ghost", - "description": "" - }, - { - "id": "$$config_mariadb_root_user", - "name": "MARIADB_ROOT_USER", - "label": "MariaDB Root User", - "defaultValue": "$$generate_username", - "description": "" - }, - { - "id": "$$secret_mariadb_root_password", - "name": "MARIADB_ROOT_PASSWORD", - "label": "MariaDB Root Password", - "defaultValue": "$$generate_password", - "description": "" - }, - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "php8.1", - "name": "wordpress", - "displayName": "WordPress", - "description": "WordPress is a content management system based on PHP.", - "services": { - "$$id": { - "name": "WordPress", - "documentation": " Taken from https://docs.docker.com/compose/wordpress/", - "depends_on": [ - "$$id-mysql" - ], - "image": "wordpress:$$core_version", - "volumes": [ - "$$id-wordpress-data:/var/www/html", - ], - "environment": [ - "WORDPRESS_DB_HOST=$$config_wordpress_db_host", - "WORDPRESS_DB_USER=$$config_mysql_user", - "WORDPRESS_DB_PASSWORD=$$secret_mysql_password", - "WORDPRESS_DB_NAME=$$config_mysql_database", - "WORDPRESS_CONFIG_EXTRA=$$config_wordpress_config_extra" - ], - "ports": [ - "80" - ] - }, - "$$id-mysql": { - "name": "MySQL", - "depends_on": [], - "image": "mysql:5.7", - "volumes": [ - "$$id-mysql-data:/var/lib/mysql", - ], - "environment": [ - "MYSQL_ROOT_PASSWORD=$$secret_mysql_root_password", - "MYSQL_ROOT_USER=$$config_mysql_root_user", - "MYSQL_DATABASE=$$config_mysql_database", - "MYSQL_USER=$$config_mysql_user", - "MYSQL_PASSWORD=$$secret_mysql_password", - ], - "ports": [] - } - }, - "variables": [ - { - "id": "$$config_wordpress_db_host", - "name": "WORDPRESS_DB_HOST", - "label": "WordPress DB Host", - "defaultValue": "$$id-mysql", - "description": "" - }, - { - "id": "$$config_wordpress_db_user", - "name": "WORDPRESS_DB_USER", - "label": "WordPress DB User", - "defaultValue": "$$config_mysql_user", - "description": "" - }, - { - "id": "$$secret_wordpress_db_password", - "name": "WORDPRESS_DB_PASSWORD", - "label": "WordPress DB Password", - "defaultValue": "$$secret_mysql_password", - "description": "" - }, - { - "id": "$$config_wordpress_db_name", - "name": "WORDPRESS_DB_NAME", - "label": "WordPress DB Name", - "defaultValue": "$$config_mysql_database", - "description": "" - }, - { - "id": "$$config_wordpress_config_extra", - "name": "WORDPRESS_CONFIG_EXTRA", - "label": "WordPress Config Extra", - "defaultValue": "", - "description": "" - }, - { - "id": "$$secret_mysql_root_password", - "name": "MYSQL_ROOT_PASSWORD", - "label": "MySQL Root Password", - "defaultValue": "$$generate_password", - "description": "" - }, - { - "id": "$$config_mysql_root_user", - "name": "MYSQL_ROOT_USER", - "label": "MySQL Root User", - "defaultValue": "$$generate_username", - "description": "" - }, - { - "id": "$$config_mysql_database", - "name": "MYSQL_DATABASE", - "label": "MySQL Database", - "defaultValue": "wordpress", - "description": "" - }, - { - "id": "$$config_mysql_user", - "name": "MYSQL_USER", - "label": "MySQL User", - "defaultValue": "$$generate_username", - "description": "" - }, - { - "id": "$$secret_mysql_password", - "name": "MYSQL_PASSWORD", - "label": "MySQL Password", - "defaultValue": "$$generate_password", - "description": "" - } - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "4.7.1", - "name": "vscodeserver", - "displayName": "VSCode Server", - "description": "vscode-server by Coder is VS Code running on a remote server, accessible through the browser.", - "services": { - "$$id": { - "name": "VSCode Server", - "documentation": "Taken from https://github.com/coder/code-server/. ", - "depends_on": [], - "image": "codercom/code-server:$$core_version", - "volumes": [ - "$$id-config-data:/home/coder/.local/share/code-server", - "$$id-vscodeserver-data:/home/coder", - "$$id-keys-directory:/root/.ssh", - "$$id-theme-and-plugin-directory:/root/.local/share/code-server" - - ], - "environment": [ - "PASSWORD=$$secret_password", - ], - "ports": [ - "8080" - ] - } - }, - "variables": [ - { - "id": "$$secret_password", - "name": "PASSWORD", - "label": "Password", - "defaultValue": "$$generate_password", - "description": "", - "extras": { - "isVisibleOnUI": true, - } - } - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "RELEASE.2022-10-15T19-57-03Z", - "name": "minio", - "displayName": "MinIO", - "description": " MinIO is a cloud storage server compatible with Amazon S3", - "services": { - "$$id": { - "name": "MinIO", - "command": "server /data --console-address :9001", - "documentation": "Taken from https://docs.min.io/docs/minio-docker-quickstart-guide.html", - "depends_on": [], - "image": "minio/minio:$$core_version", - "volumes": [ - "$$id-data-write:/files", - ], - "environment": [ - "MINIO_SERVER_URL=$$config_minio_server_url", - "MINIO_BROWSER_REDIRECT_URL=$$config_minio_browser_redirect_url", - "MINIO_DOMAIN=$$config_minio_domain", - "MINIO_ROOT_USER=$$config_minio_root_user", - "MINIO_ROOT_PASSWORD=$$secret_minio_root_user_password" - ], - "ports": [ - "9001", - "9000" - ] - } - }, - "variables": [ - { - "id": "$$config_server_url", - "name": "MINIO_SERVER_URL", - "label": "Server/Console URL", - "defaultValue": "", - "description": "", - "extras": { - "required": true - } - }, - { - "id": "$$config_browser_redirect_url", - "name": "MINIO_BROWSER_REDIRECT_URL", - "label": "Browser Redirect URL", - "defaultValue": "$$generate_fqdn", - "description": "", - }, - { - "id": "$$config_minio_domain", - "name": "MINIO_DOMAIN", - "label": "Domain", - "defaultValue": "$$generate_domain", - "description": "", - }, - { - "id": "$$config_minio_root_user", - "name": "MINIO_ROOT_USER", - "label": "Root User", - "defaultValue": "$$generate_username", - "description": "", - }, - { - "id": "$$secret_minio_root_user_password", - "name": "MINIO_ROOT_PASSWORD", - "label": "Root User Password", - "defaultValue": "$$generate_password", - "description": "", - } - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "0.21.1", - "name": "fider", - "displayName": "Fider", - "description": "Fider is a platform to collect and organize customer feedback.", - "services": { - "$$id": { - "name": "Fider", - "image": "getfider/fider:$$core_version", - "documentation": "Taken from https://hub.docker.com/r/getfider/fider/", - "depends_on": [ - '$$id-postgresql' - ], - "environment": [ - "BASE_URL=$$config_base_url", - "JWT_SECRET=$$secret_jwt_secret", - "EMAIL_NOREPLY=$$config_email_noreply", - "EMAIL_MAILGUN_API=$$secret_email_mailgun_api", - "EMAIL_MAILGUN_REGION=$$config_email_mailgun_region", - "EMAIL_MAILGUN_DOMAIN=$$config_email_mailgun_domain", - "EMAIL_SMTP_HOST=$$config_email_smtp_host", - "EMAIL_SMTP_PORT=$$config_email_smtp_port", - "EMAIL_SMTP_USER=$$config_email_smtp_user", - "EMAIL_SMTP_PASSWORD=$$secret_email_smtp_password", - "EMAIL_SMTP_ENABLE_STARTTLS=$$config_email_smtp_enable_starttls", - ], - "ports": [ - "3000" - ] - }, - "$$id-postgresql": { - "name": "PostgreSQL", - "documentation": "Taken from https://hub.docker.com/r/getfider/fider/", - "depends_on": [], - "image": "postgres:12-alpine", - "volumes": [ - "$$id-postgresql-data:/var/lib/postgresql/data" - ], - "environment": [ - "POSTGRES_USER=$$config_postgres_user", - "POSTGRES_PASSWORD=$$secret_postgres_password", - "POSTGRES_DB=$$config_postgres_db", - ] - } - }, - "variables": [ - { - "id": "$$config_base_url", - "name": "BASE_URL", - "label": "Base URL", - "defaultValue": "$$generate_fqdn", - "description": "", - }, - { - "id": "$$secret_database_url", - "name": "DATABASE_URL", - "label": "Database URL for PostgreSQL", - "defaultValue": "postgresql://$$config_postgres_user:$$secret_postgres_password@$$id-postgresql:5432/$$config_postgres_db", - "description": "", - }, - { - "id": "$$secret_jwt_secret", - "name": "JWT_SECRET", - "label": "JWT Secret", - "defaultValue": "$$generate_passphrase", - "description": "", - }, - { - "id": "$$config_email_noreply", - "name": "EMAIL_NOREPLY", - "label": "No Reply Email Address", - "defaultValue": "noreply@example.com", - "description": "", - }, - { - "id": "$$secret_email_mailgun_api", - "name": "EMAIL_MAILGUN_API", - "label": "Mailgun API Key", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_email_mailgun_region", - "name": "EMAIL_MAILGUN_REGION", - "label": "Mailgun Region", - "defaultValue": "EU", - "description": "", - }, - { - "id": "$$config_email_mailgun_domain", - "name": "EMAIL_MAILGUN_DOMAIN", - "label": "Mailgun Domain", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_email_smtp_host", - "name": "EMAIL_SMTP_HOST", - "label": "SMTP Host", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_email_smtp_port", - "name": "EMAIL_SMTP_PORT", - "label": "SMTP Port", - "defaultValue": "587", - "description": "", - }, - { - "id": "$$config_email_smtp_user", - "name": "EMAIL_SMTP_USER", - "label": "SMTP User", - "defaultValue": "", - "description": "", - }, - { - "id": "$$secret_email_smtp_password", - "name": "EMAIL_SMTP_PASSWORD", - "label": "SMTP Password", - "defaultValue": "", - "description": "", - }, - { - "id": "$$config_email_smtp_enable_starttls", - "name": "EMAIL_SMTP_ENABLE_STARTTLS", - "label": "SMTP Enable StartTLS", - "defaultValue": "false", - "description": "", - }, - { - "id": "$$config_postgres_user", - "name": "POSTGRES_USER", - "label": "PostgreSQL User", - "defaultValue": "$$generate_username", - "description": "", - }, - { - "id": "$$secret_postgres_password", - "name": "POSTGRES_PASSWORD", - "label": "PostgreSQL Password", - "defaultValue": "$$generate_password", - "description": "", - }, - { - "id": "$$config_postgres_db", - "name": "POSTGRES_DB", - "label": "PostgreSQL Database", - "defaultValue": "$$generate_username", - "description": "", - }, - ] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "0.198.1", - "name": "n8n", - "displayName": "n8n.io", - "description": "n8n is a free and open node based Workflow Automation Tool.", - "services": { - "$$id": { - "name": "N8n", - "documentation": "Taken from https://hub.docker.com/r/n8nio/n8n", - "depends_on": [], - "image": "n8nio/n8n:$$core_version", - "volumes": [ - "$$id-data:/root/.n8n", - "$$id-data-write:/files", - "/var/run/docker.sock:/var/run/docker.sock" - ], - "environment": [ - "WEBHOOK_URL=$$config_webhook_url" - ], - "ports": [ - "5678" - ] - } - }, - "variables": [ - { - "id": "$$config_webhook_url", - "name": "WEBHOOK_URL", - "label": "Webhook URL", - "defaultValue": "$$generate_fqdn", - "description": "", - }] - }, - { - "templateVersion": "1.0.0", - "defaultVersion": "stable", - "name": "plausibleanalytics", - "displayName": "PlausibleAnalytics", - "description": "Plausible is a lightweight and open-source website analytics tool.", - "services": { - "$$id": { - "name": "Plausible Analytics", - "documentation": "Taken from https://plausible.io/", - "command": 'sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh db init-admin && /entrypoint.sh run"', - "depends_on": [ - "$$id-postgresql", - "$$id-clickhouse" - ], - "image": "plausible/analytics:$$core_version", - "environment": [ - "ADMIN_USER_EMAIL=$$config_admin_user_email", - "ADMIN_USER_NAME=$$config_admin_user_name", - "ADMIN_USER_PWD=$$secret_admin_user_pwd", - "BASE_URL=$$config_base_url", - "SECRET_KEY_BASE=$$secret_secret_key_base", - "DISABLE_AUTH=$$config_disable_auth", - "DISABLE_REGISTRATION=$$config_disable_registration", - "DATABASE_URL=$$secret_database_url", - "CLICKHOUSE_DATABASE_URL=$$secret_clickhouse_database_url", - ], - "ports": [ - "8000" - ], - }, - "$$id-postgresql": { - "name": "PostgreSQL", - "documentation": "Taken from https://plausible.io/", - "image": "bitnami/postgresql:13.2.0", - "volumes": [ - '$$id-postgresql-data:/bitnami/postgresql', - ], - "environment": [ - "POSTGRESQL_PASSWORD=$$secret_postgresql_password", - "POSTGRESQL_USERNAME=$$config_postgresql_username", - "POSTGRESQL_DATABASE=$$config_postgresql_database", - ], - - }, - "$$id-clickhouse": { - "name": "Clickhouse", - "documentation": "Taken from https://plausible.io/", - "volumes": [ - '$$id-clickhouse-data:/var/lib/clickhouse', - ], - "image": "yandex/clickhouse-server:21.3.2.5", - "ulimits": { - "nofile": { - "soft": 262144, - "hard": 262144 - } - }, - "extras": { - "files": [ - { - source: "$$workdir/clickhouse-config.xml", - destination: '/etc/clickhouse-server/users.d/logging.xml', - content: 'warningtrue' - }, - { - source: "$$workdir/clickhouse-user-config.xml", - destination: '/etc/clickhouse-server/config.d/logging.xml', - content: '00' - }, - { - source: "$$workdir/init.query", - destination: '/docker-entrypoint-initdb.d/init.query', - content: 'CREATE DATABASE IF NOT EXISTS plausible;' - }, - { - source: "$$workdir/init-db.sh", - destination: '/docker-entrypoint-initdb.d/init-db.sh', - content: 'clickhouse client --queries-file /docker-entrypoint-initdb.d/init.query' - } - ] - } - }, - - }, - "variables": [ - { - "id": "$$config_base_url", - "name": "BASE_URL", - "label": "Base URL", - "defaultValue": "$$generate_fqdn", - "description": "You must set this to the FQDN of the Plausible Analytics instance. This is used to generate the links to the Plausible Analytics instance.", - }, - { - "id": "$$secret_database_url", - "name": "DATABASE_URL", - "label": "Database URL for PostgreSQL", - "defaultValue": "postgresql://$$config_postgresql_username:$$secret_postgresql_password@$$id-postgresql:5432/$$config_postgresql_database", - "description": "", - }, - { - "id": "$$secret_clickhouse_database_url", - "name": "CLICKHOUSE_DATABASE_URL", - "label": "Database URL for Clickhouse", - "defaultValue": "http://$$id-clickhouse:8123/plausible", - "description": "", - }, - { - "id": "$$config_admin_user_email", - "name": "ADMIN_USER_EMAIL", - "label": "Admin Email Address", - "defaultValue": "admin@example.com", - "description": "This is the admin email. Please change it.", - }, - { - "id": "$$config_admin_user_name", - "name": "ADMIN_USER_NAME", - "label": "Admin User Name", - "defaultValue": "$$generate_username", - "description": "This is the admin username. Please change it.", - }, - { - "id": "$$secret_admin_user_pwd", - "name": "ADMIN_USER_PWD", - "label": "Admin User Password", - "defaultValue": "$$generate_password", - "description": "This is the admin password. Please change it.", - "extras": { - "isVisibleOnUI": true, - } - }, - { - "id": "$$secret_secret_key_base", - "name": "SECRET_KEY_BASE", - "label": "Secret Key Base", - "defaultValue": "$$generate_passphrase", - "description": "", - - }, - { - "id": "$$config_disable_auth", - "name": "DISABLE_AUTH", - "label": "Disable Authentication", - "defaultValue": "false", - "description": "", - }, - { - "id": "$$config_disable_registration", - "name": "DISABLE_REGISTRATION", - "label": "Disable Registration", - "defaultValue": "true", - "description": "", - }, - { - "id": "$$config_postgresql_username", - "name": "POSTGRESQL_USERNAME", - "label": "PostgreSQL Username", - "defaultValue": "postgresql", - "description": "", - }, - { - "id": "$$secret_postgresql_password", - "name": "POSTGRESQL_PASSWORD", - "label": "PostgreSQL Password", - "defaultValue": "$$generate_password", - "description": "", - } - , - { - "id": "$$config_postgresql_database", - "name": "POSTGRESQL_DATABASE", - "label": "PostgreSQL Database", - "defaultValue": "plausible", - "description": "", - }, - { - "id": "$$config_scriptName", - "name": "SCRIPT_NAME", - "label": "Custom Script Name", - "defaultValue": "plausible.js", - "description": "This is the default script name.", - }, - ] - } -] diff --git a/apps/api/src/routes/api/v1/handlers.ts b/apps/api/src/routes/api/v1/handlers.ts index e7f75c610..adfad042a 100644 --- a/apps/api/src/routes/api/v1/handlers.ts +++ b/apps/api/src/routes/api/v1/handlers.ts @@ -38,7 +38,7 @@ export async function cleanupManually(request: FastifyRequest) { return errorHandler({ status, message }); } } -export async function refreshTemplates(request: FastifyRequest) { +export async function refreshTemplates() { try { const { default: got } = await import('got') let templates = {} diff --git a/apps/api/src/routes/api/v1/index.ts b/apps/api/src/routes/api/v1/index.ts index dca169097..a6c7dbf44 100644 --- a/apps/api/src/routes/api/v1/index.ts +++ b/apps/api/src/routes/api/v1/index.ts @@ -58,7 +58,7 @@ const root: FastifyPluginAsync = async (fastify): Promise => { fastify.post('/internal/refreshTemplates', { onRequest: [fastify.authenticate] - }, async (request) => await refreshTemplates(request)); + }, async () => await refreshTemplates()); }; export default root; diff --git a/apps/api/src/routes/api/v1/services/handlers.ts b/apps/api/src/routes/api/v1/services/handlers.ts index a404a71cd..7a4083836 100644 --- a/apps/api/src/routes/api/v1/services/handlers.ts +++ b/apps/api/src/routes/api/v1/services/handlers.ts @@ -136,13 +136,12 @@ export async function parseAndFindServiceTemplates(service: any, workdir?: strin const description = variable?.description const defaultValue = variable?.defaultValue const main = variable?.main || '$$id' - const extras = variable?.extras - if (envValue.startsWith('$$config') || extras?.isVisibleOnUI) { + if (envValue.startsWith('$$config') || variable?.showOnUI) { if (envValue.startsWith('$$config_coolify')) { continue } parsedTemplate[realKey].environment.push( - { name: envKey, value: envValue, main, label, description, defaultValue, extras } + { name: envKey, value: envValue, main, label, description, defaultValue } ) } } @@ -153,10 +152,10 @@ export async function parseAndFindServiceTemplates(service: any, workdir?: strin if (proxyValue.domain) { const variable = foundTemplate.variables.find(v => v.id === proxyValue.domain) if (variable) { - const { id, name, label, description, defaultValue, extras } = variable + const { id, name, label, description, defaultValue, required = false } = variable const found = await prisma.serviceSetting.findFirst({ where: { variableName: proxyValue.domain } }) parsedTemplate[realKey].fqdns.push( - { id, name, value: found?.value || '', label, description, defaultValue, extras } + { id, name, value: found?.value || '', label, description, defaultValue, required } ) } @@ -186,9 +185,9 @@ export async function parseAndFindServiceTemplates(service: any, workdir?: strin if (variableName.startsWith('$$config_coolify')) { continue; } - if (service.fqdn && value === '$$generate_fqdn') { - strParsedTemplate = strParsedTemplate.replaceAll(variableName, service.fqdn) - } else if (service.fqdn && value === '$$generate_domain') { + if (value === '$$generate_fqdn') { + strParsedTemplate = strParsedTemplate.replaceAll(variableName, service.fqdn || '') + } else if (value === '$$generate_domain') { strParsedTemplate = strParsedTemplate.replaceAll(variableName, getDomain(service.fqdn)) } else if (service.destinationDocker?.network && value === '$$generate_network') { strParsedTemplate = strParsedTemplate.replaceAll(variableName, service.destinationDocker.network) @@ -260,7 +259,9 @@ export async function saveServiceType(request: FastifyRequest, const regex = /^\$\$.*\((\d+)\)$/g; const length = Number(regex.exec(defaultValue)?.[1]) || undefined if (variable.defaultValue.startsWith('$$generate_password')) { + console.log(variable) variable.value = generatePassword({ length }); + console.log(variable.value) } else if (variable.defaultValue.startsWith('$$generate_hex')) { variable.value = generatePassword({ length, isHex: true }); } else if (variable.defaultValue.startsWith('$$generate_username')) { diff --git a/apps/api/src/routes/webhooks/traefik/handlers.ts b/apps/api/src/routes/webhooks/traefik/handlers.ts index 9d4267ce4..5dac66235 100644 --- a/apps/api/src/routes/webhooks/traefik/handlers.ts +++ b/apps/api/src/routes/webhooks/traefik/handlers.ts @@ -374,6 +374,7 @@ export async function traefikConfiguration(request, reply) { type, destinationDockerId, dualCerts, + serviceSetting } = service; if (destinationDockerId) { const templates = await getTemplates(); @@ -387,13 +388,17 @@ export async function traefikConfiguration(request, reply) { const { proxy } = found.services[oneService]; for (const configuration of proxy) { const publicPort = service[type]?.publicPort; + if (configuration.domain) { + const setting = serviceSetting.find((a) => a.variableName === configuration.domain); + configuration.domain = configuration.domain.replace(configuration.domain, setting.value); + } if (fqdn) { data.services.push({ id: oneService, publicPort, fqdn, dualCerts, - configuration + configuration, }); } } @@ -404,17 +409,20 @@ export async function traefikConfiguration(request, reply) { } } for (const service of data.services) { - const { id, fqdn, dualCerts, configuration: { port, pathPrefix = '/' }, isCustomSSL = false } = service + let { id, fqdn, dualCerts, configuration: { port, pathPrefix = '/', domain: customDomain }, isCustomSSL = false } = service + if (customDomain) { + fqdn = customDomain + } const domain = getDomain(fqdn); const nakedDomain = domain.replace(/^www\./, ''); const isHttps = fqdn.startsWith('https://'); const isWWW = fqdn.includes('www.'); if (isHttps) { - traefik.http.routers[id] = generateHttpRouter(id, nakedDomain, pathPrefix) - traefik.http.routers[`${id}-secure`] = generateProtocolRedirectRouter(id, nakedDomain, pathPrefix, 'http-to-https') - traefik.http.services[id] = generateLoadBalancerService(id, port) + traefik.http.routers[`${id}-${port || 'default'}`] = generateHttpRouter(`${id}-${port || 'default'}`, nakedDomain, pathPrefix) + traefik.http.routers[`${id}-${port || 'default'}-secure`] = generateProtocolRedirectRouter(`${id}-${port || 'default'}-secure`, nakedDomain, pathPrefix, 'http-to-https') + traefik.http.services[`${id}-${port || 'default'}`] = generateLoadBalancerService(id, port) if (dualCerts) { - traefik.http.routers[`${id}-secure`] = { + traefik.http.routers[`${id}-${port || 'default'}-secure`] = { entrypoints: ['websecure'], rule: `(Host(\`${nakedDomain}\`) || Host(\`www.${nakedDomain}\`)) && PathPrefix(\`${pathPrefix}\`)`, service: `${id}`, @@ -425,7 +433,7 @@ export async function traefikConfiguration(request, reply) { }; } else { if (isWWW) { - traefik.http.routers[`${id}-secure-www`] = { + traefik.http.routers[`${id}-${port || 'default'}-secure-www`] = { entrypoints: ['websecure'], rule: `Host(\`www.${nakedDomain}\`) && PathPrefix(\`${pathPrefix}\`)`, service: `${id}`, @@ -434,7 +442,7 @@ export async function traefikConfiguration(request, reply) { }, middlewares: [] }; - traefik.http.routers[`${id}-secure`] = { + traefik.http.routers[`${id}-${port || 'default'}-secure`] = { entrypoints: ['websecure'], rule: `Host(\`${nakedDomain}\`) && PathPrefix(\`${pathPrefix}\`)`, service: `${id}`, @@ -445,9 +453,9 @@ export async function traefikConfiguration(request, reply) { }, middlewares: ['redirect-to-www'] }; - traefik.http.routers[`${id}`].middlewares.push('redirect-to-www'); + traefik.http.routers[`${id}-${port || 'default'}`].middlewares.push('redirect-to-www'); } else { - traefik.http.routers[`${id}-secure-www`] = { + traefik.http.routers[`${id}-${port || 'default'}-secure-www`] = { entrypoints: ['websecure'], rule: `Host(\`www.${nakedDomain}\`) && PathPrefix(\`${pathPrefix}\`)`, service: `${id}`, @@ -458,7 +466,7 @@ export async function traefikConfiguration(request, reply) { }, middlewares: ['redirect-to-non-www'] }; - traefik.http.routers[`${id}-secure`] = { + traefik.http.routers[`${id}-${port || 'default'}-secure`] = { entrypoints: ['websecure'], rule: `Host(\`${domain}\`) && PathPrefix(\`${pathPrefix}\`)`, service: `${id}`, @@ -467,21 +475,21 @@ export async function traefikConfiguration(request, reply) { }, middlewares: [] }; - traefik.http.routers[`${id}`].middlewares.push('redirect-to-non-www'); + traefik.http.routers[`${id}-${port || 'default'}`].middlewares.push('redirect-to-non-www'); } } } else { - traefik.http.routers[id] = generateHttpRouter(id, nakedDomain, pathPrefix) - traefik.http.routers[`${id}-secure`] = generateProtocolRedirectRouter(id, nakedDomain, pathPrefix, 'https-to-http') - traefik.http.services[id] = generateLoadBalancerService(id, port) + traefik.http.routers[`${id}-${port || 'default'}`] = generateHttpRouter(`${id}-${port || 'default'}`, nakedDomain, pathPrefix) + traefik.http.routers[`${id}-${port || 'default'}-secure`] = generateProtocolRedirectRouter(`${id}-${port || 'default'}-secure`, nakedDomain, pathPrefix, 'https-to-http') + traefik.http.services[`${id}-${port || 'default'}`] = generateLoadBalancerService(id, port) if (!dualCerts) { if (isWWW) { - traefik.http.routers[`${id}`].middlewares.push('redirect-to-www'); - traefik.http.routers[`${id}-secure`].middlewares.push('redirect-to-www'); + traefik.http.routers[`${id}-${port || 'default'}`].middlewares.push('redirect-to-www'); + traefik.http.routers[`${id}-${port || 'default'}-secure`].middlewares.push('redirect-to-www'); } else { - traefik.http.routers[`${id}`].middlewares.push('redirect-to-non-www'); - traefik.http.routers[`${id}-secure`].middlewares.push('redirect-to-non-www'); + traefik.http.routers[`${id}-${port || 'default'}`].middlewares.push('redirect-to-non-www'); + traefik.http.routers[`${id}-${port || 'default'}-secure`].middlewares.push('redirect-to-non-www'); } } } diff --git a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte index fefb8c643..d76698743 100644 --- a/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte +++ b/apps/ui/src/routes/services/[id]/_ServiceLinks.svelte @@ -2,7 +2,6 @@ import DocLink from '$lib/components/DocLink.svelte'; export let service: any; export let linkToDocs: boolean = false; - import ExternalLink from '$lib/components/ExternalLink.svelte'; import * as Icons from '$lib/components/svg/services'; const name: any = service.type && service.type[0].toUpperCase() + service.type.substring(1); @@ -31,15 +30,8 @@ {#if linkToDocs} - + {:else} {/if} - + diff --git a/apps/ui/src/routes/services/[id]/index.svelte b/apps/ui/src/routes/services/[id]/index.svelte index 533113f4e..2a600a1e4 100644 --- a/apps/ui/src/routes/services/[id]/index.svelte +++ b/apps/ui/src/routes/services/[id]/index.svelte @@ -293,7 +293,7 @@ - + {/each} {/each} @@ -416,7 +422,7 @@ readonly name={variable.name} id={variable.name} - value={getDomain(service.fqdn)} + value={getDomain(service.fqdn) || ''} /> {:else if variable.defaultValue === '$$generate_network'} {:else}