Гид по технологиям

Настройка HTTP Git-сервера с Nginx на Debian 11

• 5 min read • DevOps • Обновлено 27 Nov 2025
HTTP Git-сервер с Nginx на Debian 11
HTTP Git-сервер с Nginx на Debian 11

Git и Nginx — схематическое изображение

TL;DR

Кратко: на Debian 11 можно быстро развернуть HTTP Git-сервер на базе Nginx, fcgiwrap и голых (bare) репозиториев. В статье показаны шаги установки пакетов, создания bare-репозитория, конфигурации Nginx и тестирования с клиента. Включены рекомендации по безопасности, отладке и контрольный чек-лист для администратора и разработчика.

Что вы сделаете в этом руководстве

  • Установите Nginx, git и fcgiwrap
  • Создадите bare-репозиторий и файл htpasswd для авторизации
  • Настроите виртуальный хост Nginx для обслуживания Git по HTTP
  • Подключитесь к серверу с клиентской машины и сделаете push/clone
  • Получите контрольный список, рекомендации по безопасности и инструкции по устранению неполадок

Предварительные требования

  • Сервер с Debian 11
  • Домен, указывающий на IP сервера (например, git.example.com)
  • Доступ root или эквивалентные привилегии

Установка Nginx и зависимостей

Установите Nginx, Git, fcgiwrap и вспомогательные утилиты одной командой:

apt-get install nginx git fcgiwrap apache2-utils unzip -y

После установки убедитесь, что службы активны, и переходите к созданию репозитория.

Создание Git-репозитория

Создайте каталог в корне веб-сервера для репозиториев и инициализируйте bare-репозиторий для пользователя user1:

mkdir -p /var/www/html/myrepo
cd /var/www/html/myrepo
mkdir user1.git
cd user1.git
git --bare init

Вы увидите вывод:

Initialized empty Git repository in /var/www/html/myrepo/user1.git/

Затем обновите служебную информацию сервера Git и задайте права:

git update-server-info
chown -R www-data:www-data /var/www/html/myrepo
chmod -R 755 /var/www/html/myrepo

Создайте файл паролей для HTTP-авторизации и добавьте пользователя user1:

htpasswd -c /var/www/html/myrepo/htpasswd user1

Команда попросит ввести и подтвердить пароль. Проверить содержимое файла можно так:

cat /var/www/html/myrepo/htpasswd

Пример строки в htpasswd:

user1:$apr1$LoyCEkzA$Fjq5nBbLhBRdaxCQBBUQd1

Конфигурация Nginx для обслуживания Git

Создайте файл виртуального хоста:

nano /etc/nginx/conf.d/git.conf

Добавьте следующий блок конфигурации (пример):

server {
        listen 80;

        root /var/www/html/myrepo;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

        server_name git.yourdomain.com;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

location ~ (/.*) {
    client_max_body_size 0; 
    auth_basic "Git Login"; 
    auth_basic_user_file "/var/www/html/myrepo/htpasswd";
    include /etc/nginx/fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; 
    fastcgi_param GIT_HTTP_EXPORT_ALL "";
    fastcgi_param GIT_PROJECT_ROOT /var/www/html/myrepo;
    fastcgi_param REMOTE_USER $remote_user;
    fastcgi_param PATH_INFO $1; 
    fastcgi_pass  unix:/var/run/fcgiwrap.socket;
}

}

Сохраните файл и проверьте синтаксис Nginx:

nginx -t

Если все в порядке, перезапустите службу:

systemctl restart nginx
systemctl status nginx

В примере системного вывода может отображаться информация о процессе nginx и времени запуска.

Подключение к репозиторию с клиентской машины

На клиенте установите Git и подготовьте проект:

apt-get install git -y
mkdir project
cd project
git init

Настройте имя и email для коммитов:

git config --global user.email "[email protected]"
git config --global user.name "user1"

Добавьте удаленный репозиторий по HTTP и выполните push:

git remote add origin http://git.yourdomain.com/user1.git
mkdir dev01
echo "This is my first application" > dev01/file1
git add .
git commit -a -m "Add files and directories"
git push origin master

При push вас попросят ввести пароль пользователя, указанного в htpasswd. После успешного push вы увидите подтверждение создания ветки master.

Чтобы клонировать репозиторий:

git clone http://git.yourdomain.com/user1.git

Рекомендации по безопасности

Важно: HTTP без TLS передаёт пароли в незашифрованном виде. Рекомендуется:

  • Перевести сайт на HTTPS, используя Let’s Encrypt и certbot: apt-get install certbot python3-certbot-nginx
  • Ограничивать доступ по IP или размещать сервер во внутренней сети (LAN)
  • Хранить репозитории с владельцем www-data и минимальными правами записи
  • Отключить ненужные HTTP-методы и лимитировать размеры загрузок
  • Рассмотреть использование SSH для доступа к репозиториям при необходимости повышенной безопасности
  • Внедрить fail2ban для защиты от перебора паролей

Пример быстрой генерации TLS и автоматической настройки nginx:

apt-get install certbot python3-certbot-nginx -y
certbot --nginx -d git.yourdomain.com

Типичные ошибки и способы их устранения

  • 403 Forbidden: проверьте права на каталоги и owner (www-data). Убедитесь, что try_files не блокирует обращение к скрипту.
  • 502 Bad Gateway: проверьте, что fcgiwrap запущен и доступен по unix-сокету /var/run/fcgiwrap.socket. Перезапустите fcgiwrap.
  • Ошибка авторизации: убедитесь, что auth_basic_user_file указывает на правильный htpasswd и формат соответствует Apache MD5/crypt.
  • Push зависает или обрывается: проверьте client_max_body_size в конфигурации и сетевые ограничения.
  • systemd пишет Failed to parse PID from file /run/nginx.pid: часто можно игнорировать при успешном старте, но стоит проверить права и наличие файла /run/nginx.pid.

Команды для отладки:

systemctl status nginx
journalctl -u nginx -xe
ps aux | grep fcgiwrap
ls -la /var/www/html/myrepo
tail -n 200 /var/log/nginx/error.log

Контрольные списки по ролям

Администратор (быстрый чек-лист):

  • Установлены nginx, git, fcgiwrap
  • Созданы bare-репозитории в /var/www/html/myrepo
  • htpasswd создан и проверен
  • Nginx конфигурация валидна (nginx -t)
  • Включён HTTPS (Let’s Encrypt)
  • Протестированы push/clone с клиентской машины

Разработчик (быстрый чек-лист):

  • Настроены user.name и user.email
  • Добавлен origin и протестирован push
  • Проверены права на локальные файлы
  • Установлено ограничение на размер файлов, если нужно

План отката и восстановление репозитория

Если push повредил репозиторий или нужно откатиться:

  • Сохраните текущее состояние bare-репозитория копированием каталога в резервную папку.
cp -a /var/www/html/myrepo/user1.git /root/backup/user1.git.bak
  • Для восстановления замените повреждённый каталог резервной копией и выполните git fsck для проверки целостности.
rm -rf /var/www/html/myrepo/user1.git
mv /root/backup/user1.git.bak /var/www/html/myrepo/user1.git
chown -R www-data:www-data /var/www/html/myrepo/user1.git
git --git-dir=/var/www/html/myrepo/user1.git fsck --full

Критерии приёмки

  • Репозиторий доступен по HTTP(S) и отвечает при git clone
  • Push отрабатывает и появляется ветка master на сервере
  • Доступ защищён паролем (htpasswd) и/или TLS включён
  • Логи Nginx чистые от ошибок при базовых операциях

Мини-методология внедрения (быстрый план из 5 шагов)

  1. Подготовьте сервер и домен
  2. Установите пакеты (nginx, git, fcgiwrap, htpasswd)
  3. Создайте bare-репозитории и htpasswd
  4. Настройте Nginx и проверьте конфигурацию
  5. Переведите на HTTPS и выполните тестовый push/clone

Минимальные тесты и критерии приёмки

  • git clone http://git.yourdomain.com/user1.git — должен успешно клонировать
  • git push origin master — должен принять изменения и вернуть ссылку на репозиторий
  • Попытка доступа без авторизации должна требовать пароль

Отладочная схема принятия решений

flowchart TD
  A[Push не проходит] --> B{Ошибка авторизации?}
  B -- Да --> C[Проверить htpasswd и пароль]
  B -- Нет --> D{Ошибка 502 или 504?}
  D -- Да --> E[Проверить fcgiwrap и fastcgi сокет]
  D -- Нет --> F[Проверить логи nginx и права файлов]
  E --> F
  C --> F
  F --> G[Если не помогло — восстановить из бэкапа]

Короткий чек-лист безопасности для продакшна

  • Включить HTTPS (обязательно)
  • Отключить анонимную загрузку (GIT_HTTP_EXPORT_ALL по умолчанию пуст)
  • Регулярно бэкапить bare-репозитории
  • Ограничить административный доступ и использовать VPN для админских задач

Заключение

В этом руководстве показано, как развернуть простой HTTP Git-сервер на базе Nginx и fcgiwrap в Debian 11. Для локальной разработки такое решение удобно и быстро настраивается, однако для продуктивных систем рекомендуется дополнительно включать HTTPS, настроить мониторинг и политику резервного копирования.

Важно: при переносе в продакшн рассмотрите использование SSH-доступа для большего уровня безопасности, или готовых решений (Gitea, GitLab) если нужен веб-интерфейс и управление пользователями.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро