mirror of
https://github.com/m1ngsama/automa.git
synced 2026-03-26 02:33:50 +00:00
- services/forgejo/deploy.sh: deploys Forgejo via Docker to /opt/frp,
sets up nginx vhost, optionally installs GitHub mirror sync cron
- services/forgejo/{.env.example,docker-compose.yml,nginx.conf.example}:
bundled templates following find_template pattern (INFRA_DIR override)
- services/nginx/deploy.sh: fix bare envsubst clobbering nginx $vars
(e.g. $host, $uri) by scoping substitution to known domain vars only
67 lines
2.6 KiB
Bash
Executable file
67 lines
2.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Deploys Forgejo (self-hosted git) via Docker on a VPS.
|
|
# Usage: INFRA_DIR=/path/to/infra/services/forgejo ./deploy.sh
|
|
|
|
set -euo pipefail
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$SCRIPT_DIR/../../bin/lib/common.sh"
|
|
|
|
ENV_FILE="${INFRA_DIR:-.}/.env"
|
|
[ -f "$ENV_FILE" ] || { log_error "No .env found at $ENV_FILE"; exit 1; }
|
|
set -a; source "$ENV_FILE"; set +a
|
|
|
|
require_env GIT_DOMAIN
|
|
require_command docker "https://docs.docker.com/engine/install/"
|
|
|
|
find_template() {
|
|
local f="$1"
|
|
if [[ -n "${INFRA_DIR:-}" && -f "${INFRA_DIR}/$f" ]]; then
|
|
echo "${INFRA_DIR}/$f"
|
|
elif [[ -f "$SCRIPT_DIR/$f" ]]; then
|
|
echo "$SCRIPT_DIR/$f"
|
|
else
|
|
log_error "Template not found: $f"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
DEPLOY_DIR="/opt/forgejo"
|
|
log_info "Creating deploy directory $DEPLOY_DIR..."
|
|
mkdir -p "$DEPLOY_DIR/data"
|
|
|
|
log_info "Deploying docker-compose.yml..."
|
|
cp "$(find_template docker-compose.yml)" "$DEPLOY_DIR/docker-compose.yml"
|
|
|
|
log_info "Starting Forgejo container..."
|
|
docker compose -f "$DEPLOY_DIR/docker-compose.yml" up -d
|
|
|
|
log_info "Deploying nginx vhost for ${GIT_DOMAIN}..."
|
|
envsubst '${GIT_DOMAIN}' < "$(find_template nginx.conf.example)" > "/etc/nginx/sites-available/forgejo"
|
|
ln -sf /etc/nginx/sites-available/forgejo /etc/nginx/sites-enabled/forgejo
|
|
nginx -t
|
|
systemctl reload nginx
|
|
|
|
# Optional: set up GitHub mirror sync cron
|
|
if [[ -n "${GITHUB_USER:-}" && -n "${GITHUB_TOKEN:-}" && -n "${FORGEJO_URL:-}" && -n "${FORGEJO_TOKEN:-}" ]]; then
|
|
SYNC_SCRIPT="$(find_template migrate_github_to_forgejo.py 2>/dev/null || true)"
|
|
if [[ -n "$SYNC_SCRIPT" ]]; then
|
|
log_info "Installing GitHub mirror sync script..."
|
|
cp "$SYNC_SCRIPT" "$DEPLOY_DIR/migrate_github_to_forgejo.py"
|
|
mkdir -p "$DEPLOY_DIR/logs"
|
|
|
|
CRON_LINE="0 3 * * * cd $DEPLOY_DIR && GITHUB_USER=${GITHUB_USER} GITHUB_TOKEN=${GITHUB_TOKEN} FORGEJO_URL=${FORGEJO_URL} FORGEJO_TOKEN=${FORGEJO_TOKEN} python3 migrate_github_to_forgejo.py >> $DEPLOY_DIR/logs/mirror-sync.log 2>&1"
|
|
(crontab -l 2>/dev/null | grep -v "migrate_github_to_forgejo"; echo "$CRON_LINE") | crontab -
|
|
log_info "Cron sync installed (daily 03:00)"
|
|
else
|
|
log_warn "migrate_github_to_forgejo.py not found in INFRA_DIR — skipping cron setup"
|
|
fi
|
|
else
|
|
log_info "GitHub sync vars not set — skipping cron setup"
|
|
fi
|
|
|
|
log_info "Forgejo deployed at http://localhost:3000"
|
|
echo ""
|
|
echo "Remaining manual steps:"
|
|
echo " 1. Get TLS cert: certbot --nginx -d ${GIT_DOMAIN}"
|
|
echo " 2. Complete Forgejo initial setup at https://${GIT_DOMAIN}"
|
|
echo " 3. Generate Forgejo API token: https://${GIT_DOMAIN}/user/settings/applications"
|