summaryrefslogtreecommitdiff
path: root/git-shell + cgit.md
diff options
context:
space:
mode:
Diffstat (limited to 'git-shell + cgit.md')
-rw-r--r--git-shell + cgit.md252
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-сервер полностью работоспособен.