From 1c34047f7521b338b234390c2411e1976b8ff46d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20D=C3=BCren?= Date: Sun, 16 Mar 2025 23:05:14 +0100 Subject: [PATCH] Fix Caddy port configuration and improve connectivity testing --- start.sh | 467 ++++++++++++++++++++++++------------------------------- 1 file changed, 199 insertions(+), 268 deletions(-) diff --git a/start.sh b/start.sh index 94e8323..90b754e 100644 --- a/start.sh +++ b/start.sh @@ -228,7 +228,173 @@ window.ENTE_CONFIG = { console.log("Ente config loaded, API_URL =", window.ENTE_CONFIG.API_URL); EOT -# Set up Caddy server +# Runtime configuration +echo "==> Setting up direct runtime configuration" + +# Global API endpoint +API_ENDPOINT="${CLOUDRON_APP_ORIGIN}/api" +echo "==> Setting API endpoint to $API_ENDPOINT" + +# Create runtime configuration files +mkdir -p /app/data/runtime +echo "==> Creating runtime configuration files" + +# Create a config script +cat > /app/data/runtime/config.js < Attempting to directly modify web app HTML files" +WEB_APPS=("/app/web/photos" "/app/web/accounts" "/app/web/auth" "/app/web/cast") + +for app_dir in "${WEB_APPS[@]}"; do + if [ -f "$app_dir/index.html" ]; then + echo "==> Processing $app_dir/index.html" + + # Create a backup copy in our data directory + mkdir -p "/app/data/original/$(basename $app_dir)" + cp "$app_dir/index.html" "/app/data/original/$(basename $app_dir)/index.html" + + # Create a modified version of the file in our data directory + mkdir -p "/app/data/modified/$(basename $app_dir)" + cp "$app_dir/index.html" "/app/data/modified/$(basename $app_dir)/index.html" + + # Insert our configuration script into the head section + sed -i 's|||' "/app/data/modified/$(basename $app_dir)/index.html" + + # Try to replace the original file (may fail if read-only) + if cp "/app/data/modified/$(basename $app_dir)/index.html" "$app_dir/index.html" 2>/dev/null; then + echo "==> Successfully modified $app_dir/index.html" + else + echo "==> Could not modify $app_dir/index.html (read-only filesystem)" + fi + else + echo "==> Skipping $app_dir - index.html not found" + fi +done + +# Second approach: Create a modified copy that Caddy will serve +mkdir -p /app/data/public +cp /app/data/runtime/config.js /app/data/public/ +echo "==> Created public configuration script" + +# Create a loading page for each app with configuration +for app_name in "photos" "accounts" "auth" "cast"; do + cat > "/app/data/public/${app_name}-config.html" < + + + + Loading ${app_name} + + + + +

Loading ${app_name}...

+

If you are not redirected automatically, click here.

+

Debug Information

+ + +EOT +done + +# Create root index.html that loads config and redirects +cat > /app/data/public/index.html < + + + + Ente + + + + +

Loading Ente...

+

You will be redirected automatically.

+

Debug Information

+ + +EOT + +echo "==> Created special root index.html with configuration" + +# Check port availability before starting services +echo "==> Checking port availability" +CADDY_PORT=3080 +API_PORT=8080 + +# Check if ports are already in use +if lsof -i:$CADDY_PORT > /dev/null 2>&1; then + echo "==> WARNING: Port $CADDY_PORT is already in use" + echo "===> Process using port $CADDY_PORT:" + lsof -i:$CADDY_PORT +else + echo "==> Port $CADDY_PORT is available for Caddy" +fi + +if lsof -i:$API_PORT > /dev/null 2>&1; then + echo "==> WARNING: Port $API_PORT is already in use" + echo "===> Process using port $API_PORT:" + lsof -i:$API_PORT +else + echo "==> Port $API_PORT is available for API server" +fi + +# Set up Caddy echo "==> Setting up Caddy server for web apps" mkdir -p /app/data/caddy/public cat > /app/data/caddy/Caddyfile < /app/data/caddy/Caddyfile < /app/data/caddy/Caddyfile < Caddy configuration created at /app/data/caddy/Caddyfile" -# Create HTML transformer script to modify all index.html files on load -mkdir -p /app/data/scripts -cat > /app/data/scripts/insert-config.sh <||' "/app/data/temp.html" - - # Create a symlink from the modified file to the original - # Only if the temp file was created and modified successfully - if [ -f "/app/data/temp.html" ]; then - mkdir -p "/app/data/transformed/\$(basename \$app_dir)" - cp "/app/data/temp.html" "/app/data/transformed/\$(basename \$app_dir)/index.html" - fi - fi -done - -echo "All index.html files processed" -EOT -chmod +x /app/data/scripts/insert-config.sh - -# Run the transformer script to create modified index.html files -mkdir -p /app/data/transformed -echo "==> Creating modified index.html files with injected configuration" -/app/data/scripts/insert-config.sh - -# Create direct configuration files for different frameworks -mkdir -p /app/data/public -echo "==> Creating framework-specific configuration files" - -# Create a Next.js public runtime configuration -cat > /app/data/public/env.js < /app/data/public/config.json < "/app/data/public/${app_name}-config.html" < - - - - Loading ${app_name} - - - - -

Loading ${app_name}...

-

If you are not redirected automatically, click here.

-

Debug Information

- - -EOT -done - -echo "==> Created app-specific config loading pages with debug info" - -# Looking for Museum (Go server component) -echo "==> Looking for Museum (Go server component)" - -# Find the server directory - expanded search -SERVER_DIR="" - -# Look in all the most likely places -if [ -d "/app/code/server" ]; then - echo "==> Found server directory at /app/code/server" - SERVER_DIR="/app/code/server" -elif [ -d "/app/code/museum" ]; then - echo "==> Found server directory at /app/code/museum" - SERVER_DIR="/app/code/museum" -fi - -# If not found yet, try to find it based on Go files -if [ -z "$SERVER_DIR" ]; then - echo "==> Searching for Go server files in the repository" - - # Look for cmd/museum path which is mentioned in docs - if find /app/code -path "*/cmd/museum" -type d | grep -q .; then - MUSEUM_DIR=$(find /app/code -path "*/cmd/museum" -type d | head -1) - echo "==> Found Museum command directory at $MUSEUM_DIR" - SERVER_DIR=$(dirname $(dirname "$MUSEUM_DIR")) - echo "==> Setting server directory to $SERVER_DIR" - # Look for main.go files in areas that might be server-related - elif find /app/code -name "main.go" -path "*/server*" | grep -q .; then - MAIN_GO=$(find /app/code -name "main.go" -path "*/server*" | head -1) - SERVER_DIR=$(dirname "$MAIN_GO") - echo "==> Found main.go in $SERVER_DIR" - # Look for any Go files with "museum" in the path - elif find /app/code -name "*.go" -path "*/museum*" | grep -q .; then - MUSEUM_GO=$(find /app/code -name "*.go" -path "*/museum*" | head -1) - SERVER_DIR=$(dirname "$MUSEUM_GO") - echo "==> Found Go file in museum directory: $SERVER_DIR" - # Last resort - look for any main.go file - elif find /app/code -name "main.go" | grep -v "test" | grep -q .; then - MAIN_GO=$(find /app/code -name "main.go" | grep -v "test" | head -1) - SERVER_DIR=$(dirname "$MAIN_GO") - echo "==> Found main.go as fallback: $SERVER_DIR" - fi -fi - -# If still not found, check the 'cli' directory as it might be a client for the Museum -if [ -z "$SERVER_DIR" ] && [ -d "/app/code/cli" ]; then - echo "==> Checking CLI directory for Museum server code" - if find /app/code/cli -name "*.go" | grep -q .; then - SERVER_DIR="/app/code/cli" - echo "==> Using CLI directory as fallback for server: $SERVER_DIR" - fi -fi - -# If all else fails, just use the root -if [ -z "$SERVER_DIR" ]; then - echo "==> WARNING: Could not find server directory with Go files" - echo "==> Using repository root as fallback" - SERVER_DIR="/app/code" -fi - -echo "==> Selected server directory: $SERVER_DIR" -echo "==> Contents of $SERVER_DIR:" -ls -la "$SERVER_DIR" - -# Check for server dependencies -echo "==> Installing Go dependencies" -if [ -x "$(command -v go)" ]; then - echo "==> Go is installed, version: $(go version)" - # Check go.mod version requirement and modify if needed - GO_VERSION=$(go version | cut -d " " -f 3 | sed 's/go//') - echo "==> Current Go version: $GO_VERSION" - if [ -f "$SERVER_DIR/go.mod" ]; then - REQUIRED_VERSION=$(grep -o "go [0-9]\+\.[0-9]\+" "$SERVER_DIR/go.mod" | cut -d " " -f 2) - echo "==> Required Go version: $REQUIRED_VERSION" - - # Don't try to modify the go.mod file since filesystem is read-only - # Instead, use environment variables to override version requirements - echo "==> Setting Go flags to override version requirements" - export GOFLAGS="-modfile=/app/data/go/go.mod -mod=mod" - export GO111MODULE=on - export GOTOOLCHAIN=local - fi -else - echo "==> Installing Go" - apt-get update && apt-get install -y golang -fi - -# Skip trying to install specific Go versions since we can't modify /app/code -echo "==> Using existing Go toolchain with compatibility flags" - -# Check for libsodium -if dpkg -l | grep -q libsodium; then - echo "==> libsodium is installed" -else - echo "==> Installing libsodium" - apt-get update && apt-get install -y libsodium23 libsodium-dev -fi - -# Check for pkg-config -if [ -x "$(command -v pkg-config)" ]; then - echo "==> pkg-config is installed" -else - echo "==> Installing pkg-config" - apt-get update && apt-get install -y pkg-config -fi - -# Change to server directory -cd "$SERVER_DIR" - -# Set Go module cache to a writable location -export GOPATH=/app/data/go -export GO111MODULE=on -# Use local toolchain to avoid downloading required version -export GOTOOLCHAIN=local - -# Ensure go.mod is in the writable directory -if [ ! -f "/app/data/go/go.mod" ] && [ -f "$SERVER_DIR/go.mod" ]; then - echo "==> Copying go.mod and go.sum to writable location" - mkdir -p /app/data/go - cp -f "$SERVER_DIR/go.mod" "$SERVER_DIR/go.sum" /app/data/go/ || echo "==> Warning: Could not copy go.mod/go.sum" - chmod 666 /app/data/go/go.mod /app/data/go/go.sum || echo "==> Warning: Could not set permissions" -fi - -# Create proper directories with correct permissions -mkdir -p /app/data/go/cache /app/data/go/pkg/mod /app/data/go/bin -chmod -R 777 /app/data/go -chown -R cloudron:cloudron /app/data/go - -# Override version requirements and force module mode -export GOFLAGS="-modfile=/app/data/go/go.mod -mod=mod -modcacherw" - -# Create a temporary directory for Go module cache and build in writable area -export GOCACHE=/app/data/go/cache -export GOMODCACHE=/app/data/go/pkg/mod -mkdir -p $GOCACHE $GOMODCACHE -echo "==> Set up Go environment in writable directories" - -# Set up more verbose logging for API debugging -export ENTE_LOG_LEVEL=debug - # Start Caddy first before the Museum server to ensure port 3080 is available for health checks echo "==> Setting up Caddy before starting the Museum server" -echo "==> Caddy will be listening on port 3080" -echo "==> Testing if port 3080 is already in use" -if netstat -tuln | grep -q ":3080 "; then - echo "==> WARNING: Port 3080 is already in use, Caddy may fail to start" - netstat -tuln | grep ":3080 " -else - echo "==> Port 3080 is available" -fi +echo "==> Caddy will be listening on port $CADDY_PORT" # Only set permissions on the Caddy directory, not the web directory which is read-only -mkdir -p /app/data/caddy/logs -chmod -R 755 /app/data/caddy +mkdir -p /app/data/caddy +chmod -R 777 /app/data/caddy chown -R cloudron:cloudron /app/data/caddy -# Start Caddy -echo "==> Starting Caddy" +# Start Caddy server +echo "==> Starting Caddy server..." caddy run --config /app/data/caddy/Caddyfile --adapter caddyfile & CADDY_PID=$! echo "==> Caddy started with PID $CADDY_PID" -# Check if Caddy started successfully +# Wait a moment for Caddy to start sleep 2 -if ! ps -p $CADDY_PID > /dev/null; then - echo "==> ERROR: Caddy failed to start" - echo "==> Any logs available:" - if [ -f "/app/data/caddy/caddy.log" ]; then - cat /app/data/caddy/caddy.log + +# Test Caddy connectivity +echo "==> Testing Caddy connectivity on port $CADDY_PORT" +for i in {1..5}; do + if curl -s --max-time 2 --head --fail http://localhost:$CADDY_PORT/health > /dev/null; then + echo "==> Caddy is running properly on port $CADDY_PORT" + break else - echo "No Caddy logs available yet" + if [ $i -eq 5 ]; then + echo "==> Failed to connect to Caddy on port $CADDY_PORT after multiple attempts" + echo "==> Last 20 lines of Caddy log:" + tail -20 /app/data/caddy/caddy.log || echo "==> No Caddy log available" + echo "==> Network ports in use:" + netstat -tuln || echo "==> netstat command not available" + echo "==> Processes listening on ports:" + lsof -i -P -n | grep LISTEN || echo "==> lsof command not available" + else + echo "==> Attempt $i: Waiting for Caddy to start... (1 second)" + sleep 1 + fi fi -else - echo "==> Caddy is running properly on port 3080" - echo "==> Testing Caddy connectivity" - curl -v http://localhost:3080/healthcheck || echo "==> Failed to connect to Caddy" -fi +done # Determine available memory and set limits accordingly if [[ -f /sys/fs/cgroup/cgroup.controllers ]]; then # cgroup v2