#!/usr/bin/env bash set -euo pipefail # One-shot bootstrap для own-git стека: # - устанавливает зависимости; # - разворачивает Gitea через docker compose; # - раскладывает конфиги HAProxy/fail2ban/systemd; # - включает timer бэкапов; # - печатает пост-инсталляционный чеклист. # # ВНИМАНИЕ: # 1) Проверьте и отредактируйте переменные ниже перед запуском. # 2) Скрипт рассчитан на Ubuntu 24.04+. # 3) Запускать от root (sudo). # # OWGIT_REPO_DIR по умолчанию — корень репозитория (каталог над scripts/). Для установки из /opt/owngit задайте явно: # cd /opt/owngit && sudo OWGIT_REPO_DIR="$(pwd)" ./scripts/bootstrap-own-git.sh _SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" _REPO_ROOT="$(cd "${_SCRIPT_DIR}/.." && pwd)" OWGIT_REPO_DIR="${OWGIT_REPO_DIR:-${_REPO_ROOT}}" SERVER_DOMAIN="${SERVER_DOMAIN:-git.papatramp.ru}" GITEA_LAN_IP="${GITEA_LAN_IP:-192.168.128.100}" GITEA_BASE_DIR="${GITEA_BASE_DIR:-/opt/gitea}" ENABLE_HAPROXY="${ENABLE_HAPROXY:-false}" ENABLE_REMOTE_HAPROXY_DEPLOY="${ENABLE_REMOTE_HAPROXY_DEPLOY:-false}" REMOTE_HAPROXY_HOST="${REMOTE_HAPROXY_HOST:-192.168.128.65}" REMOTE_HAPROXY_PORT="${REMOTE_HAPROXY_PORT:-22}" REMOTE_HAPROXY_USER="${REMOTE_HAPROXY_USER:-papatramp}" REMOTE_HAPROXY_PASSWORD="${REMOTE_HAPROXY_PASSWORD:-}" INSTALL_UFW="${INSTALL_UFW:-false}" ENABLE_FAIL2BAN="${ENABLE_FAIL2BAN:-true}" ENABLE_BACKUP_TIMER="${ENABLE_BACKUP_TIMER:-true}" DRY_RUN="${DRY_RUN:-false}" log() { echo "[INFO] $*"; } ok() { echo "[OK] $*"; } warn() { echo "[WARN] $*"; } err() { echo "[ERR] $*"; } usage() { cat < /etc/haproxy/certs/papatramp.pem" run_cmd rm -f /tmp/owngit-selfsigned.crt /tmp/owngit-selfsigned.key warn "Используется временный сертификат. Замените на боевой Let's Encrypt/PEM." fi run_cmd haproxy -c -f /etc/haproxy/haproxy.cfg run_cmd systemctl enable --now haproxy run_cmd systemctl reload haproxy ok "HAProxy применен и перезагружен" } remote_ssh_cmd() { local cmd="$1" local ssh_target="${REMOTE_HAPROXY_USER}@${REMOTE_HAPROXY_HOST}" local ssh_opts=(-p "$REMOTE_HAPROXY_PORT" -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10) if [[ "$DRY_RUN" == "true" ]]; then echo "[DRY] ssh ${ssh_target} ${cmd}" return 0 fi if [[ -n "$REMOTE_HAPROXY_PASSWORD" ]]; then SSHPASS="$REMOTE_HAPROXY_PASSWORD" sshpass -e ssh "${ssh_opts[@]}" "$ssh_target" "$cmd" else ssh "${ssh_opts[@]}" "$ssh_target" "$cmd" fi } remote_scp_upload() { local src="$1" local dst="$2" local ssh_target="${REMOTE_HAPROXY_USER}@${REMOTE_HAPROXY_HOST}" local scp_opts=(-P "$REMOTE_HAPROXY_PORT" -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10) if [[ "$DRY_RUN" == "true" ]]; then echo "[DRY] scp ${src} ${ssh_target}:${dst}" return 0 fi if [[ -n "$REMOTE_HAPROXY_PASSWORD" ]]; then SSHPASS="$REMOTE_HAPROXY_PASSWORD" sshpass -e scp "${scp_opts[@]}" "$src" "${ssh_target}:${dst}" else scp "${scp_opts[@]}" "$src" "${ssh_target}:${dst}" fi } deploy_remote_haproxy() { if [[ "$ENABLE_REMOTE_HAPROXY_DEPLOY" != "true" ]]; then warn "Удаленный деплой HAProxy пропущен (ENABLE_REMOTE_HAPROXY_DEPLOY=false)" return fi log "Обновляю HAProxy удаленно на ${REMOTE_HAPROXY_HOST}:${REMOTE_HAPROXY_PORT}..." local ts backup_cfg remote_tmp ts="$(date +%Y%m%d-%H%M%S)" backup_cfg="/etc/haproxy/haproxy.cfg.bak.${ts}" remote_tmp="/tmp/owngit-haproxy.cfg.${ts}" remote_ssh_cmd "sudo cp -a /etc/haproxy/haproxy.cfg '${backup_cfg}'" remote_scp_upload "$OWGIT_REPO_DIR/haproxy/haproxy.cfg" "$remote_tmp" remote_ssh_cmd "sudo mv '${remote_tmp}' /etc/haproxy/haproxy.cfg && sudo chown root:root /etc/haproxy/haproxy.cfg && sudo chmod 644 /etc/haproxy/haproxy.cfg" remote_ssh_cmd "sudo touch /etc/haproxy/allowed_ips.lst /etc/haproxy/allowed_ips_knock.lst" if remote_ssh_cmd "sudo haproxy -c -f /etc/haproxy/haproxy.cfg"; then remote_ssh_cmd "sudo systemctl reload haproxy" ok "Удаленный HAProxy обновлен, backup: ${backup_cfg}" else warn "Валидация удаленного конфига не прошла, выполняю откат..." remote_ssh_cmd "sudo cp -a '${backup_cfg}' /etc/haproxy/haproxy.cfg" remote_ssh_cmd "sudo haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxy" err "Откат выполнен. Проверьте haproxy/haproxy.cfg перед повтором." exit 1 fi } deploy_fail2ban() { if [[ "$ENABLE_FAIL2BAN" != "true" ]]; then warn "Fail2ban пропущен (ENABLE_FAIL2BAN=false)" return fi log "Настраиваю fail2ban..." run_cmd apt-get install -y fail2ban run_cmd mkdir -p /etc/fail2ban/jail.d run_cmd cp -a "$OWGIT_REPO_DIR/fail2ban/jail.d/owngit.local" /etc/fail2ban/jail.d/owngit.local run_cmd systemctl enable --now fail2ban ok "Fail2ban включен" } deploy_backup_timer() { if [[ "$ENABLE_BACKUP_TIMER" != "true" ]]; then warn "Backup timer пропущен (ENABLE_BACKUP_TIMER=false)" return fi log "Устанавливаю systemd backup timer..." run_cmd cp -a "$OWGIT_REPO_DIR/systemd/gitea-backup.service" /etc/systemd/system/gitea-backup.service run_cmd cp -a "$OWGIT_REPO_DIR/systemd/gitea-backup.timer" /etc/systemd/system/gitea-backup.timer run_cmd systemctl daemon-reload run_cmd systemctl enable --now gitea-backup.timer ok "Backup timer включен" } maybe_setup_ufw() { if [[ "$INSTALL_UFW" != "true" ]]; then warn "UFW не применялся (INSTALL_UFW=false)" return fi if [[ ! -x "$OWGIT_REPO_DIR/scripts/setup-ufw.sh" ]]; then run_cmd chmod +x "$OWGIT_REPO_DIR/scripts/setup-ufw.sh" fi log "Применяю UFW..." run_cmd "$OWGIT_REPO_DIR/scripts/setup-ufw.sh" ok "UFW настроен" } print_checklist() { local haproxy_host_hint if [[ "$ENABLE_HAPROXY" == "true" ]]; then haproxy_host_hint="локальном сервере" else haproxy_host_hint="внешнем HAProxy" fi cat <