Skip to content

feat: add Sim Studio template#752

Open
trfi wants to merge 1 commit intoDokploy:canaryfrom
trfi:canary
Open

feat: add Sim Studio template#752
trfi wants to merge 1 commit intoDokploy:canaryfrom
trfi:canary

Conversation

@trfi
Copy link
Copy Markdown

@trfi trfi commented Mar 25, 2026

What is this PR about?

New template for Sim Studio — an open-source AI workflow builder for designing, simulating, and testing multi-agent pipelines with real-time collaboration.

Checklist

Before submitting this PR, please make sure that:

Issues related (if applicable)

N/A

Screenshots or Videos

image

Services included:

  • simstudio — main app (port 3000)
  • realtime — WebSocket collaboration server (port 3002)
  • migrations — one-shot init container (runs DB migrations)
  • db — pgvector/pgvector:pg17 (Postgres with vector extension)

All secrets (BETTER_AUTH_SECRET, ENCRYPTION_KEY, INTERNAL_API_SECRET, POSTGRES_PASSWORD) are auto-generated by Dokploy on deploy.

Greptile Summary

This PR adds a Sim Studio template — an open-source AI workflow builder with multi-agent support — comprising four services (simstudio, realtime, migrations, db). The overall architecture is solid: proper depends_on conditions, healthchecks, a one-shot migration container, and auto-generated secrets via template.toml. The apparent Strapi removal in meta.json is benign — it deduplicates an entry that already existed twice in the base branch.

However, two mandatory AGENTS.md conventions are violated that must be resolved before merging:

  • ports instead of expose: Both simstudio (3000) and realtime (3002) use ports: — AGENTS.md explicitly forbids this and requires expose: so Dokploy's networking layer handles routing.
  • Missing version: "3.8": The top-level Compose version declaration is absent; all blueprints are required to include it.
  • Unpinned :latest image tags (P2): All three ghcr.io/simstudioai/* images float on :latest, against the security guideline to pin to specific versions. The meta.json "version": "latest" should be updated to match once a tag is pinned.

Confidence Score: 2/5

  • Not safe to merge — two mandatory AGENTS.md conventions are violated (ports vs expose, missing version: "3.8") that will cause deployment issues on Dokploy.
  • The template structure and secret management are well done, but the two hard requirements from AGENTS.md (expose instead of ports, version: "3.8") are both missing. These are flagged as CRITICAL in the guide and will prevent the template from working correctly in Dokploy's networking model. Once those two fixes are applied (plus optionally pinning image versions), the PR should be ready to merge.
  • blueprints/simstudio/docker-compose.yml needs the portsexpose change and the version: "3.8" header added.

Reviews (1): Last reviewed commit: "feat: add Sim Studio template" | Re-trigger Greptile

Greptile also left 4 inline comments on this PR.

(2/5) Greptile learns from your feedback when you react with thumbs up/down!

Context used:

  • Context used - AGENTS.md (source)

@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Mar 25, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 25, 2026

built with Refined Cloudflare Pages Action

⚡ Cloudflare Pages Deployment

Name Status Preview Last Commit
templates ✅ Ready (View Log) Visit Preview 5f1c2dc

@dosubot
Copy link
Copy Markdown

dosubot bot commented Mar 25, 2026

Related Documentation

1 document(s) may need updating based on files changed in this PR:

Dokploy's Space

copilot-instructions /templates/blob/canary/.github/copilot-instructions.md
View Suggested Changes
@@ -53,6 +53,37 @@
   - **Port Mappings**: **NEVER use `ports` with host port mappings** (e.g., `"8080:8080"`)—**always use `expose` only** (e.g., `expose: ["8080"]`). Dokploy handles port proxying via its internal reverse proxy, so host port bindings are unnecessary and create potential port conflicts. This applies to ALL blueprints; some older templates may still incorrectly use `ports` and should be updated to use `expose` instead.
   - Use persistent volumes for data storage (e.g., `- db-data:/var/lib/postgresql/data`). 
   - Services named after folder (e.g., `ghost` service).
+  - **One-shot Migration Containers**: For database migrations or one-time initialization tasks, use `restart: 'no'` to ensure containers run only once on startup. Example:
+    ```yaml
+    migrations:
+      image: ghcr.io/simstudioai/migrations:latest
+      command: ['bun', 'run', 'db:migrate']
+      restart: 'no'
+      depends_on:
+        db:
+          condition: service_healthy
+    ```
+  - **Health Check Dependencies**: Use `condition: service_healthy` or `condition: service_completed_successfully` in `depends_on` clauses to control startup order. This ensures dependent services are ready before starting:
+    - `service_healthy`: Wait for health check to pass (e.g., database ready before migrations run)
+    - `service_completed_successfully`: Wait for container to finish successfully (e.g., migrations complete before main app starts)
+    ```yaml
+    depends_on:
+      db:
+        condition: service_healthy
+      migrations:
+        condition: service_completed_successfully
+    ```
+  - **Resource Limits**: For memory-intensive applications (AI workloads, large databases, image processing), set memory limits using `deploy.resources.limits.memory`:
+    ```yaml
+    deploy:
+      resources:
+        limits:
+          memory: 8G
+    ```
+  - **Multi-Service Architecture**: For applications requiring separate WebSocket/realtime services:
+    - Use internal service-to-service URLs for backend communication (e.g., `SOCKET_SERVER_URL=http://realtime:3002`)
+    - Expose public-facing URLs via template variables (e.g., `NEXT_PUBLIC_SOCKET_URL=https://${main_domain}`)
+    - This pattern allows services to communicate internally while presenting a unified external interface
 - **template.toml**:
   - Variables: `[variables] main_domain = "${domain}"`; use helpers for secrets (`${password:64}`, `${base64:32}`).
   - Domains: `[[config.domains]] serviceName = "<service>" port = 80 host = "${main_domain}"` (path="/" optional).

[Accept] [Decline]

Note: You must be authenticated to accept/decline updates.

How did I do? Any feedback?  Join Discord

Copy link
Copy Markdown
Author

@trfi trfi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed

@trfi
Copy link
Copy Markdown
Author

trfi commented Mar 25, 2026

The dedupe-and-sort-meta.js script (required by CONTRIBUTING.md) detected and removed a pre-existing duplicate strapi entry from the upstream meta.json.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new-template size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant