141 lines
5.0 KiB
Bash
141 lines
5.0 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
# Function for logging
|
|
log() {
|
|
echo "$(date +"%Y-%m-%d %H:%M:%S"): $1"
|
|
}
|
|
|
|
log "Starting Resgrid Cloudron App..."
|
|
|
|
# Initialize data directory if it's the first run
|
|
if [ ! -f /app/data/config/.initialized ]; then
|
|
log "First run detected, initializing data directory..."
|
|
|
|
# Copy initial configuration files if they don't exist
|
|
if [ ! -f /app/data/config/resgrid.env ]; then
|
|
log "Creating initial configuration..."
|
|
|
|
# Generate random keys and passwords
|
|
ADMIN_PASSWORD=$(openssl rand -base64 12)
|
|
DB_PASSWORD=${CLOUDRON_MYSQL_PASSWORD}
|
|
API_KEY=$(openssl rand -hex 32)
|
|
|
|
# Create environment configuration from template
|
|
export RESGRID_ADMIN_PASSWORD=$ADMIN_PASSWORD
|
|
export RESGRID_DB_PASSWORD=$DB_PASSWORD
|
|
export RESGRID_API_KEY=$API_KEY
|
|
export RESGRID_DB_HOST=${CLOUDRON_MYSQL_HOST}
|
|
export RESGRID_DB_PORT=${CLOUDRON_MYSQL_PORT}
|
|
export RESGRID_DB_USER=${CLOUDRON_MYSQL_USERNAME}
|
|
export RESGRID_DB_NAME=${CLOUDRON_MYSQL_DATABASE}
|
|
export RESGRID_REDIS_HOST=${CLOUDRON_REDIS_HOST}
|
|
export RESGRID_REDIS_PORT=${CLOUDRON_REDIS_PORT}
|
|
export RESGRID_REDIS_PASSWORD=${CLOUDRON_REDIS_PASSWORD}
|
|
export RESGRID_RABBITMQ_HOST=${CLOUDRON_RABBITMQ_HOST}
|
|
export RESGRID_RABBITMQ_PORT=${CLOUDRON_RABBITMQ_PORT}
|
|
export RESGRID_RABBITMQ_USER=${CLOUDRON_RABBITMQ_USERNAME}
|
|
export RESGRID_RABBITMQ_PASSWORD=${CLOUDRON_RABBITMQ_PASSWORD}
|
|
export RESGRID_RABBITMQ_VHOST=${CLOUDRON_RABBITMQ_VHOST}
|
|
export RESGRID_BASE_URL="https://${CLOUDRON_APP_DOMAIN}"
|
|
export RESGRID_API_URL="https://${CLOUDRON_APP_DOMAIN}/api"
|
|
export RESGRID_EVENTS_URL="https://${CLOUDRON_APP_DOMAIN}/events"
|
|
|
|
# OIDC Configuration for Cloudron
|
|
export RESGRID_OIDC_ENABLED="true"
|
|
export RESGRID_OIDC_CLIENT_ID=${CLOUDRON_OIDC_CLIENT_ID}
|
|
export RESGRID_OIDC_CLIENT_SECRET=${CLOUDRON_OIDC_CLIENT_SECRET}
|
|
export RESGRID_OIDC_AUTHORITY=${CLOUDRON_OIDC_ISSUER}
|
|
export RESGRID_OIDC_CALLBACK_PATH="/api/v1/session/callback"
|
|
|
|
# Process the template
|
|
envsubst < /app/code/resgrid.env.template > /app/data/config/resgrid.env
|
|
|
|
log "Initial configuration created successfully."
|
|
fi
|
|
|
|
# Mark as initialized
|
|
touch /app/data/config/.initialized
|
|
log "Initialization completed successfully."
|
|
fi
|
|
|
|
# Link configuration files to expected locations
|
|
ln -sf /app/data/config/resgrid.env /app/code/resgrid.env
|
|
ln -sf /app/code/nginx.conf /etc/nginx/sites-available/default
|
|
|
|
# Ensure uploads directory exists with correct permissions
|
|
mkdir -p /app/data/uploads
|
|
chmod 755 /app/data/uploads
|
|
|
|
# Wait for database to be ready
|
|
log "Waiting for MySQL database to be ready..."
|
|
until nc -z ${CLOUDRON_MYSQL_HOST} ${CLOUDRON_MYSQL_PORT}; do
|
|
log "MySQL is unavailable - sleeping for 5 seconds"
|
|
sleep 5
|
|
done
|
|
log "MySQL is available, continuing..."
|
|
|
|
# Wait for Redis to be ready
|
|
log "Waiting for Redis to be ready..."
|
|
until nc -z ${CLOUDRON_REDIS_HOST} ${CLOUDRON_REDIS_PORT}; do
|
|
log "Redis is unavailable - sleeping for 5 seconds"
|
|
sleep 5
|
|
done
|
|
log "Redis is available, continuing..."
|
|
|
|
# Wait for RabbitMQ to be ready
|
|
log "Waiting for RabbitMQ to be ready..."
|
|
until nc -z ${CLOUDRON_RABBITMQ_HOST} ${CLOUDRON_RABBITMQ_PORT}; do
|
|
log "RabbitMQ is unavailable - sleeping for 5 seconds"
|
|
sleep 5
|
|
done
|
|
log "RabbitMQ is available, continuing..."
|
|
|
|
# Pull Resgrid Docker images
|
|
log "Pulling Resgrid Docker images..."
|
|
docker pull resgridllc/resgridwebcore:${RESGRID_VERSION}
|
|
docker pull resgridllc/resgridwebservices:${RESGRID_VERSION}
|
|
docker pull resgridllc/resgridworkersconsole:${RESGRID_VERSION}
|
|
docker pull resgridllc/resgridwebevents:${RESGRID_VERSION}
|
|
|
|
# Create Docker network if it doesn't exist
|
|
docker network create resgrid-network 2>/dev/null || true
|
|
|
|
# Run the containers with environment variables from the config file
|
|
log "Starting Resgrid containers..."
|
|
source /app/data/config/resgrid.env
|
|
|
|
# Start API Service
|
|
docker run -d --name resgrid-api \
|
|
--restart unless-stopped \
|
|
--network resgrid-network \
|
|
-p 8001:80 \
|
|
--env-file /app/data/config/resgrid.env \
|
|
resgridllc/resgridwebservices:${RESGRID_VERSION}
|
|
|
|
# Start Web Core
|
|
docker run -d --name resgrid-web \
|
|
--restart unless-stopped \
|
|
--network resgrid-network \
|
|
-p 8002:80 \
|
|
--env-file /app/data/config/resgrid.env \
|
|
resgridllc/resgridwebcore:${RESGRID_VERSION}
|
|
|
|
# Start Events Service
|
|
docker run -d --name resgrid-events \
|
|
--restart unless-stopped \
|
|
--network resgrid-network \
|
|
-p 8003:80 \
|
|
--env-file /app/data/config/resgrid.env \
|
|
resgridllc/resgridwebevents:${RESGRID_VERSION}
|
|
|
|
# Start Workers Console
|
|
docker run -d --name resgrid-workers \
|
|
--restart unless-stopped \
|
|
--network resgrid-network \
|
|
--env-file /app/data/config/resgrid.env \
|
|
resgridllc/resgridworkersconsole:${RESGRID_VERSION}
|
|
|
|
# Start supervisord to manage Nginx and other processes
|
|
log "Starting supervisord..."
|
|
exec /usr/bin/supervisord -c /app/code/supervisord.conf |