Dokploy

Sim

Open-source visual workflow builder for building and deploying AI agent workflows.

Sim logo

Configuration

services:
  simstudio:
    image: ghcr.io/simstudioai/simstudio:latest
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/simstudio
      - BETTER_AUTH_URL=${SIM_APP_URL}
      - NEXT_PUBLIC_APP_URL=${SIM_APP_URL}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - ENCRYPTION_KEY=${ENCRYPTION_KEY}
      - API_ENCRYPTION_KEY=${API_ENCRYPTION_KEY}
      - INTERNAL_API_SECRET=${INTERNAL_API_SECRET}
      - SOCKET_SERVER_URL=http://realtime:3002
    depends_on:
      db:
        condition: service_healthy
      migrations:
        condition: service_completed_successfully
      realtime:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://127.0.0.1:3000"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s

  realtime:
    image: ghcr.io/simstudioai/realtime:latest
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/simstudio
      - NEXT_PUBLIC_APP_URL=${SIM_APP_URL}
      - BETTER_AUTH_URL=${SIM_APP_URL}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - INTERNAL_API_SECRET=${INTERNAL_API_SECRET}
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-fsS", "http://127.0.0.1:3002/health"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 15s

  migrations:
    image: ghcr.io/simstudioai/migrations:latest
    working_dir: /app/packages/db
    environment:
      - DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/simstudio
    depends_on:
      db:
        condition: service_healthy
    command: ["bun", "run", "db:migrate"]
    restart: "no"

  db:
    image: pgvector/pgvector:pg17
    restart: unless-stopped
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DB=simstudio
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:
[variables]
main_domain = "${domain}"
better_auth_secret = "${password:32}"
encryption_key = "${hash:64}"
api_encryption_key = "${hash:64}"
internal_api_secret = "${password:32}"
postgres_password = "${password:32}"

[config]

[config.env]
SIM_APP_URL = "http://${main_domain}"
BETTER_AUTH_SECRET = "${better_auth_secret}"
ENCRYPTION_KEY = "${encryption_key}"
API_ENCRYPTION_KEY = "${api_encryption_key}"
INTERNAL_API_SECRET = "${internal_api_secret}"
POSTGRES_PASSWORD = "${postgres_password}"

[[config.domains]]
serviceName = "simstudio"
port = 3000
host = "${main_domain}"

[[config.domains]]
serviceName = "realtime"
port = 3002
host = "${main_domain}"
path = "/socket.io"

Base64

To import this template in Dokploy: create a Compose service → AdvancedBase64 import and paste the content below:

ewogICJjb21wb3NlIjogInNlcnZpY2VzOlxuICBzaW1zdHVkaW86XG4gICAgaW1hZ2U6IGdoY3IuaW8vc2ltc3R1ZGlvYWkvc2ltc3R1ZGlvOmxhdGVzdFxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIE5PREVfRU5WPXByb2R1Y3Rpb25cbiAgICAgIC0gREFUQUJBU0VfVVJMPXBvc3RncmVzcWw6Ly9wb3N0Z3Jlczoke1BPU1RHUkVTX1BBU1NXT1JEfUBkYjo1NDMyL3NpbXN0dWRpb1xuICAgICAgLSBCRVRURVJfQVVUSF9VUkw9JHtTSU1fQVBQX1VSTH1cbiAgICAgIC0gTkVYVF9QVUJMSUNfQVBQX1VSTD0ke1NJTV9BUFBfVVJMfVxuICAgICAgLSBCRVRURVJfQVVUSF9TRUNSRVQ9JHtCRVRURVJfQVVUSF9TRUNSRVR9XG4gICAgICAtIEVOQ1JZUFRJT05fS0VZPSR7RU5DUllQVElPTl9LRVl9XG4gICAgICAtIEFQSV9FTkNSWVBUSU9OX0tFWT0ke0FQSV9FTkNSWVBUSU9OX0tFWX1cbiAgICAgIC0gSU5URVJOQUxfQVBJX1NFQ1JFVD0ke0lOVEVSTkFMX0FQSV9TRUNSRVR9XG4gICAgICAtIFNPQ0tFVF9TRVJWRVJfVVJMPWh0dHA6Ly9yZWFsdGltZTozMDAyXG4gICAgZGVwZW5kc19vbjpcbiAgICAgIGRiOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgICAgbWlncmF0aW9uczpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2NvbXBsZXRlZF9zdWNjZXNzZnVsbHlcbiAgICAgIHJlYWx0aW1lOlxuICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01EXCIsIFwiY3VybFwiLCBcIi1mc1NcIiwgXCJodHRwOi8vMTI3LjAuMC4xOjMwMDBcIl1cbiAgICAgIGludGVydmFsOiAzMHNcbiAgICAgIHRpbWVvdXQ6IDVzXG4gICAgICByZXRyaWVzOiA1XG4gICAgICBzdGFydF9wZXJpb2Q6IDMwc1xuXG4gIHJlYWx0aW1lOlxuICAgIGltYWdlOiBnaGNyLmlvL3NpbXN0dWRpb2FpL3JlYWx0aW1lOmxhdGVzdFxuICAgIHJlc3RhcnQ6IHVubGVzcy1zdG9wcGVkXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIE5PREVfRU5WPXByb2R1Y3Rpb25cbiAgICAgIC0gREFUQUJBU0VfVVJMPXBvc3RncmVzcWw6Ly9wb3N0Z3Jlczoke1BPU1RHUkVTX1BBU1NXT1JEfUBkYjo1NDMyL3NpbXN0dWRpb1xuICAgICAgLSBORVhUX1BVQkxJQ19BUFBfVVJMPSR7U0lNX0FQUF9VUkx9XG4gICAgICAtIEJFVFRFUl9BVVRIX1VSTD0ke1NJTV9BUFBfVVJMfVxuICAgICAgLSBCRVRURVJfQVVUSF9TRUNSRVQ9JHtCRVRURVJfQVVUSF9TRUNSRVR9XG4gICAgICAtIElOVEVSTkFMX0FQSV9TRUNSRVQ9JHtJTlRFUk5BTF9BUElfU0VDUkVUfVxuICAgIGRlcGVuZHNfb246XG4gICAgICBkYjpcbiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHlcbiAgICBoZWFsdGhjaGVjazpcbiAgICAgIHRlc3Q6IFtcIkNNRFwiLCBcImN1cmxcIiwgXCItZnNTXCIsIFwiaHR0cDovLzEyNy4wLjAuMTozMDAyL2hlYWx0aFwiXVxuICAgICAgaW50ZXJ2YWw6IDMwc1xuICAgICAgdGltZW91dDogNXNcbiAgICAgIHJldHJpZXM6IDVcbiAgICAgIHN0YXJ0X3BlcmlvZDogMTVzXG5cbiAgbWlncmF0aW9uczpcbiAgICBpbWFnZTogZ2hjci5pby9zaW1zdHVkaW9haS9taWdyYXRpb25zOmxhdGVzdFxuICAgIHdvcmtpbmdfZGlyOiAvYXBwL3BhY2thZ2VzL2RiXG4gICAgZW52aXJvbm1lbnQ6XG4gICAgICAtIERBVEFCQVNFX1VSTD1wb3N0Z3Jlc3FsOi8vcG9zdGdyZXM6JHtQT1NUR1JFU19QQVNTV09SRH1AZGI6NTQzMi9zaW1zdHVkaW9cbiAgICBkZXBlbmRzX29uOlxuICAgICAgZGI6XG4gICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5XG4gICAgY29tbWFuZDogW1wiYnVuXCIsIFwicnVuXCIsIFwiZGI6bWlncmF0ZVwiXVxuICAgIHJlc3RhcnQ6IFwibm9cIlxuXG4gIGRiOlxuICAgIGltYWdlOiBwZ3ZlY3Rvci9wZ3ZlY3RvcjpwZzE3XG4gICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWRcbiAgICBlbnZpcm9ubWVudDpcbiAgICAgIC0gUE9TVEdSRVNfVVNFUj1wb3N0Z3Jlc1xuICAgICAgLSBQT1NUR1JFU19QQVNTV09SRD0ke1BPU1RHUkVTX1BBU1NXT1JEfVxuICAgICAgLSBQT1NUR1JFU19EQj1zaW1zdHVkaW9cbiAgICB2b2x1bWVzOlxuICAgICAgLSBwb3N0Z3Jlc19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YVxuICAgIGhlYWx0aGNoZWNrOlxuICAgICAgdGVzdDogW1wiQ01ELVNIRUxMXCIsIFwicGdfaXNyZWFkeSAtVSBwb3N0Z3Jlc1wiXVxuICAgICAgaW50ZXJ2YWw6IDVzXG4gICAgICB0aW1lb3V0OiA1c1xuICAgICAgcmV0cmllczogNVxuXG52b2x1bWVzOlxuICBwb3N0Z3Jlc19kYXRhOlxuIiwKICAiY29uZmlnIjogIlt2YXJpYWJsZXNdXG5tYWluX2RvbWFpbiA9IFwiJHtkb21haW59XCJcbmJldHRlcl9hdXRoX3NlY3JldCA9IFwiJHtwYXNzd29yZDozMn1cIlxuZW5jcnlwdGlvbl9rZXkgPSBcIiR7aGFzaDo2NH1cIlxuYXBpX2VuY3J5cHRpb25fa2V5ID0gXCIke2hhc2g6NjR9XCJcbmludGVybmFsX2FwaV9zZWNyZXQgPSBcIiR7cGFzc3dvcmQ6MzJ9XCJcbnBvc3RncmVzX3Bhc3N3b3JkID0gXCIke3Bhc3N3b3JkOjMyfVwiXG5cbltjb25maWddXG5cbltjb25maWcuZW52XVxuU0lNX0FQUF9VUkwgPSBcImh0dHA6Ly8ke21haW5fZG9tYWlufVwiXG5CRVRURVJfQVVUSF9TRUNSRVQgPSBcIiR7YmV0dGVyX2F1dGhfc2VjcmV0fVwiXG5FTkNSWVBUSU9OX0tFWSA9IFwiJHtlbmNyeXB0aW9uX2tleX1cIlxuQVBJX0VOQ1JZUFRJT05fS0VZID0gXCIke2FwaV9lbmNyeXB0aW9uX2tleX1cIlxuSU5URVJOQUxfQVBJX1NFQ1JFVCA9IFwiJHtpbnRlcm5hbF9hcGlfc2VjcmV0fVwiXG5QT1NUR1JFU19QQVNTV09SRCA9IFwiJHtwb3N0Z3Jlc19wYXNzd29yZH1cIlxuXG5bW2NvbmZpZy5kb21haW5zXV1cbnNlcnZpY2VOYW1lID0gXCJzaW1zdHVkaW9cIlxucG9ydCA9IDMwMDBcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcblxuW1tjb25maWcuZG9tYWluc11dXG5zZXJ2aWNlTmFtZSA9IFwicmVhbHRpbWVcIlxucG9ydCA9IDMwMDJcbmhvc3QgPSBcIiR7bWFpbl9kb21haW59XCJcbnBhdGggPSBcIi9zb2NrZXQuaW9cIlxuIgp9

Tags

ai, automation, workflow


Version: latest

On this page