From 515e221c52acbcab2f8be3027f2511c8c9ffdbab Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Wed, 5 Aug 2026 02:48:12 -0400 Subject: [PATCH] =?UTF-8?q?fix(site):=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D0=B0=20=D1=81?= =?UTF-8?q?=D0=B0=D0=B9=D1=82=D0=B0=20=D0=BF=D0=BE=20IP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - стандартный nginx-vhost отдавал welcome page по IP, а HTTPS по IP получал сертификат de.dementev.space. - Что: - default vhost настроен на HTTP 404 и отказ TLS для IP и неизвестного SNI. - runbook дополнен точной процедурой Certbot, восстановлением и проверками. - завершённая задача публикации перенесена в раздел «Сделано». - Проверка: - live и bootstrap-конфигурации прошли nginx -t; доменный HTTPS отдаёт 200, неизвестный Host — 404, TLS по IP отклоняется. - mkdocs build --strict выполнен через persistent venv пользователя gitea-runner. --- project/TODO.md | 11 +++-- project/ops/gitea-vps-site/README.md | 63 +++++++++++++++++++++++---- project/ops/gitea-vps-site/nginx.conf | 13 ++++++ 3 files changed, 73 insertions(+), 14 deletions(-) diff --git a/project/TODO.md b/project/TODO.md index 50b7f1b..fddbb0a 100644 --- a/project/TODO.md +++ b/project/TODO.md @@ -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, diff --git a/project/ops/gitea-vps-site/README.md b/project/ops/gitea-vps-site/README.md index 8a89c5b..9630c72 100644 --- a/project/ops/gitea-vps-site/README.md +++ b/project/ops/gitea-vps-site/README.md @@ -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. ## Проверка и откат diff --git a/project/ops/gitea-vps-site/nginx.conf b/project/ops/gitea-vps-site/nginx.conf index 0d790ae..cd29a78 100644 --- a/project/ops/gitea-vps-site/nginx.conf +++ b/project/ops/gitea-vps-site/nginx.conf @@ -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;