Запуск витрины как службы
На этой странице вручную настраивается то, что делают 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. Проверьте установленную версию:
node -vТакже нужны npm, права root и Linux-сервер с systemd (Debian, Ubuntu, семейство RHEL, Fedora, openSUSE, Arch) или OpenRC (Alpine). Файлы служб ниже запускают /usr/local/bin/node; если command -v node показывает другой путь, укажите его.
2 Пользователь службы и папка
Витрина работает от собственного системного пользователя без входа в систему, поэтому может менять только свою папку. Все родительские папки витрины должны быть открыты этому пользователю; /srv/orionplace открыта.
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:
sudo addgroup -S orionplace
sudo adduser -S -D -H -h /srv/orionplace -s /sbin/nologin -G orionplace orionplace3 Создание и подключение витрины
Создайте проект, укажите персональный бэкенд и добавьте домен витрины. Персональный бэкенд показан в вашем профиле на orionmarket.place.
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.comset backend и add frontend записывают .env и файлы доменов, которые витрина читает при каждом запросе. На домен, который не добавлен, витрина отвечает 503 и никогда не подставляет другой домен.
4 Сборка
Соберите рабочий сервер и передайте папку пользователю службы. Собирайте заново после каждого изменения.
cd /srv/orionplace/shop
sudo npm run build
sudo chown -R orionplace:orionplace /srv/orionplace/shopЧтобы проверить сборку, запустите её вручную в той же папке и остановите сочетанием Ctrl+C:
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.js5 Переменные окружения
Служба задаёт эти переменные. Собственные настройки храните в .env в папке проекта.
| Переменная | Что делает |
|---|---|
NODE_ENV | Запускает рабочую сборку. |
HOST | Адрес, который слушает сервер. 127.0.0.1 закрывает порт от интернета: до него доходит только nginx на этом сервере. |
PORT | Порт, на который nginx передаёт запросы. У каждой витрины на сервере свой порт. |
SITEMAPS_DIR | Полный путь к папке sitemaps проекта, чтобы сервер находил её из любой рабочей папки. |
.env | Читается через --env-file=.env: собственные настройки проекта, например MIMIC_FRONT_DOMAIN для локального запуска. Публичные домены важнее его. |
PROTOCOL_HEADER | SvelteKit: брать протокол из X-Forwarded-Proto, который задаёт nginx. |
HOST_HEADER | SvelteKit: брать домен из X-Forwarded-Host. |
ADDRESS_HEADER | SvelteKit: брать адрес покупателя из X-Real-IP. |
BODY_SIZE_LIMIT | SvelteKit: принимать тела запросов до 64 МБ — фото к отзывам, аватары, вложения; по умолчанию 512 КБ. |
6 Служба systemd
В системе с systemd сохраните этот файл:
# 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
Загрузите его, запустите витрину сейчас и при каждой загрузке, затем проверьте её и прочитайте журнал:
sudo systemctl daemon-reload
sudo systemctl enable --now orionplace-shop
sudo systemctl status orionplace-shop
sudo journalctl -u orionplace-shop -n 507 Служба OpenRC (Alpine)
На Alpine вместо него сохраните этот скрипт:
#!/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
}
Сделайте его исполняемым, запустите сейчас и при каждой загрузке, затем прочитайте журнал:
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.log8 Проверка службы
Запросите главную страницу витрины от имени вашего домена:
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):
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 для домена: утилита не берёт домен, который обслуживает другой файл.
cd /srv/orionplace/shop
sudo npx orionplace-svelte install