Warcraft как сервис на домашнем сервере: сборка, база и запуск под systemd
Пошаговая инструкция для новичка: ставим пакеты, заводим отдельного пользователя, собираем бинарники,
настраиваем MariaDB, прописываем конфиги и поднимаем всё через systemd — с короткими проверками после каждого шага.
Условия
ОС: Debian/Ubuntu. Init: systemd. Команды выполняй по очереди.
Сначала убедимся, что система подходит.
lsb_release -a 2>/dev/null || cat /etc/os-release
ps -p 1 -o comm=Проверка: в выводе виден Debian/Ubuntu и systemd.
Шаг 1. Пакеты
Ставим инструменты сборки, git и MariaDB.
sudo apt update
sudo apt install -y git cmake make g++ mariadb-server libssl-dev zlib1g-devПроверяем, что база запущена и сборочные инструменты на месте.
systemctl is-active mariadb
cmake --versionПроверка: MariaDB должна быть active, CMake покажет версию.
Шаг 2. Пользователь и каталоги
Чтобы не смешивать сервисные файлы с личными, заведём отдельного пользователя и папки.
sudo useradd -r -m -d /opt/acore -s /usr/sbin/nologin acore
sudo -u acore mkdir -p /opt/acore/src /opt/acore/build /opt/acore/binПроверка:
id acore
ls -ld /opt/acore/{src,build,bin}Пользователь acore есть, каталоги созданы.
Шаг 3. Исходники
Клонируем репозиторий в отдельную папку.
sudo -u acore git clone https://github.com/azerothcore/azerothcore-wotlk.git /opt/acore/src/acoreПроверка:
sudo -u acore test -f /opt/acore/src/acore/CMakeLists.txt && echo "OK: исходники на месте"Шаг 4. Сборка и установка
Собираем в /opt/acore/build, ставим в /opt/acore/bin.
sudo -u acore bash -lc 'cd /opt/acore/build && cmake ../src/acore -DCMAKE_INSTALL_PREFIX=/opt/acore/bin'
sudo -u acore bash -lc 'cd /opt/acore/build && make -j"$(nproc)" && make install'Проверка: появились ли бинарники.
ls -lh /opt/acore/bin/bin | egrep 'worldserver|authserver'Если их нет — дальше не идём, сначала добиваемся успешной сборки.
Шаг 5. База данных
Создаём три базы и пользователя, которому они принадлежат.
sudo mysql -e "CREATE DATABASE acore_auth; CREATE DATABASE acore_characters; CREATE DATABASE acore_world;"
sudo mysql -e "CREATE USER 'acore'@'localhost' IDENTIFIED BY 'STRONG_PASS'; GRANT ALL ON acore_%.* TO 'acore'@'localhost'; FLUSH PRIVILEGES;"Проверка:
mysql -uacore -pSTRONG_PASS -e "SHOW DATABASES LIKE 'acore_%';"
mysql -uacore -pSTRONG_PASS -e "SHOW GRANTS FOR 'acore'@'localhost';"Видишь базы и права — значит всё на месте.
Шаг 6. SQL: найти и залить схему
Сначала ищем SQL-файлы, чтобы понимать реальные пути.
sudo -u acore bash -lc "cd /opt/acore/src/acore && find . -maxdepth 4 -type f -name '*.sql' | egrep 'auth|characters|world|base|create' | head"Заливаем по реальному пути из вывода (пример — путь замени на свой):
mysql -uacore -pSTRONG_PASS acore_auth < /opt/acore/src/acore/data/sql/base/auth.sqlПроверка: появились таблицы.
mysql -uacore -pSTRONG_PASS -e "USE acore_auth; SHOW TABLES LIMIT 5;"Аналогично повторяешь для acore_characters и acore_world.
Шаг 7. Конфиги
Копируем шаблоны и прописываем соединения с базой.
sudo -u acore bash -lc 'cp /opt/acore/bin/etc/authserver.conf.dist /opt/acore/bin/etc/authserver.conf'
sudo -u acore bash -lc 'cp /opt/acore/bin/etc/worldserver.conf.dist /opt/acore/bin/etc/worldserver.conf'Сначала посмотрим, как называются нужные поля.
sudo -u acore bash -lc "egrep -n 'LoginDatabaseInfo|WorldDatabaseInfo|CharacterDatabaseInfo' /opt/acore/bin/etc/*.conf | head"Пример правки строки для auth:
sudo -u acore bash -lc "sed -i \"s|^LoginDatabaseInfo.*|LoginDatabaseInfo = \\\"127.0.0.1;3306;acore;STRONG_PASS;acore_auth\\\"|\" /opt/acore/bin/etc/authserver.conf"Проверка:
sudo -u acore grep -n '^LoginDatabaseInfo' /opt/acore/bin/etc/authserver.confДля world/characters — то же самое, только базы другие.
Шаг 8. systemd: authserver
Оформляем запуск как сервис: стандартный старт, стандартный рестарт, стандартные логи.
sudo tee /etc/systemd/system/authserver.service >/dev/null <<'EOF'
[Unit]
Description=Acore Authserver
After=network.target mariadb.service[Service]User=acore
WorkingDirectory=/opt/acore/bin
ExecStart=/opt/acore/bin/bin/authserver
Restart=on-failure
RestartSec=3
LimitNOFILE=8192
[Install]WantedBy=multi-user.target
EOF
Запуск и проверка:
sudo systemctl daemon-reload
sudo systemctl enable --now authserversystemctl --no-pager --full status authserver
journalctl -u authserver -n 80 --no-pagerШаг 9. systemd: worldserver
Поднимаем второй сервис.
sudo tee /etc/systemd/system/worldserver.service >/dev/null <<'EOF'
[Unit]
Description=Acore Worldserver
After=network.target mariadb.service authserver.service[Service]User=acore
WorkingDirectory=/opt/acore/bin
ExecStart=/opt/acore/bin/bin/worldserver
Restart=on-failure
RestartSec=3
LimitNOFILE=8192
[Install]WantedBy=multi-user.target
EOF
Запуск и проверка:
sudo systemctl daemon-reload
sudo systemctl enable --now worldserversystemctl --no-pager --full status worldserver
journalctl -u worldserver -n 120 --no-pagerЕсли что-то пошло не так
“Access denied” — обычно пароль или права.
mysql -uacore -pSTRONG_PASS -e "SHOW GRANTS FOR 'acore'@'localhost';"
journalctl -u worldserver -p err -n 50 --no-pager
Таблиц нет — не тот SQL / не та база.
mysql -uacore -pSTRONG_PASS -e "SHOW TABLES FROM acore_world LIMIT 5;"
mysql -uacore -pSTRONG_PASS -e "SHOW TABLES FROM acore_characters LIMIT 5;"
Рестарты по кругу — сначала читаем лог.
systemctl --no-pager --full status worldserver
journalctl -u worldserver -n 200 --no-pager
Чек-лист
Куда дальше:
Данные → Бэкапы MariaDB/PostgreSQL
Гайды → Пошаговая диагностика
Серверная → Безопасные обновления
Зачем это в реальной эксплуатации: чтобы сервис жил как сервис — предсказуемо запускается,
а если что-то ломается, причина быстро находится в логах.