Some checks failed
Deploy to web.hhivp.com / deploy (push) Failing after 3s
- Dockerfile multi-stage: node:22-alpine builds Astro → nginx:1.29-alpine отдаёт dist/. healthcheck wget --spider / - nginx.conf: gzip с подходящими типами (RSS/JSON/SVG/woff2), кэш /_astro/ immutable 1y, кэш css/js/img 30d, MIME application/rss+xml для feed, text/plain для robots/ai/llms/sitemap, кастомная 404 - docker-compose: контейнер anotherreflections-ru-v2 на 127.0.0.1:4084 (старый WP на :4080 остаётся для отката) - .gitea/workflows/deploy.yml: push в main → SSH-деплой на web, git fetch+reset → docker compose build → up -d → docker image prune (retention 7d по правилу проекта). Verify-шаг curl на :4084 - src/pages/404.astro — тематическая страница «не найдено» с навигацией
91 lines
4.2 KiB
Nginx Configuration File
91 lines
4.2 KiB
Nginx Configuration File
# nginx-конфиг внутри контейнера (статика Astro)
|
||
# TLS терминируется на хост-уровне (web.hhivp.com), здесь только HTTP.
|
||
|
||
server {
|
||
listen 80 default_server;
|
||
server_name _;
|
||
|
||
root /usr/share/nginx/html;
|
||
index index.html;
|
||
|
||
# Логи — на stdout/stderr контейнера (видны через docker logs)
|
||
access_log /dev/stdout;
|
||
error_log /dev/stderr warn;
|
||
|
||
# Безопасность: запрет на скрытые файлы (но разрешаем .well-known для LE)
|
||
location ~ /\.(?!well-known) {
|
||
deny all;
|
||
log_not_found off;
|
||
access_log off;
|
||
}
|
||
|
||
# ────────────────────────────────────────────────────────────────
|
||
# Сжатие
|
||
# ────────────────────────────────────────────────────────────────
|
||
gzip on;
|
||
gzip_vary on;
|
||
gzip_min_length 256;
|
||
gzip_proxied any;
|
||
gzip_comp_level 6;
|
||
gzip_types
|
||
text/plain text/css text/xml
|
||
application/json application/xml application/rss+xml application/atom+xml
|
||
application/javascript application/x-javascript
|
||
image/svg+xml font/woff2;
|
||
|
||
# ────────────────────────────────────────────────────────────────
|
||
# MIME для RSS-фидов и текстовых служебных файлов
|
||
# ────────────────────────────────────────────────────────────────
|
||
location = /feed.xml {
|
||
default_type application/rss+xml;
|
||
charset utf-8;
|
||
try_files /feed.xml =404;
|
||
expires 5m;
|
||
add_header Cache-Control "public, max-age=300, must-revalidate";
|
||
}
|
||
location ~ ^/category/[^/]+/feed\.xml$ {
|
||
default_type application/rss+xml;
|
||
charset utf-8;
|
||
expires 5m;
|
||
add_header Cache-Control "public, max-age=300, must-revalidate";
|
||
}
|
||
location = /sitemap.txt {
|
||
default_type text/plain;
|
||
charset utf-8;
|
||
}
|
||
location = /robots.txt { default_type text/plain; charset utf-8; }
|
||
location = /ai.txt { default_type text/plain; charset utf-8; }
|
||
location = /llms.txt { default_type text/plain; charset utf-8; }
|
||
|
||
# ────────────────────────────────────────────────────────────────
|
||
# Кэш статики (хеш у Astro в имени файла)
|
||
# ────────────────────────────────────────────────────────────────
|
||
location /_astro/ {
|
||
expires 1y;
|
||
add_header Cache-Control "public, immutable, max-age=31536000";
|
||
access_log off;
|
||
}
|
||
location ~* \.(?:css|js|woff2?|ttf|otf|eot)$ {
|
||
expires 30d;
|
||
add_header Cache-Control "public, max-age=2592000";
|
||
access_log off;
|
||
}
|
||
location ~* \.(?:png|jpe?g|gif|svg|webp|avif|ico)$ {
|
||
expires 30d;
|
||
add_header Cache-Control "public, max-age=2592000";
|
||
access_log off;
|
||
}
|
||
|
||
# ────────────────────────────────────────────────────────────────
|
||
# Маршрутизация: trailingSlash: 'always' уже встроен в Astro,
|
||
# все страницы экспортированы как dir/index.html
|
||
# ────────────────────────────────────────────────────────────────
|
||
location / {
|
||
try_files $uri $uri/ $uri.html =404;
|
||
}
|
||
|
||
# Кастомная 404
|
||
error_page 404 /404.html;
|
||
location = /404.html { internal; }
|
||
}
|