VPSРейтинг
РазработкаМарт 2026 · 13 мин чтения

Gitea на VPS: свой Git вместо GitHub

Gitea — лёгкий self-hosted Git-сервер на Go. Работает на VPS с 512 МБ RAM, разворачивается за 10 минут через Docker, поддерживает SSH, Pull Requests, Issues, Webhooks и даже CI/CD через Gitea Actions. При этом потребляет в 20–40 раз меньше ресурсов, чем GitLab.

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

ПараметрGiteaGitLab CEGitHub
Хранение кодаВаш серверВаш серверСерверы 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-решений.

512 МБ RAM

Личное использование

  • 1 vCPU
  • 512 МБ RAM
  • 10 ГБ диска
  • До 5 пользователей
1–2 ГБ RAM

Небольшая команда

  • 2 vCPU
  • 1–2 ГБ RAM
  • 20–50 ГБ диска
  • 10–30 пользователей
2–4 ГБ RAM

С Gitea Actions

  • 2+ vCPU
  • 2–4 ГБ RAM
  • 50 ГБ+ SSD/NVMe
  • CI/CD + активные коммиты

Нужны: публичный IP-адрес, домен или поддомен и HTTPS. Git по SSH работает без SSL, но веб-интерфейс и webhooks должны быть доступны по HTTPS.

4. Установка Docker

Если Docker ещё не установлен — официальный скрипт устанавливает всё за одну команду.

Установка Docker Engine (Ubuntu 22.04 / 24.04)
curl -fsSL https://get.docker.com | sh

# Запустить и добавить в автозапуск
systemctl enable --now docker

# Проверить версию
docker --version
docker compose version

5. Docker Compose — запуск Gitea

Шаг 1: создать директорию и пользователя

Gitea внутри контейнера работает от пользователя с UID 1000. Создадим системного пользователя git на хосте — он будет владеть данными репозиториев.

Создать пользователя 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 хоста.

/opt/gitea/docker-compose.yml
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: запуск

Запустить Gitea
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

Установить Nginx и Let's Encrypt
apt install nginx certbot python3-certbot-nginx -y

Конфигурация Nginx

/etc/nginx/sites-available/gitea
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;
    }
}
Активировать и получить SSL
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. Большинство полей уже заполнены из переменных окружения. Основное — создать аккаунт администратора.

1

Проверьте настройки

Убедитесь, что Domain и Root URL заполнены правильно (из переменных окружения). Database Type — SQLite3.

2

Создайте аккаунт администратора

Прокрутите вниз до раздела "Administrator Account Settings". Введите имя, email и пароль. Этот аккаунт имеет полный контроль над Gitea.

3

Нажмите "Install Gitea"

Через несколько секунд вы будете перенаправлены в Gitea под созданным аккаунтом.

4

Закройте регистрацию

После создания своего аккаунта запретите регистрацию новых пользователей. Измените переменную в docker-compose.yml.

/opt/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-ключа (локально, на вашем компьютере)
ssh-keygen -t ed25519 -C "your@email.com"

# Вывести публичный ключ для добавления в Gitea
cat ~/.ssh/id_ed25519.pub

Настройка SSH-клиента

Добавьте в ~/.ssh/config на своём компьютере, чтобы не указывать порт вручную:

~/.ssh/config (на вашем компьютере)
Host git.example.com
    HostName git.example.com
    User git
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Проверьте соединение:

Проверить SSH-подключение к Gitea
ssh -T git@git.example.com -p 2222
# Успех: Hi username! You've successfully authenticated...

После настройки ~/.ssh/config клонирование работает как обычно:

Клонирование репозитория по SSH
git clone git@git.example.com:username/repo.git

# Или явно с портом (без ~/.ssh/config)
git clone ssh://git@git.example.com:2222/username/repo.git

9. Миграция с 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

1.Нажмите "+" в верхнем правом углу → New Migration
2.Выберите GitHub
3.Введите URL репозитория: https://github.com/username/repo
4.В поле "Clone Authorization" введите ваш GitHub-токен
5.Выберите что мигрировать: Issues, Pull Requests, Labels, Milestones, Releases, Wiki
6.Нажмите Migrate Repository

Зеркало (Mirror) — автосинхронизация

Если отметить опцию This repository will be a mirror, Gitea будет автоматически синхронизировать репозиторий с GitHub каждые 8 часов (настраивается). Удобно для постепенного перехода: GitHub остаётся основным, Gitea — зеркалом.

Перенос нескольких репозиториев через API

Для массовой миграции используйте Gitea API. Пример скрипта на bash:

Массовая миграция через Gitea API
#!/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}"
done

10. 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

/opt/gitea/docker-compose.yml — добавить переменную
- GITEA__actions__ENABLED=true
Перезапустить Gitea
docker compose down && docker compose up -d

Установить act-runner

Получите токен регистрации в Gitea: Admin Panel → Runners → Create new runner.

Добавить runner в docker-compose.yml
  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-runner
Запустить runner
docker compose up -d act-runner

# Проверить что runner появился в Gitea
# Admin → Runners — статус должен быть Active

Пример workflow

Файл работает одинаково в Gitea и GitHub Actions:

.gitea/workflows/ci.yml
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 build

11. Резервные копии

Все данные Gitea хранятся в папке /opt/gitea/data/: конфигурация, база данных SQLite и сами репозитории в виде git-объектов. Gitea также имеет встроенный инструмент бэкапа.

Встроенный бэкап Gitea

Создать дамп через gitea CLI
# Выполнить команду dump внутри контейнера
docker exec -u git gitea gitea dump -c /data/gitea/conf/app.ini

# Файл gitea-dump-*.zip появится в текущей директории
# Содержит: БД, конфиг, репозитории, attachments

Простой бэкап папки данных

Создать архив всех данных Gitea
# Остановить 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

crontab -e — ежедневный бэкап в 2:00
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 -delete
Создать папку для бэкапов
mkdir -p ~/backups

Обновление Gitea

Обновить до последней версии
cd /opt/gitea

# Скачать новый образ и перезапустить
docker compose pull
docker compose down && docker compose up -d

# Проверить версию
docker exec gitea gitea --version

Частые вопросы

Нужен VPS для Gitea? Достаточно 1 ГБ RAM

VPS для Docker-проектов →

Смотрите также