This commit is contained in:
alexencom committed 2026-11-11 11:24:02 +03:00
1 parent 17ec4b078b
commit 008f2f15ca
4 files changed
+188

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
О’ляпка · Nginx с сайтом в оперативной памяти
Распакуйте три файла рядом с существующей папкой html и docker-compose.yml версии v3. Папку html оставьте на диске: это источник для перезапуска. Существующая внешняя сеть pangolin_frontend и имя контейнера olapka-ru сохранены.
Проверка без запуска:
docker compose -f docker-compose.ram.yml config -q
Включение (в каталоге действующего проекта):
docker compose -f docker-compose.ram.yml up -d --force-recreate nginx
Команда пересоздаёт сервис; во время копирования возможен краткий перерыв. Используйте то же имя проекта Compose, что и сейчас (в исходном файле — olapka; если вы задавали -p, повторите его).
Контроль внутри контейнера:
docker compose -f docker-compose.ram.yml exec nginx df -h /srv/olapka-ram
docker compose -f docker-compose.ram.yml exec nginx nginx -t
Для видео запрос Range: bytes=0-1023 должен вернуть 206 Partial Content.
Обновление контента: полностью обновите html на диске, затем выполните
docker compose -f docker-compose.ram.yml restart nginx
Обычный nginx reload не копирует файлы заново. При изменении лимитов или томов используйте up -d --force-recreate nginx.
Откат к исходному конфигу:
docker compose -f docker-compose.yml up -d --force-recreate nginx
Что находится в RAM: полный снимок html (страницы, скрипты, картинки, видео и служебные файлы). Сервер начинает принимать запросы только после успешного копирования и nginx -t. Правила браузерного кеширования, перенаправления, HTTPS через Pangolin и отложенная загрузка видео сохранены. Журналы Docker, исходники и сама ОС не переносятся в RAM.
Размер текущей статики около 265 МиБ. Предел tmpfs — 384 МиБ, лимит всего контейнера — 640 МиБ; равный memswap_limit запрещает контейнеру swap при поддержке Linux cgroups. Лимиты не резервируют физическую память. На сервере нужен достаточный запас оперативной памяти. Если html перерастёт 384 МиБ, увеличьте size, а при необходимости и оба равных лимита; при ошибке копирования сервис не запустится.
+128
View File
@@ -0,0 +1,128 @@
# Loaded by the standard nginx image inside the http context.
# TLS is terminated by the existing external reverse proxy (Pangolin).
map $uri $olapka_canonical_path {
# Re-evaluate after internal error_page redirects.
volatile;
default $uri;
~^/new-year(?:\.html)?/?$ /;
~^/index(?:\.html)?/?$ /;
~^/(business-animation|contacts|legal|personal-animation|portfolio|services|social-animation)(?:\.html/?|/)$ /$1;
}
server {
listen 80;
server_name www.olapka.ru;
return 301 https://olapka.ru$olapka_canonical_path$is_args$args;
}
server {
listen 80;
server_name olapka.ru;
root /srv/olapka-ram;
sendfile on;
charset utf-8;
charset_types text/plain text/css text/markdown application/javascript application/json application/xml image/svg+xml;
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_min_length 512;
gzip_comp_level 5;
gzip_types text/plain text/css text/markdown application/javascript application/json application/xml text/xml image/svg+xml;
# /404 is an error too, never a successful content page.
location = /404 {
return 404;
}
error_page 404 =404 /404.html;
location = /404.html {
internal;
}
# Only return redirects here; no rewrite loops or HTTPS checks behind proxy.
if ($uri != $olapka_canonical_path) {
return 301 https://olapka.ru$olapka_canonical_path$is_args$args;
}
# try_files serves an existing file in-place, without a client redirect.
location = / {
try_files /index.html =404;
}
location = /business-animation {
try_files /business-animation.html =404;
}
location = /contacts {
try_files /contacts.html =404;
}
location = /legal {
try_files /legal.html =404;
}
location = /personal-animation {
try_files /personal-animation.html =404;
}
location = /portfolio {
try_files /portfolio.html =404;
}
location = /new-year.md {
return 301 /index.md$is_args$args;
}
location = /new-year {
return 301 /$is_args$args;
}
location = /services {
try_files /services.html =404;
}
location = /social-animation {
try_files /social-animation.html =404;
}
# Machine-readable site summaries (UTF-8 Markdown in .txt files).
location ~ ^/llms(?:-full)?\.txt$ {
types { }
default_type text/plain;
charset utf-8;
add_header Cache-Control "public, max-age=3600";
try_files $uri =404;
}
# Keep the source legal page's noindex policy on its Markdown copy.
location = /legal.md {
types { }
default_type text/markdown;
charset utf-8;
add_header X-Robots-Tag "noindex, follow";
add_header Link '</llms.txt>; rel="describedby"';
try_files $uri =404;
}
location ~ ^/(index|services|personal-animation|business-animation|social-animation|portfolio|contacts)\.md$ {
types { }
default_type text/markdown;
charset utf-8;
add_header Cache-Control "public, max-age=3600";
add_header Link '</llms.txt>; rel="describedby"';
try_files $uri =404;
}
# Revalidate changed assets after one hour (filenames are not versioned).
location ~ ^/(?:css|js|img|video)/ {
add_header Cache-Control "public, max-age=3600";
try_files $uri =404;
}
# Real assets are served normally. Unknown URLs return a real 404.
location / {
try_files $uri =404;
}
}
+25
View File
@@ -0,0 +1,25 @@
name: olapka
services:
nginx:
container_name: olapka-ru
image: nginx:stable-alpine
restart: unless-stopped
mem_limit: 640m
memswap_limit: 640m
tmpfs:
- /srv/olapka-ram:rw,noexec,nosuid,nodev,size=384m,mode=0755
entrypoint: ["/bin/sh", "/opt/olapka-ram-start.sh"]
command: ["nginx", "-g", "daemon off;"]
volumes:
- ./olapka-ram-start.sh:/opt/olapka-ram-start.sh:ro
- ./html:/srv/olapka-source:ro
- ./default.ram.conf:/etc/nginx/conf.d/default.conf:ro
networks:
frontend:
aliases:
- olapka-ru
networks:
frontend:
external: true
name: pangolin_frontend
+11
View File
@@ -0,0 +1,11 @@
#!/bin/sh
set -eu
src=/srv/olapka-source
dst=/srv/olapka-ram
awk -v p="$dst" '$2==p && $3=="tmpfs" {found=1} END {exit !found}' /proc/mounts || { echo "Missing tmpfs: $dst" >&2; exit 1; }
test -s "$src/index.html" || { echo "Missing source index.html" >&2; exit 1; }
test -z "$(find "$src" -type l -print -quit)" || { echo "Use regular site files instead of symbolic links." >&2; exit 1; }
cp -a "$src/." "$dst/"
chmod 0755 "$dst"
nginx -t
exec /docker-entrypoint.sh "$@"