Установка HTTP Git‑сервера с Nginx на Ubuntu 18.04

Что это и зачем
Git — распределённая система контроля версий для отслеживания изменений в коде. HTTP Git‑сервер позволяет предоставлять доступ к bare‑репозиториям через протокол HTTP(S), а Nginx используется как внешний веб‑сервер и reverse‑proxy, который перенаправляет запросы в git‑http‑backend через FastCGI.
Короткое определение: git‑http‑backend — CGI‑исполняемый файл из пакета Git, который обрабатывает HTTP(S) запросы к репозиториям.
Требования
- Свежая установка Ubuntu 18.04 LTS.
- Пользователь с sudo‑правами.
- Статический IP на сервере (в примерах используется 192.168.1.100).
- Доступ к сети из клиентской машины.
Важно: в продакшене используйте HTTPS (в инструкции приведён пример по HTTP для простоты). Для публичных репозиториев или передачи чувствительных данных обязательно настройте TLS.
1 Обновление системы
Перед началом обновите пакеты:
sudo apt-get update -y
sudo apt-get upgrade -yПерезагрузите систему при необходимости и войдите под sudo‑пользователем.
2 Установка необходимых пакетов
Установите nginx, git, редактор и вспомогательные пакеты:
sudo apt-get install nginx git nano fcgiwrap apache2-utils -yСоздайте директорию для репозиториев и назначьте владельца веб‑пользователю:
sudo mkdir -p /var/www/html/git
sudo chown -R www-data:www-data /var/www/html/gitfcgiwrap обеспечивает запуск git‑http‑backend под FastCGI, а apache2‑utils содержит утилиту htpasswd для создания файла паролей.
3 Конфигурация Nginx
Откройте конфигурацию по умолчанию:
sudo nano /etc/nginx/sites-available/defaultЗамените содержимое на следующий блок (вставьте или измените существующий server):
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html/git;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
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; # Git pushes can be massive, just to make sure nginx doesn't suddenly cut the connection add this.
auth_basic "Git Login"; # Whatever text will do.
auth_basic_user_file "/var/www/html/git/htpasswd";
include /etc/nginx/fastcgi_params; # Include the default fastcgi configs
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; # Tells fastcgi to pass the request to the git http backend executable
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /var/www/html/git; # /var/www/git is the location of all of your git repositories.
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param PATH_INFO $1; # Takes the capture group from our location directive and gives git that.
fastcgi_pass unix:/var/run/fcgiwrap.socket; # Pass the request to fastcgi
}
}Сохраните файл и проверьте конфигурацию nginx:
sudo nginx -tЕсли ошибок нет, перезапустите nginx:
sudo systemctl restart nginx
sudo systemctl status nginxВы должны увидеть статус сервера запущенным. Ниже пример ожидаемого результата:

Создайте пользователя для доступа к репозиториям. Для примера используем имя hitesh:
sudo htpasswd -c /var/www/html/git/htpasswd hiteshЭта команда создаст файл /var/www/html/git/htpasswd и запросит пароль.
4 Создание bare‑репозитория
Перейдите в директорию репозиториев и создайте bare‑репозиторий:
cd /var/www/html/git
sudo mkdir hitesh.git
cd hitesh.git
sudo git --bare init
sudo git update-server-info
sudo chown -R www-data:www-data .
sudo chmod -R 755 .Важно: для HTTP доступа к bare‑репозиторию необходимы корректные права и обновлённый server‑info.
5 Настройка брандмауэра UFW
Если вы используете UFW, включите его и разрешите HTTP и SSH трафик:
sudo ufw enable
sudo ufw allow http
sudo ufw allow ssh
sudo ufw statusSSH не обязателен для Git по HTTP, но полезен для управления сервером.
6 Тестирование с клиентской машины
Установите git на клиенте:
sudo apt-get install git -yСоздайте локальный тестовый проект и свяжите его с удалённым репозиторием по HTTP:
mkdir ~/testproject
cd ~/testproject
git init
git remote add origin http://[email protected]/hitesh.gitДобавьте файлы и сделайте первый коммит:
mkdir test1 test2 test3
echo "This is my first repository" > test1/repo1
echo "This is my second repository" > test2/repo2
echo "This is my third repository" > test3/repo3
git add .
git commit -a -m "Add files and directories"Отправьте изменения на сервер:
git push origin masterПри запросе вас попросят ввести HTTP‑пароль для пользователя hitesh. После успешного push файлы окажутся в /var/www/html/git/hitesh.git.
Клонирование репозитория с сервера:
git clone http://[email protected]/hitesh.gitИ затем:
cd hitesh
treeВы увидите структуру каталогов и файлов, как в примере выше.
Факто‑бокс
- Основные порты: 80 (HTTP), 22 (SSH если включён).
- Путь к репозиториям в примере: /var/www/html/git.
- Утилиты: git, nginx, fcgiwrap, apache2-utils.
- Права: www‑data как владелец каталога репозиториев.
Меры безопасности и рекомендации
- Используйте HTTPS в рабочей среде: настройте сертификат (Let’s Encrypt) и слушайте 443.
- Ограничьте доступ по IP, если репозиторий предназначен для внутреннего использования.
- Регулярно обновляйте пакеты и систему.
- Для многопользовательской разработки рассмотрите использование системы контроля доступа с учётом ролей (например, GitLab, Gitea).
- Не храните в репозиториях секреты (пароли, ключи). Если нужно — применяйте инструменты управления секретами.
Альтернативные подходы
- Доступ по SSH (git+ssh) — проще в настройке для приватных репозиториев и безопаснее при отсутствии HTTPS.
- Самостоятельные хосты Git‑платформ: GitLab, Gitea, Bitbucket Server — содержат UI, CI/CD и управление пользователями.
- Облачные сервисы: GitHub/GitLab.com — минимум инфраструктуры, но не всегда подходят для приватных сетей.
Когда этот подход не подходит
- Нужен продвинутый UI, управление правами и интеграция CI/CD — лучше использовать GitLab или Gitea.
- Высокие требования к безопасности и аудиту — предпочтительнее корпоративные решения с SSO.
- Большие бинарные файлы — рассмотрите Git LFS или альтернативные хранилища.
Чек‑лист для администратора
- Обновить систему и установить пакеты.
- Создать /var/www/html/git и настроить права.
- Настроить nginx и fcgiwrap.
- Создать htpasswd и пользователей.
- Создать bare‑репозиторий и проверить git update-server-info.
- Настроить UFW/брандмауэр.
- Настроить HTTPS и резервное копирование.
Чек‑лист для разработчика
- Установить git на клиенте.
- Инициализировать локальный репозиторий и добавить remote.
- Сделать commit и push, проверить ввод пароля.
- Клонировать репозиторий на другую машину и проверить целостность.
Устранение неполадок
- Ошибка 403/401 при push: проверьте htpasswd, права на директорию и auth_basic_user_file в конфигурации nginx.
- 502 Bad Gateway: проверьте, что fcgiwrap запущен и существует unix‑сокет /var/run/fcgiwrap.socket. Перезапустите fcgiwrap и nginx.
- Push прерывается на больших файлах: убедитесь, что client_max_body_size установлен в 0 или достаточно большой размер.
- git update-server-info не выполнен: некоторые клиенты по HTTP требуют наличия server‑info, выполните git update-server-info в каталоге bare‑репо.
Критерии приёмки
- Сервер отвечает на HTTP‑запросы и возвращает 200 для GET на путь к репозиторию.
- Пользователь может выполнить git push и git clone с корректной аутентификацией.
- Права владельца и доступа к файлам настроены на www‑data.
- Nginx успешно перезапускается без ошибок конфигурации.
Резюме
Вы развернули простой HTTP Git‑сервер на Ubuntu 18.04 с использованием Nginx и fcgiwrap. Этот способ подходит для внутренних сетей и небольших команд, но для публичных или критичных проектов рекомендуется переключиться на HTTPS и рассмотреть готовые решения (Gitea, GitLab).
Если нужны примеры конфигурации для HTTPS, автоматического развёртывания или интеграции с CI, напишите, и я подготовлю расширенное руководство.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента