UnicoreCMS

Установка

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
devphpMyAdmin на :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-tls
docker 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 boot

boot прогоняет три шага подряд: 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 фейковых игроков, серверы, новости и подарки. На боевой базе так делать не надо.

Содержание