Initial own-git docs, configs, scripts, and hardening pack

This commit is contained in:
PTah
2026-04-21 21:37:43 +10:00
commit f5899ebc56
25 changed files with 1843 additions and 0 deletions
+276
View File
@@ -0,0 +1,276 @@
# 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.yml``shellcheck` и проверка 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
```bash
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:
```bash
chmod +x scripts/bootstrap-own-git.sh
sudo OWGIT_REPO_DIR=/opt/owngit scripts/bootstrap-own-git.sh
```
Сначала безопасная проверка шагов без изменений:
```bash
OWGIT_REPO_DIR=/opt/owngit scripts/bootstrap-own-git.sh --dry-run
```
Полезные переменные bootstrap:
```bash
SERVER_DOMAIN=git.papatramp.ru
GITEA_LAN_IP=192.168.128.100
INSTALL_UFW=false
ENABLE_FAIL2BAN=true
ENABLE_BACKUP_TIMER=true
```
Положить `app.ini`:
```bash
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
```
Сгенерировать секреты:
```bash
openssl rand -hex 32
openssl rand -hex 32
```
## 2) Установка HAProxy конфига
```bash
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`)
```sshconfig
Host git-papatramp
HostName git.papatramp.ru
User git
Port 2222
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 30
ServerAliveCountMax 6
```
Проверка:
```bash
ssh -T git-papatramp
```
## 6) Миграция репозиториев с GitHub
Скрипт в `scripts/migrate-github-to-gitea.sh`:
- получает список реп через GitHub API;
- создает репозитории в Gitea API;
- делает `git clone --mirror` + `git push --mirror`;
- умеет мигрировать LFS (опционально).
Пример запуска:
```bash
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) Быстрые проверки
```bash
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
```bash
make help
make check-haproxy
make deploy-haproxy
make gitea-up
make gitea-restart
```
Запуск миграции через `.env`:
```bash
cp .env.example .env
nano .env
make dry-run
make migrate
```
## 9) Preflight и backup
```bash
chmod +x scripts/preflight-check.sh scripts/backup-gitea.sh
./scripts/preflight-check.sh
```
Запуск бэкапа вручную:
```bash
sudo ./scripts/backup-gitea.sh
```
Пример cron (ежедневно в 03:10):
```bash
10 3 * * * /opt/owngit/scripts/backup-gitea.sh >> /var/log/gitea-backup.log 2>&1
```
Восстановление:
```bash
sudo ./scripts/restore-gitea.sh /opt/backups/gitea/gitea-backup-YYYYMMDD-HHMMSS.tar.gz
```
## 10) Автобэкапы через systemd timer
Установка:
```bash
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
```
Проверка:
```bash
systemctl list-timers --all | grep gitea-backup
sudo systemctl status gitea-backup.timer --no-pager
```
## 11) Hardening (firewall + fail2ban)
```bash
chmod +x scripts/setup-ufw.sh
sudo ./scripts/setup-ufw.sh
```
Настройка fail2ban:
```bash
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:
```bash
chmod +x scripts/safe-apply-ssh-hardening.sh
sudo ./scripts/safe-apply-ssh-hardening.sh
```
Опциональный lockdown:
```bash
chmod +x scripts/safe-apply-ssh-lockdown.sh
sudo ./scripts/safe-apply-ssh-lockdown.sh
```