Deployment of puzzle.unturf.com

This commit is contained in:
Russell Ballestrini 2025-03-17 01:09:19 +00:00
parent 62c974323b
commit 793b041c2c
2 changed files with 127 additions and 2 deletions

124
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,124 @@
stages:
- deploy
variables:
APP_NAME: "puzzle.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
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."

5
app.py
View file

@ -1279,9 +1279,10 @@ def main(global_config=None, **settings):
return config.make_wsgi_app()
uwsgi_app = main()
if __name__ == "__main__":
app = main()
host = os.environ.get("PYRAPUZZLE_HOST", "0.0.0.0")
port = int(os.environ.get("PYRAPUZZLE_PORT", 6543))
print(f"Serving on http://{host}:{port}")
serve(app, host=host, port=port)
serve(uwsgi_app, host=host, port=port)