HTTP Git‑сервер с Nginx на Ubuntu 22.04

Git — это система контроля версий с открытым исходным кодом, которая отслеживает изменения на уровне исходников. Её используют тысячи разработчиков для управления изменениями кода, отката к предыдущим версиям и создания параллельных веток файлов и директорий.
HTTP Git Server — открытый проект, который позволяет шарить Git‑репозитории по локальной сети (LAN) через HTTP/HTTPS. Это простой в развертывании вариант для небольших команд или тестовой инфраструктуры, управляемый из командной строки.
В этой инструкции показано, как настроить HTTP Git‑сервер на базе Nginx в Ubuntu 22.04 и защитить его сертификатом Let’s Encrypt.
Что вы получите из этого руководства
- Минимальная рабочая конфигурация Nginx + fcgiwrap для обслуживания Git по HTTP/HTTPS.
- Примеры команд на сервере и клиенте, необходимые права и проверки.
- Простая схема аутентификации через htpasswd и автоматическая выдача SSL через Certbot.
Предварительные требования
- Сервер с Ubuntu 22.04.
- Домен, указывающий на IP сервера (например, git.example.com).
- Доступ root или эквивалентные права sudo.
Важно: в примерах используются имена и пути, которые вы можете заменить под свою среду.
Установка Nginx и необходимых пакетов
Установите Nginx, Git и вспомогательные утилиты:
apt-get install nginx git fcgiwrap apache2-utils unzip -yПосле установки можно переходить к созданию репозитория.
Создание Git‑репозитория
Создайте каталог внутри веб‑корня Nginx для хранения репозиториев:
mkdir /var/www/html/gitrepoПерейдите в каталог и создайте «голый» (bare) репозиторий для пользователя:
cd /var/www/html/gitrepo
mkdir hitesh.gitИнициализируйте bare‑репозиторий:
cd hitesh.git
git --bare initВы увидите:
Initialized empty Git repository in /var/www/html/gitrepo/hitesh.git/Обновите серверную информацию для поддержки HTTP доступа:
git update-server-infoУстановите владельца и права доступа, чтобы Nginx/FCGI могли читать репозиторий:
chown -R www-data:www-data /var/www/html/gitrepo
chmod -R 755 /var/www/html/gitrepoСоздайте файл паролей и добавьте пользователя hitesh (утилита htpasswd из пакета apache2-utils):
htpasswd -c /var/www/html/gitrepo/htpasswd hiteshПример интерактивного ввода пароля:
New password:
Re-type new password:
Adding password for user hiteshПроверить содержимое файла паролей:
cat /var/www/html/gitrepo/htpasswdПример вывода (хеш будет отличаться):
hitesh:$vcr2$AdyCEkaA$Fsq5nDbLhBDdafCQGBUsr2Конфигурация Nginx для обслуживания Git репозитория
Создайте конфигурацию виртуального хоста Nginx:
nano /etc/nginx/conf.d/gitrepo.confДобавьте следующую конфигурацию (адаптируйте server_name под ваш домен):
server {
listen 80;
root /var/www/html/gitrepo;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name git.example.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/gitrepo/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/gitrepo;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param PATH_INFO $1;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
}Сохраните файл и проверьте синтаксис конфигурации Nginx:
nginx -tОжидаемый вывод:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulПерезапустите Nginx, чтобы применить изменения:
systemctl restart nginxПроверить статус службы:
systemctl status nginxПример вывода статуса службы (вывод сокращён):
? nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-11-05 08:00:04 UTC; 2s ago
Docs: man:nginx(8)
Process: 144985 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 144987 (nginx)Важно: если при старте Nginx возникают ошибки, проверьте пути к fcgiwrap.socket и права доступа к /var/www/html/gitrepo.
Защита Git HTTP сервера сертификатом Let’s Encrypt
Установите Certbot и плагин для Nginx:
apt-get install certbot python3-certbot-nginx -yЗапустите Certbot для автоматического получения и установки сертификата для вашего домена:
certbot --nginx -d git.example.comПри интерактивной настройке вам предложат ввести e‑mail и принять условия. Затем Certbot выполнит http‑01 проверку и предложит, нужно ли перенаправлять весь трафик на HTTPS. Рекомендуется выбрать перенаправление (вариант 2).
Пример фрагментов вывода Certbot (сокращено):
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for git.example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/git.confПосле успешной установки вы увидите поздравление и путь к файлам сертификата:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/git.example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/git.example.com/privkey.pem
Your cert will expire on 2023-02-06. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"Совет: проверьте конфигурацию TLS через SSL Labs или похожий сервис.
Подключение к Git‑репозиторию с клиента
На клиенте установите Git:
apt-get install git -yСоздайте каталог проекта и инициализируйте репозиторий:
mkdir project
cd project
git initСконфигурируйте глобально имя и e‑mail:
git config --global user.email "[email protected]"
git config --global user.name "hitesh"Добавьте удалённый origin, указывая URL вашего сервера:
git remote add origin https://git.example.com/hitesh.gitСоздайте структуру проекта и добавьте файл:
mkdir data
echo "This is my first application" > data/appДобавьте файлы в индекс и зафиксируйте изменения:
git add .
git commit -a -m "Add files and directories"Выгрузите (push) в удалённый репозиторий:
git push origin masterПри доступе по HTTPS вас попросят ввести пароль от пользователя hitesh (htpasswd).
Пример успешного пуша:
Counting objects: 4, done.
Writing objects: 100% (4/4), 281 bytes | 281.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To https://git.example.com/hitesh.git
* [new branch] master -> masterКлонирование репозитория выглядит так:
git clone https://git.example.com/hitesh.gitЧастые ошибки и как их исправить
- Nginx возвращает 502 или 499: проверьте, что fcgiwrap запущен и сокет /var/run/fcgiwrap.socket существует и доступен для www-data.
- Ошибка доступа к репозиторию: убедитесь, что права и владелец /var/www/html/gitrepo настроены на www-data и что htpasswd корректен.
- Проблемы с HTTPS: проверьте, что DNS для домена верно указывает на сервер и что правило перенаправления HTTP→HTTPS не блокирует проверку Certbot.
Когда этот способ не подходит
- Большие команды с тонким разграничением прав: лучше рассмотреть GitLab, Gitea или другой Git‑хост с управлением пользователей и пулл‑реквестами.
- Требуется интеграция CI/CD и issue‑трекер: полноценные платформы удобнее.
Альтернативы
- Gitea — лёгкий self‑hosted Git с веб‑интерфейсом.
- GitLab CE — полный набор функций DevOps, но более ресурсоёмкий.
- SSH‑доступ к Git‑репозиториям (git over ssh) — проще с точки безопасности и прав, но требует управления ключами.
Критерии приёмки
- Репозиторий клонируется по HTTPS без ошибок.
- Push и Pull работают, аутентификация через htpasswd успешна.
- Сертификат TLS установлен и валиден, сайт доступен по HTTPS.
- Права на директории настроены, Nginx не выдаёт ошибок при старте.
Мини‑методология быстрой проверки (checklist)
- DNS указывает на сервер
- Nginx и fcgiwrap установлены
- Bare‑репозиторий и htpasswd созданы
- Nginx конфигурация проверена (nginx -t)
- Certbot выполнился и сертификат активирован
- Клонирование и push с клиента проходят успешно
Полезные команды и сниппет‑чек‑лист
- Проверка доступа к порту 80/443: curl -I http://git.example.com
- Проверка сокета fcgiwrap: ss -x | grep fcgiwrap
- Обновление server info после изменений: git update-server-info
1‑строчный глоссарий
- bare‑репозиторий — репозиторий без рабочей копии, используемый для удалённого хранения.
- fcgiwrap — процесс, обеспечивающий запуск CGI‑скриптов (здесь: git‑http‑backend).
- htpasswd — утилита для управления простым файлом аутентификации HTTP.
Итог
Это простая, воспроизводимая конфигурация HTTP Git‑сервера на базе Nginx и Ubuntu 22.04. Для небольших команд и локальных сред решение даёт быстрый доступ к репозиториям с минимальными затратами. Для более масштабных потребностей рассмотрите специализированные платформы (Gitea, GitLab).
Важно: следите за обновлением сертификатов (certbot renew) и регулярно проверяйте права доступа и логи Nginx.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента