Files
owngit/README.md
T

8.2 KiB
Raw Blame History

OwnGit: свой "аналог GitHub" на Ubuntu 24.04

Готовый комплект для поднятия собственного git-сервера (Gitea/Forgejo) за HAProxy:

  • reverse proxy и TLS на HAProxy;
  • Gitea внутри сети;
  • SSH для git push/pull;
  • миграция репозиториев с GitHub (public + private).

Состав репозитория

  • haproxy/haproxy.cfg — полный конфиг HAProxy (с Gitea, Zabbix, Synology, RDP, SMTP).
  • gitea/docker-compose.yml — запуск Gitea в Docker.
  • gitea/app.ini.example — шаблон конфигурации Gitea.
  • scripts/migrate-github-to-gitea.sh — массовая миграция репозиториев GitHub в Gitea.
  • scripts/preflight-check.sh — быстрая проверка DNS/портов/healthz/SSH.
  • scripts/backup-gitea.sh — бэкап данных Gitea с ротацией.
  • scripts/restore-gitea.sh — восстановление Gitea из архива бэкапа.
  • scripts/setup-ufw.sh — базовая настройка UFW под эту схему портов.
  • scripts/safe-apply-ssh-hardening.sh — безопасное применение SSH hardening.
  • scripts/safe-apply-ssh-lockdown.sh — безопасное применение строгого SSH lockdown-профиля.
  • scripts/bootstrap-own-git.sh — one-shot установка стека (deps + Gitea + HAProxy + fail2ban + timer).
  • .env.example — шаблон переменных окружения для миграции.
  • Makefile — быстрые команды установки/проверки/миграции.
  • docs/troubleshooting.md — типовые проблемы и диагностика.
  • docs/security-hardening.md — чеклист усиления безопасности (P0/P1/P2).
  • .github/workflows/haproxy-lint.yml — CI-проверка синтаксиса haproxy.cfg.
  • .github/workflows/scripts-and-docs-check.ymlshellcheck и проверка markdown-ссылок.
  • systemd/ — unit/timer для ежедневных бэкапов через systemd.
  • fail2ban/jail.d/owngit.local — готовый профиль fail2ban (sshd + recidive).
  • ssh/sshd_config.d/90-owngit-hardening.conf — шаблон безопасных SSH-настроек.
  • ssh/sshd_config.d/95-owngit-lockdown.conf.example — опциональный строгий профиль (AllowUsers/Match Address).

Архитектура

  • Публичный домен Gitea: git.papatramp.ru.
  • TLS-сертификат хранится и завершается на HAProxy (:443).
  • Внутренний доступ к Gitea: 192.168.128.100:3000.
  • Git SSH: внешний :2222 на HAProxy -> внутренний 192.168.128.100:2222.

1) Установка Gitea

sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable --now docker

sudo mkdir -p /opt/gitea/data/gitea/conf
sudo cp gitea/docker-compose.yml /opt/gitea/docker-compose.yml
cd /opt/gitea
sudo docker compose up -d

Или one-shot bootstrap:

chmod +x scripts/bootstrap-own-git.sh
sudo OWGIT_REPO_DIR=/opt/owngit scripts/bootstrap-own-git.sh

Сначала безопасная проверка шагов без изменений:

OWGIT_REPO_DIR=/opt/owngit scripts/bootstrap-own-git.sh --dry-run

Полезные переменные bootstrap:

SERVER_DOMAIN=git.papatramp.ru
GITEA_LAN_IP=192.168.128.100
INSTALL_UFW=false
ENABLE_FAIL2BAN=true
ENABLE_BACKUP_TIMER=true

Положить app.ini:

sudo cp gitea/app.ini.example /opt/gitea/data/gitea/conf/app.ini
sudo nano /opt/gitea/data/gitea/conf/app.ini
sudo docker compose restart gitea

Сгенерировать секреты:

openssl rand -hex 32
openssl rand -hex 32

2) Установка HAProxy конфига

sudo cp haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy

Важно: сертификат papatramp.pem должен включать SAN для git.papatramp.ru.

3) Нужно ли SSL на самом Gitea?

Обычно нет. Достаточно TLS на HAProxy:

  • клиент <-> HAProxy: HTTPS (с сертификатом);
  • HAProxy <-> Gitea: HTTP по LAN.

SSL на Gitea нужен только если нужен end-to-end TLS внутри сети или Gitea публикуется напрямую без HAProxy.

4) Работа и из интернета, и из локалки

Рекомендуется единый адрес: https://git.papatramp.ru.

Чтобы это работало из LAN:

  • либо Split DNS: git.papatramp.ru -> LAN IP HAProxy;
  • либо Hairpin NAT на роутере.

5) SSH-клиент (~/.ssh/config)

Host git-papatramp
    HostName git.papatramp.ru
    User git
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes
    ServerAliveInterval 30
    ServerAliveCountMax 6

Проверка:

ssh -T git-papatramp

6) Миграция репозиториев с GitHub

Скрипт в scripts/migrate-github-to-gitea.sh:

  • получает список реп через GitHub API;
  • создает репозитории в Gitea API;
  • делает git clone --mirror + git push --mirror;
  • умеет мигрировать LFS (опционально).

Пример запуска:

chmod +x scripts/migrate-github-to-gitea.sh

export GITHUB_TOKEN='ghp_...'
export GITHUB_OWNER='your_github_user_or_org'
export GITHUB_OWNER_TYPE='user'   # или org

export GITEA_URL='https://git.papatramp.ru'
export GITEA_TOKEN='gitea_pat'
export GITEA_OWNER='your_gitea_user_or_org'
export GITEA_OWNER_TYPE='user'    # или org

export PUSH_WITH_SSH='true'
export GITEA_SSH_HOST='git.papatramp.ru'
export GITEA_SSH_PORT='2222'
export MIGRATE_LFS='true'

./scripts/migrate-github-to-gitea.sh

7) Быстрые проверки

curl -I http://192.168.128.100:3000
curl -I https://git.papatramp.ru
nc -zv git.papatramp.ru 2222

Если всё корректно:

  • web UI открывается по https://git.papatramp.ru;
  • ssh -T git-papatramp достигает Gitea;
  • git clone/push работает по SSH/HTTPS.

8) Полезные команды через Makefile

make help
make check-haproxy
make deploy-haproxy
make gitea-up
make gitea-restart

Запуск миграции через .env:

cp .env.example .env
nano .env
make dry-run
make migrate

9) Preflight и backup

chmod +x scripts/preflight-check.sh scripts/backup-gitea.sh
./scripts/preflight-check.sh

Запуск бэкапа вручную:

sudo ./scripts/backup-gitea.sh

Пример cron (ежедневно в 03:10):

10 3 * * * /opt/owngit/scripts/backup-gitea.sh >> /var/log/gitea-backup.log 2>&1

Восстановление:

sudo ./scripts/restore-gitea.sh /opt/backups/gitea/gitea-backup-YYYYMMDD-HHMMSS.tar.gz

10) Автобэкапы через systemd timer

Установка:

sudo cp systemd/gitea-backup.service /etc/systemd/system/gitea-backup.service
sudo cp systemd/gitea-backup.timer /etc/systemd/system/gitea-backup.timer
sudo systemctl daemon-reload
sudo systemctl enable --now gitea-backup.timer

Проверка:

systemctl list-timers --all | grep gitea-backup
sudo systemctl status gitea-backup.timer --no-pager

11) Hardening (firewall + fail2ban)

chmod +x scripts/setup-ufw.sh
sudo ./scripts/setup-ufw.sh

Настройка fail2ban:

sudo apt install -y fail2ban
sudo cp fail2ban/jail.d/owngit.local /etc/fail2ban/jail.d/owngit.local
sudo systemctl enable --now fail2ban
sudo fail2ban-client status

Подробный чеклист и приоритеты см. в docs/security-hardening.md.

Применение SSH hardening:

chmod +x scripts/safe-apply-ssh-hardening.sh
sudo ./scripts/safe-apply-ssh-hardening.sh

Опциональный lockdown:

chmod +x scripts/safe-apply-ssh-lockdown.sh
sudo ./scripts/safe-apply-ssh-lockdown.sh