captainVersion: 4 services: $$cap_appname-studio: image: supabase/studio:$$cap_studio_version restart: unless-stopped environment: STUDIO_PG_META_URL: http://$$cap_appname-pg-meta.$$cap_root_domain POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} DEFAULT_ORGANIZATION: ${STUDIO_DEFAULT_ORGANIZATION} DEFAULT_PROJECT: ${STUDIO_DEFAULT_PROJECT} SUPABASE_URL: http://$$cap_appname-supabase-kong.$$cap_root_domain SUPABASE_PUBLIC_URL: http://$$cap_appname-supabase-studio.$$cap_root_domain # Kept for backwards compatibility with studio:0.22.08 SUPABASE_REST_URL: http://$$cap_appname-rest.$$cap_root_domain/rest/v1/ SUPABASE_ANON_KEY: $$cap_supabase_anon_key SUPABASE_SERVICE_KEY: $$cap_supabase_service_key caproverExtra: containerHttpPort: $$cap_studio_http_port $$cap_appname-kong: image: kong:$$cap_kong_version volumes: - $$cap_appname-kong-config:/var/lib/kong:ro restart: unless-stopped ports: - $$cap_kong_https_port:8443 environment: KONG_DATABASE: $$cap_kong_database KONG_DECLARATIVE_CONFIG: $$cap_kong_declaritive_config # https://github.com/supabase/cli/issues/14 KONG_DNS_ORDER: $$cap_kong_dns_order KONG_PLUGINS: $$cap_kong_plugins KONG_ADMIN_LISTEN: 0.0.0.0:$$cap_kong_admin_port, 0.0.0.0:$$cap_kong_admin_ssl_port ssl KONG_NGINX_PROXY_PROXY_BUFFER_SIZE: 160k KONG_NGINX_PROXY_PROXY_BUFFERS: 64 160k caproverExtra: containerHttpPort: 8000 $$cap_appname-auth: image: supabase/gotrue:$$cap_auth_version depends_on: - $$cap_appname-db restart: unless-stopped environment: GOTRUE_API_HOST: $$cap_gotrue_api_host GOTRUE_API_PORT: $$cap_gotrue_api_port API_EXTERNAL_URL: http://$$cap_appname-rest.$$cap_root_domain GOTRUE_DB_DRIVER: postgres GOTRUE_DB_DATABASE_URL: postgres://$$cap_pg_user:$$cap_pg_pass@srv-captain--$$cap_appname-db:5432/$$cap_pg_db?sslmode=disable&search_path=auth GOTRUE_SITE_URL: $$cap_appname-auth.$$cap_root_domain GOTRUE_URI_ALLOW_LIST: $$cap_gotrue_uri_allow_list GOTRUE_DISABLE_SIGNUP: $$cap_gotrue_disable_signup GOTRUE_JWT_ADMIN_ROLES: service_role GOTRUE_JWT_AUD: authenticated GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated GOTRUE_JWT_EXP: $$cap_gotrue_jwt_expiry GOTRUE_JWT_SECRET: $$cap_jwt_secret GOTRUE_EXTERNAL_EMAIL_ENABLED: $$cap_gotrue_external_email_enabled GOTRUE_MAILER_AUTOCONFIRM: $$cap_gotrue_mailer_autoconfirm GOTRUE_SMTP_ADMIN_EMAIL: $$cap_gotrue_smtp_admin_email GOTRUE_SMTP_HOST: $$cap_gotrue_smtp_host GOTRUE_SMTP_PORT: $$cap_gotrue_smtp_port GOTRUE_SMTP_USER: $$cap_gotrue_smtp_user GOTRUE_SMTP_PASS: $$cap_gotrue_smtp_pass GOTRUE_SMTP_SENDER_NAME: $$cap_gotrue_smtp_sender_name GOTRUE_MAILER_URLPATHS_INVITE: /auth/v1/verify GOTRUE_MAILER_URLPATHS_CONFIRMATION: /auth/v1/verify GOTRUE_MAILER_URLPATHS_RECOVERY: /auth/v1/verify GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE: /auth/v1/verify GOTRUE_EXTERNAL_PHONE_ENABLED: $$cap_gotrue_enable_phone_signup GOTRUE_SMS_AUTOCONFIRM: $$cap_gotrue_sms_autoconfirm MFA_ENABLED: $$cap_gotrue_mfa_enabled caproverExtra: containerHttpPort: $$cap_gotrue_api_port $$cap_appname-rest: image: postgrest/postgrest:$$cap_postgrest_version depends_on: - $$cap_appname-db restart: unless-stopped environment: PGRST_DB_URI: postgres://$$cap_pg_user:$$cap_pg_pass@srv-captain--$$cap_appname-db:5432/$$cap_pg_db PGRST_DB_SCHEMA: $$cap_postgrest_db_schemas PGRST_DB_ANON_ROLE: anon PGRST_JWT_SECRET: $$cap_jwt_secret PGRST_DB_USE_LEGACY_GUCS: 'false' caproverExtra: containerHttpPort: 3000 $$cap_appname-realtime: image: supabase/realtime:$$cap_realtime_version depends_on: - $$cap_appname-db restart: unless-stopped environment: PORT: 4000 DB_HOST: srv-captain--$$cap_appname-db DB_PORT: 5432 DB_USER: $$cap_pg_user DB_PASSWORD: $$cap_pg_pass DB_NAME: $$cap_pg_db DB_AFTER_CONNECT_QUERY: 'SET search_path TO _realtime' DB_ENC_KEY: supabaserealtime API_JWT_SECRET: $$cap_jwt_secret FLY_ALLOC_ID: fly123 FLY_APP_NAME: realtime SECRET_KEY_BASE: UpNVntn3cDxHJpq99YMc1T1AQgQpc8kfYTuRgBiYa15BLrx8etQoXz3gZv1/u2oq ERL_AFLAGS: -proto_dist inet_tcp ENABLE_TAILSCALE: 'false' DNS_NODES: "''" caproverExtra: containerHttpPort: 4000 dockerfileLines: # https://github.com/caprover/one-click-apps/pull/833#issuecomment-1445213826 - FROM supabase/realtime:$$cap_realtime_version - CMD sh -c "/app/bin/migrate && /app/bin/realtime eval 'Realtime.Release.seeds(Realtime.Repo)' && /app/bin/server" $$cap_appname-storage: image: supabase/storage-api:$$cap_storage_version depends_on: - $$cap_appname-db - $$cap_appname-rest restart: unless-stopped volumes: - $$cap_appname-storage:/var/lib/storage environment: ANON_KEY: $$cap_supabase_anon_key SERVICE_KEY: $$cap_supabase_service_key POSTGREST_URL: srv-captain--$$cap_appname-rest PGRST_JWT_SECRET: $$cap_jwt_secret DATABASE_URL: postgres://$$cap_pg_user:$$cap_pg_pass@srv-captain--$$cap_appname-db:5432/$$cap_pg_db FILE_SIZE_LIMIT: $$cap_storage_file_size_limit STORAGE_BACKEND: file FILE_STORAGE_BACKEND_PATH: /var/lib/storage TENANT_ID: stub REGION: stub GLOBAL_S3_BUCKET: stub ENABLE_IMAGE_TRANSFORMATION: 'true' IMGPROXY_URL: http://$$cap_appname-imgproxy.$$cap_root_domain caproverExtra: containerHttpPort: 5000 $$cap_appname-imgproxy: image: darthsim/imgproxy:$$cap_imgproxy_version environment: IMGPROXY_BIND: ':5001' IMGPROXY_LOCAL_FILESYSTEM_ROOT: / IMGPROXY_USE_ETAG: 'true' volumes: - $$cap_appname-imgproxy-storage:/var/lib/storage caproverExtra: containerHttpPort: 5001 $$cap_appname-pg-meta: image: supabase/postgres-meta:$$cap_pg_meta_version depends_on: - $$cap_appname-db restart: unless-stopped environment: PG_META_PORT: $$cap_pg_meta_port PG_META_DB_HOST: srv-captain--$$cap_appname-db PG_META_DB_PORT: 5432 PG_META_DB_NAME: $$cap_pg_db PG_META_DB_USER: $$cap_pg_user PG_META_DB_PASSWORD: $$cap_pg_pass caproverExtra: containerHttpPort: $$cap_pg_meta_port $$cap_appname-db: # not using postgres image because supabase/postgres # has some additional initdb script image: supabase/postgres:$$cap_db_version volumes: - $$cap_appname-db-realtime:/docker-entrypoint-initdb.d/realtime.sql - $$cap_appname-db-roles:/docker-entrypoint-initdb.d/roles.sql # Must be superuser to enable pg_net extension - $$cap_appname-db-webhooks:/etc/postgresql.schema.sql - $$cap_appname-db-data:/var/lib/postgresql/data restart: unless-stopped environment: POSTGRES_HOST: /var/run/postgresql PGPORT: 5432 POSTGRES_PORT: 5432 PGPASSWORD: $$cap_pg_pass POSTGRES_PASSWORD: $$cap_pg_pass PGDATABASE: $$cap_pg_db POSTGRES_DB: $$cap_pg_db caproverExtra: notExposeAsWebApp: 'true' caproverOneClickApp: variables: # shared env - id: $$cap_jwt_secret label: JWT secret defaultValue: $$cap_gen_random_hex(32) validRegex: /^([^\s^\/])+$/ - id: $$cap_supabase_anon_key label: Supabase Anon Key description: Generate ANON_KEY using your JWT secret at https://supabase.io/docs/guides/hosting/overview#api-keys validRegex: /^([^\s^\/])+$/ - id: $$cap_supabase_service_key label: Supabase Service Key description: Generate SERVICE_KEY using your JWT secret at https://supabase.io/docs/guides/hosting/overview#api-keys validRegex: /^([^\s^\/])+$/ # studio variables - id: $$cap_studio_version label: Studio version defaultValue: '20230216-e731b77' description: Check out their Docker page for the valid tags https://hub.docker.com/r/supabase/studio/tags validRegex: /^([^\s^\/])+$/ - id: $$cap_studio_http_port label: Studio HTTP port defaultValue: '3000' validRegex: /^\d+$/ # kong variables - id: $$cap_kong_version label: Kong version defaultValue: '2.8.1' description: Check out their Docker page for the valid tags https://hub.docker.com/_/kong?tab=tags validRegex: /^([^\s^\/])+$/ - id: $$cap_kong_http_port label: Kong HTTP port defaultValue: '8000' validRegex: /^\d+$/ - id: $$cap_kong_https_port label: Kong HTTPS port defaultValue: '8443' validRegex: /^\d+$/ - id: $$cap_kong_admin_port label: Kong Admin Listen port defaultValue: '8001' validRegex: /^\d+$/ - id: $$cap_kong_admin_ssl_port label: Kong Admin Listen SSL port defaultValue: '8444' validRegex: /^\d+$/ - id: $$cap_kong_database label: Kong Database defaultValue: 'off' validRegex: /^([^\s^\/])+$/ - id: $$cap_kong_declaritive_config label: Kong Declarative Config defaultValue: '/var/lib/kong/kong.yml' - id: $$cap_kong_dns_order label: Kong DNS order defaultValue: 'LAST,A,CNAME' validRegex: /^([^\s^\/])+$/ - id: $$cap_kong_plugins label: Kong Plugins defaultValue: 'request-transformer,cors,key-auth,acl' validRegex: /^([^\s^\/])+$/ # auth variables - id: $$cap_auth_version label: Auth Version defaultValue: 'v2.47.0' description: Check out their Docker page for the valid tags https://hub.docker.com/r/supabase/gotrue/tags validRegex: /^([^\s^\/])+$/ - id: $$cap_gotrue_api_host label: Gotrue API Host defaultValue: '0.0.0.0' validRegex: /^([^\s^\/])+$/ - id: $$cap_gotrue_api_port label: Gotrue API port defaultValue: '9999' validRegex: /^([^\s^\/])+$/ - id: $$cap_gotrue_uri_allow_list label: Gotrue URI allow list defaultValue: '' - id: $$cap_gotrue_disable_signup label: Gotrue Disable Signup defaultValue: 'false' validRegex: /^(true|false)$/ - id: $$cap_gotrue_jwt_expiry label: Gotrue JWT expiry defaultValue: '84600' validRegex: /^\d+$/ - id: $$cap_gotrue_external_email_enabled label: Gotrue external email enabled defaultValue: 'true' validRegex: /^(true|false)$/ - id: $$cap_gotrue_mailer_autoconfirm label: Gotrue mailer autoconfirm defaultValue: 'false' validRegex: /^(true|false)$/ - id: $$cap_gotrue_smtp_admin_email label: Gotrue SMTP admin email defaultValue: 'admin@example.com' - id: $$cap_gotrue_smtp_host label: Gotrue SMTP Host defaultValue: '' - id: $$cap_gotrue_smtp_port label: Gotrue SMTP port defaultValue: '567' validRegex: /^\d+$/ - id: $$cap_gotrue_smtp_user label: Gotrue SMTP user defaultValue: '' - id: $$cap_gotrue_smtp_pass label: Gotrue SMTP password defaultValue: '' - id: $$cap_gotrue_smtp_sender_name label: Gotrue SMTP sender name defaultValue: '' - id: $$cap_gotrue_enable_phone_signup label: Gotrue External Phone Signup defaultValue: 'true' validRegex: /^(true|false)$/ - id: $$cap_gotrue_sms_autoconfirm label: Gotrue SMS autoconfirm defaultValue: 'false' validRegex: /^(true|false)$/ - id: $$cap_gotrue_mfa_enabled label: Gotrue MFA enabled defaultValue: 'false' validRegex: /^(true|false)$/ # postgrest variables - id: $$cap_postgrest_version label: Postgrest Version defaultValue: 'v10.1.2' description: Check out their Docker page for the valid tags https://hub.docker.com/r/postgrest/postgrest/tags validRegex: /^([^\s^\/])+$/ - id: $$cap_postgrest_db_schemas label: Postgrest DB Schemas defaultValue: 'public, storage' validRegex: /^([^\s^\/])+$/ # realtime variables - id: $$cap_realtime_version label: Storage Realtime Version defaultValue: 'v2.5.1' description: Check out their Docker page for the valid tags https://hub.docker.com/r/supabase/realtime/tags validRegex: /^([^\s^\/])+$/ # storage variables - id: $$cap_storage_version label: Storage API Version defaultValue: 'v0.28.2' description: Check out their Docker page for the valid tags https://hub.docker.com/r/supabase/gotrue/tags validRegex: /^([^\s^\/])+$/ - id: $$cap_storage_file_size_limit label: Storage File Size Limit defaultValue: '52428800' validRegex: /^\d+$/ # postgres variables - id: $$cap_db_version label: Postgres Version defaultValue: '15.1.0.42-rc2' description: Check out their Docker page for the valid tags https://hub.docker.com/r/supabase/postgres/tags validRegex: /^([^\s^\/])+$/ - id: $$cap_pg_user label: Postgres Username defaultValue: 'postgres' validRegex: /.{1,}/ - id: $$cap_pg_pass label: Postgres Password defaultValue: $$cap_gen_random_hex(64) validRegex: /.{1,}/ - id: $$cap_pg_db label: Postgres Default Database defaultValue: 'postgres' validRegex: /.{1,}/ # pg-meta variables - id: $$cap_pg_meta_version label: Postgres Meta Version defaultValue: 'v0.60.7' description: Check out their Docker page for the valid tags https://hub.docker.com/r/supabase/postgres-meta/tags validRegex: /^([^\s^\/])+$/ - id: $$cap_pg_meta_port label: Postgres Meta Port defaultValue: '8080' validRegex: /^\d+$/ # imgproxy variables - id: $$cap_imgproxy_version label: ImgProxy Version defaultValue: 'v3.11' description: Check out their Docker page for the valid tags https://hub.docker.com/r/darthsim/imgproxy/tags validRegex: /^([^\s^\/])+$/ instructions: start: >- Supabase is an open source Firebase alternative. end: > Supabase is deployed. 1. Make sure to enable websocket support inside $$cap_appname-realtime. 2. You will also have to create a kong.yml inside /var/lib/docker/volumes/captain--$$cap_appname-kong-config/_data Check https://github.com/supabase/supabase/blob/master/docker/volumes/api/kong.yml for the example content (make sure to edit and add your ANON_KEY, SERVICE_KEY and service url) 3. # Set $$cap_appname-db instance count to 0 `docker service scale srv-captain--$$cap_appname-db=0` 4. Run the following command # delete already created database `rm -rf /var/lib/docker/volumes/captain--$$cap_appname-db-data/_data/*` # clone supabase repo to extract migrations `git clone https://github.com/supabase/supabase` # copy migrations required for supabase `cp -r supabase/docker/volumes/db/* /var/lib/docker/volumes/captain--$$cap_appname-db-data/_data/ && rm -rf supabase` # now set instance count for $$cap_appname-db back to 1 `docker service scale srv-captain--$$cap_appname-db=1` # once database is started, set wal_level to logical and restart database again `echo "wal_level = 'logical'" >> /var/lib/docker/volumes/captain--$$cap_appname-db-data/_data/postgresql.conf` displayName: Supabase isOfficial: true description: Supabase is an open source Firebase alternative. documentation: Taken from https://github.com/supabase/supabase