diff --git a/start.sh b/start.sh index d651406..98759ed 100644 --- a/start.sh +++ b/start.sh @@ -637,24 +637,33 @@ import ( func main() { port := "8080" - log.Println("Starting mock Ente API server on port", port) + fmt.Println("Starting mock Ente API server on port", port) log.Println("This is a standalone mock server that doesn't require any Ente modules") // Log some environment variables for debugging - log.Println("Environment variables:") - log.Println("PGHOST:", os.Getenv("PGHOST")) - log.Println("PGPORT:", os.Getenv("PGPORT")) - log.Println("API_ENDPOINT:", os.Getenv("ENTE_API_ENDPOINT")) + fmt.Println("Environment variables:") + fmt.Println("PGHOST:", os.Getenv("PGHOST")) + fmt.Println("PGPORT:", os.Getenv("PGPORT")) + fmt.Println("API_ENDPOINT:", os.Getenv("ENTE_API_ENDPOINT")) // Create a logger that logs to both stdout and a file os.MkdirAll("/app/data/logs", 0755) // Ensure the logs directory exists logFile, err := os.OpenFile("/app/data/logs/api_requests.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - log.Printf("Error opening log file: %v", err) + fmt.Printf("Error opening log file: %v\n", err) } - defer logFile.Close() + defer func() { + if logFile != nil { + logFile.Close() + } + }() - multiWriter := io.MultiWriter(os.Stdout, logFile) + var multiWriter io.Writer + if logFile != nil { + multiWriter = io.MultiWriter(os.Stdout, logFile) + } else { + multiWriter = os.Stdout + } logger := log.New(multiWriter, "", log.LstdFlags) // Initialize random seed @@ -701,6 +710,7 @@ func main() { // Return a success response w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) // Use the encoding/json package to create and send the response jsonResponse := map[string]string{ @@ -815,7 +825,9 @@ func main() { logger.Printf("Mock Ente API server listening on port %s\n", port) // Make sure we listen on all interfaces, not just localhost + fmt.Printf("Starting HTTP server on 0.0.0.0:%s\n", port) if err := http.ListenAndServe("0.0.0.0:" + port, nil); err != nil { + fmt.Printf("Server failed: %v\n", err) logger.Fatalf("Server failed: %v", err) } } @@ -958,24 +970,33 @@ import ( func main() { port := "8081" - log.Println("Starting mock Public Albums API server on port", port) + fmt.Println("Starting mock Public Albums API server on port", port) log.Println("This is a standalone mock server that doesn't require any Ente modules") // Log some environment variables for debugging - log.Println("Environment variables:") - log.Println("PGHOST:", os.Getenv("PGHOST")) - log.Println("PGPORT:", os.Getenv("PGPORT")) - log.Println("API_ENDPOINT:", os.Getenv("ENTE_API_ENDPOINT")) + fmt.Println("Environment variables:") + fmt.Println("PGHOST:", os.Getenv("PGHOST")) + fmt.Println("PGPORT:", os.Getenv("PGPORT")) + fmt.Println("API_ENDPOINT:", os.Getenv("ENTE_API_ENDPOINT")) // Create a logger that logs to both stdout and a file os.MkdirAll("/app/data/logs", 0755) // Ensure the logs directory exists logFile, err := os.OpenFile("/app/data/logs/public_api_requests.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - log.Printf("Error opening log file: %v", err) + fmt.Printf("Error opening log file: %v\n", err) } - defer logFile.Close() + defer func() { + if logFile != nil { + logFile.Close() + } + }() - multiWriter := io.MultiWriter(os.Stdout, logFile) + var multiWriter io.Writer + if logFile != nil { + multiWriter = io.MultiWriter(os.Stdout, logFile) + } else { + multiWriter = os.Stdout + } logger := log.New(multiWriter, "", log.LstdFlags) http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { @@ -1004,6 +1025,9 @@ func main() { w.Header().Set("Content-Type", "application/json") + // Use fmt.Fprintf to explicitly use the fmt package + fmt.Fprintf(w, "{\"status\":\"processing\"}") + // Use json package to create the response response := map[string]string{ "status": "mock", @@ -1018,7 +1042,9 @@ func main() { logger.Printf("Mock Public Albums API server listening on port %s\n", port) // Make sure we listen on all interfaces + fmt.Printf("Starting Public Albums HTTP server on 0.0.0.0:%s\n", port) if err := http.ListenAndServe("0.0.0.0:" + port, nil); err != nil { + fmt.Printf("Public Albums server failed: %v\n", err) logger.Fatalf("Server failed: %v", err) } } @@ -1054,24 +1080,33 @@ import ( func main() { port := "8081" - log.Println("Starting mock Public Albums API server on port", port) + fmt.Println("Starting mock Public Albums API server on port", port) log.Println("This is a standalone mock server that doesn't require any Ente modules") // Log some environment variables for debugging - log.Println("Environment variables:") - log.Println("PGHOST:", os.Getenv("PGHOST")) - log.Println("PGPORT:", os.Getenv("PGPORT")) - log.Println("API_ENDPOINT:", os.Getenv("ENTE_API_ENDPOINT")) + fmt.Println("Environment variables:") + fmt.Println("PGHOST:", os.Getenv("PGHOST")) + fmt.Println("PGPORT:", os.Getenv("PGPORT")) + fmt.Println("API_ENDPOINT:", os.Getenv("ENTE_API_ENDPOINT")) // Create a logger that logs to both stdout and a file os.MkdirAll("/app/data/logs", 0755) // Ensure the logs directory exists logFile, err := os.OpenFile("/app/data/logs/public_api_requests.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { - log.Printf("Error opening log file: %v", err) + fmt.Printf("Error opening log file: %v\n", err) } - defer logFile.Close() + defer func() { + if logFile != nil { + logFile.Close() + } + }() - multiWriter := io.MultiWriter(os.Stdout, logFile) + var multiWriter io.Writer + if logFile != nil { + multiWriter = io.MultiWriter(os.Stdout, logFile) + } else { + multiWriter = os.Stdout + } logger := log.New(multiWriter, "", log.LstdFlags) http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { @@ -1100,6 +1135,9 @@ func main() { w.Header().Set("Content-Type", "application/json") + // Use fmt.Fprintf to explicitly use the fmt package + fmt.Fprintf(w, "{\"status\":\"processing\"}") + // Use json package to create the response response := map[string]string{ "status": "mock", @@ -1114,7 +1152,9 @@ func main() { logger.Printf("Mock Public Albums API server listening on port %s\n", port) // Make sure we listen on all interfaces + fmt.Printf("Starting Public Albums HTTP server on 0.0.0.0:%s\n", port) if err := http.ListenAndServe("0.0.0.0:" + port, nil); err != nil { + fmt.Printf("Public Albums server failed: %v\n", err) logger.Fatalf("Server failed: %v", err) } } @@ -1224,11 +1264,6 @@ cat > /app/data/caddy/Caddyfile < /app/data/caddy/Caddyfile < + + + + + + {http.vars.head_content} + + + {http.vars.body_content} + +" + } + } + + # Main photos app - rewrite to use the index-with-config handle / { root * /app/web/photos - try_files {path} /index.html - file_server - - # Dynamically inject our configuration script - header * +Link "; rel=preload; as=script" - header * +Link "; rel=preload; as=script" - header ?index.html +Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src *" - # Add script injection as HTML filter - filter { - search_pattern - replacement + # Rewrite index.html to include our config + @isroot { + path / + } + + # For other files just serve them directly + file_server + + # Special handling for index.html to inject scripts + handle @isroot { + rewrite * /index-with-config.html + vars { + head_content "" + body_content "" + } + reverse_proxy http://localhost:$CADDY_PORT { + header_up Host {host} + } } } @@ -1271,45 +1335,72 @@ cat > /app/data/caddy/Caddyfile < - replacement + @is_index { + path /accounts/ + path /accounts/index.html } + header @is_index Content-Type text/html + respond @is_index 200 {file}/app/data/web/accounts/index.html + + @not_index { + not path /accounts/ + not path /accounts/index.html + } + uri strip_prefix /accounts + root @not_index /app/web/accounts + file_server @not_index } # Auth app + handle /auth { + header Content-Type text/html + respond 200 {file}/app/data/web/auth/index.html + } + handle /auth/* { - root * /app/web/auth - uri strip_prefix /auth - try_files {path} /index.html - file_server - - # Dynamically inject our configuration script for auth app - filter ?index.html { - search_pattern - replacement + @is_index { + path /auth/ + path /auth/index.html } + header @is_index Content-Type text/html + respond @is_index 200 {file}/app/data/web/auth/index.html + + @not_index { + not path /auth/ + not path /auth/index.html + } + uri strip_prefix /auth + root @not_index /app/web/auth + file_server @not_index } # Cast app + handle /cast { + header Content-Type text/html + respond 200 {file}/app/data/web/cast/index.html + } + handle /cast/* { - root * /app/web/cast - uri strip_prefix /cast - try_files {path} /index.html - file_server - - # Dynamically inject our configuration script for cast app - filter ?index.html { - search_pattern - replacement + @is_index { + path /cast/ + path /cast/index.html } + header @is_index Content-Type text/html + respond @is_index 200 {file}/app/data/web/cast/index.html + + @not_index { + not path /cast/ + not path /cast/index.html + } + uri strip_prefix /cast + root @not_index /app/web/cast + file_server @not_index } # Main API proxy @@ -1345,8 +1436,7 @@ cat > /app/data/caddy/Caddyfile < Created Caddy config with dynamic script injection at /app/data/caddy/Caddyfile" -echo "==> No longer trying to modify read-only HTML files" +echo "==> Created Caddy config with static HTML files at /app/data/caddy/Caddyfile" # Start Caddy server echo "==> Starting Caddy server"