949c334e68
Document and add a reusable postinstall-check.sh to validate Gitea, external HAProxy health, SSH reachability, and backup presence after bootstrap. Made-with: Cursor
356 lines
12 KiB
Markdown
356 lines
12 KiB
Markdown
# 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/postinstall-check.sh` — post-install тесты Gitea + внешний HAProxy + 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 (без локального HAProxy, если он уже есть отдельно):
|
||
|
||
```bash
|
||
chmod +x scripts/bootstrap-own-git.sh
|
||
sudo OWGIT_REPO_DIR=/opt/owngit ENABLE_HAPROXY=false scripts/bootstrap-own-git.sh
|
||
```
|
||
|
||
Сначала безопасная проверка шагов без изменений:
|
||
|
||
```bash
|
||
sudo OWGIT_REPO_DIR=/opt/owngit ENABLE_HAPROXY=false scripts/bootstrap-own-git.sh --dry-run
|
||
```
|
||
|
||
Полезные переменные bootstrap:
|
||
|
||
```bash
|
||
SERVER_DOMAIN=git.papatramp.ru
|
||
GITEA_LAN_IP=192.168.128.100
|
||
ENABLE_HAPROXY=false
|
||
ENABLE_REMOTE_HAPROXY_DEPLOY=false
|
||
REMOTE_HAPROXY_HOST=192.168.128.65
|
||
REMOTE_HAPROXY_PORT=22
|
||
REMOTE_HAPROXY_USER=papatramp
|
||
# REMOTE_HAPROXY_PASSWORD='ваш_пароль_ssh'
|
||
INSTALL_UFW=false
|
||
ENABLE_FAIL2BAN=true
|
||
ENABLE_BACKUP_TIMER=true
|
||
```
|
||
|
||
### Безопасный порядок для чистого Ubuntu 24.04
|
||
|
||
```bash
|
||
sudo mkdir -p /opt && cd /opt
|
||
sudo git clone https://github.com/PTah/owngit.git
|
||
cd /opt/owngit && sudo chmod +x scripts/bootstrap-own-git.sh
|
||
```
|
||
|
||
Сначала прогон без изменений:
|
||
|
||
```bash
|
||
sudo OWGIT_REPO_DIR=/opt/owngit ENABLE_HAPROXY=false scripts/bootstrap-own-git.sh --dry-run
|
||
```
|
||
|
||
Потом реальный запуск:
|
||
|
||
```bash
|
||
sudo OWGIT_REPO_DIR=/opt/owngit ENABLE_HAPROXY=false scripts/bootstrap-own-git.sh
|
||
```
|
||
|
||
После установки быстрая проверка:
|
||
|
||
```bash
|
||
docker ps
|
||
sudo systemctl status haproxy --no-pager
|
||
curl -I http://127.0.0.1:3000
|
||
```
|
||
|
||
Если HAProxy у вас на отдельном узле (например, `192.168.128.65`), проверяйте его сервис на этом узле и обновите там backend на новый IP Gitea (`:3000`) и SSH proxy (`:2222`).
|
||
|
||
### Автообновление удаленного HAProxy по SSH
|
||
|
||
`bootstrap-own-git.sh` умеет подключаться к удаленному HAProxy-серверу, делать backup текущего `/etc/haproxy/haproxy.cfg`, загружать новый конфиг, валидировать его и делать `reload` (с откатом при ошибке).
|
||
|
||
Пример запуска для вашего случая:
|
||
|
||
```bash
|
||
sudo OWGIT_REPO_DIR=/opt/owngit \
|
||
ENABLE_HAPROXY=false \
|
||
ENABLE_REMOTE_HAPROXY_DEPLOY=true \
|
||
REMOTE_HAPROXY_HOST=192.168.128.65 \
|
||
REMOTE_HAPROXY_USER=papatramp \
|
||
REMOTE_HAPROXY_PASSWORD='ваш_пароль_ssh' \
|
||
scripts/bootstrap-own-git.sh
|
||
```
|
||
|
||
Рекомендуется сначала сделать dry-run с теми же переменными.
|
||
|
||
### Post-install тест-скрипт (рекомендуется)
|
||
|
||
После bootstrap можно прогнать единый тест-скрипт:
|
||
|
||
```bash
|
||
chmod +x scripts/postinstall-check.sh
|
||
sudo SERVER_DOMAIN=git.papatramp.ru \
|
||
CHECK_REMOTE_HAPROXY=true \
|
||
REMOTE_HAPROXY_HOST=192.168.128.65 \
|
||
REMOTE_HAPROXY_USER=papatramp \
|
||
REMOTE_HAPROXY_PASSWORD='ваш_пароль_ssh' \
|
||
scripts/postinstall-check.sh
|
||
```
|
||
|
||
Скрипт проверяет:
|
||
- контейнер `gitea` на текущем сервере;
|
||
- локальный ответ `http://127.0.0.1:3000`;
|
||
- публичный `https://git.papatramp.ru`;
|
||
- доступность SSH порта `:2222`;
|
||
- валидность и статус сервиса HAProxy на удаленном узле;
|
||
- наличие backup-файлов `haproxy.cfg.bak.*` на удаленном узле.
|
||
|
||
Положить `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 конфига
|
||
|
||
Если HAProxy уже работает на отдельном сервере (например, `192.168.128.65`), этот раздел применяется на том сервере HAProxy, а не на хосте с Gitea.
|
||
|
||
```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
|
||
```
|