summaryrefslogtreecommitdiff
path: root/git-shell + cgit.md
blob: 89b9b751eb1f3695797210f990263a504d457a9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
Полная инструкция: простой 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-сервер полностью работоспособен.