Установка · Ручная настройка

Запуск витрины как службы

На этой странице вручную настраивается то, что делают orionplace app install и команда install витрины: системный пользователь, рабочая сборка и служба, которая запускает витрину при загрузке и перезапускает её после сбоя. Ниже — те же файлы, что пишет установщик, для витрины shop в /srv/orionplace/shop на порту 3000.

Как это работает

Витрина — это сервер на Node.js. Он слушает только 127.0.0.1, поэтому доступен лишь с этого сервера; публичные HTTPS-запросы принимает nginx и передаёт их витрине, см. «Конфигурация nginx». Для каждого запроса витрина выбирает ваш персональный бэкенд по домену запроса — по файлам доменов в проекте.

1 Требования

Витрине на SvelteKit нужен Node.js 20.19 или новее; серверная утилита ставит Node.js 24 LTS. Проверьте установленную версию:

bash
node -v

Также нужны npm, права root и Linux-сервер с systemd (Debian, Ubuntu, семейство RHEL, Fedora, openSUSE, Arch) или OpenRC (Alpine). Файлы служб ниже запускают /usr/local/bin/node; если command -v node показывает другой путь, укажите его.

2 Пользователь службы и папка

Витрина работает от собственного системного пользователя без входа в систему, поэтому может менять только свою папку. Все родительские папки витрины должны быть открыты этому пользователю; /srv/orionplace открыта.

bash
sudo useradd --system --home-dir /srv/orionplace \
  --shell /sbin/nologin --user-group orionplace
sudo mkdir -p /srv/orionplace
sudo chown orionplace:orionplace /srv/orionplace

На Alpine, где нет useradd:

bash
sudo addgroup -S orionplace
sudo adduser -S -D -H -h /srv/orionplace -s /sbin/nologin -G orionplace orionplace

3 Создание и подключение витрины

Создайте проект, укажите персональный бэкенд и добавьте домен витрины. Персональный бэкенд показан в вашем профиле на orionmarket.place.

bash
cd /srv/orionplace
sudo npx --yes orionplace-svelte init shop
cd shop
sudo npm install
sudo npx orionplace-svelte set backend my-shop.orionplace.app
sudo npx orionplace-svelte add frontend shop.example.com

set backend и add frontend записывают .env и файлы доменов, которые витрина читает при каждом запросе. На домен, который не добавлен, витрина отвечает 503 и никогда не подставляет другой домен.

4 Сборка

Соберите рабочий сервер и передайте папку пользователю службы. Собирайте заново после каждого изменения.

bash
cd /srv/orionplace/shop
sudo npm run build
sudo chown -R orionplace:orionplace /srv/orionplace/shop

Чтобы проверить сборку, запустите её вручную в той же папке и остановите сочетанием Ctrl+C:

bash
sudo -u orionplace env HOST=127.0.0.1 PORT=3000 PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host ADDRESS_HEADER=x-real-ip BODY_SIZE_LIMIT=67108864 /usr/local/bin/node --env-file=.env build/index.js

5 Переменные окружения

Служба задаёт эти переменные. Собственные настройки храните в .env в папке проекта.

ПеременнаяЧто делает
NODE_ENVЗапускает рабочую сборку.
HOSTАдрес, который слушает сервер. 127.0.0.1 закрывает порт от интернета: до него доходит только nginx на этом сервере.
PORTПорт, на который nginx передаёт запросы. У каждой витрины на сервере свой порт.
SITEMAPS_DIRПолный путь к папке sitemaps проекта, чтобы сервер находил её из любой рабочей папки.
.envЧитается через --env-file=.env: собственные настройки проекта, например MIMIC_FRONT_DOMAIN для локального запуска. Публичные домены важнее его.
PROTOCOL_HEADERSvelteKit: брать протокол из X-Forwarded-Proto, который задаёт nginx.
HOST_HEADERSvelteKit: брать домен из X-Forwarded-Host.
ADDRESS_HEADERSvelteKit: брать адрес покупателя из X-Real-IP.
BODY_SIZE_LIMITSvelteKit: принимать тела запросов до 64 МБ — фото к отзывам, аватары, вложения; по умолчанию 512 КБ.

6 Служба systemd

В системе с systemd сохраните этот файл:

/etc/systemd/system/orionplace-shop.service
# Installed by "orionplace-svelte install". Run it again after changes;
# manage with: orionplace app status|logs|restart shop
[Unit]
Description=OrionMarketplace storefront shop (SvelteKit)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=orionplace
Group=orionplace
WorkingDirectory=/srv/orionplace/shop
Environment=NODE_ENV=production
Environment=HOST=127.0.0.1
Environment=PORT=3000
Environment=SITEMAPS_DIR=/srv/orionplace/shop/sitemaps
Environment=PROTOCOL_HEADER=x-forwarded-proto
Environment=HOST_HEADER=x-forwarded-host
Environment=ADDRESS_HEADER=x-real-ip
Environment=BODY_SIZE_LIMIT=67108864
ExecStart=/usr/local/bin/node --env-file=.env build/index.js
Restart=on-failure
RestartSec=3
LimitNOFILE=65535
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full

[Install]
WantedBy=multi-user.target

Загрузите его, запустите витрину сейчас и при каждой загрузке, затем проверьте её и прочитайте журнал:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now orionplace-shop
sudo systemctl status orionplace-shop
sudo journalctl -u orionplace-shop -n 50

7 Служба OpenRC (Alpine)

На Alpine вместо него сохраните этот скрипт:

/etc/init.d/orionplace-shop
#!/sbin/openrc-run
# Installed by "orionplace-svelte install". Run it again after changes;
# manage with: orionplace app status|logs|restart shop
name="orionplace-shop"
description="OrionMarketplace storefront shop (SvelteKit)"
supervisor=supervise-daemon
respawn_delay=3
command="/usr/local/bin/node"
command_args="--env-file=.env build/index.js"
command_user="orionplace:orionplace"
directory="/srv/orionplace/shop"
output_log="/var/log/orionplace/shop.log"
error_log="/var/log/orionplace/shop.log"
export NODE_ENV="production"
export HOST="127.0.0.1"
export PORT="3000"
export SITEMAPS_DIR="/srv/orionplace/shop/sitemaps"
export PROTOCOL_HEADER="x-forwarded-proto"
export HOST_HEADER="x-forwarded-host"
export ADDRESS_HEADER="x-real-ip"
export BODY_SIZE_LIMIT="67108864"

depend() {
  need net
  after firewall
}

start_pre() {
  checkpath --directory --owner orionplace:orionplace --mode 0755 /var/log/orionplace
}

Сделайте его исполняемым, запустите сейчас и при каждой загрузке, затем прочитайте журнал:

bash
sudo chmod 755 /etc/init.d/orionplace-shop
sudo rc-update add orionplace-shop default
sudo rc-service orionplace-shop start
sudo tail -n 50 /var/log/orionplace/shop.log

8 Проверка службы

Запросите главную страницу витрины от имени вашего домена:

bash
curl -sI -H 'Host: shop.example.com' http://127.0.0.1:3000/

HTTP/1.1 200 означает, что витрина работает. 503 — домен не добавлен в проект. Нет ответа — служба не запущена: прочитайте её журнал. Затем опубликуйте витрину по HTTPS, см. «Конфигурация nginx».

9 Обновления

Обновите пакет витрины, соберите её и перезапустите службу (на Alpine: sudo rc-service orionplace-shop restart):

bash
cd /srv/orionplace/shop
sudo npx orionplace-svelte update
sudo npm run build
sudo chown -R orionplace:orionplace /srv/orionplace/shop
sudo systemctl restart orionplace-shop

Чтобы позже передать витрину утилитам, выполните в её папке команду install. Она запишет тот же файл службы поверх вашего и подключит домены через серверную утилиту, если та настроена. Сначала удалите свой файл nginx для домена: утилита не берёт домен, который обслуживает другой файл.

bash
cd /srv/orionplace/shop
sudo npx orionplace-svelte install