-
Notifications
You must be signed in to change notification settings - Fork 0
migrating to dokploy #63
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR migrates the deployment infrastructure from a custom DigitalOcean deployment workflow to Dokploy with Traefik-based routing. The changes remove the old CI/CD deployment pipeline and introduce a new Docker Compose configuration for SaaS deployments with automatic SSL certificate management.
- Removes custom GitHub Actions deployment workflows (docker-publish and deploy jobs)
- Introduces a new compose.saas.yml for Dokploy-based deployments with Traefik routing
- Updates server configuration to bind to all network interfaces instead of conditionally binding to localhost
Reviewed changes
Copilot reviewed 4 out of 5 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| server/config/runtime.exs | Simplifies IP binding to always use 0.0.0.0 instead of conditionally using 127.0.0.1 for SaaS mode |
| server/Dockerfile | Updates FROM clause to use uppercase AS keyword (best practice) and adds blank line for formatting |
| compose.saas.yml | New Docker Compose configuration for SaaS deployments with Traefik labels for wildcard subdomain routing and SSL |
| .github/workflows/ci.yml | Removes docker-publish and deploy jobs as deployment is now handled by Dokploy |
Comments suppressed due to low confidence (1)
compose.saas.yml:58
- A network named 'ethui-stacks' is defined but is not actually used by any service in this compose file. The server service should be configured to use this network, otherwise the network definition serves no purpose.
Add a 'networks' section to the server service configuration to use the defined network.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | ||
|
|
||
| # ssl support for *.stacks.ethui.dev | ||
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | ||
| - 'traefik.http.routers.ethui-stacks-secure.entrypoints=websecure' | ||
| - 'traefik.http.routers.ethui-stacks-secure.service=ethui-stacks-hkdbss-1-web' |
Copilot
AI
Jan 8, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The hardcoded service name 'ethui-stacks-hkdbss-1-web' in the Traefik labels appears to be specific to a particular Dokploy deployment instance. This identifier is typically auto-generated by Dokploy and may differ across deployments. Using a hardcoded value could cause routing to fail if the actual service name generated by Dokploy doesn't match this pattern.
Consider using Traefik's service discovery or a more generic service reference that will work regardless of the Dokploy-generated identifier.
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | |
| - 'traefik.http.routers.ethui-stacks-secure.entrypoints=websecure' | |
| - 'traefik.http.routers.ethui-stacks-secure.service=ethui-stacks-hkdbss-1-web' | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | |
| - 'traefik.http.routers.ethui-stacks-secure.entrypoints=websecure' |
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | ||
|
|
||
| # ssl support for *.stacks.ethui.dev | ||
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | ||
| - 'traefik.http.routers.ethui-stacks-secure.entrypoints=websecure' | ||
| - 'traefik.http.routers.ethui-stacks-secure.service=ethui-stacks-hkdbss-1-web' |
Copilot
AI
Jan 8, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The hardcoded service name 'ethui-stacks-hkdbss-1-web' in the Traefik labels appears to be specific to a particular Dokploy deployment instance. This identifier is typically auto-generated by Dokploy and may differ across deployments. Using a hardcoded value could cause routing to fail if the actual service name generated by Dokploy doesn't match this pattern.
Consider using Traefik's service discovery or a more generic service reference that will work regardless of the Dokploy-generated identifier.
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | |
| - 'traefik.http.routers.ethui-stacks-secure.entrypoints=websecure' | |
| - 'traefik.http.routers.ethui-stacks-secure.service=ethui-stacks-hkdbss-1-web' | |
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-web" | |
| - "traefik.http.services.ethui-stacks-web.loadbalancer.server.port=4000" | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | |
| - 'traefik.http.routers.ethui-stacks-secure.entrypoints=websecure' | |
| - 'traefik.http.routers.ethui-stacks-secure.service=ethui-stacks-web' |
| volumes: | ||
| - data:/data | ||
| - /var/run/docker.sock:/var/run/docker.sock | ||
| - data:/data |
Copilot
AI
Jan 8, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are two potentially conflicting volume mounts for data directories. The environment variable DATA_ROOT is set to '/data' which maps to the named volume 'data:/data', but there's also a bind mount './server/data:/app/data'. This could lead to confusion about where data is actually stored or result in data being split across multiple locations.
Verify which data directory should be used and remove the unnecessary volume mount. If DATA_ROOT=/data is correct, the './server/data:/app/data' mount may not be needed.
| - data:/data |
| - "traefik.http.routers.ethui-stacks.rule=HostRegexp(`^[a-z0-9-]+\\.stacks\\.ethui\\.dev$`)" | ||
| - "traefik.http.routers.ethui-stacks.entrypoints=web" | ||
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | ||
|
|
||
| # ssl support for *.stacks.ethui.dev | ||
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' |
Copilot
AI
Jan 8, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The HostRegexp pattern uses backticks as delimiters which may not be the correct syntax for Traefik v2/v3. Modern Traefik versions typically use parentheses for HostRegexp patterns like 'HostRegexp({subdomain:[a-z0-9-]+}.stacks.ethui.dev)' or use the Host matcher with regex.
Verify this syntax is correct for your Traefik version. The pattern may need to be adjusted to match Traefik's expected syntax.
| - "traefik.http.routers.ethui-stacks.rule=HostRegexp(`^[a-z0-9-]+\\.stacks\\.ethui\\.dev$`)" | |
| - "traefik.http.routers.ethui-stacks.entrypoints=web" | |
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | |
| - "traefik.http.routers.ethui-stacks.rule=HostRegexp(`{subdomain:[a-z0-9-]+}.stacks.ethui.dev`)" | |
| - "traefik.http.routers.ethui-stacks.entrypoints=web" | |
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`{subdomain:[a-z0-9-]+}.stacks.ethui.dev`)' |
| - "traefik.http.routers.ethui-stacks.rule=HostRegexp(`^[a-z0-9-]+\\.stacks\\.ethui\\.dev$`)" | ||
| - "traefik.http.routers.ethui-stacks.entrypoints=web" | ||
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | ||
|
|
||
| # ssl support for *.stacks.ethui.dev | ||
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' |
Copilot
AI
Jan 8, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The HostRegexp pattern uses backticks as delimiters which may not be the correct syntax for Traefik v2/v3. Modern Traefik versions typically use parentheses for HostRegexp patterns like 'HostRegexp({subdomain:[a-z0-9-]+}.stacks.ethui.dev)' or use the Host matcher with regex.
Verify this syntax is correct for your Traefik version. The pattern may need to be adjusted to match Traefik's expected syntax.
| - "traefik.http.routers.ethui-stacks.rule=HostRegexp(`^[a-z0-9-]+\\.stacks\\.ethui\\.dev$`)" | |
| - "traefik.http.routers.ethui-stacks.entrypoints=web" | |
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`^[a-z0-9-]+\.stacks\.ethui\.dev$`)' | |
| - "traefik.http.routers.ethui-stacks.rule=HostRegexp(`{subdomain:[a-z0-9-]+}.stacks.ethui.dev`)" | |
| - "traefik.http.routers.ethui-stacks.entrypoints=web" | |
| - "traefik.http.routers.ethui-stacks.service=ethui-stacks-hkdbss-1-web" | |
| # ssl support for *.stacks.ethui.dev | |
| - 'traefik.http.routers.ethui-stacks-secure.rule=HostRegexp(`{subdomain:[a-z0-9-]+}.stacks.ethui.dev`)' |
No description provided.