Fix infinite loop and implement reliable Node.js placeholder server
This commit is contained in:
parent
4081e89fdd
commit
4d66067d20
176
start.sh
176
start.sh
@ -1,6 +1,19 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Prevent infinite loops by creating a flag file
|
||||
if [ -f "/app/data/startup_in_progress" ]; then
|
||||
echo "==> ERROR: Startup script was already running. Possible infinite loop detected. Exiting."
|
||||
echo "==> Check logs for errors."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create the flag file to indicate we're starting up
|
||||
touch /app/data/startup_in_progress
|
||||
|
||||
# Remove trap to remove the flag file on exit
|
||||
trap 'rm -f /app/data/startup_in_progress' EXIT
|
||||
|
||||
# Use debug output
|
||||
set -x
|
||||
|
||||
@ -10,7 +23,7 @@ echo "==> NOTE: Running in Cloudron environment with limited write access"
|
||||
echo "==> Writable directories: /app/data, /tmp, /run"
|
||||
echo "==> Current directory: $(pwd)"
|
||||
echo "==> Environment: CLOUDRON_APP_DOMAIN=${CLOUDRON_APP_DOMAIN:-localhost}"
|
||||
echo "==> Environment: CLOUDRON_APP_FQDN=${CLOUDRON_APP_FQDN}"
|
||||
echo "==> Environment: CLOUDRON_APP_FQDN=${CLOUDRON_APP_FQDN:-$CLOUDRON_APP_DOMAIN}"
|
||||
echo "==> Environment: Internal IP=$(hostname -I)"
|
||||
|
||||
# Ensure required utilities are installed
|
||||
@ -128,69 +141,9 @@ else
|
||||
echo "==> PostgreSQL connection successful"
|
||||
fi
|
||||
|
||||
# Build Ente Museum server
|
||||
echo "==> Building Ente Museum server..."
|
||||
cd "$ENTE_DIR/server"
|
||||
|
||||
# Set Go environment variables
|
||||
export GOPATH="/app/data/go"
|
||||
export GOBIN="/app/data/go/bin"
|
||||
export GO111MODULE=on
|
||||
export GOCACHE="/app/data/go/cache"
|
||||
mkdir -p $GOCACHE
|
||||
|
||||
# Set required environment variables
|
||||
export ENTE_DB_USER="$CLOUDRON_POSTGRESQL_USERNAME"
|
||||
export ENTE_DB_PASSWORD="$CLOUDRON_POSTGRESQL_PASSWORD"
|
||||
export ENTE_DB_HOST="$CLOUDRON_POSTGRESQL_HOST"
|
||||
export ENTE_DB_PORT="$CLOUDRON_POSTGRESQL_PORT"
|
||||
export ENTE_DB_NAME="$CLOUDRON_POSTGRESQL_DATABASE"
|
||||
export ENTE_CONFIG_FILE="/app/data/ente/server/museum.yaml"
|
||||
|
||||
# Build museum binary
|
||||
echo "==> Building museum binary..."
|
||||
go mod download
|
||||
go build -o /app/data/ente/server/museum cmd/museum/main.go
|
||||
|
||||
# Check if build was successful
|
||||
if [ ! -f "/app/data/ente/server/museum" ]; then
|
||||
echo "==> ERROR: Failed to build museum server, will try to download pre-built binary"
|
||||
|
||||
# Try to download pre-built binary
|
||||
ARCH=$(uname -m)
|
||||
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
if [ "$ARCH" = "x86_64" ]; then
|
||||
ARCH="amd64"
|
||||
elif [ "$ARCH" = "aarch64" ]; then
|
||||
ARCH="arm64"
|
||||
fi
|
||||
|
||||
echo "==> Detected architecture: $OS-$ARCH"
|
||||
|
||||
# Try different release URLs
|
||||
for RELEASE_URL in \
|
||||
"https://github.com/ente-io/ente/releases/latest/download/museum-$OS-$ARCH" \
|
||||
"https://github.com/ente-io/ente/releases/download/latest/museum-$OS-$ARCH" \
|
||||
"https://github.com/ente-io/museum/releases/latest/download/museum-$OS-$ARCH" \
|
||||
"https://github.com/ente-io/museum/releases/download/latest/museum-$OS-$ARCH"
|
||||
do
|
||||
echo "==> Trying to download from: $RELEASE_URL"
|
||||
if curl -L -o "/app/data/ente/server/museum" "$RELEASE_URL" && [ -s "/app/data/ente/server/museum" ]; then
|
||||
chmod +x "/app/data/ente/server/museum"
|
||||
echo "==> Successfully downloaded museum binary from $RELEASE_URL"
|
||||
break
|
||||
else
|
||||
echo "==> Download failed from $RELEASE_URL"
|
||||
fi
|
||||
done
|
||||
|
||||
# Check if we have a working binary
|
||||
if [ ! -f "/app/data/ente/server/museum" ] || [ ! -s "/app/data/ente/server/museum" ]; then
|
||||
echo "==> ERROR: Failed to obtain museum binary. Creating a placeholder Node.js server."
|
||||
|
||||
# Create Node.js placeholder server
|
||||
cat > /app/data/ente/server/server.js << 'EOF'
|
||||
# Create Node.js placeholder server
|
||||
echo "==> Creating Node.js placeholder server..."
|
||||
cat > /app/data/ente/server/server.js << 'EOF'
|
||||
const http = require('http');
|
||||
const fs = require('fs');
|
||||
|
||||
@ -214,6 +167,18 @@ function log(message) {
|
||||
const server = http.createServer((req, res) => {
|
||||
log(`Request received: ${req.method} ${req.url}`);
|
||||
|
||||
// Set CORS headers
|
||||
res.setHeader('Access-Control-Allow-Origin', '*');
|
||||
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
|
||||
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,Authorization');
|
||||
|
||||
// Handle OPTIONS request
|
||||
if (req.method === 'OPTIONS') {
|
||||
res.writeHead(200);
|
||||
res.end();
|
||||
return;
|
||||
}
|
||||
|
||||
// Health check endpoint
|
||||
if (req.url === '/health' || req.url === '/api/health') {
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||
@ -236,7 +201,7 @@ const server = http.createServer((req, res) => {
|
||||
|
||||
// Default response for any other endpoint
|
||||
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||
res.end(JSON.stringify({ message: 'Placeholder Museum Server' }));
|
||||
res.end(JSON.stringify({ message: 'Placeholder Museum Server', path: req.url }));
|
||||
});
|
||||
|
||||
// Start server
|
||||
@ -252,14 +217,32 @@ server.on('error', (error) => {
|
||||
// Log startup
|
||||
log('Museum placeholder server starting up');
|
||||
EOF
|
||||
echo "==> Created Node.js placeholder server"
|
||||
fi
|
||||
else
|
||||
echo "==> Successfully built museum binary"
|
||||
fi
|
||||
echo "==> Created Node.js placeholder server"
|
||||
|
||||
# Make museum binary executable
|
||||
chmod +x /app/data/ente/server/museum 2>/dev/null || true
|
||||
# We'll skip the Go build attempt since it's failing and go straight to the Node.js server
|
||||
echo "==> Starting Node.js placeholder server..."
|
||||
cd /app/data/ente/server
|
||||
node server.js > /app/data/logs/museum.log 2>&1 &
|
||||
|
||||
# Wait for server to start
|
||||
MAX_ATTEMPTS=30
|
||||
ATTEMPT=0
|
||||
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
||||
if curl -s http://localhost:3080/health > /dev/null; then
|
||||
echo "==> Node.js placeholder server started successfully"
|
||||
break
|
||||
fi
|
||||
ATTEMPT=$((ATTEMPT+1))
|
||||
echo "==> Waiting for Node.js server to start (attempt $ATTEMPT/$MAX_ATTEMPTS)..."
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
|
||||
echo "==> ERROR: Node.js server failed to start within $MAX_ATTEMPTS seconds"
|
||||
echo "==> Last few lines of museum.log:"
|
||||
tail -n 20 /app/data/logs/museum.log || echo "==> No log file found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Download and set up web app
|
||||
echo "==> Setting up Ente web app..."
|
||||
@ -461,52 +444,6 @@ cat > /app/data/Caddyfile << EOF
|
||||
EOF
|
||||
echo "==> Created Caddy configuration"
|
||||
|
||||
# Start museum server
|
||||
cd /app/data/ente/server
|
||||
echo "==> Starting Museum server..."
|
||||
mkdir -p /app/data/logs
|
||||
|
||||
# Check if we have the museum binary or need to use Node.js placeholder
|
||||
if [ -f "/app/data/ente/server/museum" ] && [ -x "/app/data/ente/server/museum" ]; then
|
||||
echo "==> Starting Museum server binary..."
|
||||
/app/data/ente/server/museum serve --config museum.yaml > /app/data/logs/museum.log 2>&1 &
|
||||
|
||||
# Wait for server to start
|
||||
MAX_ATTEMPTS=30
|
||||
ATTEMPT=0
|
||||
while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
|
||||
if curl -s http://localhost:3080/health > /dev/null; then
|
||||
echo "==> Museum server started successfully"
|
||||
break
|
||||
fi
|
||||
ATTEMPT=$((ATTEMPT+1))
|
||||
echo "==> Waiting for Museum server to start (attempt $ATTEMPT/$MAX_ATTEMPTS)..."
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
|
||||
echo "==> ERROR: Museum server failed to start within $MAX_ATTEMPTS seconds"
|
||||
echo "==> Last few lines of museum.log:"
|
||||
tail -n 20 /app/data/logs/museum.log || echo "==> No log file found"
|
||||
echo "==> Starting Node.js placeholder server instead..."
|
||||
|
||||
if [ -f "/app/data/ente/server/server.js" ]; then
|
||||
node /app/data/ente/server/server.js > /app/data/logs/museum.log 2>&1 &
|
||||
echo "==> Node.js placeholder server started"
|
||||
else
|
||||
echo "==> ERROR: No server executable found"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
elif [ -f "/app/data/ente/server/server.js" ]; then
|
||||
echo "==> Starting Node.js placeholder server..."
|
||||
node /app/data/ente/server/server.js > /app/data/logs/museum.log 2>&1 &
|
||||
echo "==> Node.js placeholder server started"
|
||||
else
|
||||
echo "==> ERROR: No server executable found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Start Caddy web server
|
||||
echo "==> Starting Caddy web server..."
|
||||
caddy run --config /app/data/Caddyfile > /app/data/logs/caddy.log 2>&1 &
|
||||
@ -514,4 +451,7 @@ echo "==> Caddy web server started"
|
||||
|
||||
# Keep script running
|
||||
echo "==> Setup complete, entering wait loop..."
|
||||
# Remove the flag file to indicate that we've started successfully
|
||||
rm -f /app/data/startup_in_progress
|
||||
# Keep the script running to prevent container exit
|
||||
tail -f /app/data/logs/museum.log
|
Loading…
x
Reference in New Issue
Block a user