git daemon: запуск Git сервера по протоколу git://
git daemon — встроенный в Git простой сервер, раздающий репозитории по протоколу git://. Он быстрый, не требует аутентификации и подходит для публичных репозиториев в локальной сети. Порт по умолчанию: 9418.
Что такое git daemon #
Git daemon работает по собственному протоколу git:// (не HTTP, не SSH). Особенности:
- Только чтение (по умолчанию) — нельзя делать push
- Нет аутентификации — любой может клонировать
- Быстрый — минимальный overhead
- Порт 9418 — нестандартный, часто заблокирован на firewall
- Подходит для внутренних сетей, публичных зеркал
# Протокол git://
git clone git://server.example.com/project.git
git clone git://localhost/project.git
Базовый запуск #
# Самый простой запуск
git daemon --reuseaddr --base-path=/srv/git --export-all /srv/git
# Параметры:
# --reuseaddr — переиспользовать адрес после рестарта
# --base-path=DIR — базовый путь для репозиториев
# --export-all — раздавать все репозитории (иначе только с маркером)
# Клонировать
git clone git://server.example.com/project.git
# Путь: /srv/git/project.git → URL: git://server/project.git
Без --export-all нужно создавать маркер для каждого репозитория:
# Разрешить конкретный репозиторий (без --export-all)
touch /srv/git/project.git/git-daemon-export-ok
# Или запретить репозиторий когда используется --export-all
# (Нет встроенного механизма — используйте .git/daemon-deny или
# не используйте --export-all)
Настройка с опциями #
# Полная настройка
git daemon \
--reuseaddr \
--verbose \
--base-path=/srv/git \
--export-all \
--enable=receive-pack \
--listen=0.0.0.0 \
--port=9418 \
/srv/git
# Разрешить push (--enable=receive-pack)
# ВНИМАНИЕ: позволяет ЛЮБОМУ делать push — только для доверенных сетей!
# Слушать только localhost (для тестирования)
git daemon --base-path=/srv/git --export-all --listen=127.0.0.1
# Раздавать конкретные директории
git daemon --base-path=/srv --export-all \
/srv/git/public-repos
Запуск как systemd сервис #
Для постоянного запуска на сервере используйте systemd:
# Создать файл сервиса
sudo cat > /etc/systemd/system/git-daemon.service << 'EOF'
[Unit]
Description=Git Daemon
After=network.target
[Service]
User=git
Group=git
ExecStart=/usr/bin/git daemon \
--reuseaddr \
--verbose \
--base-path=/srv/git \
--export-all \
/srv/git
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Включить и запустить
sudo systemctl daemon-reload
sudo systemctl enable git-daemon
sudo systemctl start git-daemon
# Статус
sudo systemctl status git-daemon
# ● git-daemon.service - Git Daemon
# Active: active (running)
Запуск через inetd #
Альтернатива systemd — запуск через inetd (xinetd):
# /etc/inetd.conf
echo "9418 stream tcp nowait git /usr/bin/git \
git daemon --inetd --verbose --export-all --base-path=/srv/git" \
>> /etc/inetd.conf
# Перезапустить inetd
sudo service inetd restart
Firewall и безопасность #
# Открыть порт 9418 в firewall (ufw)
sudo ufw allow 9418/tcp
sudo ufw reload
# Iptables
sudo iptables -A INPUT -p tcp --dport 9418 -j ACCEPT
# Проверить что git daemon слушает
ss -tlnp | grep 9418
# LISTEN 0 128 0.0.0.0:9418 ...
# Тест подключения
git ls-remote git://localhost/project.git
Git daemon полностью открыт — нет аутентификации. Используйте только для:
- Публичных репозиториев
- Изолированных внутренних сетей
- Временных серверов для миграции данных
Работа с git daemon для push #
Push через git:// требует явного включения и крайне небезопасен без ACL:
# Включить receive-pack (push) — ТОЛЬКО в доверенной сети
git daemon \
--base-path=/srv/git \
--export-all \
--enable=receive-pack \
/srv/git
# Теперь можно делать push
git push git://server/project.git main
# Ограничить по IP через tcp wrappers /etc/hosts.allow
# git-daemon: 192.168.1.0/24 ← разрешить только локальную сеть
# git-daemon: ALL EXCEPT 192.168.1.0/24 : DENY
Сравнение с другими серверами #
# git daemon: простейший сервер
# + Встроен в Git, не требует установки
# + Быстрый протокол
# - Нет аутентификации
# - Порт 9418 часто заблокирован
# - Только для публичного чтения
# SSH: рекомендуется для приватных репозиториев
# + Аутентификация по ключам
# + Порт 22 обычно открыт
# + Шифрование
# HTTPS: рекомендуется для CI/CD
# + Порт 443 открыт везде
# + Аутентификация токенами
# + TLS шифрование
Отладка #
# Запуск с подробным выводом
git daemon --verbose --base-path=/srv/git --export-all /srv/git
# Тест клонирования
GIT_TRACE=1 git clone git://localhost/project.git
# Проверить логи systemd
journalctl -u git-daemon -f
# Проверить права на файлы
ls -la /srv/git/
# Пользователь git должен иметь права на чтение репозиториев
Часто задаваемые вопросы #
Почему git clone git:// завершается с ошибкой? Проверьте: 1) запущен ли git daemon, 2) открыт ли порт 9418, 3) существует ли репозиторий по указанному пути, 4) есть ли файл git-daemon-export-ok если не используется --export-all.
Можно ли использовать git daemon в продакшене? Для публичных репозиториев — да, но лучше использовать HTTPS через nginx с git http-backend. Для приватных — только SSH или HTTPS с аутентификацией.
Как разрешить push только для определённых IP? git daemon не имеет встроенного ACL. Используйте firewall (iptables/nftables) для ограничения доступа по IP к порту 9418.
Какой максимальный размер репозитория для git daemon? Нет технических ограничений. Ограничения определяются пропускной способностью сети и объёмом диска.
Чем git daemon отличается от Smart HTTP? git daemon использует собственный протокол git:// на порту 9418. Smart HTTP использует HTTPS на порту 443 и требует веб-сервера. Smart HTTP поддерживает аутентификацию и работает через прокси.
Заключение #
git daemon — простейший способ раздавать Git репозитории в локальной сети. Запускается одной командой, без конфигурации. Подходит для публичных репозиториев и внутренних сетей. Для серьёзных задач используйте собственный Git сервер на основе Gitea или GitLab CE с HTTPS и аутентификацией.