diff options
Diffstat (limited to 'git-shell + cgit.md')
| -rw-r--r-- | git-shell + cgit.md | 252 |
1 files changed, 251 insertions, 1 deletions
diff --git a/git-shell + cgit.md b/git-shell + cgit.md index 7fd31a8..89b9b75 100644 --- a/git-shell + cgit.md +++ b/git-shell + cgit.md @@ -1 +1,251 @@ -# Git server setup notes +Полная инструкция: простой 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-сервер полностью работоспособен. |
