fix(site): закрыта выдача сайта по IP #4
+5
-6
@@ -2,12 +2,6 @@
|
|||||||
|
|
||||||
Приоритеты: P1 — делаем в первую очередь; P2 — полезно, когда дойдут руки; P3 — идеи под вопросом.
|
Приоритеты: P1 — делаем в первую очередь; P2 — полезно, когда дойдут руки; P3 — идеи под вопросом.
|
||||||
|
|
||||||
## P1
|
|
||||||
|
|
||||||
- [ ] **Перенести публикацию сайта на Gitea Actions и VPS.**
|
|
||||||
Настроить repository-scoped host runner, строгую сборку MkDocs, атомарные
|
|
||||||
релизы, nginx и TLS для `de.dementev.space` по согласованной спецификации.
|
|
||||||
|
|
||||||
## P2
|
## P2
|
||||||
|
|
||||||
- [ ] **Перенос учебника Airflow в de-roadmap.**
|
- [ ] **Перенос учебника 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 и терминал» в блоке базовых инструментов** —
|
- [x] **Подраздел «Linux и терминал» в блоке базовых инструментов** —
|
||||||
2026-07-12: видео-интро («Девопс на троечку», покрытие проверено по
|
2026-07-12: видео-интро («Девопс на троечку», покрытие проверено по
|
||||||
субтитрам) + три статьи (навигация и grep — habr, права — FirstVDS,
|
субтитрам) + три статьи (навигация и grep — habr, права — FirstVDS,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
- Корень публикации: `/srv/de-roadmap`.
|
- Корень публикации: `/srv/de-roadmap`.
|
||||||
- Хранение: текущий релиз и две предыдущие версии.
|
- Хранение: текущий релиз и две предыдущие версии.
|
||||||
- Окружение сборки: `/var/lib/gitea-runner/venvs/site`.
|
- Окружение сборки: `/var/lib/gitea-runner/venvs/site`.
|
||||||
|
- Публичный IPv4 VPS: `167.224.64.252`.
|
||||||
|
|
||||||
## Подготовка VPS
|
## Подготовка VPS
|
||||||
|
|
||||||
@@ -100,8 +101,9 @@ sudo systemctl enable --now gitea-runner
|
|||||||
|
|
||||||
## Nginx и первичная публикация
|
## Nginx и первичная публикация
|
||||||
|
|
||||||
Из корня репозитория установить virtual host, создать ссылку и только затем
|
Из корня репозитория установить bootstrap-конфигурацию nginx, создать ссылку,
|
||||||
перечитать проверенную конфигурацию:
|
отключить стандартный сайт Ubuntu и только затем перечитать проверенную
|
||||||
|
конфигурацию:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo install -o root -g root -m 0644 \
|
sudo install -o root -g root -m 0644 \
|
||||||
@@ -110,12 +112,25 @@ sudo install -o root -g root -m 0644 \
|
|||||||
sudo ln -s \
|
sudo ln -s \
|
||||||
/etc/nginx/sites-available/de-roadmap \
|
/etc/nginx/sites-available/de-roadmap \
|
||||||
/etc/nginx/sites-enabled/de-roadmap
|
/etc/nginx/sites-enabled/de-roadmap
|
||||||
|
sudo unlink /etc/nginx/sites-enabled/default
|
||||||
sudo nginx -t
|
sudo nginx -t
|
||||||
sudo systemctl reload nginx
|
sudo systemctl reload nginx
|
||||||
```
|
```
|
||||||
|
|
||||||
Default-сайт можно отключить только после успешной проверки нового virtual
|
Первый server block в `nginx.conf` возвращает `404` для неизвестных HTTP Host,
|
||||||
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 можно собрать сайт вручную и опубликовать его тем же
|
До первого workflow можно собрать сайт вручную и опубликовать его тем же
|
||||||
скриптом с тестовым release id. Проверка до переключения DNS:
|
скриптом с тестовым release id. Проверка до переключения DNS:
|
||||||
@@ -127,6 +142,11 @@ curl --header 'Host: de.dementev.space' http://127.0.0.1/
|
|||||||
После локальной проверки разрешить профили `Nginx Full` в UFW. До этого
|
После локальной проверки разрешить профили `Nginx Full` в UFW. До этого
|
||||||
публичные порты `80/tcp` и `443/tcp` должны оставаться закрытыми.
|
публичные порты `80/tcp` и `443/tcp` должны оставаться закрытыми.
|
||||||
|
|
||||||
|
Файл `project/ops/gitea-vps-site/nginx.conf` предназначен только для запуска до
|
||||||
|
выпуска сертификата. После выпуска сертификата Certbot изменяет установленный
|
||||||
|
virtual host. Повторная установка bootstrap-файла поверх рабочего конфига
|
||||||
|
удалит TLS-директивы.
|
||||||
|
|
||||||
## Окружение сборки
|
## Окружение сборки
|
||||||
|
|
||||||
Скрипт `.gitea/scripts/build-site.sh` создаёт persistent venv при первом запуске
|
Скрипт `.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`.
|
1. Уменьшить TTL записи `de.dementev.space`.
|
||||||
2. Направить `A` на VPS; удалить или корректно направить `AAAA`.
|
2. Направить `A` на VPS; удалить или корректно направить `AAAA`.
|
||||||
3. Убедиться, что сайт доступен извне по HTTP.
|
3. Убедиться, что сайт доступен извне по HTTP.
|
||||||
4. Выпустить сертификат:
|
4. Выпустить сертификат и включить перенаправление HTTP на HTTPS:
|
||||||
|
|
||||||
```bash
|
```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`.
|
5. В созданном Certbot HTTP-блоке для `de.dementev.space` добавить
|
||||||
6. Вернуть обычный DNS TTL.
|
`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.
|
||||||
|
|
||||||
## Проверка и откат
|
## Проверка и откат
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
listen [::]:80;
|
listen [::]:80;
|
||||||
|
|||||||
Reference in New Issue
Block a user