#!/bin/sh # Dev entrypoint - runs all services with hot-reload set -e PUID=${PUID:-1000} PGID=${PGID:-1000} if [ "$(id -u)" = "0" ]; then if [ "$PUID" != "1000" ] || [ "$PGID" != "1000" ]; then deluser node 2>/dev/null || true delgroup node 2>/dev/null || true addgroup -g "$PGID" -S node adduser -S -u "$PUID" -G node -h /home/node -s /bin/sh node fi # Fix data dir ownership chown "$PUID:$PGID" /app/data 2>/dev/null || true chown "$PUID:$PGID" /app/data/requests.db* 2>/dev/null || true # Install/update deps as root (named volumes are root-owned) cd /app/proxy && go mod download cd /app/svelte && npm install --loglevel=warn 2>&1 || true cd /app # Fix ownership on everything the node user needs to write to chown -R "$PUID:$PGID" /app/svelte/node_modules 2>/dev/null || true # Pre-create .svelte-kit and fix ownership so vite dev can write type definitions mkdir -p /app/svelte/.svelte-kit/types chown -R "$PUID:$PGID" /app/svelte/.svelte-kit /app/svelte/build 2>/dev/null || true # Ensure Go cache/tmp dirs are writable by the node user # Use a dedicated dir for the proxy binary so CompileDaemon can overwrite it mkdir -p /home/node/.cache/go-build /tmp/go-build /tmp/proxy-bin chown -R "$PUID:$PGID" /home/node/.cache /tmp/go-build /tmp/proxy-bin /go/pkg 2>/dev/null || true # Re-exec this script as the node user exec su-exec "$PUID:$PGID" "$0" "$@" fi echo "=== DEV MODE (uid=$(id -u)) ===" echo "Proxy Server: http://0.0.0.0:${PORT} (CompileDaemon hot-reload)" echo "Svelte Dashboard: http://0.0.0.0:${SVELTE_PORT} (vite HMR)" echo "================" cleanup() { echo "Shutting down dev services..." kill $PROXY_PID $SVELTE_PID 2>/dev/null || true exit 0 } trap cleanup SIGTERM SIGINT # Start Go proxy with CompileDaemon for hot-reload cd /app/proxy HOME=/home/node CompileDaemon -build="go build -o /tmp/proxy-bin/proxy cmd/proxy/main.go" -command="/tmp/proxy-bin/proxy" -graceful-kill=true -graceful-timeout=10 -pattern="(.+\\.go|.+\\.yaml)$" & PROXY_PID=$! cd /app # Wait for Go proxy to be ready (up to 120s for first compile) echo "Waiting for proxy to be ready..." i=0 while [ $i -lt 120 ]; do if wget -qO /dev/null "http://localhost:${PORT}/health" 2>/dev/null; then echo "Proxy is ready!" break fi sleep 2 i=$((i + 2)) done if [ $i -ge 120 ]; then echo "Warning: proxy not ready after 120s, starting frontends anyway" fi # Start SvelteKit dev server (Vite HMR) cd /app/svelte PORT=${SVELTE_PORT} HOST=0.0.0.0 DASHBOARD_PASSWORD="${DASHBOARD_PASSWORD}" npm run dev -- --host 0.0.0.0 --port ${SVELTE_PORT} & SVELTE_PID=$! cd /app echo "" echo "All dev services started. Watching for file changes..." echo "" wait