add: Контейнеризация архива cad.ru (1998)

- Добавлен Dockerfile для dev и prod (с HTML и конфигом в образе)
     - docker-compose.yml для разработки
     - Nginx конфиг cadpoint1998--internal-nginx.conf с KOI8-R
     - .dockerignore для исключения лишних файлов
     - Переименование configs/ → config/ (современный стандарт)
This commit is contained in:
2026-03-28 12:48:41 +03:00
parent bb0de6c576
commit 7a745ec541
3 changed files with 146 additions and 0 deletions

29
Dockerfile Normal file
View File

@@ -0,0 +1,29 @@
# Архивный сайт cad.ru (1998) — контейнеризированный с nginx
# Образ полностью self-contained: конфиг + HTML копируются в образ
# Используется как для dev, так и для prod
FROM nginx:alpine
# Удаляем стандартный nginx конфиг (по умолчанию)
RUN rm /etc/nginx/conf.d/default.conf
# Копируем custom конфиг cadpoint1998 как default
# Это обеспечивает правильную кодировку KOI8-R и маршрутизацию
COPY config/nginx/cadpoint1998--internal-nginx.conf /etc/nginx/conf.d/default.conf
# Копируем все статические HTML файлы в корень документов nginx
# Архив содержит исторический контент (не обновляется), поэтому полностью в образ
COPY html/ /usr/share/nginx/html/
# Health check: проверяем доступность сайта через nginx
# Используется Docker для определения статуса контейнера и orchestration-системами
HEALTHCHECK --interval=120s --timeout=3s --start-period=5s --retries=3 \
CMD wget --quiet --tries=1 --spider http://localhost/index.htm || exit 1
# Экспозируем порт 80 (внутренний, проксируется внешним nginx на хосте)
EXPOSE 80
# Запускаем nginx в foreground режиме (критично для Docker контейнеров)
# Без этого контейнер выключится сразу после запуска
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -0,0 +1,75 @@
# --- ОПТИМИЗАЦИЯ ПРОИЗВОДИТЕЛЬНОСТИ ---
# sendfile on; # можно включить для больших статик файлов, но для контейнера избыточно
tcp_nopush on; # отправляй данные только когда буфер полон (меньше пакетов)
tcp_nodelay on; # не жди, отправляй сразу (для low-latency интеракции)
# keepalive_timeout 65; # по умолчанию работает, фреймовый сайт не требует особого тюнинга
types_hash_max_size 2048; # размер хэша для mime.types
# MIME-типы и кодировка по умолчанию
include /etc/nginx/mime.types;
# default_type application/octet-stream; # оставляю по умолчанию
# Настройки логов (stdout/stderr для docker logs)
access_log /dev/stdout; # вывод в stdout контейнера (видно через docker logs)
error_log /dev/stderr warn; # ошибки в stderr
# Настройки сжатия gzip (для экономии трафика между контейнером и внешним nginx)
gzip on; # включаем сжатие
gzip_proxied any; # сжимаем, даже если запрос идет через прокси
gzip_comp_level 6; # уровень сжатия (6 = хороший баланс между CPU и ratio)
gzip_buffers 16 8k; # буферы для сжатия (16 буферов по 8к)
gzip_http_version 1.1; # поддерживаем gzip с HTTP/1.1+
gzip_disable "msie6"; # не сжимаем для IE6 (исторический артефакт, но оставляю)
gzip_vary on; # добавляем Vary: Accept-Encoding в response (важно для кешей)
gzip_min_length 512; # сжимаем только если больше 512 байт (меньше — толку нет)
gzip_types text/plain # какие MIME-типы сжимать
text/css
application/json
application/x-javascript
text/xml application/xml
application/xml+rss
text/javascript
application/javascript
application/vnd.ms-fontobject
application/x-font-ttf
font/opentype
image/svg+xml
image/x-icon;
# --- КОНФИГУРАЦИЯ СЕРВЕРА ---
server {
listen 80 default_server; # слушаем по умолчанию на порте 80 внутри контейнера
listen [::]:80; # поддержка IPv6
server_name _; # принимаем любое имя хоста (внутренний контейнер)
root /usr/share/nginx/html; # корень для статических файлов (монтируется снаружи)
index index.htm index1.htm index.html; # приоритет индексов (index.htm для KOI8-R)
charset koi8-r; # отправляем charset=koi8-r в Content-Type заголовке
source_charset koi8-r; # исходная кодировка файлов на диске
client_max_body_size 50M; # максимальный размер тела запроса (для загрузок)
# Корневой путь → явно на index.htm (для фреймовой структуры)
location = / {
try_files /index.htm =404;
}
# Все остальные пути → статические файлы как есть
location / {
try_files $uri $uri/ =404;
}
# Обработчики ошибок (если они есть в корне html/)
error_page 404 /404.html;
error_page 500 /500.html;
# Внутренние редиректы (не возвращаем клиенту, только используем для error_page)
location = /404.html {
internal;
}
location = /500.html {
internal;
}
}

42
docker-compose.yml Normal file
View File

@@ -0,0 +1,42 @@
# Файл для dev-окружения и локального тестирования
# Для продакшена используй docker-compose.prod.yml
# Примечание: в новых версиях Docker Compose версия необязательна
# (в новых версиях даже рекомендуется её не указывать)
# version: '3.8'
services:
cadpoint1998:
# Собираем образ из Dockerfile (одного для dev и prod)
# Образ полностью self-contained: конфиг + HTML в образе
build:
context: .
dockerfile: Dockerfile
# Имя контейнера для удобства обращения через docker/podman
container_name: cadpoint1998-site
# Порт: слушаем на localhost:8030, проксируем в контейнер на 80
# Внешний nginx/reverse-proxy обращается на этот адрес
ports:
- "127.0.0.1:8030:80"
# Политика перезагрузки: перезагружаем при сбое, но не при явном останове
restart: unless-stopped
# Логирование в JSON-файлы (видно через docker logs и анализ)
logging:
driver: "json-file"
options:
max-size: "5m" # максимум 5МБ на файл лога
max-file: "1" # хранить только 1 файл (экономим место)
# Пользовательская сеть для координации с другими сервисами
networks:
- cadpoint1998-network
# Определяем пользовательскую bridge-сеть для контейнеров
networks:
cadpoint1998-network:
driver: bridge