Иллюстрация: домашний сервер Warcraft, systemd и MariaDB — сборка и запуск сервиса

Warcraft как сервис на домашнем сервере: сборка, база и запуск под systemd

25.01.2026

Пошаговая инструкция для новичка: ставим пакеты, заводим отдельного пользователя, собираем бинарники,
настраиваем 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';"

Видишь базы и права — значит всё на месте.

Совет: замени STRONG_PASS на сильный пароль. Потом сам себе спасибо скажешь.

Шаг 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"
Проверка: в выводе есть понятные SQL для auth, characters, world.

Заливаем по реальному пути из вывода (пример — путь замени на свой):

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 authserver
systemctl --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 worldserver
systemctl --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
Если сервис валится сразу — не пытайся “перезапускать до победы”. Один раз глянул лог — и уже понятно, куда копать.

Чек-лист

Сервисы активны: systemctl is-active authserver worldserver
В логах нет ошибок: journalctl -u worldserver -p err
Бинарники на месте: /opt/acore/bin/bin
Таблицы существуют (не пусто): SHOW TABLES
Пользователь БД локальный: acore@localhost
Рестарт и лимиты настроены: Restart / LimitNOFILE
Есть бэкап БД и тест восстановления

Куда дальше:
Данные → Бэкапы MariaDB/PostgreSQL
Гайды → Пошаговая диагностика
Серверная → Безопасные обновления

Зачем это в реальной эксплуатации: чтобы сервис жил как сервис — предсказуемо запускается,
а если что-то ломается, причина быстро находится в логах.