Установка
Docker или вручную, оба способа рабочие
Собрать образ Docker и не думать про версии Node или развернуть всё руками на сервере. Разницы в поведении нет, выбирайте по привычке.
Docker
Забрать исходники
git clone https://github.com/MCXTeam/UnicoreCMS.git
cd UnicoreCMS
cp .env.example .envЗаполнить .env
Минимум, без чего не стартует: BASEURL, API_BASEURL, DATABASE_NAME, JWT_KEY. Плюс блок MYSQL_* — из него поднимется контейнер с базой.
Обязательно поменяйте JWT_KEY и ENCRYPTION_KEY, значения из примера не годятся:
openssl rand -hex 32Все переменные разобраны на отдельной странице.
Поднять
docker compose --profile prod up -d --buildПервая сборка долгая, внутри ставятся зависимости всех четырёх пакетов и собираются оба фронта. Последующие занимают минуты.
Профили в docker-compose.yml:
| Профиль | Что поднимает |
|---|---|
prod | Само приложение (все три процесса в одном контейнере) |
nginx | Реверс-прокси с раскладкой по доменам из CLIENT_HOST, ADMIN_HOST, SERVER_HOST |
dev | phpMyAdmin на :8081 |
MariaDB поднимается всегда, профиль ей не нужен.
Свой прокси уже есть
Если снаружи уже стоит nginx или Traefik, профиль nginx не включайте, иначе контейнер займёт порты 80 и 443. Проксируйте сразу на CLIENT_PORT, ADMIN_PORT и BACKEND_PORT.
Создать таблицы
docker compose exec app pnpm run alignКоманда синхронизирует схему базы с сущностями. Дальше идёт первый запуск.
HTTPS
Профиль nginx умеет работать в двух раскладках: docker/nginx/templates — обычный HTTP, docker/nginx/templates-tls — редирект на 443 и TLS с сертификатом Let's Encrypt. Выбирает раскладку переменная NGINX_TEMPLATES, сертификаты выписывает профиль certbot.
Поднять HTTP и направить домены
Домены из CLIENT_HOST, ADMIN_HOST и SERVER_HOST должны резолвиться на сервер, а nginx — отвечать на 80 порту. Шаблон по умолчанию как раз отдаёт /.well-known/acme-challenge/, без этого сертификат не выпишется.
Выписать сертификат
docker compose --profile certbot run --rm certbotПеред этим задайте CERTBOT_EMAIL. Сертификат выписывается сразу на все три домена плюс www для основного.
Переключить nginx на TLS
NGINX_TEMPLATES=templates-tlsdocker compose --profile nginx up -d --force-recreate nginxПеревести адреса на https
Поменяйте BASEURL, API_BASEURL и ADMIN_BASEURL на https://. Это не косметика: именно по схеме в API_BASEURL сервер понимает, что работает по TLS, и включает HSTS, флаг Secure на куках сессии и SameSite=None, без которого админка на отдельном домене не удержит вход.
Продление сертификата — та же команда с renew, раз в неделю по крону:
docker compose --profile certbot run --rm certbot renewВручную
Node и pnpm
Нужен Node 22–24, рекомендуется 22 (версия зафиксирована в .nvmrc). pnpm ставится через corepack:
corepack enable
corepack prepare pnpm@11.20.0 --activateВерсию pnpm держит поле packageManager в корневом package.json, так что вручную следить за ней не придётся: corepack подставит нужную сам.
Установка в CI
Начиная с одиннадцатой версии pnpm спрашивает подтверждение, когда собирается снести node_modules, и без терминала падает с ERR_PNPM_ABORTED_REMOVE_MODULES_DIR_NO_TTY. В контейнерах и на сборочных агентах ставьте переменную CI=true — в Dockerfile проекта она уже прописана.
База данных
Создайте базу и пользователя. Для MySQL/MariaDB:
CREATE DATABASE unicore CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'unicore'@'localhost' IDENTIFIED BY 'пароль';
GRANT ALL PRIVILEGES ON unicore.* TO 'unicore'@'localhost';Реквизиты положите в DATABASE_* в .env.
Зависимости, сборка, схема
cp .env.example .env
# отредактировать .env
pnpm run bootboot прогоняет три шага подряд: pnpm install, сборку общего пакета и сервера, синхронизацию схемы базы. Фронты он не собирает, их соберите отдельно:
pnpm run build:client
pnpm run build:adminЗапуск
pnpm run startСтартуют сразу три процесса. На проде запускайте их через pm2, в корне уже лежит ecosystem.config.js:
pm2 start ecosystem.config.js
pm2 saveРазработка
pnpm run devОбщий пакет собирается один раз, дальше поднимаются все три приложения в watch-режиме. Сервер слушает :5000, сайт :3000, админка :4000, если порты не переопределяли.
Тестовые данные
Поставьте DEV_SEED=1 в .env и выполните pnpm run seed — в базу насыпется 250 фейковых игроков, серверы, новости и подарки. На боевой базе так делать не надо.