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

Основная цель
Это руководство показывает, как установить и настроить Git HTTP-сервер на Ubuntu 20.04 с использованием Nginx и fcgiwrap. В результате вы получите самоуправляемый хостинг репозиториев по HTTP(S) с базовой аутентификацией.
Важные замечания
- HTTP по умолчанию незашифрован — используйте HTTPS (Let’s Encrypt) в продакшене.
- Для приватного и корпоративного использования рассмотрите Gitea, GitLab или Gitolite — они предоставляют управление пользователями, веб-интерфейс и дополнительные функции.
Требования
- Сервер с Ubuntu 20.04.
- Домен, указывающий на IP сервера (например, git.example.com).
- Доступ root или пользователь с sudo.
Начало работы
Перед началом обновите пакеты:
apt-get update -yПосле обновления можно переходить к установке необходимых пакетов.
Установка Nginx и Git
Установите Nginx, Git и вспомогательные пакеты:
apt-get install nginx git fcgiwrap apache2-utils unzip -yfcgiwrap обеспечивает запуск git-http-backend как FastCGI-приложения; apache2-utils содержит утилиту htpasswd для создания файла паролей.
Создание Git-репозитория
Создайте каталог в корне веб-сервера и инициализируйте «bare» репозиторий:
mkdir /var/www/html/gitcd /var/www/html/git
mkdir gituser.gitgit --bare initОбновите информацию сервера Git (нужно для доступа по HTTP):
git update-server-infoУстановите права и владельца:
chown -R www-data:www-data /var/www/html/git
chmod -R 755 /var/www/html/gitСоздайте пользователя для HTTP-аутентификации (htpasswd создаст файл с хешированным паролем):
htpasswd -c /var/www/html/git/htpasswd gituserВы будете приглашены ввести пароль:
New password:
Re-type new password:
Adding password for user gituserПроверьте содержимое файла паролей:
cat /var/www/html/git/htpasswdОжидаемый формат подобен следующему (строка уникальна для вашего пароля и не копируется):
gituser:$apr1$iPKZDbFB$ziRRbGXzVMMHaPYOtL05m/Настройка Nginx для Git
Создайте виртуальный хост для сервера Git:
nano /etc/nginx/conf.d/git.confДобавьте конфигурацию (оставьте имена файлов и пути как есть, при необходимости замените server_name на ваш домен):
server {
listen 80;
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 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/git/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/git;
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Пример корректного статуса будет содержать строку Active: active (running).
Тестирование HTTP Git сервера
На клиентской машине установите Git и создайте тестовый проект:
apt-get install git -ymkdir myappcd myapp
git initДобавьте удалённый репозиторий (замените адрес на ваш домен):
git remote add origin http://[email protected]/gituser.gitСоздайте каталоги и файлы:
mkdir app1 app2
echo "This is my first application" > app1/app1
echo "This is my first application" > app2/app2Добавьте и зафиксируйте изменения:
git add .git commit -a -m "Add files and directories"И отправьте на сервер:
git push origin masterПри первом пуше вас попросят ввести пароль пользователя gituser (тот, что вы задали с помощью htpasswd).
Если всё прошло успешно, вы увидите вывод с информацией о подсчёте и отправке объектов, а ветка master будет создана на удалённом сервере.
Чтобы клонировать репозиторий на другую машину:
git clone http://[email protected]/gituser.gitБезопасность и корректная эксплуатация
Важно усилить защиту перед использованием в реальной сети:
- Включите HTTPS: используйте certbot и LetsEncrypt для выдачи бесплатного сертификата и автоматического обновления.
- Ограничьте доступ по IP, если сервер предполагается использовать только внутри LAN.
- Храните резервные копии bare-репозиториев и периодически проверяйте целостность git fsck.
- Используйте более сложные решения (Gitea/GitLab/Gitolite) для управления пользователями, правами и аудитом.
Пример базового перенаправления HTTP->HTTPS и добавления certbot остаётся за рамками этого шага, но рекомендуется на этапе продакшн.
Технические нюансы и отладка
- 403 Forbidden: проверьте права на каталог и файл htpasswd, а также конфигурацию auth_basic_user_file.
- 502 Bad Gateway: убедитесь, что fcgiwrap запущен и сокет /var/run/fcgiwrap.socket доступен; проверьте журналы systemd и /var/log/nginx/error.log.
- Пустые push/clone: выполните git update-server-info в папке bare-репозитория и проверьте fastcgi_param GIT_PROJECT_ROOT.
Альтернативные подходы
- SSH (git@server:path): безопаснее и часто проще для аутентификации ключами. Хорош для командных сред.
- Gitea/GitLab: добавляют веб-интерфейс, CI, управление пользователями и внешние интеграции.
- Gitolite: тонкая настройка прав доступа к репозиториям по SSH.
Мини-методология развёртывания (5 шагов)
- Подготовка сервера и домена.
- Установка Nginx, fcgiwrap, Git и утилит.
- Создание bare-репозиториев и настройка htpasswd.
- Конфигурация Nginx и перезапуск сервисов.
- Тестирование push/clone и настройка HTTPS.
Ролевая контрольная таблица
- Администратор сервера
- Настроить DNS, установить пакеты, настроить Nginx, управлять сертификатами.
- Разработчик
- Инициализация локальных репозиториев, добавление remote, push/clone, проверка прав.
- Оператор
- Мониторинг состояния служб, резервное копирование, контроль доступа и логов.
Критерии приёмки
- Репозиторий доступен по указанному домену/URL.
- Успешный git push и git clone с использованием учётных данных.
- Nginx функционирует без ошибок (nginx -t успешен).
- Логи не показывают критических ошибок при обычных операциях.
Когда этот подход не подходит
- Когда требуется централизованное управление пользователями, веб-интерфейс или CI — лучше Gitea/GitLab.
- Когда необходимо минимизировать сетевые риски без HTTPS и журналирования.
Короткий глоссарий (по строкам)
- bare-репозиторий: репозиторий без рабочей копии, подходящий для удалённого хранения.
- fcgiwrap: демон, запускающий CGI-скрипты через FastCGI-сокет, нужен для git-http-backend.
- htpasswd: утилита для создания файла с хешированными паролями Apache/Nginx.
- git-http-backend: CGI-программа, обрабатывающая HTTP(S)-запросы к Git-репозиторию.
Диаграма принятия решения (Mermaid)
flowchart TD
A[Нужен Git-сервер?] --> B{Требуется веб-интерфейс и CI?}
B -- Да --> C[Gitea / GitLab]
B -- Нет --> D{Доступ только внутри LAN?}
D -- Да --> E[Простой Nginx + fcgiwrap 'это руководство']
D -- Нет --> F{Нужна простота и безопасность?}
F -- Да --> G[SSH + Gitolite]
F -- Нет --> EИтог
Поздравляем — вы развернули простой Git HTTP сервер на Ubuntu 20.04 с Nginx. Для безопасной эксплуатации в публичных сетях обязательно включите HTTPS и рассмотрите более полнофункциональные решения при росте команды.
Ключевые действия: установить пакеты, создать bare-репозиторий, настроить htpasswd, прописать конфигурацию Nginx для git-http-backend, протестировать push/clone.
В следующих шагах рекомендуем: подключить Let’s Encrypt для HTTPS, автоматизировать резервное копирование и при необходимости мигрировать к Gitea/GitLab для управления доступом и интеграций.
Похожие материалы
Herodotus — Android‑троян и защита
Как включить новый Пуск в Windows 11
Панель полей сводной таблицы в Excel — быстрый разбор
Включение нового меню Пуск в Windows 11
Дубликаты Диспетчера задач в Windows 11 — как исправить