↓Перейти к содержанию
  1. Git: руководства и команды/

Собственный Git сервер: настройка self-hosted хостинга репозиториев

·4 минуты·

Развернуть собственный Git сервер нужно, когда данные нельзя хранить в облачных сервисах, нужен полный контроль над репозиториями, или просто хочется избежать зависимости от GitHub/GitLab.com. Вариантов несколько — от минималистичного SSH до полноценных веб-платформ.

Вариант 1: простой SSH сервер #

Самый простой способ — Git репозитории через SSH. Не требует дополнительного ПО.

Настройка сервера #

# На сервере: создать пользователя git
sudo adduser git
sudo su - git

# Настроить SSH ключи
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# Добавить публичный ключ разработчика
echo "ssh-ed25519 AAAA... developer@laptop" >> ~/.ssh/authorized_keys

# Создать репозиторий
mkdir -p ~/repos
cd ~/repos
git init --bare myapp.git

Работа с репозиторием #

# Разработчик: клонировать репозиторий
git clone [email protected]:repos/myapp.git
cd myapp

# Обычная работа
echo "Hello" > README.md
git add README.md
git commit -m "Initial commit"
git push origin main

# Клонировать у другого разработчика
git clone [email protected]:repos/myapp.git

Ограничение доступа #

# Запретить git пользователю интерактивный shell
sudo chsh -s $(which git-shell) git

# Теперь: git push/clone работают
# Но: ssh [email protected] — отказано
# git-shell разрешает только Git операции

# Разрешить только определённые команды в authorized_keys
cat ~/.ssh/authorized_keys
# command="git-shell -c \"$SSH_ORIGINAL_COMMAND\"",
# no-port-forwarding,no-X11-forwarding,no-agent-forwarding
# ssh-ed25519 AAAA... developer@laptop

Вариант 2: Gitea (рекомендуется) #

Gitea — лёгкий self-hosted Git сервис с веб-интерфейсом. Один бинарный файл, низкие требования к ресурсам.

# Установка через Docker (проще всего)
docker run -d \
  --name gitea \
  -p 3000:3000 \
  -p 222:22 \
  -v /srv/gitea:/data \
  gitea/gitea:latest

# Или через docker-compose
cat > docker-compose.yml << 'EOF'
version: "3"
services:
  gitea:
    image: gitea/gitea:latest
    environment:
      - USER_UID=1000
      - USER_GID=1000
    ports:
      - "3000:3000"
      - "222:22"
    volumes:
      - ./gitea:/data
    restart: unless-stopped
EOF
docker-compose up -d

# Открыть http://server:3000 и пройти первоначальную настройку

Возможности Gitea: веб-интерфейс как GitHub, pull requests, issues, CI/CD (Gitea Actions), организации, разграничение прав, webhooks, API.

Минимальные требования: 512 МБ RAM, 1 ядро CPU, подходит для небольших команд.

Вариант 3: GitLab Community Edition #

GitLab CE — полноценная DevOps платформа с бесплатным self-hosted вариантом.

# Установка на Ubuntu 22.04
curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" apt install gitlab-ce

# Первый вход: пользователь root, пароль в файле
sudo cat /etc/gitlab/initial_root_password

# Конфигурация в /etc/gitlab/gitlab.rb
sudo gitlab-ctl reconfigure  # применить изменения

# Обновление
sudo apt update && sudo apt upgrade gitlab-ce

GitLab CE включает: репозитории, CI/CD pipelines, container registry, issue tracker, wiki, code review. Требует: минимум 4 ГБ RAM, 4 ядра CPU, 10 ГБ диска.

Вариант 4: Forgejo #

Forgejo — fork Gitea с открытым управлением. API совместим с Gitea:

docker run -d \
  --name forgejo \
  -p 3000:3000 \
  -p 222:22 \
  -v /srv/forgejo:/data \
  codeberg.org/forgejo/forgejo:latest

Вариант 5: Gitolite (управление правами) #

Gitolite — система управления доступом к Git репозиториям через SSH:

# Установка Gitolite (на сервере)
sudo apt install gitolite3

# Администрирование через специальный репозиторий
git clone git@server:gitolite-admin
cd gitolite-admin

# conf/gitolite.conf — конфигурация прав
cat conf/gitolite.conf
repo myapp
    RW+     =   alice bob   # полный доступ
    R       =   charlie     # только чтение
    -       =   dave        # запрет

repo @all
    R       =   admin       # admin читает все репозитории
# Добавить нового разработчика
cp /tmp/dave.pub keydir/dave.pub
git add keydir/dave.pub
git commit -m "Add dave's SSH key"
git push  # изменения применяются автоматически

Сравнение вариантов #

Вариант         RAM    Сложность   Возможности
SSH + bare      ~0     Низкая      Только репозитории
Gitea           512МБ  Низкая      Веб-интерфейс, PR, Issues, CI
Forgejo         512МБ  Низкая      Как Gitea, более открытый
GitLab CE       4ГБ    Высокая     Полная DevOps платформа
Gitolite        ~0     Средняя     Тонкое управление правами

Резервное копирование #

Независимо от выбранного варианта, регулярное резервное копирование обязательно:

# Простое зеркалирование bare репозитория
rsync -avz /srv/git/repos/ backup-server:/backup/git/

# Или через git clone --mirror
git clone --mirror git@server:repos/myapp.git /backup/myapp.git
# Обновление зеркала:
cd /backup/myapp.git && git remote update

# Для GitLab: встроенный бэкап
sudo gitlab-backup create
# Файл: /var/opt/gitlab/backups/XXXXXXXXX_gitlab_backup.tar

# Для Gitea: бэкап через утилиту
gitea dump -c /etc/gitea/app.ini

Webhooks для CI/CD #

# После push на сервер: автодеплой через post-receive хук
cat > /srv/git/repos/myapp.git/hooks/post-receive << 'EOF'
#!/bin/bash
while read oldrev newrev refname; do
  if [ "$refname" = "refs/heads/main" ]; then
    echo "Deploying main branch..."
    # Обновить рабочую копию
    git --work-tree=/var/www/myapp --git-dir=/srv/git/repos/myapp.git checkout -f main
    # Или вызвать скрипт деплоя
    /usr/local/bin/deploy-myapp.sh
  fi
done
EOF
chmod +x /srv/git/repos/myapp.git/hooks/post-receive

Часто задаваемые вопросы #

Что выбрать для команды из 5 человек? Gitea — оптимальный выбор. Лёгкий, с веб-интерфейсом, pull requests, и не требует мощного сервера. Запускается в Docker за 5 минут.

Нужен ли SSL/TLS для собственного сервера? Да. Без TLS пароли и токены передаются открытым текстом. Let’s Encrypt предоставляет бесплатные сертификаты: установите nginx перед Gitea с certbot.

Как мигрировать репозитории с GitHub? Gitea и GitLab имеют встроенные инструменты импорта. Или вручную: git clone --mirror github.com/user/repo.git && git push --mirror git@myserver:user/repo.git.

Можно ли использовать GitHub Actions с собственным сервером? Нет. Но Gitea поддерживает Gitea Actions (совместимо с GitHub Actions синтаксисом). GitLab CE имеет встроенный CI/CD.

Как разграничить права если нужна тонкая настройка? GitLab CE предоставляет роли (Owner/Maintainer/Developer/Reporter/Guest) на уровне проекта и группы. Gitolite предоставляет настройку прав вплоть до отдельных веток через конфигурационный файл.

Заключение #

Для минималистичного решения — SSH с bare репозиторием. Для командной разработки с удобным интерфейсом — Gitea (легковесный) или GitLab CE (полная платформа). Выбор зависит от ресурсов сервера и нужных функций. В любом случае настройте резервное копирование и HTTPS. О протоколах Git читайте в отдельной статье.