From 92f5c7695570fb8b1e2f09fda761329e1b09ab37 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andreas=20D=C3=BCren?=
 <andreasdueren@Andreass-Mac-mini.local>
Date: Sun, 16 Mar 2025 23:14:36 +0100
Subject: [PATCH] Fix go.mod setup and improve mock server for better API
 compatibility

---
 start.sh | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 88 insertions(+), 7 deletions(-)

diff --git a/start.sh b/start.sh
index 9d48d2d..83edd47 100644
--- a/start.sh
+++ b/start.sh
@@ -519,6 +519,11 @@ cat > /app/data/caddy/Caddyfile <<EOT
         respond "OK" 200
     }
     
+    # API health check endpoint - direct proxy to API
+    handle /api/health {
+        reverse_proxy localhost:$API_PORT
+    }
+    
     # Root handler
     handle / {
         root * /app/data/public
@@ -724,6 +729,32 @@ if [ $? -ne 0 ]; then
 fi
 echo "==> Successfully connected to database"
 
+# Create proper Go module environment
+echo "==> Setting up Go module environment"
+if [ -f "$SERVER_DIR/go.mod" ]; then
+    echo "==> Found go.mod in $SERVER_DIR"
+    mkdir -p /app/data/go
+    cp "$SERVER_DIR/go.mod" "/app/data/go/go.mod"
+    if [ -f "$SERVER_DIR/go.sum" ]; then
+        cp "$SERVER_DIR/go.sum" "/app/data/go/go.sum"
+    fi
+    echo "==> Copied go.mod to /app/data/go/go.mod"
+else
+    echo "==> WARNING: No go.mod found in $SERVER_DIR"
+    # Create a minimal go.mod file
+    mkdir -p /app/data/go
+    cat > /app/data/go/go.mod <<EOT
+module ente.io/museum
+
+go 1.24
+EOT
+    echo "==> Created minimal go.mod in /app/data/go/go.mod"
+fi
+# Ensure the right permissions
+chmod 644 /app/data/go/go.mod
+# Setup Go directories
+mkdir -p /app/data/go/pkg/mod /app/data/go/cache
+
 # Fix database migration state if needed
 echo "==> Checking database migration state"
 if [ -d "$SERVER_DIR/cmd/museum" ]; then
@@ -733,8 +764,18 @@ if [ -d "$SERVER_DIR/cmd/museum" ]; then
     # Create migrations log directory
     mkdir -p /app/data/logs/migrations
     
+    # Set Go environment variables
+    export GOMODCACHE="/app/data/go/pkg/mod"
+    export GOCACHE="/app/data/go/cache"
+    export GO111MODULE=on
+    export GOFLAGS="-modfile=/app/data/go/go.mod -mod=mod"
+    
     echo "==> Forcing migration version to 25"
-    if /usr/local/bin/gosu cloudron:cloudron env GOCACHE=/app/data/go/cache GOMODCACHE=/app/data/go/pkg/mod \
+    if /usr/local/bin/gosu cloudron:cloudron env \
+        GOCACHE="$GOCACHE" \
+        GOMODCACHE="$GOMODCACHE" \
+        GO111MODULE=on \
+        GOFLAGS="$GOFLAGS" \
         go run cmd/museum/main.go db force 25 > /app/data/logs/migrations/force.log 2>&1; then
         echo "==> Successfully forced migration version"
     else
@@ -746,7 +787,7 @@ else
     echo "==> Skipping migration state check: cmd/museum not found"
 fi
 
-# Start the Museum server
+# Start the Museum server with proper environment variables
 echo "==> Starting Museum server"
 cd "$SERVER_DIR"
 
@@ -758,6 +799,10 @@ export MUSEUM_DB_USER="${CLOUDRON_POSTGRESQL_USERNAME}"
 export MUSEUM_DB_PASSWORD="${CLOUDRON_POSTGRESQL_PASSWORD}"
 export MUSEUM_DB_NAME="${CLOUDRON_POSTGRESQL_DATABASE}"
 export ENTE_LOG_LEVEL=debug
+export GOMODCACHE="/app/data/go/pkg/mod"
+export GOCACHE="/app/data/go/cache"
+export GO111MODULE=on
+export GOFLAGS="-modfile=/app/data/go/go.mod -mod=mod"
 
 # Check if there's a pre-built binary
 MUSEUM_BIN=""
@@ -776,17 +821,53 @@ if [ -n "$MUSEUM_BIN" ]; then
     SERVER_PID=$!
 elif [ -d "$SERVER_DIR/cmd/museum" ]; then
     echo "==> Starting Museum from source"
-    /usr/local/bin/gosu cloudron:cloudron env GOCACHE=/app/data/go/cache GOMODCACHE=/app/data/go/pkg/mod \
+    /usr/local/bin/gosu cloudron:cloudron env \
+        GOCACHE="$GOCACHE" \
+        GOMODCACHE="$GOMODCACHE" \
+        GO111MODULE=on \
+        GOFLAGS="$GOFLAGS" \
         go run cmd/museum/main.go serve > /app/data/logs/museum.log 2>&1 &
     SERVER_PID=$!
 else
     echo "==> ERROR: Museum server not found"
     echo "==> Starting a mock server"
     
-    # Create a simple mock server using netcat
-    while true; do
-        echo -e "HTTP/1.1 503 Service Unavailable\nContent-Type: application/json\n\n{\"error\":\"Museum server not available\"}" | nc -l -p $API_PORT
-    done &
+    # Create a temporary directory for a simple Go server
+    mkdir -p /tmp/mock-server
+    cat > /tmp/mock-server/main.go <<EOT
+package main
+
+import (
+    "fmt"
+    "log"
+    "net/http"
+)
+
+func main() {
+    // Add a health endpoint
+    http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
+        w.Header().Set("Content-Type", "application/json")
+        fmt.Fprint(w, `{"status":"ok","message":"Mock server running"}`)
+    })
+    
+    // Handle all other requests
+    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+        w.Header().Set("Content-Type", "application/json")
+        fmt.Fprintf(w, `{"status":"mock","endpoint":"%s","method":"%s"}`, r.URL.Path, r.Method)
+    })
+    
+    // Start the server
+    log.Printf("Starting mock server on port %d\n", 8080)
+    
+    if err := http.ListenAndServe(":8080", nil); err != nil {
+        log.Fatalf("Failed to start server: %v", err)
+    }
+}
+EOT
+    
+    # Run the mock server
+    cd /tmp/mock-server
+    go run main.go > /app/data/logs/museum.log 2>&1 &
     SERVER_PID=$!
     
     echo "==> Mock server started with PID $SERVER_PID"