Перейти к содержимому

Продакшен

Публичный слушатель сервера сам по себе не занимается TLS. В продакшене перед ним ставят nginx: он держит сертификаты и раздаёт байты файлов, а на сервер проксирует запросы лаунчера и Yggdrasil. Конфиг для него печатает сам сервер — порт и путь к хранилищу он берёт из своего конфига, поэтому они не разъедутся:

Окно терминала
laminara-server nginx-config --config /etc/laminara/config.json --domain launcher.example.com \
| sudo tee /etc/nginx/sites-available/laminara.conf
sudo ln -sf /etc/nginx/sites-available/laminara.conf /etc/nginx/sites-enabled/laminara.conf
sudo 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.

Порт и бэкапы

  • Наружу открывается только порт nginx (443). Публичный порт сервера (api.addr) держите на 127.0.0.1 или во внутренней сети — снаружи к нему ходить незачем.
  • Каталог данных (/var/lib/laminara) — это профили сборок, объекты и ключ подписи. Потеря ключа означает, что старые манифесты больше нечем переподписать. Бэкапьте его отдельно и надёжно.