- Redesigned scheduler to use separate short-lived sessions for lock operations - Lock acquisition and release now use independent database connections - Each scheduled action processed in its own transaction to minimize lock time - Error handling isolates failed actions to prevent blocking others - Re-enabled scheduler with optimized locking strategy Key improvements: - acquire_scheduler_lock() uses own connection, disposes immediately - release_scheduler_lock() uses own connection, disposes immediately - process_single_scheduled_action() uses transaction-per-action approach - Prevents long-running transactions that were blocking web requests russell@unturf.com is the boss
124 lines
3.9 KiB
YAML
124 lines
3.9 KiB
YAML
stages:
|
|
- deploy
|
|
|
|
variables:
|
|
APP_NAME: "upload.unturf.com"
|
|
APP_DIR: "/opt/${APP_NAME}"
|
|
VENV_DIR: "${APP_DIR}/venv"
|
|
CADDYFILE_DIR: "/etc/caddy"
|
|
CADDY_SNIPPETS_DIR: "/etc/caddy/caddy_snippets"
|
|
|
|
deploy:
|
|
stage: deploy
|
|
tags:
|
|
- master.unturf.com
|
|
only:
|
|
- main # Adjust if you want to deploy from other branches
|
|
script:
|
|
# Step 1: Define variables with substitutions
|
|
- |
|
|
# Variables with substitutions must be defined in the script section
|
|
SERVICE_NAME="uwsgi-${APP_NAME//./-}.service" # Replace dots with dashes
|
|
UWSGI_SOCKET="${APP_DIR}/uwsgi.sock" # Place socket in app directory
|
|
|
|
# Step 2: Synchronize the code to the application directory
|
|
- |
|
|
if [ ! -d "${APP_DIR}" ]; then
|
|
mkdir -p "${APP_DIR}"
|
|
fi
|
|
rsync -a --exclude=data/ --exclude=venv/ --delete "${CI_PROJECT_DIR}/" "${APP_DIR}/"
|
|
|
|
# Step 3: Set up Python virtual environment and install dependencies
|
|
- |
|
|
if [ ! -d "${VENV_DIR}" ]; then
|
|
python3 -m venv "${VENV_DIR}"
|
|
fi
|
|
source "${VENV_DIR}/bin/activate"
|
|
pip install --upgrade pip
|
|
pip install -r "${APP_DIR}/requirements.txt"
|
|
|
|
# Step 4: Install uWSGI in virtual environment
|
|
- |
|
|
source "${VENV_DIR}/bin/activate"
|
|
pip install uwsgi
|
|
|
|
# Step 5: Create or update the systemd user service file for uWSGI
|
|
- |
|
|
mkdir -p ~/.config/systemd/user/
|
|
|
|
# Determine the correct module and callable for your application
|
|
# Adjust 'app:app' based on your application's entry point
|
|
# For example, if your main application file is 'app.py' and the Flask app is named 'app', use 'app:app'
|
|
|
|
# If your application entry point is different, adjust accordingly
|
|
# For example, if your main file is 'wsgi.py' and the callable is 'application', use 'wsgi:application'
|
|
|
|
# Set the MODULE variable based on your application's entry point
|
|
MODULE="app:uwsgi_app" # Adjust this based on your application
|
|
|
|
cat > ~/.config/systemd/user/${SERVICE_NAME} <<EOF
|
|
[Unit]
|
|
Description=uWSGI instance to serve ${APP_NAME}
|
|
After=network.target
|
|
|
|
[Service]
|
|
WorkingDirectory=${APP_DIR}
|
|
Environment="PATH=${VENV_DIR}/bin"
|
|
ExecStart=${VENV_DIR}/bin/uwsgi \\
|
|
--master \\
|
|
--enable-threads \\
|
|
--processes 4 \\
|
|
--http-socket ${UWSGI_SOCKET} \\
|
|
--chmod-socket=660 \\
|
|
--chown-socket=gitlab-runner:caddy \\
|
|
--vacuum \\
|
|
--die-on-term \\
|
|
--chdir ${APP_DIR} \\
|
|
--logto2 ${APP_DIR}/uwsgi.log \\
|
|
--module ${MODULE}
|
|
|
|
Restart=always
|
|
KillSignal=SIGQUIT
|
|
Type=notify
|
|
NotifyAccess=all
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
EOF
|
|
|
|
# Step 6: Reload systemd user daemon and restart the uWSGI service
|
|
- systemctl --user daemon-reload
|
|
- systemctl --user restart ${SERVICE_NAME}
|
|
- systemctl --user enable ${SERVICE_NAME}
|
|
|
|
# Step 7: Handle Caddy configurations
|
|
- |
|
|
# Create Caddy snippets directory if it doesn't exist
|
|
mkdir -p "${CADDY_SNIPPETS_DIR}"
|
|
|
|
# Write the application's Caddy configuration to its own snippet file
|
|
cat > "${CADDY_SNIPPETS_DIR}/${APP_NAME}.caddy" <<EOF
|
|
${APP_NAME} {
|
|
encode gzip
|
|
tls {
|
|
on_demand
|
|
}
|
|
handle {
|
|
reverse_proxy unix//${UWSGI_SOCKET}
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Concatenate all snippets into the main Caddyfile
|
|
echo '# Main Caddyfile - concatenated snippets' > "${CADDYFILE_DIR}/Caddyfile"
|
|
cat "${CADDY_SNIPPETS_DIR}"/*.caddy >> "${CADDYFILE_DIR}/Caddyfile"
|
|
|
|
# Validate the Caddyfile
|
|
caddy validate --config "${CADDYFILE_DIR}/Caddyfile"
|
|
|
|
# Step 8: Reload Caddy service, gitlab-runner is in sudoers.
|
|
# gitlab-runner ALL=(ALL) NOPASSWD: /bin/systemctl * caddy.service
|
|
- sudo /bin/systemctl restart caddy.service
|
|
|
|
# Deployment completed
|
|
- echo "Deployment completed successfully."
|