Архив содержит готовую сборку: исходников и node_modules в нём нет, ставить зависимости не нужно.
Требования
- Linux x86_64 или ARM64 с glibc: Ubuntu 22.04+, Debian 12+ (Alpine/musl этой сборкой не поддерживается).
- Node.js 24.6 или новее:
node -v. Установка — https://nodejs.org (LTS) или NodeSource. - MongoDB 6.0 или новее (на этом же сервере или внешняя, например Atlas).
unzip:sudo apt install unzip.- Домен и обратный прокси с HTTPS (ниже — пример для nginx).
Установка
sudo useradd --system --create-home --home-dir /opt/meenu-cms meenu
sudo -u meenu unzip meenu-cms-X.Y.Z.zip -d /opt/meenu-cms
cd /opt/meenu-cms
sudo -u meenu cp .env.example .env
sudo -u meenu nano .env
В .env обязательно укажите:
PUBLIC_URL— адрес сайта, как его видят гости:https://shop.example.ru;MONGO_URL— строка подключения к MongoDB;PORT— порт приложения (по умолчанию 4321);- за nginx на этой же машине:
HOST=127.0.0.1иTRUST_PROXY=127.0.0.1.
NODE_ENV=production launcher выставляет сам. Остальные настройки (бренд, оплата, интеграции) задаются в админке.
Первый запуск
cd /opt/meenu-cms && sudo -u meenu node launcher.mjs
В выводе появится строка Система не установлена. Откройте …/install. Откройте адрес: первый шаг мастера — код активации MEENU-XXXX-XXXX-XXXX-XXXX из письма после оплаты или из личного кабинета (серверу нужен доступ в интернет к сайту Meenu), затем — название бизнеса, владелец и первая точка. Код привязывается к этому серверу; при переезде отвяжите прежнюю установку в личном кабинете. Остановить — Ctrl+C; дальше запускайте через systemd.
Автозапуск (systemd)
/etc/systemd/system/meenu-cms.service:
[Unit]
Description=Meenu CMS
After=network-online.target mongod.service
Wants=network-online.target
[Service]
Type=simple
User=meenu
WorkingDirectory=/opt/meenu-cms
ExecStart=/usr/bin/node /opt/meenu-cms/launcher.mjs
Restart=always
RestartSec=5
KillMode=control-group
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now meenu-cms
journalctl -u meenu-cms -f # журнал
Путь к node проверьте командой which node (при установке через nvm он другой).
nginx
server {
listen 443 ssl;
server_name shop.example.ru;
# сертификат — certbot --nginx -d shop.example.ru
client_max_body_size 10m; # загрузка фото блюд до 10 МБ
location / {
proxy_pass http://127.0.0.1:4321;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
С nginx обязательно TRUST_PROXY=127.0.0.1 в .env: иначе все гости видны с адреса прокси и ограничения запросов становятся общими на весь сайт.
Что лежит в каталоге
| Путь | Что это |
|---|---|
launcher.mjs |
супервизор: запускает CMS, перезапускает при сбое, применяет обновления |
launcher.prev.mjs |
предыдущий launcher (появляется после его самообновления) |
launcher.pending.json, launcher.rejected.json |
служебные файлы самообновления launcher |
current.json |
какая версия из releases/ работает |
releases/<версия>/ |
версии приложения (хранятся 3 последние) |
.env |
ваши настройки (в архивах обновлений его нет — не перезаписывается) |
uploads/ |
загруженные фото и логотипы |
update-log.json |
история обновлений |
Обновление
Когда выходит новая версия, в админке появляется баннер «Доступна версия X · Подробнее»: заметки всех новых версий и кнопка «Применить обновление» (только владелец, при действующей лицензии или в льготный период). Launcher скачивает архив с сервера Meenu, проверяет подпись, запускает новую версию на временном порту и переключается на неё, только если она ответила. При любой ошибке продолжает работать прежняя версия, причина видна в разделе «Обновления» и в update-log.json.
Если в новой версии изменился сам launcher, он обновляется следом: новый файл сначала проверяется самотестом, затем заменяет launcher.mjs (прежний рабочий сохраняется в launcher.prev.mjs), и launcher перезапускается. CMS при этом перезапускается дважды: при переключении на новую версию и при перезапуске launcher (каждый раз — как обычный рестарт). Не прошёл самотест — остаётся прежний launcher, обновление CMS всё равно применено, в разделе «Обновления» — предупреждение.
- systemd, запуск вручную — launcher заменяет себя в том же процессе (тот же PID), юнит менять не нужно.
- pm2 (и любой запуск с IPC-каналом) — launcher останавливает CMS и завершается с кодом 75, pm2 поднимает его заново уже с новым
launcher.mjs(нужен включённый по умолчаниюautorestart). - Docker —
launcher.mjsвместе сcurrent.jsonиreleases/должен лежать на томе (volume): иначе пересоздание контейнера вернёт launcher и версию из образа.
Если новый launcher трижды подряд стартует, но CMS под ним не проработала минуту, на четвёртом старте он сам возвращает launcher.prev.mjs и больше не ставится (launcher.rejected.json); в разделе «Обновления» — предупреждение. Если launcher не запускается вовсе, верните прежний вручную:
cd /opt/meenu-cms && sudo -u meenu cp launcher.prev.mjs launcher.mjs && sudo systemctl restart meenu-cms
Лицензия проверяется раз в сутки. За 30 дней до окончания в админке появится предупреждение; после окончания 14 дней админка работает как обычно, затем закрывается до продления (раздел «Лицензия» остаётся доступным). Витрина и приём заказов работают всегда.
Вручную:
sudo systemctl stop meenu-cms
cd /opt/meenu-cms && sudo -u meenu unzip -o meenu-cms-X.Y.Z.zip
sudo systemctl start meenu-cms
unzip -o добавит releases/X.Y.Z/, обновит launcher.mjs, current.json и эту инструкцию; .env и uploads/ не затрагиваются.
Откат вручную: остановите сервис, впишите в current.json версию из releases/ ({ "version": "1.4.0" }) и запустите. Изменения данных новой версии при откате не отменяются — они всегда совместимы с предыдущей версией.
Резервные копии
Регулярно сохраняйте базу (mongodump --uri "$MONGO_URL" --out /backup/meenu-$(date +%F)) и каталог uploads/.