User Tools

Site Tools


servers:linux:games:trinitycore_3.3.5

Information

Notes

  • 2024/10/30: These notes haven't been re-factored in a while and likely benefit from some more-recent changes on localhost Server notes

Prerequisites

Create Group and User

sudo groupadd 'trinity' && sudo useradd -c 'TrinityCore system account' -d '/var/lib/trinity' -g 'trinity' -m -r 'trinity'

Dependencies

Packages

sudo dnf install bzip2-devel clang cmake git mariadb-devel boost-devel readline-devel

Firewall

  • :!: 3724/tcp is loginserver and needs forwarded from the router for both LAN and WAN
  • :!: 8085/tcp is worldserver and needs forwarded from the router for both LAN and WAN
  • 3443/tcp is Remote Console
  • 7878/tcp is SOAP
sudo firewall-cmd --add-port='3724'/'tcp' --permanent && sudo firewall-cmd --reload
sudo firewall-cmd --add-port='8085'/'tcp' --permanent && sudo firewall-cmd --reload
sudo firewall-cmd --add-port='3443'/'tcp' --permanent && sudo firewall-cmd --reload
sudo firewall-cmd --add-port='7878'/'tcp' --permanent && sudo firewall-cmd --reload

Download Source

sudo su 'trinity' -s '/usr/bin/bash'
cd ~ && mkdir -p ~/'Projects' && rm -Rf ~/'Projects/trinity-335/src' && git clone --branch '3.3.5' --depth '1' --recurse-submodules 'https://github.com/TrinityCore/TrinityCore.git' ~/'Projects/trinity-335/src' && sync
exit

Databases

Initial

  • This creates the authserver, characters, and worldserver databases
sudo mysql
CREATE DATABASE authserver;
GRANT ALL PRIVILEGES ON authserver.* to 'authserver'@'localhost' IDENTIFIED BY 'x';
CREATE DATABASE characters;
GRANT ALL PRIVILEGES ON characters.* to 'characters'@'localhost' IDENTIFIED BY 'x';
CREATE DATABASE worldserver;
GRANT ALL PRIVILEGES ON worldserver.* to 'worldserver'@'localhost' IDENTIFIED BY 'x';
FLUSH PRIVILEGES;
EXIT

TDB

sudo su 'trinity' -s '/usr/bin/bash'
rm -Rf '/tmp/TDB' '/tmp/TDB/TDB335.7z' && mkdir -p '/tmp/TDB' && cd ~ && wget -O '/tmp/TDB/TDB335.7z' 'https://github.com/TrinityCore/TrinityCore/releases/download/TDB335.23061/TDB_full_world_335.23061_2023_06_14.7z' && 7za x '/tmp/TDB/TDB335.7z' -o'/tmp/TDB' && mv '/tmp/TDB/TDB_full_world_335'*'.sql' ~/'Projects/trinity-335/run/bin' && rm -Rf '/tmp/TDB' && sync

Compile

  • :!: This wipes out the run folder, so ideally any extracted content and the full TDB shouldn't be moved there until after this initial compile
  • :!: For content extraction, Fedora major versions should match between the compiler and extraction machines for Boost libraries 6)
sudo su 'trinity' -s '/usr/bin/bash'
rm -Rf ~/'Projects/trinity-335/build' ~/'Projects/trinity-335/run' && mkdir -p ~/'Projects/trinity-335/build' ~/'Projects/trinity-335/run' && cd ~/'Projects/trinity-335/build' && CC='/usr/bin/clang' CXX='/usr/bin/clang++' cmake ~/'Projects/trinity-335/src' -DCMAKE_INSTALL_PREFIX=~/'Projects/trinity-335/run' -DTOOLS='1' && sync && make --jobs=$(nproc) install && sync
exit

Extractors

  • Copies mapextractor, vmap4extractor, vmap4assembler, and mmaps_generator to /tmp/trinity-extractors
mkdir -p '/tmp/trinity-extractors' && sudo cp '/var/lib/trinity/Projects/trinity-335/run/bin/mapextractor' '/var/lib/trinity/Projects/trinity-335/run/bin/vmap4extractor' '/var/lib/trinity/Projects/trinity-335/run/bin/vmap4assembler' '/var/lib/trinity/Projects/trinity-335/run/bin/mmaps_generator' '/tmp/trinity-extractors' && sudo chown -R $USER:$USER '/tmp/trinity-extractors' && sync

Content

Transfer Extractors to Client

  • :!: Run on the machine doing the content extraction
  • See WoW 3.3.5 installation notes
mkdir -p '/tmp/trinity-extractors' && scp espionage724@192.168.1.152:'/tmp/trinity-extractors/'* '/tmp/trinity-extractors' && mv '/tmp/trinity-extractors/'* ~/'.wine/World of Warcraft 3.3.5/drive_c/Program Files/World of Warcraft 3.3.5a.12340'*'/' && sync

Dependencies

  • :!: Run on the machine doing the content extraction
sudo dnf install 'boost'

Extract and Generate Content

DBCs, Maps, and Cameras

  • :!: Run on the machine doing the content extraction
cd ~/'.wine/World of Warcraft 3.3.5/drive_c/Program Files/World of Warcraft 3.3.5a.12340'*'/' && ./'mapextractor' -f '0'  && sync

VMaps

Extract

  • :!: Run on the machine doing the content extraction
cd ~/'.wine/World of Warcraft 3.3.5/drive_c/Program Files/World of Warcraft 3.3.5a.12340'*'/' && ./'vmap4extractor' -l && sync

Assemble

  • :!: Run on the machine doing the content extraction
cd ~/'.wine/World of Warcraft 3.3.5/drive_c/Program Files/World of Warcraft 3.3.5a.12340'*'/' && mkdir -p 'vmaps' && ./'vmap4assembler' 'Buildings' 'vmaps' && sync

MMaps

  • :!: Run on the machine doing the content extraction
cd ~/'.wine/World of Warcraft 3.3.5/drive_c/Program Files/World of Warcraft 3.3.5a.12340'*'/' && mkdir -p 'mmaps' && ./'mmaps_generator' --bigBaseUnit 'true' --threads $(nproc) && sync

Transfer Content to Server

  • Should be around 3.6GB
  • :!: Run on the machine that did the content extraction
cd ~/'.wine/World of Warcraft 3.3.5/drive_c/Program Files/World of Warcraft 3.3.5a.12340'*'/' && scp -r 'dbc' 'maps' 'vmaps' 'mmaps' 'Cameras' espionage724@192.168.1.152:~

Cleanup on Client

  • :!: Run on the machine that did the content extraction
cd ~/'.wine/World of Warcraft 3.3.5/drive_c/Program Files/World of Warcraft 3.3.5a.12340'*'/' && rm -Rf 'Buildings' 'Cameras' 'dbc' 'maps' 'vmaps' 'mmaps' && cd ~/'Downloads' && rm -f 'mapextractor' 'vmap4extractor' 'vmap4assembler' 'mmaps_generator' && sync

Move Content on Server

  • Moves the dbc, maps, vmaps, mmaps, and Cameras folders from the main user's ~ into the bin folder
  • :!: Run on the machine that is running the server
ls ~/'dbc' ~/'maps' ~/'vmaps' ~/'mmaps' ~/'Cameras' > '/dev/null' && sudo rm -Rf '/var/lib/trinity/Projects/trinity-335/run/bin/dbc' '/var/lib/trinity/Projects/trinity-335/run/bin/maps' '/var/lib/trinity/Projects/trinity-335/run/bin/vmaps' '/var/lib/trinity/Projects/trinity-335/run/bin/mmaps' '/var/lib/trinity/Projects/trinity-335/run/bin/Cameras' && cd ~ && sudo mv 'dbc' 'maps' 'vmaps' 'mmaps' 'Cameras' '/var/lib/trinity/Projects/trinity-335/run/bin' && sudo chown -R 'trinity':'trinity' '/var/lib/trinity/Projects/trinity-335/run/bin/dbc' '/var/lib/trinity/Projects/trinity-335/run/bin/maps' '/var/lib/trinity/Projects/trinity-335/run/bin/vmaps' '/var/lib/trinity/Projects/trinity-335/run/bin/mmaps' '/var/lib/trinity/Projects/trinity-335/run/bin/Cameras' && sync
sudo restorecon -F -I -R '/var/lib/trinity/Projects/trinity-335' && sync

SELinux

sudo semanage fcontext --add --type 'bin_t' '/var/lib/trinity/Projects/trinity-335/run/bin/authserver' && sudo restorecon -F -I -R '/var/lib/trinity/Projects/trinity-335/run/bin/authserver'
sudo semanage fcontext --add --type 'bin_t' '/var/lib/trinity/Projects/trinity-335/run/bin/worldserver' && sudo restorecon -F -I -R '/var/lib/trinity/Projects/trinity-335/run/bin/worldserver'

Settings

authserver

nano ~/'Projects/trinity-335/run/etc/authserver.conf'
LoginDatabaseInfo = ".;/var/lib/mysql/mysql.sock;authserver;x;authserver"

worldserver

  • :!: TODO: Update for conf.d
nano ~/'Projects/trinity-335/run/etc/worldserver.conf'
LoginDatabaseInfo     = ".;/var/lib/mysql/mysql.sock;authserver;x;authserver"
WorldDatabaseInfo     = ".;/var/lib/mysql/mysql.sock;worldserver;x;worldserver"
CharacterDatabaseInfo = ".;/var/lib/mysql/mysql.sock;characters;x;characters"
Quests.LowLevelHideDiff = -1
Motd = "Welcome to the Realm of Espionage World of Warcraft server!"
Server.LoginInfo = 1
BirthdayTime = 1170471600

TODO Settings

# Distance
Visibility.Distance.Continents = 533
Visibility.Distance.Instances = 533
Visibility.Notify.Period.OnContinents = 250
Visibility.Notify.Period.InInstances = 250

Create GM Account

sudo su 'trinity' -s '/usr/bin/bash'
cd ~/'Projects/trinity-335/run/bin' && ~/'Projects/trinity-335/run/bin/authserver'
  • Ctrl + C
cd ~/'Projects/trinity-335/run/bin' && ~/'Projects/trinity-335/run/bin/worldserver'
account create Espionage724 x
account set gmlevel Espionage724 3 -1
server shutdown 1

Other Settings

Disable Console

Config

  • This prevents the system log from having unnecessary console spam
  • :!: To be done after creating the initial GM account
  • Any additional console use should come from telnet from a remote machine on the local network
  • :!: Credentials for the remote console are the same as the GM account created above
  • 2023/07/30: TODO: sed didn't work as-expected, hence this isn't a one-liner yet 8-)
sudo su 'trinity' -s '/usr/bin/bash'
nano ~/'Projects/trinity-335/run/etc/worldserver.conf'
Console.Enable = 0

telnet

telnet '192.168.1.152' '3443'
server shutdown 1

Realm Information

  • To be done after databases are initialized
  • Applies to the first realm
sudo mysql
UPDATE `authserver`.`realmlist` SET `name` = 'RoE (WotLK)', `address` = 'wow.realmofespionage.xyz' WHERE `realmlist`.`id` = 1;

Two-Factor Authentication

  • :!: 2023/07/30: This may have different behavior, see TOTPMasterSecret in auth and world confs
  • To be done after databases are initialized
  • Applies to the first account
  • :!: token_key must contain and not exceed 16 characters and can only contain characters A-Z and numbers 2-7 7)
  • Add key to Authenticator app
  • Authenticator will be prompted from the game client on each log-in
sudo mysql
UPDATE `authserver`.`account` SET `token_key` = 'x' WHERE `account`.`id` = 1

SOAP

  • TODO: Re-figure out how SOAP works

Services

authserver

  • 2027/07/30: TODO: Rename the service as tc-335-auth isn't rememberable
sudo -e '/etc/systemd/system/tc-335-auth.service' && sudo systemctl daemon-reload && sudo systemctl enable 'tc-335-auth' --now
[Unit]
Description=TrinityCore 3.3.5 authserver
Wants=network-online.target
After=network-online.target mysqld.service

[Service]
Type=simple
User=trinity
Group=trinity
WorkingDirectory=/var/lib/trinity/Projects/trinity-335/run/bin
ExecStart='/var/lib/trinity/Projects/trinity-335/run/bin/authserver' -c '/var/lib/trinity/Projects/trinity-335/run/etc/authserver.conf'
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl status 'tc-335-auth' -l

worldserver

  • :!: Make sure worldserver's Console is disabled before starting the worldserver service
  • 2027/07/30: TODO: Rename the service as tc-335-world isn't rememberable
sudo -e '/etc/systemd/system/tc-335-world.service' && sudo systemctl daemon-reload && sudo systemctl enable 'tc-335-world'
[Unit]
Description=TrinityCore 3.3.5 worldserver
Wants=network-online.target
After=network-online.target mysqld.service

[Service]
Type=simple
User=trinity
Group=trinity
WorkingDirectory=/var/lib/trinity/Projects/trinity-335/run/bin
ExecStart='/var/lib/trinity/Projects/trinity-335/run/bin/worldserver' -c '/var/lib/trinity/Projects/trinity-335/run/etc/worldserver.conf'
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl status 'tc-335-world' -l

Information

  • :!: Explanation of the update process and following services
  1. Pull-in updated sources and compile TC (1:00)
  2. Stop TC auth and world services (3:00)
  3. Install updated-compiled TC (3:02:30)
  4. Start TC auth and world services (3:05)

Updater

Service

  • :!: Change make --jobs=2 as-needed
sudo -e '/etc/systemd/system/tc-335-up.service'
[Service]
User=trinity
Group=trinity
Type=oneshot
WorkingDirectory=/var/lib/trinity/Projects/trinity-335/build
Environment='CC=/usr/bin/clang'
Environment='CXX=/usr/bin/clang++'
ExecStartPre='/usr/bin/make' clean
ExecStartPre='/usr/bin/git' -C '/var/lib/trinity/Projects/trinity-335/src' pull origin '3.3.5'
ExecStartPre='/usr/bin/sync'
ExecStart='/usr/bin/cmake' '/var/lib/trinity/Projects/trinity-335/src' -DCMAKE_INSTALL_PREFIX='/var/lib/trinity/Projects/trinity-335/run' -DTOOLS='1'
ExecStart='/usr/bin/make' --jobs='2'
ExecStartPost='/usr/bin/sync'

Timer

  • Every day at 01:00:00
sudo -e '/etc/systemd/system/tc-335-up.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'tc-335-up.timer' --now
[Unit]
Description=TrinityCore 3.3.5 Git Updater and Compiler
Wants=network-online.target
After=network-online.target

[Timer]
OnCalendar=*-*-* 01:00:00
Persistent=true

[Install]
WantedBy=timers.target

Stopper

Service

sudo -e '/etc/systemd/system/tc-335-stop.service'
[Service]
Type=oneshot
ExecStart='/usr/bin/systemctl' stop 'tc-335-auth'
ExecStart='/usr/bin/systemctl' stop 'tc-335-world'
ExecStartPost='/usr/bin/sync'

Timer

  • Every day at 03:00:00
sudo -e '/etc/systemd/system/tc-335-stop.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'tc-335-stop.timer' --now
[Unit]
Description=TrinityCore 3.3.5 Services Stopper
Wants=network-online.target mysqld.service
After=network-online.target

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

Post-updater

Service

sudo -e '/etc/systemd/system/tc-335-up-post.service'
[Service]
User=trinity
Group=trinity
Type=oneshot
WorkingDirectory=/var/lib/trinity/Projects/trinity-335/build
ExecStart='/usr/bin/make' install
ExecStartPost='/usr/bin/sync'

Timer

  • Every day at 03:02:30
sudo -e '/etc/systemd/system/tc-335-up-post.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'tc-335-up-post.timer' --now
[Unit]
Description=TrinityCore 3.3.5 Post-Updater
Wants=network-online.target
After=network-online.target

[Timer]
OnCalendar=*-*-* 03:02:30
Persistent=true

[Install]
WantedBy=timers.target

Restarter

Service

sudo -e '/etc/systemd/system/tc-335-restart.service'
[Service]
Type=oneshot
ExecStart='/usr/bin/systemctl' start 'tc-335-auth'
ExecStart='/usr/bin/systemctl' start 'tc-335-world'
ExecStartPost='/usr/bin/sync'

Timer

  • Every day at 03:05:00
sudo -e '/etc/systemd/system/tc-335-restart.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'tc-335-restart.timer' --now
[Unit]
Description=TrinityCore 3.3.5 Services Restarter
Wants=network-online.target mysqld.service
After=network-online.target

[Timer]
OnCalendar=*-*-* 03:05:00
Persistent=true

[Install]
WantedBy=timers.target

Database Backup

  • This backs up an archive to the local disk

authserver

Database Auth

sudo -H -u 'mysql' -e '/var/lib/mysql/auth/authserver' && sudo chmod '600' '/var/lib/mysql/auth/authserver'
[mysqldump]
user=authserver
password=x

Service

mkdir -p ~/'backups' && sudo -H -u 'mysql' mkdir -p '/var/lib/mysql/tmp' && sudo -e '/etc/systemd/system/authserver-db.service' && sudo sed -i 's/'CHANGEME'/'$USER'/g' '/etc/systemd/system/authserver-db.service'
[Service]
Type=oneshot
WorkingDirectory=/var/lib/mysql/tmp
ExecStartPre='/usr/bin/mysqldump' --defaults-extra-file='/var/lib/mysql/auth/authserver' --single-transaction 'authserver' -r '/var/lib/mysql/tmp/authserver.sql'
ExecStart='/usr/bin/gzip' -f '/var/lib/mysql/tmp/authserver.sql'
ExecStart='/usr/bin/bash' -c '"/usr/bin/mv" "/var/lib/mysql/tmp/authserver.sql.gz" "/home/CHANGEME/backups/authserver-database-auto-"$$(date +%%Y-%%m-%%d)".sql.gz"'
ExecStartPost='/usr/bin/sync'

Timer

  • This happens daily
sudo -e '/etc/systemd/system/authserver-db.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'authserver-db.timer' --now && sudo systemctl start 'authserver-db' && sudo systemctl status 'authserver-db' -l
[Unit]
Description=TrinityCore (authserver) Database Backup
After=mysqld.service

[Timer]
OnCalendar=*-*-* 03:40:00
Persistent=true

[Install]
WantedBy=timers.target

characters

Database Auth

sudo -H -u 'mysql' -e '/var/lib/mysql/auth/characters' && sudo chmod '600' '/var/lib/mysql/auth/characters'
[mysqldump]
user=characters
password=x

Service

mkdir -p ~/'backups' && sudo -H -u 'mysql' mkdir -p '/var/lib/mysql/tmp' && sudo -e '/etc/systemd/system/characters-db.service' && sudo sed -i 's/'CHANGEME'/'$USER'/g' '/etc/systemd/system/characters-db.service'
[Service]
Type=oneshot
WorkingDirectory=/var/lib/mysql/tmp
ExecStartPre='/usr/bin/mysqldump' --defaults-extra-file='/var/lib/mysql/auth/characters' --single-transaction 'characters' -r '/var/lib/mysql/tmp/characters.sql'
ExecStart='/usr/bin/gzip' -f '/var/lib/mysql/tmp/characters.sql'
ExecStart='/usr/bin/bash' -c '"/usr/bin/mv" "/var/lib/mysql/tmp/characters.sql.gz" "/home/CHANGEME/backups/characters-database-auto-"$$(date +%%Y-%%m-%%d)".sql.gz"'
ExecStartPost='/usr/bin/sync'

Timer

  • This happens daily
sudo -e '/etc/systemd/system/characters-db.timer' && sudo systemctl daemon-reload && sudo systemctl enable 'characters-db.timer' --now && sudo systemctl start 'characters-db' && sudo systemctl status 'characters-db' -l
[Unit]
Description=TrinityCore (characters) Database Backup
After=mysqld.service

[Timer]
OnCalendar=*-*-* 03:41:00
Persistent=true

[Install]
WantedBy=timers.target

Backup

  • Create backup archive on server and transfer to client computer

Server

Stop Services

sudo systemctl stop authserver worldserver

Backup Database

sudo mysqldump --defaults-extra-file='/var/lib/mysql/auth/authserver' --single-transaction 'authserver' -r ~/'authserver-database-manual-'$(date +%Y-%m-%d)'.sql' && sync
sudo mysqldump --defaults-extra-file='/var/lib/mysql/auth/characters' --single-transaction 'characters' -r ~/'characters-database-manual-'$(date +%Y-%m-%d)'.sql' && sync

Start Services

sudo systemctl start authserver worldserver

Client

Transfer Files To Client

scp espionage724@192.168.1.152:~/'authserver-database-'*'.sql' espionage724@192.168.1.152:~/'characters-database-'*'.sql' ~/'Downloads' && sync

Restore

Client

Uncompress Database

  • This is only needed if restoring an automated database backup 8)
gunzip ~/'Downloads/authserver-database-'*'.sql.gz'
gunzip ~/'Downloads/characters-database-'*'.sql.gz'

Transfer Files To Server

scp ~/'Downloads/authserver-database-'*'.sql' ~/'Downloads/characters-database-'*'.sql' espionage724@192.168.1.152:~

Remove Files

rm -f ~/'Downloads/authserver-database-'*'.sql' ~/'Downloads/characters-database-'*'.sql' && sync

Server

Stop Services

sudo systemctl stop authserver worldserver

Drop Previous Database

sudo mysql
DROP DATABASE authserver;
DROP DATABASE characters;
FLUSH TABLES;

Re-create Databases

sudo mysql
CREATE DATABASE authserver;
CREATE DATABASE characters;

Restore Database

sudo mysql 'authserver' < ~/'authserver-database-'*'.sql' && sync
sudo mysql 'characters' < ~/'characters-database-'*'.sql' && sync

Reapply Permissions

sudo mysql
GRANT ALL PRIVILEGES ON authserver.* to 'authserver'@'localhost' IDENTIFIED BY 'x';
GRANT ALL PRIVILEGES ON characters.* to 'characters'@'localhost' IDENTIFIED BY 'x';
FLUSH PRIVILEGES;

Start Services

sudo systemctl start authserver worldserver

Remove Backups

  • Verify that TrinityCore works before running
rm ~/'authserver-database-'*'.sql' ~/'characters-database-'*'.sql' && sync
3)
WoW realmlist.wtf
4)
required for content extraction, and since the core and tools are compiled on Linux the extraction tools also require Linux
5)
the compile command below wipes out the run folder if it exists before compiling
6)
can use LD_LIBRARY_PATH=. for all the extraction commands, and copy the requested .so library files from downloaded packages into the WoW folder
7)
in other words, token_key requires a 16-character Base32 string
8)
manual doesn't gzip
/var/www/wiki/data/pages/servers/linux/games/trinitycore_3.3.5.txt · Last modified: by Sean Rhone