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}