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

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 шагов)
- Подготовьте сервер и домен
- Установите пакеты (nginx, git, fcgiwrap, htpasswd)
- Создайте bare-репозитории и htpasswd
- Настройте Nginx и проверьте конфигурацию
- Переведите на 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) если нужен веб-интерфейс и управление пользователями.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента