Files
owngit/README.md
T
2026-04-22 10:16:34 +10:00

360 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).
- `docs/haproxy-kalinamall.cfg` — периметровый HAProxy kalinamall.ru (TCP+SNI `:443`, Exchange/RDS/ERP/SMTP) **и** Gitea `git.kalinamall.ru``192.168.160.129:443`, SSH `:2222`.
- `docs/haproxy-kalinamall.md` — описание схемы kalinamall.ru, `git.kalinamall.ru`, DNS и `app.ini`.
- `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`.
Отдельный контур **kalinamall.ru**: TLS на бэкендах (GlobalSign wildcard); HAProxy только маршрутизирует по SNI на `:443`. Подробнее — [`docs/haproxy-kalinamall.md`](docs/haproxy-kalinamall.md), конфиг — [`docs/haproxy-kalinamall.cfg`](docs/haproxy-kalinamall.cfg). На Gitea в `app.ini`: `ROOT_URL=https://git.kalinamall.ru/` и настройки SSH-домена/порта под внешний `: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
```