Полная инструкция: простой Git-сервер на OpenBSD (git-shell + cgit) Эта инструкция описывает настройку лёгкого, безопасного и полностью рабочего Git-сервера на OpenBSD. После её выполнения вы получите: SSH-доступ к репозиториям для push/pull (пользователь git, аутентификация только по ключам). Веб-интерфейс cgit для просмотра репозиториев на поддомене git.drohiczyn-poleski.com. Автоматически обновляемый SSL-сертификат Let's Encrypt. Все шаги выполняются на сервере OpenBSD через SSH (желательно через VPN, так как прямой SSH заблокирован правилами pf). 0. Предварительные условия У вас есть сервер OpenBSD с настроенным httpd, pf, WireGuard (адрес VPN-сети 10.77.77.1). Уже работают сайты на доменах drohiczyn-poleski.com и astro.drohiczyn-poleski.com (их конфигурация в /etc/httpd.conf сохранена). DNS-запись git.drohiczyn-poleski.com типа A указывает на ваш IP (199.247.31.17) и отключено проксирование Netlify (если используется Netlify, значок должен быть серым, не оранжевым). 1. Установка Git и создание пользователя git bash doas pkg_add git Создайте пользователя git с домашней директорией /home/git: bash doas adduser Заполните интерактивно: username: git full name: Git Server shell: ksh (позже сменим на git-shell) home: /home/git Пароль: оставьте пустым (только вход по ключам). Настройте домашнюю директорию: bash doas mkdir -p /home/git/.ssh doas chmod 700 /home/git/.ssh doas touch /home/git/.ssh/authorized_keys doas chmod 600 /home/git/.ssh/authorized_keys doas chown -R git:git /home/git 2. Настройка SSH-ключей администратора Вам нужен SSH-ключ, который будет использоваться для управления репозиториями. Если у вас уже есть ключ (например, ~/.ssh/id_ed25519.pub), скопируйте его на сервер. Если нет — создайте на локальной машине: bash ssh-keygen -t ed25519 -C "git admin key" Скопируйте публичный ключ на сервер (предположим, что файл ключа лежит в /tmp/my_git_key.pub на сервере). Добавьте ключ в /home/git/.ssh/authorized_keys с ограничениями: bash echo 'no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ' | doas tee /home/git/.ssh/authorized_keys doas cat /tmp/my_git_key.pub | doas tee -a /home/git/.ssh/authorized_keys doas chown git:git /home/git/.ssh/authorized_keys doas chmod 600 /home/git/.ssh/authorized_keys Измените оболочку пользователя git на git-shell, чтобы запретить интерактивный вход: bash doas chpass -s git-shell git Проверьте подключение (с локальной машины): bash ssh git@10.77.77.1 Вы должны увидеть сообщение об ошибке «PTY allocation request failed» (вход запрещён) без запроса пароля. 3. Создание каталога для репозиториев bash doas mkdir -p /var/www/git-repos doas chown -R git:www /var/www/git-repos doas chmod 750 /var/www/git-repos Создайте симлинк, чтобы разработчики могли использовать короткий путь /git: bash doas ln -sf /var/www/git-repos /git Инициализируйте тестовый репозиторий: bash doas -u git git init --bare /var/www/git-repos/project1.git Теперь с локальной машины можно пушить в него: bash git remote add origin git@10.77.77.1:/git/project1.git git push -u origin master 4. Установка cgit и подготовка chroot Установите пакет cgit: bash doas pkg_add cgit Создайте конфигурационный файл cgit: bash doas mkdir -p /var/www/conf doas tee /var/www/conf/cgitrc << 'EOF' scan-path=/git-repos css=/cgit.css logo=/cgit.png enable-index-links=1 enable-http-clone=1 root-title=My Git Repositories root-desc=Public projects snapshots=tar.gz readme=:README.md EOF Скопируйте статические файлы cgit (логотип и стили): bash doas cp /var/www/cgit/cgit.png /var/www/cgit/ 2>/dev/null || true doas cp /var/www/cgit/cgit.css /var/www/cgit/ 2>/dev/null || true doas chown -R www:www /var/www/cgit Добавьте пользователя www в группу git, чтобы cgit мог читать репозитории: bash doas usermod -G www,git www doas chmod 750 /var/www/git-repos doas find /var/www/git-repos -type d -exec chmod 750 {} \; doas find /var/www/git-repos -type f -exec chmod 640 {} \; Теперь самое важное: git должен работать внутри chroot (из-за особенностей httpd). Скопируйте git и все необходимые библиотеки в /var/www: bash doas mkdir -p /var/www/usr/local/bin /var/www/usr/local/libexec /var/www/usr/lib /var/www/usr/local/lib /var/www/dev # Копируем сам git doas cp /usr/local/bin/git /var/www/usr/local/bin/ # Копируем системный загрузчик и библиотеки doas cp /usr/libexec/ld.so /var/www/usr/libexec/ for lib in $(ldd /usr/local/bin/git | awk '/\/usr\// {print $NF}' | sort -u); do doas mkdir -p "/var/www/$(dirname "$lib")" doas cp "$lib" "/var/www/$lib" done # Создаём /dev/null (необходим git даже для чтения) doas mknod /var/www/dev/null c 2 2 doas chmod 666 /var/www/dev/null Проверьте, что git работает внутри chroot: bash doas chroot /var/www /usr/local/bin/git --version Вы должны увидеть версию git (например, git version 2.51.0). Если команда не выполняется, свяжитесь со мной. 5. Настройка блока httpd для поддомена cgit Откройте /etc/httpd.conf и добавьте в конец следующие блоки (внимание: без однострочных location, только многострочные): nginx # --- git.drohiczyn-poleski.com (cgit) --- server "git.drohiczyn-poleski.com" { listen on egress port 80 location * { block return 301 "https://$HTTP_HOST$REQUEST_URI" } } server "git.drohiczyn-poleski.com" { listen on egress tls port 443 log style combined log access "git-access.log" tls { certificate "/etc/ssl/git.drohiczyn-poleski.com.fullchain.pem" key "/etc/ssl/private/git.drohiczyn-poleski.com.key" } location "/cgit.css" { root "/cgit" no fastcgi } location "/cgit.png" { root "/cgit" no fastcgi } location "/*" { root "/cgi-bin/cgit.cgi" fastcgi socket "/run/slowcgi.sock" } location "/.git*" { block } } Проверьте синтаксис и перезагрузите httpd: bash doas httpd -n doas rcctl restart httpd 6. SSL-сертификат для поддомена Добавьте в /etc/acme-client.conf секцию (если её ещё нет): text domain git.drohiczyn-poleski.com { domain key "/etc/ssl/private/git.drohiczyn-poleski.com.key" domain full chain certificate "/etc/ssl/git.drohiczyn-poleski.com.fullchain.pem" sign with letsencrypt } Выпустите сертификат: bash doas acme-client -v git.drohiczyn-poleski.com doas rcctl restart httpd Для автоматического обновления раз в неделю добавьте строки в /etc/weekly.local: bash echo 'acme-client -v git.drohiczyn-poleski.com' | doas tee -a /etc/weekly.local echo 'rcctl restart httpd' | doas tee -a /etc/weekly.local 7. Запуск slowcgi и финальная проверка bash doas rcctl enable slowcgi doas rcctl start slowcgi doas rcctl restart httpd Перейдите в браузере на https://git.drohiczyn-poleski.com. Вы должны увидеть страницу cgit со списком репозиториев (пока только project1.git). Если вместо списка репозиториев отображается "No repositories found", очистите кэш cgit: bash doas rm -rf /var/cache/cgit/* doas rcctl restart slowcgi httpd Всё готово! Ваш личный Git-сервер полностью работоспособен.