diff --git a/deploy/apache/README.md b/deploy/apache/README.md new file mode 100644 index 0000000..4370ac0 --- /dev/null +++ b/deploy/apache/README.md @@ -0,0 +1,52 @@ +# deploy/apache — vhost для mapmil.deepfishing.ru + +Источник истины для Apache-виртхоста, который проксирует домен на стек MapMil. + +## Что здесь + +- `mapmil.conf` — vhost `mapmil.deepfishing.ru` (`apache2` → `ca-frontend:80`) + +## Архитектура + +- `apache2` — **отдельный** контейнер (не из `docker-compose.yml` этого репо). +- Он подключён к сети `mapmil_default`, создаваемой compose-стеком MapMil. +- Бэкенд адресуется **по имени сервиса `ca-frontend`**, не по IP. + IP контейнера меняется при пересборке → хардкод IP даёт **503** (Connection refused). + +## Применение на сервере (beget) + +```bash +cd ~/Projects/MapMil +CONF=/usr/local/apache2/conf/conf-enabled/mapmil.conf + +# 1. Бэкап текущего конфига в контейнере +docker exec apache2 cp "$CONF" "$CONF.bak" + +# 2. Скопировать актуальный vhost из репо внутрь контейнера +docker cp deploy/apache/mapmil.conf apache2:"$CONF" + +# 3. Проверить и перезагрузить Apache +docker exec apache2 httpd -t +docker exec apache2 httpd -k graceful + +# 4. Проверить сайт +curl -s -o /dev/null -w "%{http_code}\n" https://mapmil.deepfishing.ru/ # 200 +``` + +## Если сайт отдаёт 503 + +Проверить, что в конфиге **нет хардкода IP**: + +```bash +docker exec apache2 grep -n "ca-frontend\|172\." "$CONF" +docker exec apache2 tail -20 /usr/local/apache2/logs/mapmil-error.log +``` + +Признак: `AH00957: attempt to connect to 172.x.x.x:80 failed`. +Лечение — применить `mapmil.conf` из репо (см. выше). + +## TODO + +- Автоматизировать копирование конфига при деплое (сейчас вручную). +- Рассмотреть подключение `deploy/apache/` как volume в контейнер `apache2`, + чтобы конфиг не терялся при его пересоздании. diff --git a/deploy/apache/mapmil.conf b/deploy/apache/mapmil.conf new file mode 100644 index 0000000..c1843b4 --- /dev/null +++ b/deploy/apache/mapmil.conf @@ -0,0 +1,42 @@ +# ========== HTTPS VirtualHost для mapmil.deepfishing.ru ========== +# +# Источник истины для vhost Apache (контейнер `apache2`). +# Применение: см. deploy/apache/README.md +# +# ВАЖНО: бэкенд адресуется ПО ИМЕНИ `ca-frontend`, а не по IP контейнера. +# IP меняется при каждом пересоздании стека → хардкод IP даёт 503. +# Контейнер `apache2` подключён к сети `mapmil_default`, поэтому имя резолвится. + + + ServerName mapmil.deepfishing.ru + + SSLEngine on + SSLCertificateFile /etc/letsencrypt/live/deepfishing.ru/fullchain.pem + SSLCertificateKeyFile /etc/letsencrypt/live/deepfishing.ru/privkey.pem + + SSLProtocol -all +TLSv1.2 +TLSv1.3 + SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 + SSLHonorCipherOrder on + SSLCompression off + + ProxyPreserveHost On + RequestHeader set X-Forwarded-Proto "https" + RequestHeader set X-Forwarded-Host %{HTTP_HOST}e + AllowEncodedSlashes NoDecode + + Header set X-Content-Type-Options "nosniff" + Header set X-XSS-Protection "1; mode=block" + + # WebSocket support + RewriteEngine On + RewriteCond %{HTTP:Upgrade} websocket [NC] + RewriteCond %{HTTP:Connection} upgrade [NC] + RewriteRule ^/(.*)$ ws://ca-frontend:80/$1 [P,L] + + ProxyPass / http://ca-frontend:80/ + ProxyPassReverse / http://ca-frontend:80/ + + ErrorLog /usr/local/apache2/logs/mapmil-error.log + CustomLog /usr/local/apache2/logs/mapmil-access.log combined + LogLevel warn +