# nginx-конфиг внутри контейнера. TLS терминируется на хосте (web.hhivp.com). server { listen 80 default_server; server_name _; root /usr/share/nginx/html; index index.html; access_log /dev/stdout; error_log /dev/stderr warn; 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; # RSS-фиды: явный Content-Type для IPB RSS Importer location = /feed.xml { types { } 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 ~ ^/cat/[^/]+/feed\.xml$ { types { } 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; } # Агрегатор новостей: cron на хосте пишет в /var/lib/pushkino/data/news.json (bind-mount) location = /api/news.json { alias /var/lib/pushkino/data/news.json; default_type application/json; charset utf-8; add_header Cache-Control "public, max-age=120, must-revalidate"; # Если файл не создан cron'ом — отдадим пустую структуру try_files $uri @news_fallback; } location @news_fallback { default_type application/json; return 200 '{"updatedAt":null,"items":[]}'; } # Кэш статических ассетов Astro (хеш в имени) location /_astro/ { expires 1y; add_header Cache-Control "public, immutable, max-age=31536000"; access_log off; } location /uploads/ { expires 30d; add_header Cache-Control "public, max-age=2592000"; 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; } # Маршрутизация: Astro генерит dir/index.html location / { try_files $uri $uri/ $uri.html =404; } error_page 404 /404.html; location = /404.html { internal; } }