Продакшен
Публичный слушатель сервера сам по себе не занимается TLS. В продакшене перед ним ставят nginx: он держит сертификаты и раздаёт байты файлов, а на сервер проксирует запросы лаунчера и Yggdrasil. Конфиг для него печатает сам сервер — порт и путь к хранилищу он берёт из своего конфига, поэтому они не разъедутся:
laminara-server nginx-config --config /etc/laminara/config.json --domain launcher.example.com \ | sudo tee /etc/nginx/sites-available/laminara.confsudo ln -sf /etc/nginx/sites-available/laminara.conf /etc/nginx/sites-enabled/laminara.confsudo nginx -t && sudo systemctl reload nginxСертификата в этот момент ещё нет, поэтому первый раз печатайте конфиг с ключом --no-tls
(один блок на :80), а TLS добавит certbot: sudo certbot --nginx -d launcher.example.com.
Установщик делает ровно это сам, если выбрать вариант с доменом.
nginx и TLS
Конфиг проксирует всё на публичный порт сервера по HTTP/1.1 с пробросом апгрейда соединения: это нужно и для Connect-вызовов лаунчера, и для Yggdrasil, и для веб-консоли, которая работает по WebSocket (/console/socket). Без заголовков Upgrade/Connection консоль в браузере не подключится — сокет сразу закрывается.
map $http_upgrade $connection_upgrade { default upgrade; '' close;}
location / { proxy_pass http://laminara; # upstream на 127.0.0.1:8099 proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_read_timeout 3600s; proxy_buffering off;}Всё это nginx-config печатает сам. Редирект с :80 на :443 и путь для ACME-проверки уже прописаны. Доменов можно передать несколько — повторите --domain; сертификат при этом выписывается на первый.
Раздача файлов: два пути
Как сервер отдаёт байты объектов, зависит от хранилища.
Включите api.xAccel: true. Тогда на запрос /objects/<хеш> сервер отвечает заголовком X-Accel-Redirect, а сами байты отдаёт nginx через sendfile — без копирования через процесс сервера. В nginx нужна внутренняя локация, указывающая на каталог хранилища:
location /_objects/ { internal; alias /var/lib/laminara/objects/; add_header Cache-Control "public, immutable, max-age=31536000";}Эту локацию nginx-config добавляет сам, когда в конфиге включён api.xAccel, а хранилище
файловое: префикс он берёт из xaccelPrefix, а alias — из root.
Читает файлы сам nginx, поэтому объекты должны быть ему доступны: новые сервер создаёт
с правами 0644, но объекты, сложенные прежними версиями сервера, закрыты режимом 0600.
Такое хранилище нужно один раз открыть на чтение: chmod -R u+rwX,go+rX /var/lib/laminara/objects.
Байты через сервер вообще не идут. На запрос объекта он отдаёт редирект на presigned-ссылку хранилища, и лаунчер качает напрямую из S3 или CDN. nginx на пути файлов не участвует; xAccel не нужен.
Порт и бэкапы
- Наружу открывается только порт nginx (443). Публичный порт сервера (
api.addr) держите на127.0.0.1или во внутренней сети — снаружи к нему ходить незачем. - Каталог данных (
/var/lib/laminara) — это профили сборок, объекты и ключ подписи. Потеря ключа означает, что старые манифесты больше нечем переподписать. Бэкапьте его отдельно и надёжно.