Spaces:
Building
Building
set -e | |
echo "Starting Dify services..." | |
# Database connection check based on type | |
if [ "${DATABASE_TYPE}" = "sqlite" ]; then | |
echo "Using SQLite database at ${SQLITE_PATH}" | |
# Ensure directory exists | |
mkdir -p $(dirname "${SQLITE_PATH}") | |
touch "${SQLITE_PATH}" | |
else | |
# Enhanced PostgreSQL connection check with timeout | |
check_postgres() { | |
local max_attempts=30 | |
local attempt=1 | |
while [ $attempt -le $max_attempts ]; do | |
echo "Checking PostgreSQL connection to ${DB_HOST}:${DB_PORT} (attempt $attempt/$max_attempts)..." | |
if pg_isready -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USERNAME}" -d "${DB_DATABASE}"; then | |
return 0 | |
fi | |
attempt=$((attempt + 1)) | |
sleep 5 | |
done | |
return 1 | |
} | |
# Try to connect with timeout | |
if ! check_postgres; then | |
echo "Failed to connect to PostgreSQL, falling back to SQLite..." | |
export DATABASE_TYPE="sqlite" | |
mkdir -p $(dirname "${SQLITE_PATH}") | |
touch "${SQLITE_PATH}" | |
fi | |
fi | |
check_redis() { | |
redis-cli -h "${REDIS_HOST}" -p "${REDIS_PORT}" -a "${REDIS_PASSWORD}" ping > /dev/null 2>&1 | |
} | |
echo "Waiting for Redis to be ready..." | |
until check_redis; do | |
echo "Redis is unavailable (host: ${REDIS_HOST}, port: ${REDIS_PORT}) - retrying..." | |
sleep 5 | |
done | |
echo "Redis is ready!" | |
# Initialize database if needed | |
cd /app/api | |
if [ ! -f ".db_initialized" ]; then | |
echo "Running database migrations..." | |
flask db upgrade | |
if [ $? -eq 0 ]; then | |
touch .db_initialized | |
echo "Database initialization completed successfully" | |
else | |
echo "Database initialization failed" | |
exit 1 | |
fi | |
fi | |
# Start services | |
echo "Starting API server on port 7860..." | |
gunicorn --bind 0.0.0.0:7860 \ | |
--workers 1 \ | |
--worker-class gevent \ | |
--timeout 200 \ | |
--preload \ | |
app:app & | |
# Start Next.js web server | |
cd /app/web | |
echo "Starting Next.js server on port 3000..." | |
# Ensure standalone directory exists | |
if [ ! -d ".next/standalone" ]; then | |
echo "Error: Next.js standalone build not found" | |
exit 1 | |
fi | |
# Copy static files if they exist | |
if [ -d ".next/static" ]; then | |
mkdir -p .next/standalone/.next | |
cp -r .next/static .next/standalone/.next/ | |
fi | |
# Copy public files if they exist | |
if [ -d "public" ]; then | |
cp -r public .next/standalone/ | |
fi | |
cd .next/standalone | |
echo "Starting Next.js standalone server..." | |
NODE_ENV=production \ | |
NEXT_TELEMETRY_DISABLED=1 \ | |
node server.js & | |
# Wait for both processes | |
wait |