1. Что такое Gitea и зачем хостить самому
GitHub — удобный сервис, но хранит ваш код на американских серверах Microsoft. Приватные репозитории бесплатны, но есть ограничения на CI/CD минуты, хранилище и коллаборацию. Аккаунт могут заблокировать. Для критически важного кода или командной работы без зависимости от внешнего сервиса — лучше иметь свой Git.
Gitea (Git with a cup of tea) — open-source Git-сервис, написанный на Go. Лёгкий, быстрый, с приятным веб-интерфейсом, похожим на GitHub. Поддерживает репозитории, Issues, Pull Requests, Webhooks, организации, пользователей и встроенный реестр пакетов.
Код у вас
Репозитории хранятся на вашем VPS. Никаких ограничений на приватные репозитории, участников или хранилище.
Минимум ресурсов
100–200 МБ RAM в покое. Работает на самом дешёвом VPS вместе с другими сервисами.
GitHub-совместимость
API совместим с GitHub. Gitea Actions читает файлы GitHub Actions без изменений.
Gitea или Forgejo?
Forgejo — форк Gitea 2022 года с более открытым управлением. Оба проекта активно развиваются, полностью совместимы. В этом гайде используем Gitea — оба устанавливаются идентично, и вы сможете перейти на Forgejo без потери данных.
2. Gitea vs GitLab vs GitHub
| Параметр | Gitea | GitLab CE | GitHub |
|---|---|---|---|
| Хранение кода | Ваш сервер | Ваш сервер | Серверы Microsoft |
| Min RAM | ~200 МБ | ~4–8 ГБ | — |
| Стоимость хостинга | ~200 ₽/мес (VPS) | ~2 000 ₽/мес (мощный VPS) | Бесплатно / от $4 |
| Open source | ✅ MIT | ✅ MIT (CE) | ❌ Закрытый |
| CI/CD | ✅ Gitea Actions | ✅ GitLab CI | ✅ GitHub Actions |
| Issues + PR | ✅ | ✅ | ✅ |
| Container Registry | ✅ (встроен) | ✅ | ✅ |
| Package Registry | ✅ (npm, pip…) | ✅ | ✅ |
| LDAP / SSO | ✅ | ✅ | 💰 Enterprise |
| Сложность setup | Низкая | Высокая | Нет (облако) |
Когда выбирать Gitea
Gitea идеальна, если у вас небольшая команда или личные проекты, VPS с 1–2 ГБ RAM, и вы хотите простоту настройки без изучения GitLab-экосистемы. GitLab оправдан для 50+ разработчиков с полноценным DevOps-пайплайном.
3. Требования к серверу
Gitea написана на Go и компилируется в один бинарный файл. Она одна из самых нетребовательных к ресурсам среди self-hosted Git-решений.
Личное использование
- — 1 vCPU
- — 512 МБ RAM
- — 10 ГБ диска
- — До 5 пользователей
Небольшая команда
- — 2 vCPU
- — 1–2 ГБ RAM
- — 20–50 ГБ диска
- — 10–30 пользователей
С Gitea Actions
- — 2+ vCPU
- — 2–4 ГБ RAM
- — 50 ГБ+ SSD/NVMe
- — CI/CD + активные коммиты
Нужны: публичный IP-адрес, домен или поддомен и HTTPS. Git по SSH работает без SSL, но веб-интерфейс и webhooks должны быть доступны по HTTPS.
4. Установка Docker
Если Docker ещё не установлен — официальный скрипт устанавливает всё за одну команду.
curl -fsSL https://get.docker.com | sh
# Запустить и добавить в автозапуск
systemctl enable --now docker
# Проверить версию
docker --version
docker compose version5. Docker Compose — запуск Gitea
Шаг 1: создать директорию и пользователя
Gitea внутри контейнера работает от пользователя с UID 1000. Создадим системного пользователя git на хосте — он будет владеть данными репозиториев.
# Системный пользователь git (без пароля, без домашней директории /home/git влияет на SSH)
adduser --system --shell /bin/bash --gecos 'Gitea' --group --disabled-password --home /home/git git
# Создать рабочую папку
mkdir -p /opt/gitea
chown git:git /opt/gitea
cd /opt/giteaШаг 2: docker-compose.yml
Замените git.example.com на ваш домен. SSH пробрасывается на порт 2222, чтобы не конфликтовать с SSH хоста.
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__DEFAULT__APP_NAME=My Gitea
- GITEA__server__DOMAIN=git.example.com
- GITEA__server__SSH_DOMAIN=git.example.com
- GITEA__server__ROOT_URL=https://git.example.com/
- GITEA__server__HTTP_PORT=3000
- GITEA__server__SSH_PORT=2222
- GITEA__server__SSH_LISTEN_PORT=22
- GITEA__database__DB_TYPE=sqlite3
- GITEA__service__DISABLE_REGISTRATION=false # После регистрации → true
- GITEA__log__LEVEL=Warn
ports:
- "127.0.0.1:3000:3000" # Веб (через Nginx)
- "2222:22" # Git SSH
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:roПеременные GITEA__
Формат переменных: GITEA__секция__ключ. Это удобная замена редактированию app.ini — Docker-переменные имеют приоритет над файлом конфигурации.
Шаг 3: запуск
docker compose up -d
# Проверить статус
docker compose ps
# Логи (первый запуск может занять ~10 сек)
docker compose logs -f giteaПосле старта в папке /opt/gitea/data/ появятся директории gitea/ (конфиги) и git/ (репозитории). База данных SQLite хранится в data/gitea/gitea.db.
6. Nginx + SSL
Nginx принимает HTTPS-запросы и проксирует их в контейнер на порт 3000. Gitea будет доступна по адресу https://git.example.com.
Установка Nginx и Certbot
apt install nginx certbot python3-certbot-nginx -yКонфигурация Nginx
server {
listen 80;
server_name git.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Для загрузки больших репозиториев и LFS
client_max_body_size 512M;
proxy_read_timeout 300s;
}
}ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
# Получить сертификат
certbot --nginx -d git.example.comПосле этого Gitea будет доступна по HTTPS. Первый экран — мастер начальной настройки.
7. Первоначальная настройка
При первом открытии https://git.example.com откроется Installation Wizard. Большинство полей уже заполнены из переменных окружения. Основное — создать аккаунт администратора.
Проверьте настройки
Убедитесь, что Domain и Root URL заполнены правильно (из переменных окружения). Database Type — SQLite3.
Создайте аккаунт администратора
Прокрутите вниз до раздела "Administrator Account Settings". Введите имя, email и пароль. Этот аккаунт имеет полный контроль над Gitea.
Нажмите "Install Gitea"
Через несколько секунд вы будете перенаправлены в Gitea под созданным аккаунтом.
Закройте регистрацию
После создания своего аккаунта запретите регистрацию новых пользователей. Измените переменную в docker-compose.yml.
- GITEA__service__DISABLE_REGISTRATION=true # Запретить новых пользователейdocker compose down && docker compose up -dПанель администратора
Доступна по адресу /-/admin/. Здесь можно управлять пользователями, организациями, просматривать очереди задач и выполнять git gc для всех репозиториев.
8. SSH-ключи для клонирования
Gitea SSH работает на порту 2222 (чтобы не конфликтовать с SSH хоста на порту 22). Добавьте свой публичный ключ в Gitea, настройте SSH-клиент — и можно клонировать репозитории без пароля.
Добавить SSH-ключ в Gitea
Настройки → SSH / GPG Keys → Add Key. Скопируйте содержимое ~/.ssh/id_ed25519.pub (или id_rsa.pub) в поле Key.
Если ключа ещё нет — сгенерируйте:
ssh-keygen -t ed25519 -C "your@email.com"
# Вывести публичный ключ для добавления в Gitea
cat ~/.ssh/id_ed25519.pubНастройка SSH-клиента
Добавьте в ~/.ssh/config на своём компьютере, чтобы не указывать порт вручную:
Host git.example.com
HostName git.example.com
User git
Port 2222
IdentityFile ~/.ssh/id_ed25519Проверьте соединение:
ssh -T git@git.example.com -p 2222
# Успех: Hi username! You've successfully authenticated...После настройки ~/.ssh/config клонирование работает как обычно:
git clone git@git.example.com:username/repo.git
# Или явно с портом (без ~/.ssh/config)
git clone ssh://git@git.example.com:2222/username/repo.git9. Миграция с GitHub
Gitea умеет мигрировать репозитории с GitHub, GitLab, Bitbucket и других Gitea-инстансов. Переносится всё: код, ветки, теги, issues, pull requests, комментарии, releases, milestones и labels.
Шаг 1: создать токен GitHub
Для приватных репозиториев или для переноса issues/PR нужен Personal Access Token GitHub. Перейдите в GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic). Создайте токен с правами repo.
Шаг 2: запустить миграцию в Gitea
Зеркало (Mirror) — автосинхронизация
Если отметить опцию This repository will be a mirror, Gitea будет автоматически синхронизировать репозиторий с GitHub каждые 8 часов (настраивается). Удобно для постепенного перехода: GitHub остаётся основным, Gitea — зеркалом.
Перенос нескольких репозиториев через API
Для массовой миграции используйте Gitea API. Пример скрипта на bash:
#!/bin/bash
GITEA_URL="https://git.example.com"
GITEA_TOKEN="ваш_gitea_api_token"
GITHUB_TOKEN="ваш_github_token"
GITHUB_USER="github_username"
# Список репозиториев для миграции
REPOS=("repo1" "repo2" "repo3")
for REPO in "${REPOS[@]}"; do
curl -s -X POST "${GITEA_URL}/api/v1/repos/migrate" \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Content-Type: application/json" \
-d "{
\"clone_addr\": \"https://github.com/${GITHUB_USER}/${REPO}\",
\"auth_token\": \"${GITHUB_TOKEN}\",
\"repo_name\": \"${REPO}\",
\"issues\": true,
\"pull_requests\": true,
\"releases\": true
}"
echo "Мигрирован: ${REPO}"
done10. Gitea Actions (CI/CD)
Gitea Actions — встроенная CI/CD система, появившаяся в версии 1.19. Полностью совместима с синтаксисом GitHub Actions: файлы .gitea/workflows/*.yml (или .github/workflows/*.yml) работают без изменений.
Actions требует runner
В отличие от GitHub, Gitea Actions не включает runners «из коробки». Нужно установить отдельный агент — act-runner. Он может работать на том же VPS или на отдельной машине.
Включить Actions в Gitea
- GITEA__actions__ENABLED=truedocker compose down && docker compose up -dУстановить act-runner
Получите токен регистрации в Gitea: Admin Panel → Runners → Create new runner.
act-runner:
image: gitea/act_runner:latest
container_name: act-runner
restart: unless-stopped
depends_on:
- gitea
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./runner-data:/data
environment:
- GITEA_INSTANCE_URL=https://git.example.com
- GITEA_RUNNER_REGISTRATION_TOKEN=ВАШ_ТОКЕН_РЕГИСТРАЦИИ
- GITEA_RUNNER_NAME=my-runnerdocker compose up -d act-runner
# Проверить что runner появился в Gitea
# Admin → Runners — статус должен быть ActiveПример workflow
Файл работает одинаково в Gitea и GitHub Actions:
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build11. Резервные копии
Все данные Gitea хранятся в папке /opt/gitea/data/: конфигурация, база данных SQLite и сами репозитории в виде git-объектов. Gitea также имеет встроенный инструмент бэкапа.
Встроенный бэкап Gitea
# Выполнить команду dump внутри контейнера
docker exec -u git gitea gitea dump -c /data/gitea/conf/app.ini
# Файл gitea-dump-*.zip появится в текущей директории
# Содержит: БД, конфиг, репозитории, attachmentsПростой бэкап папки данных
# Остановить Gitea перед бэкапом БД
docker compose stop gitea
# Создать архив
tar -czf ~/gitea-backup-$(date +%Y%m%d).tar.gz -C /opt/gitea data/
# Запустить обратно
docker compose start gitea
ls -lh ~/gitea-backup-*.tar.gzАвтоматический бэкап через cron
0 2 * * * docker stop gitea && tar -czf ~/backups/gitea-$(date +%Y%m%d).tar.gz -C /opt/gitea data/ && docker start gitea
30 2 * * * find ~/backups/ -name "gitea-*.tar.gz" -mtime +30 -deletemkdir -p ~/backupsОбновление Gitea
cd /opt/gitea
# Скачать новый образ и перезапустить
docker compose pull
docker compose down && docker compose up -d
# Проверить версию
docker exec gitea gitea --version