463 lines
13 KiB
Markdown
463 lines
13 KiB
Markdown
# Синхронизация Gitea → GitHub
|
||
|
||
Проект описывает несколько способов синхронизировать репозиторий из Gitea в GitHub после push.
|
||
|
||
## Варианты
|
||
|
||
1) Git Hooks (рекомендуется) — мгновенно
|
||
2) GitHub Actions — 1–5 минут, гибко
|
||
3) Gitea Mirror — просто, но по расписанию
|
||
4) Два remote — локальный рабочий процесс
|
||
|
||
## Рекомендуемый способ: Git Hooks
|
||
|
||
Идея: на сервере Gitea в `hooks/post-receive` выполнить `git push` в GitHub.
|
||
|
||
Ключевые шаги:
|
||
|
||
- найти путь к bare репозиторию на сервере Gitea
|
||
- установить `post-receive` из `gitea-hooks/post-receive`
|
||
- настроить аутентификацию (SSH ключ или HTTPS token)
|
||
- вести лог (например `/var/log/gitea/github-sync.log`)
|
||
|
||
## Вариант: GitHub Actions
|
||
|
||
- настроить секреты (`GITEA_URL`, `GITEA_TOKEN`)
|
||
- workflow по расписанию/ручному триггеру
|
||
- опционально webhook из Gitea
|
||
|
||
Подробные пошаговые инструкции — см. Appendix ниже.
|
||
|
||
|
||
---
|
||
|
||
## Appendix (migrated from docs/GITEA_SYNC.md)
|
||
<!-- MIGRATED_FROM_DOCS:GITEA_SYNC.md -->
|
||
|
||
## 🔄 Синхронизация Gitea → GitHub
|
||
|
||
Автоматическая синхронизация репозитория из Gitea в GitHub после каждого push.
|
||
|
||
---
|
||
|
||
### 📋 Доступные методы
|
||
|
||
| Метод | Сложность | Скорость | Надежность | Рекомендация |
|
||
|-------|-----------|----------|------------|--------------|
|
||
| **1. Git Hooks** | ⭐⭐ | ⚡ Мгновенно | ✅ Высокая | Рекомендуется |
|
||
| **2. GitHub Actions** | ⭐⭐⭐ | ⏱️ 1-5 мин | ✅ Высокая | Для сложных сценариев |
|
||
| **3. Gitea Mirror** | ⭐ | ⏱️ По расписанию | ⭐⭐ Средняя | Самый простой |
|
||
| **4. Двойной Remote** | ⭐ | ⚡ Мгновенно | ⭐⭐ Средняя | Локальная работа |
|
||
|
||
---
|
||
|
||
### 🚀 Метод 1: Git Hooks (Рекомендуется)
|
||
|
||
#### Установка
|
||
|
||
**1. На сервере Gitea найдите путь к репозиторию:**
|
||
```bash
|
||
## Обычно это:
|
||
/var/lib/gitea/data/gitea-repositories/username/configure_nginx_manager.git
|
||
## Или
|
||
/home/git/gitea-repositories/username/configure_nginx_manager.git
|
||
```
|
||
|
||
**2. Создайте post-receive hook:**
|
||
```bash
|
||
cd /path/to/gitea/repos/username/configure_nginx_manager.git/hooks/
|
||
nano post-receive
|
||
```
|
||
|
||
**3. Вставьте содержимое** из файла `gitea-hooks/post-receive` (в этом репозитории)
|
||
|
||
**4. Настройте параметры:**
|
||
```bash
|
||
## В файле post-receive измените:
|
||
GITHUB_REPO="git@github.com:YOUR_USERNAME/configure_nginx_manager.git"
|
||
## Или для HTTPS с токеном:
|
||
GITHUB_REPO="https://YOUR_TOKEN@github.com/YOUR_USERNAME/configure_nginx_manager.git"
|
||
```
|
||
|
||
**5. Сделайте скрипт исполняемым:**
|
||
```bash
|
||
chmod +x post-receive
|
||
```
|
||
|
||
**6. Создайте директорию для логов:**
|
||
```bash
|
||
mkdir -p /var/log/gitea
|
||
chown git:git /var/log/gitea
|
||
```
|
||
|
||
#### Настройка SSH ключей (для git@github.com)
|
||
|
||
**На сервере Gitea:**
|
||
|
||
**Шаг 1: Определите пользователя Gitea**
|
||
```bash
|
||
## Проверьте под каким пользователем запущен Gitea
|
||
ps aux | grep gitea | grep -v grep
|
||
|
||
## Обычно это один из:
|
||
## - git (стандартная установка)
|
||
## - gitea (установка через Docker/LXC)
|
||
```
|
||
|
||
**Шаг 2: Переключитесь на этого пользователя**
|
||
```bash
|
||
## Попробуйте git:
|
||
sudo su - git
|
||
|
||
## Если не работает, попробуйте gitea:
|
||
sudo su - gitea
|
||
|
||
## Проверьте текущего пользователя
|
||
whoami # Должно быть: git или gitea
|
||
```
|
||
|
||
**Шаг 3: Создайте SSH ключ**
|
||
```bash
|
||
## Создайте SSH ключ (если его ещё нет)
|
||
ssh-keygen -t ed25519 -C "gitea-to-github-sync" -f ~/.ssh/id_ed25519 -N ""
|
||
|
||
## Скопируйте публичный ключ
|
||
cat ~/.ssh/id_ed25519.pub
|
||
```
|
||
|
||
**На GitHub:**
|
||
1. Settings → SSH and GPG keys
|
||
2. New SSH key
|
||
3. Вставьте публичный ключ
|
||
4. Save
|
||
|
||
**⚠️ ВАЖНО: Добавьте GitHub в known_hosts:**
|
||
```bash
|
||
## От того же пользователя (git или gitea)
|
||
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
|
||
|
||
## Проверьте что ключ добавлен
|
||
cat ~/.ssh/known_hosts | grep github.com
|
||
```
|
||
|
||
**Проверка подключения:**
|
||
```bash
|
||
ssh -T git@github.com
|
||
## Должно вывести: Hi username! You've successfully authenticated...
|
||
```
|
||
|
||
#### Настройка токена (для HTTPS)
|
||
|
||
**На GitHub:**
|
||
1. Settings → Developer settings → Personal access tokens → Tokens (classic)
|
||
2. Generate new token
|
||
3. Выберите scope: `repo` (полный доступ к репозиториям)
|
||
4. Скопируйте токен
|
||
|
||
**В hook файле:**
|
||
```bash
|
||
GITHUB_REPO="https://ghp_YOUR_TOKEN_HERE@github.com/username/configure_nginx_manager.git"
|
||
```
|
||
|
||
#### Тестирование
|
||
|
||
```bash
|
||
## Сделайте тестовый commit в Gitea
|
||
cd /tmp
|
||
git clone http://gitea.example.com/username/configure_nginx_manager.git
|
||
cd configure_nginx_manager
|
||
echo "test" >> README.md
|
||
git add README.md
|
||
git commit -m "Test sync to GitHub"
|
||
git push
|
||
|
||
## Проверьте лог
|
||
tail -f /var/log/gitea/github-sync.log
|
||
|
||
## Проверьте GitHub - изменения должны появиться
|
||
```
|
||
|
||
---
|
||
|
||
### 🔄 Метод 2: GitHub Actions
|
||
|
||
#### Установка
|
||
|
||
**1. Создайте workflow в GitHub репозитории:**
|
||
|
||
Файл уже создан: `.github/workflows/sync-from-gitea.yml`
|
||
|
||
**2. Настройте секреты в GitHub:**
|
||
|
||
GitHub Repository → Settings → Secrets and variables → Actions → New repository secret
|
||
|
||
Добавьте:
|
||
- **Name**: `GITEA_URL`
|
||
- **Value**: `https://gitea.example.com/username/configure_nginx_manager.git`
|
||
|
||
- **Name**: `GITEA_TOKEN`
|
||
- **Value**: Токен доступа Gitea
|
||
|
||
#### Получение токена Gitea
|
||
|
||
**В Gitea:**
|
||
1. Settings → Applications → Generate New Token
|
||
2. Token Name: "GitHub Sync"
|
||
3. Select permissions: `read:repository`
|
||
4. Generate Token
|
||
5. Скопируйте токен
|
||
|
||
#### Запуск синхронизации
|
||
|
||
**Автоматически (по расписанию):**
|
||
- Каждый час проверяет изменения
|
||
|
||
**Вручную:**
|
||
1. GitHub → Actions
|
||
2. Выберите workflow "Sync from Gitea"
|
||
3. Run workflow
|
||
|
||
**Через webhook от Gitea:**
|
||
|
||
В Gitea репозитории:
|
||
1. Settings → Webhooks → Add Webhook → Gitea
|
||
2. Target URL: `https://api.github.com/repos/USERNAME/configure_nginx_manager/dispatches`
|
||
3. HTTP Method: `POST`
|
||
4. POST Content Type: `application/json`
|
||
5. Secret: оставьте пустым или используйте
|
||
6. Trigger On: `Push events`
|
||
7. Body:
|
||
```json
|
||
{
|
||
"event_type": "gitea-push"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🪞 Метод 3: Gitea Mirror (Встроенная функция)
|
||
|
||
#### Настройка
|
||
|
||
**В Gitea репозитории:**
|
||
1. Settings → Repository
|
||
2. Прокрутите до "Mirror Settings"
|
||
3. Нажмите "Add Push Mirror"
|
||
4. Заполните:
|
||
- **Git Remote Repository URL**: `https://github.com/username/configure_nginx_manager.git`
|
||
- **Username**: ваш GitHub username
|
||
- **Password**: GitHub Personal Access Token
|
||
- **Sync Interval**: `8h` (каждые 8 часов) или `0` (только вручную)
|
||
5. Save
|
||
|
||
#### Ручная синхронизация
|
||
|
||
Settings → Repository → Mirror Settings → Sync Now
|
||
|
||
#### Преимущества
|
||
- ✅ Встроенная функция
|
||
- ✅ Не требует скриптов
|
||
- ✅ Управление через веб-интерфейс
|
||
|
||
#### Недостатки
|
||
- ⚠️ Работает по расписанию (не мгновенно)
|
||
- ⚠️ Доступно не во всех версиях Gitea
|
||
|
||
---
|
||
|
||
### 🔀 Метод 4: Двойной Remote
|
||
|
||
#### Для локальной работы
|
||
|
||
**Настройка:**
|
||
```bash
|
||
## В вашем локальном репозитории
|
||
cd configure_nginx_manager
|
||
|
||
## Добавьте GitHub как второй remote
|
||
git remote add github git@github.com:username/configure_nginx_manager.git
|
||
|
||
## Или настройте push в оба репозитория одновременно
|
||
git remote set-url --add --push origin git@github.com:username/configure_nginx_manager.git
|
||
|
||
## Проверьте
|
||
git remote -v
|
||
```
|
||
|
||
**Использование:**
|
||
```bash
|
||
## Обычный push (только в Gitea)
|
||
git push origin main
|
||
|
||
## Push в GitHub
|
||
git push github main
|
||
|
||
## Push в оба репозитория
|
||
git push origin main
|
||
git push github main
|
||
|
||
## Или создайте alias
|
||
git config alias.pushall '!git push origin main && git push github main'
|
||
git pushall
|
||
```
|
||
|
||
---
|
||
|
||
### 🔍 Проверка синхронизации
|
||
|
||
#### Проверка через Git
|
||
|
||
```bash
|
||
## Сравнить коммиты
|
||
git ls-remote git@gitea.example.com:username/configure_nginx_manager.git
|
||
git ls-remote git@github.com:username/configure_nginx_manager.git
|
||
|
||
## Должны быть одинаковые SHA
|
||
```
|
||
|
||
#### Проверка логов (Метод 1 - Hooks)
|
||
|
||
```bash
|
||
## На сервере Gitea
|
||
tail -f /var/log/gitea/github-sync.log
|
||
```
|
||
|
||
#### Проверка GitHub Actions (Метод 2)
|
||
|
||
1. GitHub Repository → Actions
|
||
2. Смотрите последние запуски
|
||
3. Проверьте логи выполнения
|
||
|
||
---
|
||
|
||
### ⚙️ Рекомендованная конфигурация
|
||
|
||
Для максимальной надежности используйте **комбинацию методов**:
|
||
|
||
1. **Git Hook** (основной) - мгновенная синхронизация
|
||
2. **GitHub Actions** (резервный) - проверка каждый час на случай сбоя hook
|
||
|
||
#### Установка обоих методов
|
||
|
||
```bash
|
||
## 1. Установите Git Hook на сервере Gitea
|
||
## (см. Метод 1)
|
||
|
||
## 2. Настройте GitHub Actions
|
||
## (см. Метод 2)
|
||
|
||
## 3. GitHub Actions будет подхватывать пропущенные изменения
|
||
```
|
||
|
||
---
|
||
|
||
### 🐛 Устранение проблем
|
||
|
||
#### Проблема: Hook не срабатывает
|
||
|
||
**Проверка:**
|
||
```bash
|
||
## На сервере Gitea
|
||
ls -la /path/to/repo.git/hooks/post-receive
|
||
## Должно быть -rwxr-xr-x
|
||
|
||
## Проверьте права
|
||
chmod +x /path/to/repo.git/hooks/post-receive
|
||
chown git:git /path/to/repo.git/hooks/post-receive
|
||
|
||
## Проверьте лог ошибок Gitea
|
||
tail -f /var/log/gitea/gitea.log
|
||
```
|
||
|
||
#### Проблема: Permission denied (SSH)
|
||
|
||
**Решение:**
|
||
```bash
|
||
## Убедитесь что SSH ключ добавлен в GitHub
|
||
ssh -T git@github.com
|
||
|
||
## Проверьте права на .ssh
|
||
chmod 700 ~/.ssh
|
||
chmod 600 ~/.ssh/id_ed25519
|
||
```
|
||
|
||
#### Проблема: Authentication failed (HTTPS)
|
||
|
||
**Решение:**
|
||
- Проверьте токен GitHub (должен иметь scope `repo`)
|
||
- Токен не истёк
|
||
- Правильный формат URL: `https://TOKEN@github.com/user/repo.git`
|
||
|
||
#### Проблема: GitHub Actions не запускается
|
||
|
||
**Решение:**
|
||
1. Проверьте секреты в Settings → Secrets
|
||
2. Проверьте формат webhook от Gitea
|
||
3. Запустите вручную для теста
|
||
|
||
---
|
||
|
||
### 📊 Сравнение методов
|
||
|
||
#### Скорость синхронизации
|
||
- **Git Hooks**: ⚡ < 1 секунды
|
||
- **GitHub Actions (webhook)**: ⏱️ 10-30 секунд
|
||
- **GitHub Actions (schedule)**: ⏱️ до 1 часа
|
||
- **Gitea Mirror**: ⏱️ по расписанию
|
||
|
||
#### Надежность
|
||
- **Git Hooks**: ⭐⭐⭐⭐⭐ (при правильной настройке)
|
||
- **GitHub Actions**: ⭐⭐⭐⭐⭐ (очень надежно)
|
||
- **Gitea Mirror**: ⭐⭐⭐ (зависит от версии Gitea)
|
||
- **Двойной Remote**: ⭐⭐ (требует ручного действия)
|
||
|
||
---
|
||
|
||
### 🎯 Итоговая рекомендация
|
||
|
||
Для проекта `configure_nginx_manager`:
|
||
|
||
**1. Основной метод: Git Hook**
|
||
- Быстро
|
||
- Надежно
|
||
- Автоматически
|
||
|
||
**2. Резервный метод: GitHub Actions**
|
||
- Проверка каждый час
|
||
- Подхватит пропущенные изменения
|
||
- Можно запустить вручную
|
||
|
||
**3. Мониторинг:**
|
||
```bash
|
||
## Еженедельная проверка
|
||
git ls-remote origin | head -1
|
||
git ls-remote github | head -1
|
||
## SHA должны совпадать
|
||
```
|
||
|
||
---
|
||
|
||
### 📝 Быстрая установка
|
||
|
||
```bash
|
||
## На сервере Gitea
|
||
sudo su - git
|
||
cd /path/to/gitea-repositories/username/configure_nginx_manager.git/hooks/
|
||
|
||
## Скачайте hook
|
||
wget https://raw.githubusercontent.com/username/configure_nginx_manager/main/gitea-hooks/post-receive
|
||
|
||
## Настройте
|
||
nano post-receive
|
||
## Измените GITHUB_REPO
|
||
|
||
## Права
|
||
chmod +x post-receive
|
||
|
||
## Тест
|
||
echo "test" | ./post-receive
|
||
```
|
||
|
||
Готово! 🎉
|
||
|