Skip to content

Conversation

@naps62
Copy link
Member

@naps62 naps62 commented Jan 7, 2026

No description provided.

@vercel
Copy link

vercel bot commented Jan 7, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
stacks Ready Ready Preview, Comment Jan 8, 2026 0:04am

@naps62 naps62 marked this pull request as ready for review January 8, 2026 12:02
Copilot AI review requested due to automatic review settings January 8, 2026 12:02
@naps62 naps62 merged commit db15e41 into main Jan 8, 2026
3 checks passed
@naps62 naps62 deleted the dokploy branch January 8, 2026 12:05
Copy link
Contributor

Copilot AI left a 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.

Comment on lines +28 to +33
- "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'
Copy link

Copilot AI Jan 8, 2026

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.

Suggested change
- "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'

Copilot uses AI. Check for mistakes.
Comment on lines +28 to +33
- "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'
Copy link

Copilot AI Jan 8, 2026

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.

Suggested change
- "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'

Copilot uses AI. Check for mistakes.
volumes:
- data:/data
- /var/run/docker.sock:/var/run/docker.sock
- data:/data
Copy link

Copilot AI Jan 8, 2026

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.

Suggested change
- data:/data

Copilot uses AI. Check for mistakes.
Comment on lines +26 to +31
- "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$`)'
Copy link

Copilot AI Jan 8, 2026

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.

Suggested change
- "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`)'

Copilot uses AI. Check for mistakes.
Comment on lines +26 to +31
- "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$`)'
Copy link

Copilot AI Jan 8, 2026

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.

Suggested change
- "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`)'

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants