@@ -327,6 +327,13 @@ resource "coder_agent" "main" {
327327 bash .devcontainer/post-start.sh || echo "⚠️ Post-start script had issues"
328328 fi
329329
330+ # Start VNC server for browser testing
331+ echo "🖥️ Starting VNC server..."
332+ if [ -x /usr/local/bin/start-vnc ]; then
333+ /usr/local/bin/start-vnc &
334+ echo "✅ VNC server started on port 6080"
335+ fi
336+
330337 echo "✅ Workspace ready!"
331338 echo ""
332339 echo "Quick start commands:"
@@ -336,6 +343,8 @@ resource "coder_agent" "main" {
336343 echo "Or from app directories:"
337344 echo " Frontend: cd apps/frontend && npm start"
338345 echo " Backend: cd apps/backend && ./mvnw spring-boot:run"
346+ echo ""
347+ echo "VNC Browser: https://${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -vnc.dev.simpleaccounts.io/vnc.html"
339348 EOT
340349
341350 # Display apps (for web access)
@@ -457,6 +466,24 @@ resource "coder_app" "swagger" {
457466 share = " owner"
458467}
459468
469+ # VNC Browser for UI testing and preview
470+ # Always enabled - useful for Playwright tests and visual debugging
471+ resource "coder_app" "vnc" {
472+ agent_id = coder_agent. main . id
473+ slug = " vnc"
474+ display_name = " VNC Browser"
475+ icon = " /icon/desktop.svg"
476+ url = " http://localhost:6080/vnc.html?autoconnect=true"
477+ subdomain = true
478+ share = " owner"
479+
480+ healthcheck {
481+ url = " http://localhost:6080"
482+ interval = 10
483+ threshold = 20
484+ }
485+ }
486+
460487# Main workspace container
461488resource "docker_container" "workspace" {
462489 # Use pre-built image for fast startup
@@ -629,6 +656,22 @@ resource "docker_container" "workspace" {
629656 value = " 8080"
630657 }
631658
659+ # VNC routing (port 6080)
660+ labels {
661+ label = " traefik.http.routers.${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -vnc.rule"
662+ value = " Host(`${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -vnc.dev.simpleaccounts.io`)"
663+ }
664+
665+ labels {
666+ label = " traefik.http.routers.${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -vnc.service"
667+ value = " ${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -vnc"
668+ }
669+
670+ labels {
671+ label = " traefik.http.services.${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -vnc.loadbalancer.server.port"
672+ value = " 6080"
673+ }
674+
632675 # Depend on database containers and host directory setup
633676 depends_on = [
634677 docker_container . postgres ,
@@ -659,6 +702,11 @@ resource "coder_metadata" "workspace_info" {
659702 value = " https://${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -api.dev.simpleaccounts.io"
660703 }
661704
705+ item {
706+ key = " vnc_url"
707+ value = " https://${ data . coder_workspace_owner . me . name } -${ data . coder_workspace . me . name } -vnc.dev.simpleaccounts.io/vnc.html"
708+ }
709+
662710 item {
663711 key = " postgres_host"
664712 value = " db:5432"
0 commit comments