fix(site): закрыта выдача сайта по IP #4

Merged
ddmitry merged 1 commits from docs/gitea-vps-site-runbook into main 2026-08-05 09:55:05 +03:00
3 changed files with 73 additions and 14 deletions
Showing only changes of commit 515e221c52 - Show all commits
+5 -6
View File
@@ -2,12 +2,6 @@
Приоритеты: P1 — делаем в первую очередь; P2 — полезно, когда дойдут руки; P3 — идеи под вопросом.
## P1
- [ ] **Перенести публикацию сайта на Gitea Actions и VPS.**
Настроить repository-scoped host runner, строгую сборку MkDocs, атомарные
релизы, nginx и TLS для `de.dementev.space` по согласованной спецификации.
## P2
- [ ] **Перенос учебника Airflow в de-roadmap.**
@@ -45,6 +39,11 @@
## Сделано
- [x] **Публикация сайта перенесена на Gitea Actions и VPS**
2026-08-05: настроены repository-scoped host runner, строгая сборка MkDocs,
атомарные релизы, nginx и TLS для `de.dementev.space`; GitHub Pages сохранён
как неактивный резерв.
- [x] **Подраздел «Linux и терминал» в блоке базовых инструментов**
2026-07-12: видео-интро («Девопс на троечку», покрытие проверено по
субтитрам) + три статьи (навигация и grep — habr, права — FirstVDS,
+55 -8
View File
@@ -13,6 +13,7 @@
- Корень публикации: `/srv/de-roadmap`.
- Хранение: текущий релиз и две предыдущие версии.
- Окружение сборки: `/var/lib/gitea-runner/venvs/site`.
- Публичный IPv4 VPS: `167.224.64.252`.
## Подготовка VPS
@@ -100,8 +101,9 @@ sudo systemctl enable --now gitea-runner
## Nginx и первичная публикация
Из корня репозитория установить virtual host, создать ссылку и только затем
перечитать проверенную конфигурацию:
Из корня репозитория установить bootstrap-конфигурацию nginx, создать ссылку,
отключить стандартный сайт Ubuntu и только затем перечитать проверенную
конфигурацию:
```bash
sudo install -o root -g root -m 0644 \
@@ -110,12 +112,25 @@ sudo install -o root -g root -m 0644 \
sudo ln -s \
/etc/nginx/sites-available/de-roadmap \
/etc/nginx/sites-enabled/de-roadmap
sudo unlink /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
```
Default-сайт можно отключить только после успешной проверки нового virtual
host.
Первый server block в `nginx.conf` возвращает `404` для неизвестных HTTP Host,
не раскрывает версию nginx и отклоняет TLS handshake для IP или неизвестного
SNI. Поэтому сертификат `de.dementev.space` не выдаётся при обращении к VPS по
IP. Если проверка конфигурации не прошла, отключить новый virtual host,
восстановить стандартный сайт и перечитать проверенную конфигурацию:
```bash
sudo unlink /etc/nginx/sites-enabled/de-roadmap
sudo ln -s \
/etc/nginx/sites-available/default \
/etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
```
До первого workflow можно собрать сайт вручную и опубликовать его тем же
скриптом с тестовым release id. Проверка до переключения DNS:
@@ -127,6 +142,11 @@ curl --header 'Host: de.dementev.space' http://127.0.0.1/
После локальной проверки разрешить профили `Nginx Full` в UFW. До этого
публичные порты `80/tcp` и `443/tcp` должны оставаться закрытыми.
Файл `project/ops/gitea-vps-site/nginx.conf` предназначен только для запуска до
выпуска сертификата. После выпуска сертификата Certbot изменяет установленный
virtual host. Повторная установка bootstrap-файла поверх рабочего конфига
удалит TLS-директивы.
## Окружение сборки
Скрипт `.gitea/scripts/build-site.sh` создаёт persistent venv при первом запуске
@@ -139,14 +159,41 @@ curl --header 'Host: de.dementev.space' http://127.0.0.1/
1. Уменьшить TTL записи `de.dementev.space`.
2. Направить `A` на VPS; удалить или корректно направить `AAAA`.
3. Убедиться, что сайт доступен извне по HTTP.
4. Выпустить сертификат:
4. Выпустить сертификат и включить перенаправление HTTP на HTTPS:
```bash
sudo certbot --nginx -d de.dementev.space
sudo certbot --nginx \
--non-interactive \
--agree-tos \
--email me@dementev.space \
--redirect \
-d de.dementev.space
```
5. Проверить HTTPS и `systemctl status certbot.timer`.
6. Вернуть обычный DNS TTL.
5. В созданном Certbot HTTP-блоке для `de.dementev.space` добавить
`server_tokens off;`, затем проверить и перечитать конфигурацию:
```bash
sudoedit /etc/nginx/sites-available/de-roadmap
sudo nginx -t
sudo systemctl reload nginx
```
6. Проверить перенаправление, HTTPS, сертификат и автоматическое продление:
```bash
curl --head http://de.dementev.space/
curl --fail --head https://de.dementev.space/
! curl --insecure --head https://167.224.64.252/
sudo certbot certificates
systemctl is-enabled certbot.timer
systemctl is-active certbot.timer
```
Ожидаются `301 Moved Permanently`, затем `200 OK`, отказ TLS по IP,
действующий сертификат и состояния таймера `enabled` и `active`.
7. Вернуть обычный DNS TTL.
## Проверка и откат
+13
View File
@@ -1,3 +1,16 @@
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
server_tokens off;
ssl_reject_handshake on;
return 404;
}
server {
listen 80;
listen [::]:80;