[Build Log] Okashī

Introduction

Hey there! Welcome to a second PC build log?!
'Tis not (primarily) for gaming, though. It’s main purpose is hosting smol home server / homelab experiments.

And by “experiments,” I actually mean, “I don’t know what I’m doing, but hopefully I have enough brain cells to set something up.” :derpdorp:

Planned Projects
If I call it a project, it sounds fancier.

  • Proxmox VE
    • Pi-Hole
    • NextCloud
    • Ubuntu VM
      • WoW Private Server
  • Windows 11 (Fallback OS)
    • WoW Private Server (Fallback Plan)

Docker was on the list, but Proxmox seems to have a built-in PXC Container Toolkit.

Name
奇怪しい ⇒ おかしい ⇒ Okashī
(奇怪しい = Odd / Strange / Unusual)

Methinks it’s a fitting name…
Seeing as nothing makes any sort of sense to me while I attempt to set up these projects.


Parts List

Component Selection Price
CPU AMD Ryzen 5 5600G $119.99
CPU Cooler Noctua NH-L9a-AM4 chromax.black $54.95
Motherboard ASRock B550 Phantom Gaming-ITX/ax $159.99
Graphics Card - -
Memory G.Skill Trident Z Neo 64 GB (2 x 32 GB) DDR4-3200 $162.99
Storage Inland Premium 512 GB M.2 NVMe SSD
Western Digital PC SN520 NVMe SSD
$0.00
(Holdover)
:denmode:
Power Supply EVGA SuperNOVA 650 GM (B-Stock) $80.99
Case Fractal Design Ridge (Black) $129.99
Case Fans 2 × Fractal Design Aspect 14 PWM $0.00
(Included)
Operating System Proxmox VE
VM: Ubuntu
Dual Boot: Windows 11 (Unlicensed)
$0.00
Grand Total
(Shipping + Taxes Excluded)
$708.90
+ :truck: + :denmode:

Revision History

Last Updated: 04/12/2023

Assembly

Fractal Design Ridge





Recommendation Points Dissatisfaction Points
Design: Minimalist box with a very narrow profile, which can be set up vertically or horizontally. Build Quality: Paint chips and scuffs easily from rough handling and from screws.
Removable Panels (5/6 Sides): Front panel is conveniently held in by four small magnets. Larger side panels are secured by thumbscrews, nubs, and rails. Smaller side panels are held in by screws and nubs, and may only be accessed after the larger panels have been removed. Riveted Frame: While 5/6 of the side panels may be removed for physical access, the frame is riveted together and can obstruct cable management. (Compare against the Define 7 series and its removable top frame for mounting fans.)
Cable Routing Layout: The case has multiple tie down points for velcro strips or cable ties. Several velcro strips and zip ties are included in the package. Cable Lengths: Cable lengths for the front I/O wires and the internal PSU extension cable are slightly too long (by ≈5 cm, IMO). Too long is better than too short, but it’s aggravating to keep tidy.
Pictorially-Detailed Manual: The manual details every step of case disassembly and hardware mounting very simply and very explicitly. Ambiguity in the Manual: For hardware mounting steps, screws are only shown pictorially and do not have their model numbers listed.


ASRock B550 Phantom Gaming-ITX/ax Motherboard
So smol.


Okashī - Interior
Have I mentioned.
I really really really like matte black.

Also, this took an ungodly amount of time (90% cable management) and finger pain. :joy:
Please ignore the cable mess, it’s as good as I can get it with EVGA’s stock cables. :weary:


Okashī - Interior
I like this side. This side is so clean? :laughing:


Fractal Design Ridge - Front Panel
Magnets on the front panel!
Left a lasting first impression on me, I think this is one of my favorite features of this case, lol.


Okashī - All Assembled!
This is the point where I realized I forgot to flick the switch on the PSU.


'Chew’s Desk
:smiling_face_with_three_hearts:
Off-Screen: 4 hours of rearranging desk cables. (ノ°Д°)ノ︵ ┻━┻ Still, WORTH IT.

Maaan…
To think that my desk started out looking like this.
…I need more surface area for my plushies, GDI.


Current Desk Setup
I love this space.


Closing Comments

The physical build’s not quiiite yet done – still got those Noctua chromax.black case fans on my wishlist, and I haven’t put in the RX 5600 XT card in there. But the system’s been operational for a while now! Stable Proxmox OS, and stable Windows 11 OS. :grin:

PC building is still really fun for me!
That is, when I don’t have to think about how much it costs, and when I don’t have to fight cable snakes, and when I don’t have to carefully partition my time outside of work because of course we have a sale and of course I have to work on all the weekends.

Figuring out Linux is more headbashing and quiet documentation reading than fun, but I’m finding it pretty interesting and it’s a new learning experience.

I have a newfound appreciation for all these incredibly straightforward Windows installs. :joy:

Also, suuuuuuuuuuper special thanks to @Den!
For the parts advice, the Proxmox suggestion, the NVMe SSD, THE DANBO!!!, and for being very, very sexy, all the time. :wubba:

3 Likes

This came together so quickly from “rolling an idea around in my brain” to fully built :laughing: . It turned out so awesome! And I promise it gets fun… eventually :laughtears: .

2 Likes

Stop reminding me how much a mess my desk is.

and is that a shot glass under the monitor?

2 Likes

Naw, it’s a lil’ Japanese tea cup (湯のみ / yunomi) a friendo bought for me. Has prints of sushi on it. :grin:

I accidentally cracked it while washing it one day, so it can’t hold liquid anymore. Now it’s a glorified holder for my car keys.

2 Likes

Post-Hardware Installation Guide
A smol record of things for Windows 11 and Proxmox VE, mostly for my future reference, but perhaps useful for others? My encountered issues and workarounds for Linux are likely to be hardware-specific.


Windows 11 OS

  1. Download and run the Windows 11 OS Media Creation Tool.
  2. Follow the Media Creation Tool’s wizard to create a bootable installation media on an available USB drive.
  3. Insert and boot from the USB drive in the new / other system.
  4. Install Windows 11 without a network and without a Microsoft account.
    • Open the Command Prompt with Shift + F10. If the Command Prompt is not immediately visible, Alt + Tab to navigate to it.
    • In the Command Prompt, enter: OOBE\BYPASSNRO
    • Users should now be able to install Windows 11 “with a limited setup” (i.e. without a network connection).


Windows 11 (Unlicensed)

Recommended Post-Installation Steps

  • Settings: Preferably before connecting to the Internet, scrub through all the Settings and disable every sort of telemetry and data collecting option.
    • Personalization: Preferably before connecting to the Internet, tweak Background, Colors, Themes, Lock Screen, and the Taskbar to personal preferences.
  • DNS: Change the DNS.
    • Control Panel > Network and Internet > Network and Sharing Center > Change Adapter Settings > Wi-Fi / Ethernet > Properties > IPv4 / IPv6.
  • Microsoft Edge: Scrub through all the Settings and disable every sort of telemetry and data collecting option.
    • After Updates: Re-scrub through all the Settings, since Microsoft always leaves new telemetry and data collecting options toggled on.
  • Explorer Patcher: Free, open-source executable that enables more personalization of the Windows 11 Taskbar, System Tray, File Explorer, Start Menu, Windows Switcher, etc. Highly recommended, to revert some controversial changes back to Windows 10 functionality (e.g. Context Menu).

Proxmox Virtual Environment

  1. Download the Proxmox VE Installer ISO Image.
  2. Use Rufus or Etcher to create a bootable installation media on an available USB drive.
  3. Insert and boot from the USB drive in the new / other system.
  4. Install Proxmox VE.
    • An Ethernet / cabled connection to the Internet is highly recommended for the network configuration step.
    • Avoid using the default 192.168.100.2 as the IP address.
    • In the Router’s DHCP settings, assign the Proxmox VE’s IP address as a static address.
    • Refer to Troubleshooting below if issues arise.
  5. Restart the system, rearrange the boot order from the UEFI / BIOS, and select Proxmox VE from the GNU GRUB Boot Loader.
  6. Log in to Proxmox VE with the default login and password.
    • Default Login: root
      • Realm: Linux PAM Standard Authentication
    • To access to Proxmox VE from another system / device on the network, connect to: https://192.168.xxx.xxx:8006/


Proxmox VE (GUI)

Troubleshooting

  • Editing the Loader: Hover over a selection (e.g. Install Proxmox VE) and press the E key.
Issue Workaround
Once Install Proxmox VE / Install Proxmox VE (Debug Mode) is selected, there is no video output.
  1. Edit the Loader.
  2. On the line linux /boot/linux26/, add: nomodeset
  3. Launch the edited Loader with Ctrl + X
The installation will hang, with the message:
nvme nvme0: controller is down: will reset: CSTS=0xffffffff, PCI_STATUS=0xffff
  1. Edit the Loader.
  2. On the line linux /boot/linux26/, add: nvme_core.default_ps_max_latency_us=5500
  3. Launch the edited Loader with Ctrl + X
The installation will hang, with the message:
Cannot run in framebuffer mode. Please specify busIDs for all framebuffer devices.
In the installation's Bash shell:
  1. Find the BusID for the display driver with: lspci | grep -i vga
  2. Create a .conf file in /usr/share/X11/xorg.conf.d/ with: nano /usr/share/X11/xorg.conf.d/amd-driver.conf
  3. In the .conf file, enter the following and replace xx:x:x: with the BusID of the display driver:
    Section "Device"
        Identifier "Card0"
        Driver "fbdev"
        BusID "pci0:xx:x:x:"
    EndSection
    
  4. Restart the installation with: xinit -- -dpi 96 >/dev/tty2 2>&1
The Proxmox installation GUI runs off the screen. Use Tab to blindly navigate, Space to check boxes, and Enter to click on off-screen buttons.
After booting into Proxmox VE and waiting for a minute, the Bash shell is populated by several (repeated) messages:

Error Messages
blk_update_request: I/O error, dev nvme0n1, sector 21647360 op 0x0:(READ) flags 0x80700 phys_seg 2 prio class 0
nvme 0000:03:00.0: can't change power state from D3cold to D0 (config space inaccessible)
Buffer I/O error on dev dm-1, logical block 2097371, lost async page write
Buffer I/O error on device dm-1, logical block 2145289
blk_update_request: I/O error, dev nvme0n1, sector 18352120 op 0x1:(WRITE) flags 0x0 phys_seg 1 prio class 0
Temporary Solution: First, edit the Loader so that Proxmox VE can run stable.
  1. Edit the Loader.
  2. On the line linux /boot/..., add: nvme_core.default_ps_max_latency_us=5500
  3. Launch the edited Loader with Ctrl + X
Long-Term Solution: On a successful Proxmox VE boot, edit /etc/default/grub to apply the NVMe settings on every boot.

In the Bash shell:
  1. Edit the Loader with: nano /etc/default/grub
  2. Find GRUB_CMDLINE_LINUX=, and edit it as such: GRUB_CMDLINE_LINUX=nvme_core.default_ps_max_latency_us=5500
  3. Save changes with Ctrl + O, and apply the changes with: update-grub

One step forward, five steps back. :joy:

If peeps have any post-installation Proxmox (or Linux in general) advice and recommended steps (e.g. apt-get this, set up that, post-install scripts, firewalls?), lemme know?

Currently combing through Proxmox VE Firewall, and a lot of it is going over my head.

(Er, if anyone wants to help, I’d like the Proxmox VE GUI / web interface to be accessible by only two IP addresses on the network.)

Everything currently feels incredibly insecure and it’s terrifying.

2 Likes

Proxmox Post-Installation Guide
This is the Linux / Proxmox VE equivalent of watching a toddler take its first baby steps. :weary:

The best way to learn is to teach.
- Frank Oppenheimer

…Or something.

If I happen to misuse or misdefine any terminology, please feel free to correct me! I’m learning all this through pure experience / Googling, with no technical background at all. :sweat_smile:


Proxmox VE - No-Subscription Repository

  • Purpose: Switching from the Enterprise Repository (default configuration) to a No-Subscription Repository for Proxmox VE updates and upgrades.
    • Enterprise Repository: Enabled by default. Requires a valid, paid subscription key to access the pve-enterprise repository.
    • No-Subscription Repository: Free, no subscription is required to access the pve-no-subscription repository.
  • Documentation: Package Repositories
  1. Enable the No-Subscription Repository by editing sources.list with: nano /etc/apt/sources.list
    • Add deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription
  2. Disable the Enterprise Repository by editing pve-enterprise.list with: nano /etc/apt/sources.list.d/pve-enterprise.list
    • Find deb https://enterprise.proxmox.com/debian/pve bullseye pve-enterprise and uncomment it (i.e. remove the #).
  3. Update and upgrade the OS.
    • apt-get update = Updates the package list with the latest available versions, but does not install the updates.
    • apt-get upgrade = Installs the latest available versions for existing packages, but does not install new packages, remove old packages, or upgrade the kernel version.
    • apt dist-upgrade = Installs the latest available versions for existing packages, installs new dependency packages, removes old dependency packages, and upgrades the kernel version.

Alternatively:

  1. Navigate to Node > Updates > Repositories.
  2. Add the No-Subscription Repository:
  3. Disable the Enterprise Repository.
  4. Navigate to Node > Shell.
    • apt-get update = Updates the package list with the latest available versions, but does not install the updates.
    • apt-get upgrade = Installs the latest available versions for existing packages, but does not install new packages, remove old packages, or upgrade the kernel version.
    • apt dist-upgrade = Installs the latest available versions for existing packages, installs new dependency packages, removes old dependency packages, and upgrades the kernel version.

As I understand it, switching to the No-Subscription Repository will not remove the subscription prompt. Folks’ll have to purchase a subscription key to remove it.


No Valid Subscription Prompt
Pops up after logging into the Proxmox VE GUI / web interface.


SSH Keys - Windows to Linux

  • Purpose: Setting up the SSH Service between / from a Windows 10 / 11 machine and / to a Linux machine, without using third-party tools (e.g. PuTTY).
  1. From Windows, run Command Prompt or PowerShell.
    • ssh-keygen = Generates an SSH key. The default is a 2048-bit RSA key.
    • ssh-keygen -t ed25519 = Generates a 256-bit Ed25519 key. Recommended over RSA keys?
  2. Prompt: Enter file in which to save the key (C:\Users\[User]/.ssh/id_ed25519):
    • Press Enter to continue.
    • If C:\Users\[User]\.ssh does not exist, a new folder will be created.
  3. Prompt: Enter passphrase (empty for no passphrase):
    • Enter a passphrase if desired.
    • Press Enter to continue.
  4. In the C:\Users\[User]\.ssh folder, two files will be created: id_ed25519 and id_ed25519.pub.
    • Private Key (id_ed25519): This key remains with the Windows machine. Do not share this.
    • Public Key (id_ed25519.pub): This key is copied to the Linux machine.
    • The SSH file names may be renamed, but should (probably?) have identical names (sans the .pub extension).
  5. Copy the Public Key to the Linux machine with: type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh <user>@192.168.xxx.xxx "cat >> .ssh/authorized_keys"
    • Replace <user> with the Linux username, and 192.168.xxx.xxx with the Linux machine’s IP address.
    • Prompt: The authenticity of host '192.168.xxx.xxx (192.168.xxx.xxx)' can't be established. Are you sure you want to continue connecting (yes/no)?
      • Enter yes to continue.
    • Command Prompt: $env:USERPROFILE\.ssh\id_ed25519.pub may not be recognized as a valid syntax / file path. Alternatively, use: type C:\Users\[User]\.ssh\id_ed25519.pub
  6. From Linux, use the Bash shell to change permissions of the ~/.ssh directory:
    • chmod 700 ~/.ssh = Only the user has read, write, and execute permissions for ~/.ssh.
    • chmod 600 ~/.ssh/authorized_keys = Only the owner of the file has read and write permissions for the file.
      • The Public Key may be viewed from the authorized_keys file with: nano ~/.ssh/authorized_keys
  7. Specify where the SSH server should look for authorized keys by editing the sshd_config file with nano /etc/ssh/sshd_config:
    • Find AuthorizedKeysFile .ssh/authorized_keys and uncomment it (i.e. remove the #).
    • Restart the SSH Service with: sudo service ssh restart
  8. From Windows, use Command Prompt or PowerShell to access the Linux machine with: ssh <user>@192.168.xxx.xxx
    • Replace <user> with the Linux username, and 192.168.xxx.xxx with the Linux machine’s IP address.
    • The SSH Service is working properly when the Linux machine may be accessed (via SSH) without a password prompt.

Firewall - Whitelisting GUI Access

  • Purpose: Restricting access to the Proxmox VE GUI / web interface (Port: 8006) to certain IP addresses on the network.
  • Documentation: Firewall
  1. Navigate to Datacenter > Firewall.
  2. Add a Rule to whitelist specific IP addresses:
    • In the Router’s DHCP settings, assign the whitelisted IP addresses as static addresses.
    • Double-check the Interface field with the Linux Bridge entry in Node > Network (alternatively, /etc/network/interfaces).
  3. Add a Rule to blacklist all other IP addresses:
    • Ensure that the Whitelist Rule has higher priority than the Blacklist Rule (i.e. top of the Firewall Rule list).
  4. In Datacenter > Firewall > Options, edit the field: Firewall = Yes.
  5. Navigate to Node > Shell.
    • pve-firewall status = Checks whether the firewall is enabled / disabled, and running / stopped.
    • pve-firewall start = Enables the firewall and applies firewall rules.
    • pve-firewall stop = Disables the firewall.

Tested the firewall settings briefly, and can confirm that it works as (I) intended. :grin:

I’ve heard that Proxmox’s Firewall settings are extensive / flexible (e.g. Security Groups, IPSet?), but I haven’t experimented with it at all enough to figure it out.


GNU GRUB Loader - Customizing Colors

  • Purpose: Changing the color theme of the GNU GRUB Loader.


GNU Grub Loader (VM)

  1. Edit the GNU Grub Debian Theme with: nano /etc/grub.d/05_debian_theme
    • color_normal=<color_1>/<color_2> = Color of the text (color_1) and background (color_2) for the border / bezel.
    • menu_color_normal=<color_1>/<color_2> = Color of the text (color_1) and background (color_2) for unselected options.
    • menu_color_highlight=<color_1>/<color_2> = Color of the text (color_1) and background (color_2) for the selected option.
    • Valid Colors: black blue brown cyan dark-grey green light-cyan light-blue light-green light-gray light-magenta light-red magenta red white yellow
  2. Apply the changes with: update-grub

Pi-hole LXC CT

  • Purpose: Blocking ads on all devices connected to the Pi-hole DNS. Also, restricting access to the Pi-hole GUI / web interface (Port: 80) to certain IP addresses on the network.
  • Documentation: Overview of Pi-hole, Installation, Ports
  1. Navigate to Node > Shell.
    • pveam update = Updates the list of LXC (Linux Containers) templates.
  2. Navigate to Node > Storage > CT Templates > Templates.
    • Download a Debian template (or other Personal Preference).
  3. Create a CT (LXC Container).
    • Unprivileged Container: Yes
    • Template: Debian (or Personal Preference)
    • Disks > Storage: Local-LVM
      • Local: Folder on the filesystem that Proxmox VE is installed on.
      • Local-LVM: LVM thin pool that allocates blocks as they are written. Used to store guest volumes, or anything file / directory-based (e.g. ISO files, CT templates).
    • Disk Size: 2 GiB | CPU Cores: 1 | Memory: 512 MiB | Swap: 512 MiB
    • Network Configuration:
    • Confirmation:
  4. Start the Container (Pi-hole).
    • In the Router’s DHCP settings, assign the Container (Pi-hole) IP address as a static address.
    • Find the MAC address and IP address in Container (Pi-hole) > Network.
  5. Navigate to Node > Container (Pi-hole) > Console.
    • Default Login: root
    • apt update && apt upgrade -y = Updates packages.
    • apt install curl -y = Installs cURL.
  6. Install Pi-hole with: curl -sSL https://install.pi-hole.net | bash
    • Upstream DNS Provider: Cloudflare
    • Web Admin Interface / Web Server (lighttpd): On
    • Query Logging: On
    • pihole -a -p = Change the default admin password.
  7. Access Pi-hole from another system / device on the network by connecting to: http://pi.hole/admin or http://192.168.xxx.xxx/admin/
    • Adlist = Add new adlists. Additional adlists are available online.
    • Tools > Update Gravity = Updates and applies the list of blocked domains.
    • Tools > Search Adlists = Looks for domains in existing adlists.
    • Tools > Network = Lists devices on the network and their Pi-hole-related stats.
    • Settings > DNS = Add and edit upstream DNS servers.
  8. Navigate to Node > Container (Pi-hole) > Firewall.
    • Port 53 = DNS (i.e. Access to the Internet?)
    • Port 80 = HTTP (i.e. Access to 192.168.xxx.xxx/admin)
    • In Node > Container > Firewall > Options, edit the field: Firewall = Yes.
  9. In Container (Pi-hole) > Options, edit the field: Start at Boot = Yes.


Pi-hole (GUI)

Not (currently) pointing the router’s DNS to the Pi-hole, since my roommates sometimes work-from-home and rely on a stable Internet connection. Might need to shutdown the Proxmox VE to dual-boot into Windows 11, or forget to start Okashi up after shutting it down, or derp something the hell up and blow up a thing in Proxmox / Pi-hole. :derpdorp:

I’ll offer the Pi-hole DNS as an opt-in thingy for them in the future, whenever I feel reasonably confident I’ve stopped derping around.

[Harvests browsing data.]
Not that I even know what to do with that data.

I’ve been recommended Firezone / Wireguard to tap into Pi-hole while I’m out n’ about.
Step 1 is to obtain a domain name? Hm…


Ubuntu VM

  • Purpose: Setting up an Ubuntu distro in a virtual machine to run Docker and desktop applications on (also, game servers if possible, but later).
  • ISO Image Download: Ubuntu Desktop
  1. Navigate to Node > Storage > ISO Images.
    • Upload = Uploads an ISO image from the remote machine to the Proxmox VE machine.
    • Download from URL = Download an ISO image from a URL. An Internet connection is required.
  2. Create a VM (Virtual Machine).
    • ISO Image: Ubuntu ISO
    • System: (Default Configuration)
    • Disks > Storage: Local-LVM
    • Disk Size: 256 GiB | Discard: Yes | Cores: 4 | Memory: 32000 MiB
    • Network: (Default Configuration)
    • Confirmation:
  3. Navigate to Node > VM (Ubuntu) > Console.
    • A noVNC client should appear. Settings may be configured from the left-side tab menu (e.g. Local Cursor, Fullscreen).
  4. Install Ubuntu.
    • Download Updates…: Yes.
    • Install Third-Party Software…: Yes.
    • Installation Type: Erase Disk and Install Ubuntu.
  5. After Ubuntu restarts, it will prompt to remove the installation medium.
    • Navigate to Node > VM (Ubuntu) > Hardware.
    • Edit the field: CD/DVD Drive = Do not use any media.
    • Navigate to Node > VM (Ubuntu) > Console, and press Enter to proceed.
  6. Log in to Ubuntu with the login and password entered during the installation.


Ubuntu Desktop (Proxmox VM)
Might need to pop in the graphics card, Ubuntu really does not like 1920 x 1080 on iGPU. :sweat_smile:

Post Installation Steps

  • Settings: Personalize the Ubuntu Desktop according to personal preferences.
    • Network: Change the DNS.
  • Firefox: Scrub through all the Settings to disable any telemetry and data collecting option, and to personalize according to personal preferences.
  • Application Menu: Accessible with (i.e. ⊞ Win) + A.
    • Alphabetical Sorting: Open the Terminal with Ctrl + Alt + T, and run: gsettings set org.gnome.shell app-picker-layout "[]". Sort settings will be applied on re-login.

Pending Projects

  • Docker
    • Firezone
    • NextCloud
  • WoW Private Server

Closing Comments
Wait, I’m actually having fun with Linux / Proxmox VE.

This is.
So.
Cooooooooool. :blobooo:

I still don’t understand jack. :rofl:
But it’s so gratifying testing the thing and getting successful / intended results?!
Also pretty refreshing to install stuff without stuff breaking because… obscure Linux reasons.

Lotsa reading and forum scrolling, tho. Especially time-consuming for a Linux noob like myself.
The Proxmox VE’s GUI makes setting up a lot easier. I’m, er, a visual learner, m’kay.
Not touching something like Arch with a ten-foot pole.

Still got a hella lot more to do / explore, but I’m saving my progress in this post for now. :eyes:

3 Likes

Trust me, It’s far scarier when you feel like you understand… because then you know something is wrong. :rofl: So much progressssssssssssssssss. So awesome.

3 Likes

Ubuntu Post-Installation Guide
An application inside a container inside another application inside an operating system inside a virtual machine inside a virtual environment.
Milk inside a bag of milk inside a bag of milk.

It’s uh…
Very different from Windows.


Firefox Snap - Always Private Browsing

  • Purpose: Setting Firefox to always open a Private Window from the Favorites bar.
  1. Copy the firefox.desktop file to the Desktop.
    • sudo find /snap/ -type f -name "firefox.desktop" = Finds the directory for firefox.desktop
    • cd /snap/firefox/.../firefox.desktop ~/Desktop/ = Copies firefox.desktop to the Desktop.
  2. Edit the firefox.desktop file with: nano ~/Desktop/firefox.desktop
    • Under [Desktop Entry], find Exec=firefox %u and add: -private-window
    • To fix the Firefox desktop icon, add a full path for the image file.
      • In the Terminal: cp -v /snap/firefox/.../default256.png /usr/share/pixmaps/firefox.png
      • Under [Desktop Entry], find Icon=/default256.png and replace with: Icon=/usr/share/pixmaps/firefox.png
  3. Edit the firefox.desktop Properties.
    • Context Menu > Allow Launching.
    • Permissions > Execute: Allow executing as program.
  4. Move the edited firefox.desktop to Applications.
    • mv ~/Desktop/firefox.desktop /usr/share/applications/ = Moves firefox.desktop to the Applications folder.
  5. Add Firefox to the Favorites bar from the Context Menu.
  6. Hide /snap/ from the Home folder with: echo snap >> ~/.hidden


Firefox Private Window


Installing Themes and Other Personalization Tweaks

Installing GTK3/4 Themes

  1. Download the .tar.xz file from the Theme’s Files tab.
  2. Extract the contents of the .tar.xz file to ~/.themes
    • In the Home directory, use Ctrl + H to show hidden folders.
    • If the ~/.themes folder does not exist: mkdir ~/.themes
  3. Change the desktop theme with GNOME Tweaks and Extensions Manager.
    • Install: sudo apt install gnome-tweaks gnome-shell-extension-manager
    • Extensions Manager: Install “User Themes” to load shell themes from the user directory.
    • GNOME Tweaks: Navigate to the Appearance tab to change the desktop theme.
    • GTK 4 Apps: If a theme supports GTK 4, copy the contents of the theme’s gtk-4.0 folder to ~/.config/gtk-4.0.

Alternatively:

  1. Find the Theme’s PPA (Personal Package Archive) on Launchpad.
  2. Add the PPA to the Ubuntu Software’s Sources.
    • PPA Address: Found on the PPA’s Launchpad page.
    • Updates: Once the PPA is added to the Sources, the package may be updated with apt update && apt upgrade.
$ sudo add-apt-repository <ppa address>
$ sudo apt update
$ sudo apt install <package>
  1. Change the desktop theme with GNOME Tweaks and Extensions Manager.


Skeuos Theme (#4B8500)
Yes, icons are still using the default Yaru icon pack, 'til I find a good dark theme w/lime accent alternative.
Gib recommendations?

Other GNOME Shell Tweaks

  • Click Dock Icon to Minimize: gsettings set org.gnome.shell.extensions.dash-to-dock click-action 'minimize'
  • Fixed Dock Opacity: gsettings set org.gnome.shell.extensions.dash-to-dock transparency-mode 'FIXED'
  • Adjust Dock Opacity: gsettings set org.gnome.shell.extensions.dash-to-dock background-opacity 1.0
    • Transparent: 0.0 | 50% Transparency: 0.5 | Opaque: 1.0

Docker and Portainer

  • Purpose: Setting up Docker Engine on Ubuntu, to run Firezone and Nextcloud (and anything else that uses docker-compose.yml files).
  • Documentation: Install Docker Engine on Ubuntu, Install Portainer CE with Linux
    • Docker’s and Portainer’s installation tutorials are very straight-forward copy-and-paste commands. Refer to the documentation for a better explanation of each step listed below.
  1. Set up the Docker Repository.
$ sudo apt-get update
$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg

$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg

$ echo \
    "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
$ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Install Docker Engine.
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. Add the current User to the docker group to run docker commands without sudo.
$ sudo groupadd docker
$ sudo usermod -aG docker <username>
  1. Run the following to start Docker automatically on boot:
$ sudo systemctl enable docker
  1. Install Portainer CE (Community Edition).
$ sudo docker volume create portainer_data
$ sudo docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
  1. Access Portainer by connecting to https://localhost:9443.
  2. Log in with the username and password entered during the initial setup.
    • Home: Management panel for any existing environments.
      • Environment: An instance in Portainer. (Docker, Docker Swarm, Kubernetes, etc.)
    • Dashboard: Summary of the selected environment.
    • Containers: List of containers running in the environment.
    • Images: List of available images. Additional images may be pulled from registries.
      • Docker Image: A template used to create applications that can run in Docker containers.

TrinityCore

Easy Mode - Repacks
If compiling from scratch sounds too complicated and / or time-consuming, Repacks are available as a shortcut. Most repacks come attached with extraneous odds and ends – custom NPCs, custom items, edited maps, plugins, scripts, edited default configurations, etc.

  • Blizzlike / Vanilla: Repacks offering a retail WoW experience, with minimal in-game additions. May still contain additions in the database, or “convenient” server startup programs / control panels.
  • Fun: Repacks offering a definitively non-retail WoW experience, with many custom in-game items, edited maps, and whatever else within the author’s scripting capabilities. YMMV.
  • Solo / Single-Player: Repacks offering a WoW experience that balances the entire game’s difficulty, such that previously multi-player events (e.g. raids) may now be feasibly completed by a single player. Balance may be achieved by nerfing mobs, adjusting experience multipliers, quest drops, and item stats, and / or introducing NPC player-bots.

Prerequisite - World of Warcraft Client
To complete the server setup (Step 5) – or at least minimize issues due to incompatible or outdated files – a World of Warcraft Client (i.e. game) pertaining to the server patch / version (e.g. 3.3.5a) is extremely recommended.

  • Patch 1.12.1 = Vanilla (i.e. No Expansion)
  • Patch 2.4.3 = The Burning Crusade
  • Patch 3.3.5a = Wrath of the Lich King
  • Patch 4.3.4 = Cataclysm
  • Patch 10.1.0 = Dragonflight


World of Warcraft 3.3.5a Game Client

I think Blizzard has stopped distributing WoW clients for older versions and expansions, so the only way to obtain those game clients now is to find them elsewhere on the Internet. Just follow your standard precautions and be careful downloading / torrenting from random hosts.
If you’re absolutely desperate for link to a clean WoW client, and if I trust you decently well, I suppose I caaan direct you to some hosts.

I’m uncertain whether WoW Classic game clients work with private servers or not.

Compiling TrinityCore on Linux

  1. Install the prerequisite packages.
$ sudo apt-get update
$ sudo apt-get install git clang cmake make gcc g++ libmysqlclient-dev libssl-dev libbz2-dev libreadline-dev libncurses-dev libboost-all-dev mysql-server p7zip
$ sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100
$ sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang 100
  1. Clone either the 3.3.5a Branch (WotLK) or Master Branch source code from https://github.com/TrinityCore/TrinityCore.git
    • Warning: Avoid cloning, compiling, or running the server as sudo or root. It will create permissions-related issues.
$ cd ~/
$ git clone -b 3.3.5 https://github.com/TrinityCore/TrinityCore.git
$ cd ~/
$ git clone -b master https://github.com/TrinityCore/TrinityCore.git
  • The source code will be cloned to ~/home/.../TrinityCore/
  1. Install the TrinityCore core binaries and server files.
    • Create a build directory in /TrinityCore/
$ cd TrinityCore
$ mkdir build
$ cd build
  • Configure and compile the core with the cmake command.
$ cmake ../ -DCMAKE_INSTALL_PREFIX=~/TrinityCore/wow/server_335
$ time make -j $(nproc) install
  • Core binaries will be installed in /TrinityCore/wow/server_335/bin
  • Config files will be installed in /TrinityCore/wow/server_335/etc
  • time make -j $(nproc) install = Compiles the core with any available processing units, and runs a timer on the process.
  1. Extract files necessary for the server from the World of Warcraft client.
    • Alternatively, the files are available for download from Arctium. Note that minor errors due to incompatible or outdated files may or may not crop up when running the server.
    • The extractor tool and executables are located in /TrinityCore/contrib and /TrinityCore/wow/server_335/bin respectively.
      • Extractor Tool: extractor.bat (for Windows), extractor.sh (for Linux)
      • Extractor Executables: mapextractor, mmaps_generator, vmap4assembler, vmap4extractor
    • Create a /bin/ directory in the World of Warcraft client directory, copy the extractor tool and executables to the /WoW/bin/ folder, and run the extractor.sh script with ./extractor.sh. When prompted, select 4) Extract All.
      • WoW Client Directory: /home/.../WoW/, or where Wow.exe is located.
      • WoW Server / Data Directory: /home/.../WoW/, or where the Data folder is located.
      • Permission Denied: In Properties > Permissions for extractor.sh, enable Allow Executing File as Program.
      • The extracted files will be located in /WoW/data/
    • Copy the extracted file directories to /TrinityCore/wow/server_335/bin, or where worldserver is located.
      • Extracted File Directories: dbc, maps, mmaps, vmaps, cameras
      • Alternatively, manually specify the path of each directory in /TrinityCore/wow/server/server_335/worldserver.conf.
  2. Edit the authserver.conf and worldserver.conf files in /TrinityCore/wow/server_335/etc to configure the server.
    • Remove the .dist suffix from both files.
    • Port 3724: Used by authserver for authentication. Allow access to this port in the Firewall.
    • Port 8085: Used by worldserver for the game server. Allow access to this port in the Firewall.
  3. Install the TrinityCore Database.
    • Run a Database Editor / Manager (e.g. DBeaver) and create a New Database Connection.
      • Username: root | Password:
      • Permission Denied: Find the MySQL Username and Password in sudo nano /etc/mysql/debian.cnf
    • Execute the SQL Query from create_mysql.sql (3.3.5a Branch, Master Branch) to create a new Database folder and necessary sub-folders within localhost.
    • Reconnect to localhost with the newly created trinity user.
      • Username: trinity | Default Password: trinity
      • Changing Passwords: If the default password is changed, edit the database login entries in the authserver.conf and worldserver.conf files to match.
    • Download the latest TrinityCore Database (3.3.5a or Master) from their Releases, and extract the .sql file to /TrinityCore/wow/server_335/bin, or where worldserver is located.
  4. In the Terminal, navigate to /TrinityCore/wow/server_335/bin and run the worldserver file with ./worldserver
  5. In a separate tab in the Terminal, navigate to /TrinityCore/wow/server_335/bin and run the authserver file with ./authserver
  6. Create a Login Account in the Terminal running worldserver with GM Commands:
    • account create <username> <password> = Creates a WoW Login Account with the specified Username and Password.
    • account set gmlevel <account> <0-3> -1 = Sets a specified GM Level for the Username.
      • 1 = Standard | 2 = Game Master | 3 = Admin
  7. Edit the realmlist.WTF file located in /WoW/Data/enUS/ folder.
    • set realmlist 127.0.0.1 = Connect to the WoW Server, if it is hosted on the same system.
    • set realmlist 192.168.xxx.xxx = Connect to the WoW Server, if it is hosted on the same network.
    • set realmlist logon.custom-domain.com = Connect to the WoW Server, if it has a custom domain name.
      • Non-Localhost: In the Database Editor, navigate to localhost > Databases > auth > realmlist and edit the Address entry to match the IP Address (192.168.xxx.xxx) or Domain Name (logon.custom-domain.com).
  8. Start Wow.exe and log in with the login and password created previously.
    • Launcher: Avoid using the WoW Launcher to start the game, as it may automatically update the client. Newer WoW expansions are not compatible with servers built for older versions.
    • Stuck on “Connecting”: Double-check the Firewalls in Linux and ensure Ports 3724 and 8085 are Open / Allow In.
    • Stuck on Realm List / “Logging In To Game Server”: Double-check the Address entry under Realmlist in the Database and ensure it matches the IP Address / Domain Name in realmlist.WTF.


World of Warcraft - Realm Selection
Once a character has been created, you’re ready to start playing! :grin:

Legality Notes
From my dim understanding…

  • Playing on a WoW private server breaks Blizzard’s EULA (End User License Agreement), but is not illegal and is difficult (impossible?) to enforce from Blizzard’s end.
  • Hosting a WoW private server runs into the copyright infringement gray area, but the main argument is, a private server’s source code doesn’t use Blizzard’s source code, and is therefore not illegal? Anyway, in practice, private servers are abundant and have existed for at least 15 years, and Blizzard rarely puts in the legal resources to pursue suits against every server host.

Pending Projects

  • Firezone
  • NextCloud
  • Wine
    • I have Wine and Winetricks installed on Ubuntu, but it refuses to open Wow.exe and keeps complaining it “Failed to find a suitable display device,” lol.

Closing Comments
Progress was slow these past two weeks (I need to feed that gaming addiction ), and there’ll likely be little Linux progress for the rest of this month 'cos IRL things (and gaming off-hours).

Docker was pleasantly easy and quick to set up!
And then TrinityCore proceeded to induce in me the largest headache I’ve had all year…

I’ve run WoW private servers on Windows before, but this was my first time compiling it all from scratch, and my first time doing it on Linux. Took me a solid 12 hours to power through all the hitches I ran into along the way. :weary:

In the end, tho, 大成功! I’ve got the WoW Server running on a separate Linux machine’s hardware, while I’m able to continue gaming on said server from the leisure of my main Windows machine! And all without relying on someone else’s shady or outdated repack, which may or may not contain dubious hidden accessories! :grin:

I’d say I was excited to get back into WoW (on-again, off-again relationship :rofl:), but there’s this throbbing headache that’s reeeaaally murdering my brain right now, ahaha. There’s some cool stuff I can show off with Trinity Creator (Custom Items and NPCs) and Noggit Qt (Map Editor) – stuff which peeps obviously cannot do in retail WoW. :sunglasses:
I just need to get Wine working for that to happen.

3 Likes

Oh good! They got rid of the obnoxious yellow business edition ad. I’ve been waiting for that in order to upgrade lol.

2 Likes

You could go about disabling it by editing a file:

2 Likes

Preface
This post will be incredibly text-dense and should really be its own thread.

I do have some neato screenshots, tho! Maybe peruse those instead. I’ve included some in-game and in-editor screenies / .GIFs. Pretty exciting stuff, IMO! :grin:

Again, this tutorial / guide / compendium of my WoW knowledge is mostly for my future reference. A sorely needed reference – I’ve forgotten a hella lot (…It’s been 84 years…) and am spending literal hours relearning things. I keep running into issues and am getting mad déjà vu, because I’ve run into these same issues before.

Honestly, if past 'Chew had the foresight to pen all this down, in painstakingly meticulous step-by-literal-step process, I wouldn’t be spending my entire Sunday defining which configurations to use and what variables mean in a written guide. :roll_eyes:


TrinityCore Basics - Content Creation and Database Editing
Compared to alternative choices (AFAIK), TrinityCore – and specifically WoW 3.3.5a – has the most support / compatibility with community-made toolpacks, custom content, and additional resources. For other frameworks (e.g. AzerothCore, MaNGOS, ArcEmu), I have extremely limited experience with and can’t comment on their ease of use or compatibility with tools.

Unless otherwise specified, assume that all executables under Content Creation Tools and Database Tools (including the Database Managers) are running on Windows.

Most Content Creation Tools and Database Tools seem to rely on Windows, but – rather conveniently! – are able to connect to remote databases. If the server and the tools are not running on the same system, the MySQL database will need to be open to remote connections prior to any content creation / database editing. Otherwise, if both the server and the tools are running on localhost, the MySQL section is completely optional.

Wine on Linux could be an alternative to using Windows, but at this point, I haven’t gotten around to experimenting with it yet.

Content Creation Tools

Database Tools
Many tools have been developed and released for .DBC editing and .MPQ patching, but some of them are specialized and only perform one function, or handle only specific file formats. Below is a non-comprehensive list of tools that I recall using or reading about.

  • WDBX Editor (Recommended): Useful all-in-one tool that edits and converts between .DBC, .CSV, and .MPQ files. Able to work on multiple files at the same time, and is compatible with other file formats as well (DB2, WDB, ADB, etc.).
  • Ladik’s MPQ Editor (Recommended): Edits .MPQ files in archive file format (think, .ZIP files). If WDBX Editor runs into issues with .MPQ files, use MPQ Editor.
  • MyDbcEditor: Edits and converts betwen .DBC and .CSV files.
  • CSVed (Deprecated): Edits .CSV files. The original host site appears to be broken, but the Internet Archive site and archived download links seem to still work.
  • DBCutil (Deprecated): Converts between .DBC and .CSV files. Some users have reported file corruption using this tool.
  • Taliis (Deprecated): Edits .DBC files and appears to have world editing functionality.

Other Tools

  • BLPNG Converter: Converts between .BLP and .png. files. Launch the executable to start the conversion.
  • BLP Converter: Converts between .BLP and .png files via the cmd interface. Drag and drop files on the executable to start the conversion.
  • GIMP: Versatile image editor that is free and open-source.
  • Photoshop: Versatile image editor, but is subscription-based.

Please note that I am not vetting for any of the links above – double-check these sources! Some of these tools are extremely old (but still functional) and are forked / distributed by third-parties, since the original host is no longer available.

Useful Resources and Sites

  • AC-Web (Releases): Forum with repacks and discussions for WoW emulation. Underwent a dramatic change in management, hence the visible number of banned members with legitimate contributions.
  • EmuCoach (Releases): Forum with repacks, tutorials, discussions for WoW emulation. Keep in mind that they monetize their content.
  • Model Changing Network (Tutorials, Downloads): Forum with tutorials, downloads, and discussions on various custom content for WoW private servers. The entire site does not appear to be indexed by Google for some reason.
  • OwnedCore: Forum with repacks, tutorials, and discussions for WoW emulation. Extremely old, still carrying threads from 2007 – and therefore, extremely useful for troubleshooting and finding fixes with outdated tools!
  • TrinityCore Wiki: Mostly useful for server-side instructions and documentation.
    • Database/World: Lists and describes the variables used in the world database tables. Currently, the 3.3.5a Database is lacking in documentation, but missing info may be supplemented with info from the Master Database, or the old TrinityCore site’s Database/World.
  • WoWDev Wiki: Lists and describes variables used in .DBC tables. Especialy useful for describing flags, and for identifying variables that use IDs defined by other .DBC files.
  • Wowhead - WotLK Classic: Extremely excellent and comprehensive database of WoW items, NPCs, skills, spells, and much, much more. Most entries are helpfully identified by their ID in the URL, and 3D models may be interacted with in the browser.
    • Dressing Room: A configurable 3D model used to view and plan character outfits.
    • Item Appearance Sets: A gallery of item sets that displays and lists items with matching designs, and alternative color schemes (if available).

There’s a lot of file formats and tools thrown around, but it’s a lot simpler than it looks. Trust me, if 15-year old 'Chew could pick it up, so could you! :grin:
Not counting the Linux stuff, which I only learned very recently.

…Holy shit it’s been 10+ years that I’ve been doing this for.


MySQL Database - Allowing Remote Connections

When the database switches its Bind IP from 127.0.0.1 to its network IP address (e.g. 192.168.xxx.xxx), any profile with @localhost seems unable to connect to the database. I’m uncertain whether there’s a fix for this issue, or if this is simply how databases work (i.e. I am Linoobx).

A workaround is to create a new profile with the system’s network IP address @192.168.xxx.xxx (Step 2), which should allow the local machine to connect to / edit the database through the Database Manager.

  1. From the localhost system, run a Database Manager and connect to the database with an administrative profile (e.g. root, debian-sys-maint).
  2. Create a new profile for the local system to connect with.
    • In the Users folder, copy and paste the profile for trinity@localhost.
    • In the Host field, replace localhost with the local system’s network IP address (192.168.xxx.xxx).
    • In the Schema Privileges tab, allow all access privileges to the auth, characters, and world databases.
  3. Create a new profile for the remote system to connect with.
    • In the Users folder, copy and paste the profile for trinity@localhost.
    • In the Host field, replace localhost with the remote system’s network IP address (192.168.xxx.xxx).
    • In the Schema Privileges tab, allow all access privileges to the auth, characters, and world databases.
  4. Change the Bind IP of the MySQL database.
    • In the Terminal, navigate to the mysqld.cnf directory with: cd /etc/mysql/mysql.conf.d/
    • Create a backup of the mysqld.cnf file with: sudo cp mysqld.cnf mysqld.cnf.bak
    • Edit the mysqld.cnf file with: sudo nano mysql.cnf
    • Find bind-address = 127.0.0.1, and replace with: bind-address = 192.168.xxx.xxx
    • Save the edits, then restart the MySQL service with: sudo systemctl restart mysql
    • In the Firewall, allow access in to Port 3306.
  5. Connect to the MySQL database with the Database Manager to test whether the profiles and the Bind IP have been properly configured.
    • Server Host: Local Network IP Address (192.168.xxx.xxx).
    • Port: 3306
    • Username: trinity
    • Password: <password>
  6. Edit worldserver.conf and authserver.conf to point to the system’s network IP address.
    • Navigate to the directory with: cd /TrinityCore/.../etc/
    • Edit the worldserver.conf file with: nano worldserver.conf
      • Replace 127.0.0.1 with the system’s network IP address (192.168.xxx.xxx).
    • Edit the authserver.conf file with: nano authserver.conf
      • Replace 127.0.0.1 with the system’s network IP address (192.168.xxx.xxx).
  7. Start worldserver and authserver to test whether the .conf files have been properly configured.
    • Navigate to the directory with: cd /TrinityCore/.../bin/
    • Start the server with: ./worldserver and ./authserver

WDBX Editor - .DBC Edits and .MPQ Patches

To make custom additions or changes to WoW, and to have the custom content reflect on both the server-side and on the game client’s side, edits must be made to the server’s .DBC files, and patches must be added to the game client’s files.

  • Server .DBC Directory: /TrinityCore/.../bin/dbc/
  • Game Client .MPQ Directory: /WoW/Data/

Adding Custom Player Titles
A simple exercise to introduce newbies to .DBC editing and .MPQ patching.

  1. From the TrinityCore server files, locate the CharTitles.dbc file in: /TrinityCore/.../bin/dbc/
    • Copy the CharTitles.dbc file to the Windows system for editing.
    • Recommended: Keep a backup folder of unedited .dbc files, to revert any unwanted changes.
  2. Download and extract WDBX Editor.zip.
  3. Launch WDBX Editor.
  4. Open CharTitles.dbc, and load WotLK 3.3.5 (12340) when prompted.
  5. At the bottom of the page, copy and paste the latest / last entry to the table.
    • ID: A unique TitleID for each title, used to define and identify the title in-game.
    • Condition_ID: Presumably tied to in-game events that will grant the title when triggered or fulfilled.
    • Name_Lang_enUS: Title text string for male characters, which will appear above an in-game character.
      • %s: Character’s Name
    • Name1_Lang_enUS: Title text string for female characters, which will appear above an in-game character.
    • Mask_ID: I’m uncertain what this value pertains to, but it seems to (need to?) be unique to each entry. Increase in increments of +1, relative to the previous row’s value.
  6. Save the edited CharTitles.dbc file.
  7. WIth the same edited CharTitles.dbc file, select Export > To MPQ, and export as patch-x.MPQ.
    • Naming: Follow the convention of patch-x.MPQ, with x as any integer or letter character.
  8. Transfer the edited CharTitles.dbc and patch-x.MPQ files to their respective directories.
    • Copy CharTitles.dbc to the TrinityCore server in: /TrinityCore/.../bin/dbc/
    • Copy patch-x.MPQ to the WoW client in: /WoW/Data/
  9. Start the TrinityCore server and launch the game client.
    • To add the newly added custom title to your character, use: .titles add <ID>

Trinity Creator - Adding Custom Items and Other Content

  1. Download TrinityCreatorInstaller.msi and install Trinity Creator.
  2. Launch Trinity Creator.
    • Select TrinityCore 3.3.5a (2020-01) for the Emulation Profile.
    • Navigate to Config > Configure MySQL.
      • MySQL Host: 192.168.xxx.xxx
      • MySQL Port: 3306
      • User: trinity
      • Password: <password>
      • World Database: world
      • If the MySQL info has been manually defined / edited from defaults, refer to WorldDatabase.Info within worldserver.conf to fill in the fields.
    • Navigate to Config > Configure DBC Path.
      • Select Select, and navigate to the World of Warcraft 3.3.5a client directory.
      • If no DBC folder exists in the client directory, Trinity Creator will automatically create a DBC folder and extract the necessary files.
  3. Trinity Creator should now be ready to use for custom content creation!
    • Export to Database: Automatically exports created content to the MySQL database.
      • Items: Exported to item_template table.
      • NPCs: Exported to creature_template table.
      • Quests: Export to quest_template table.
    • Export to SQL: Exports created content to a portable.SQL script.

Fixing Icon Display on Custom Items

Once the custom item has been imported into the item_template table in the world database, the item will exist in-game and should be interactable. However, at this point, it will likely appear with a icon in the inventory, and certain functionality may be slightly broken (e.g. equipable items will not equip on a right-click).


Custom Item - Slightly Bugged
Displayed icon is not the intended item icon.
Right-clicking functionality is currently broken.
Item can only be equipped by clicking and dragging over to the Character menu.

To fix this, additional edits need to be made on both the server side and client side.

  1. Run a Database Manager and navigate to Database > world > item_template.
  2. Locate the new item_template addition(s) and export it in .CSV format.
    • DBeaver Query: SELECT entry, class, subclass, SoundOverrideSubclass, Material, displayid, InventoryType, sheath FROM world.item_template WHERE entry BETWEEN 500000 AND 600000;
      • SELECT: Selectively includes the defined column categories in the search results, and excludes all others.
      • FROM: Defines which table(s) the results should be selected from (world.item_template).
      • WHERE: Defines additional filters to narrow the results down with.
    • In the Results window, right-click on the records, select Export Data, and export as Item.csv.
  3. From the TrinityCore server files, locate the Item.dbc file in: /TrinityCore/.../bin/dbc/
    • Copy the Item.dbc file to the Windows system for editing.
  4. Launch WDBX Editor, and import Item.csv into Item.dbc.
    • Open Item.dbc, and load WotLK 3.3.5 (12340) when prompted.
    • Navigate to Import > From CSV, and select Item.csv.
      • Import New: Only adds new records to the .dbc file.
      • Update Existing: Adds new records and updates mismatching records in the .dbc file.
      • Override All: Replaces all records in the dbc file with all records from the .csv file.
      • Has Header Row?: Enabled.
    • Save the edited Item.dbc file.
    • WIth the same edited Item.dbc file, select Export > To MPQ, and export as patch-x.MPQ.
      • Naming: Follow the convention of patch-x.MPQ, with x as any integer or letter character.
  5. Transfer the edited Item.dbc and patch-x.MPQ files to their respective directories.
    • Copy Item.dbc to the TrinityCore server in: /TrinityCore/.../bin/dbc/
    • Copy patch-x.MPQ to the WoW client in: /WoW/Data/
  6. Start the TrinityCore server and launch the game client to test whether the icon issue is fixed.


Custom Item - Successful Patch!
Custom created item displays its icon, as intended.
Right-clicking on the item properly equips the item to the character.


WoW Model Viewer - Custom NPC Models

WoW Model Viewer (WMV) has progressed significantly past WoW 3.3.5a (WotLK), with older versions officially unavailable, so the archived repository is one of the few remaining sources for a WMV that’s compatible with WoW 3.3.5a (WotLK).

For World of Warcraft 3.3.5a (WotLK), WMV v.7.0.1 (r485) - WMV v7.0.1 (r252) seem compatible. Anything above r485 will prompt a warning on the WoW client being outdated, and anything below r252 may have buggy results displaying, importing, and / or exporting models.

  1. Download and extract WMV.zip.
  2. Launch WMV.
    • From the left panel, select a model to display it in the main window.
    • If a “Character” model is selected, additional customization options will be made available in the right panel.
    • Use an online database like Wowhead to search for items based on name, stats, visuals, or other filter categories.
  3. Export the custom character model with File > Export Model > 3DS… .
    • Keep WMV open in the background to track the customized facial features (e.g. Skin Color, Face Type, Hair Color, etc.) in the right panel. WMV does not save these customizations on export.
    • The exported file will produce (at least) two files: a .3ds 3D model file (for Autodesk), and a .tga texture file. Keep the .tga file, and ignore or delete the .3ds file.
    • Optional: Feel free to further edit the .tga texture file with an Image Editor (e.g. Photoshop, GIMP). When finished, export as .png. Example:
  4. Download either BLPNG Converter or BLP Converter (or use a BLP Format Plugin for Photoshop) to convert the .tga or .png file to Blizzard’s proprietary.BLP file format.
    • BLPNG Converter: Launch the executable to convert the file format.
    • BLP Converter: Drag and drop the .tga or .png file on the executable to start a cmd conversion.
  5. From the TrinityCore server files, locate the CreatureDisplayInfo.dbc and CreatureDisplayInfoExtra.dbc in: /TrinityCore/.../bin/dbc/
    • Copy both CreatureDisplayInfo.dbc and CreatureDisplayInfoExtra.dbc files to the Windows system for editing.
  6. Launch WDBX Editor and open CreatureDisplayInfo.dbc and CreatureDisplayInfoExtra.dbc.
  7. Start with CreatureDisplayInfoExtra.dbc, and create a new row.
    • Since CreatureDisplayInfo.dbc relies on the unique ID defined in CreatureDisplayInfoExtra.dbc, I would recommend this order of operations.
    • ID: A unique ID for the character creature’s ExtraDisplayInfo entry, used to define and identify the entry in CreatureDisplayInfo.dbc.
    • DisplayRaceID: The character creature’s race, defined by ChrRaces.dbc.
      • 1 = Human | 2 = Orc | 3 = Dwarf | 4 = Night Elf | 5 = Scourge | 6 = Tauren
      • 7 = Gnome | 8 = Troll | 9 = Goblin | 10 = Blood Elf | 11 = Draenei | 12 = Fel Orc
      • 13 = Naga | 14 = Broken | 15 = Skeleton | 16 = Vrykul | 17 = Tuskarr
      • 18 = Forest Troll | 19 = Taunka | 20 = Northrend Skeleton | 21 = Ice Troll
    • DisplaySexID: The character creature’s sex.
      • 0 = Male | 1 = Female | 2 = None
    • SkinID: The character creature’s skin color. Copy the value from WMV.
    • FaceID: The character creature’s face type. Copy the value from WMV.
    • HairstyleID: The character creature’s hair style. Copy the value from WMV.
    • HairColorID: The character creature’s hair color. Copy the value from WMV.
    • FacialHairID: The character creature’s facial feature. Copy the value from WMV.
    • NPCItemDisplay: The character creature’s equipment, defined by ItemDisplayInfo.dbc. WMV provides the DisplayIDs of items in their equipment tab and lookup menus, in the form of: [ItemID] [DisplayID].
      • NPCItemDisplay_1: DisplayID for head equipment. Leave as 0 for none.
      • NPCItemDisplay_2: DisplayID for shoulder equipment. Leave as 0 for none.
      • NPCItemDisplay_3: DisplayID for shirt equipment. Leave as 0 for none.
      • NPCItemDisplay_4: DisplayID for chest equipment. Leave as 0 for none.
      • NPCItemDisplay_5: DisplayID for belt equipment. Leave as 0 for none.
      • NPCItemDisplay_6: DisplayID for leg equipment. Leave as 0 for none.
      • NPCItemDisplay_7: DisplayID for feet equipment. Leave as 0 for none.
      • NPCItemDisplay_8: DisplayID for wrist equipment. Leave as 0 for none.
      • NPCItemDisplay_9: DisplayID for hand equipment. Leave as 0 for none.
      • NPCItemDisplay_10: DisplayID for tabards. Leave as 0 for none.
      • NPCItemDisplay_11: DisplayID for cape equipment. Leave as 0 for none.
    • Flags: Leave as 0.
    • BakeName: Text string for the custom .BLP texture file. Include the .BLP file extension.
  8. In CreatureDisplayInfo.dbc, create a new row.
    • ID: A unique DisplayID for each creature, used to define and identify the creature’s in-game display model.
    • ModelID: The creature model template associated with the creature, defined by CreatureModelData.dbc.
      • 49 = HumanMale.m2 | 50 = HumanFemale.m2
      • 51 = OrcMale.m2 | 52 = OrcFemale.m2
      • 53 = DwarfMale.m2 | 54 = DwarfFemale.m2
      • 55 = NightElfMale.m2 | 56 = NightElfFemale.m2
      • 57 = ScourgeMale.m2 | 58 = ScourgeFemale.m2
      • 59 = TaurenMale.m2 | 60 = TaurenFemale.m2
      • 182 = GnomeMale.m2 | 183 = GnomeFemale.m2
      • 185 = TrollMale.m2 | 186 = TrollFemale.m2
      • 2208 = BloodElfMale.m2 | 2209 = BloodElfFemale.m2
      • 2248 = DraeneiMale.m2 | 2249 = DraeneiFemale.m2
    • SoundID: Sound override for the creature. Leave as 0 to use the default sounds from CreatureModelData.dbc.
    • ExtraDisplayInfo: A unique ID that uses data from CreatureDisplayInfoExtra.dbc to generate unique facial features for character creatures.
      • Copy the ID from CreatureDisplayInfoExtra.dbc for your custom model in this field.
    • CreatureModelScale: A multiplier applied to the size of the creature’s in-game model. Set as 1 for default model size.
    • CreatureModelAlpha: A value applied to the transparency of the creature’s in-game model. Set as 255 for default model opacity.
    • TextureVariation: Alternative textures applied to the creature, often used for non-character creatures.
    • NPCSoundID: Applies sound packs used for NPC interaction, defined by NPCSounds.dbc, which itself is defined by SoundEntries.dbc.
  9. Save the edited CreatureDisplayInfo.dbc and CreatureDisplayInfoExtra files.
  10. WIth the same edited CreatureDisplayInfo.dbc and CreatureDisplayInfoExtra.dbc files, select Export > To MPQ, and export as patch-x.MPQ.
    • Naming: Follow the convention of patch-x.MPQ, with x as any integer or letter character.
  11. Launch MPQ Editor and open both .MPQ patches.
    • Group multiple related patches into a single patch-x.MPQ by adding the contents of one .MPQ to the other.
    • In the root directory, create a new directory: /Textures/BakedNpcTextures/
    • Copy the custom.BLP texture file to: /Textures/BakedNpcTextures/
  12. Transfer the edited CreatureDisplayInfo.dbc, CreatureDisplayInfoExtra.dbc, and patch-x.MPQ files to their respective directories.
    • Copy CreatureDisplayInfo.dbc and CreatureDisplayInfoExtra.dbc to the TrinityCore server in: /TrinityCore/.../bin/dbc/
    • Copy patch-x.MPQ to the WoW client in: /WoW/Data/
  13. Run a Database Manager and navigate to Database > world > creature_model_info.
  14. Add a new entry to the creature_model_info table.
    • Entry ID: A unique ID for each NPC creature, used to define and identify the NPC in-game.
    • DisplayID: The creature’s unique DisplayID, defined by CreatureDisplayInfo.dbc.
      • Copy the ID from CreatureDisplayInfo.dbc for your custom model in this field.
    • BoundingRadius: Leave as 0.
    • CombatReach: The creature’s combat reach radius. Set as 1.5 for a humanoid creature’s default reach radius.
    • Gender: The creature’s sex.
      • 0 = Male | 1 = Female | 2 = None
    • DisplayID_Other_Gender: If the creature has both male and female models, this value uses the defined alternate DisplayID when the creature is generated with the other sex.
  15. Launch Trinity Creator and navigate to the Creature tab to start creating an in-game NPC!
    • DisplayIDs: An NPC may use up to four different DisplayIDs when spawned in-game (e.g. facial variations, male and female variations, clothing variations).
    • Equipment: Use the item’s ItemID rather than the item’s DisplayID.
      • Weapon 1: Weapon or item is held in the NPC’s main hand.
      • Weapon 2: Weapon, shield, or other item is held in the NPC’s off hand.
  16. Select Export to Database to automatically export the created NPC to the MySQL database.
    • Alternatively, select Export to SQL File to examine the .SQL script before importing it into the database.
  17. Start the TrinityCore server and launch the game client to test whether the custom NPC model spawns, looks, and acts as intended.
    • Spawn the newly added NPC with: .npc add <Entry ID>


Custom NPC Model
From the Wow Model Viewer drawing board, and in to the game! :grin:
Notice the slight color differences between the original WMV screenshot, and the .GIF above (mismatched metal colors vs. consistent steel accents). That’s the power of GIMP at work!


Noggit - World Editing

Noggit is the reason I call WoW a sandbox RPG.

  1. Download and extract Noggit.zip.
  2. Launch Noggit.
    • When prompted to find a directory, select the World of Warcraft 3.3.5a directory.
    • Navigate to Noggit > Settings.
      • Game Path: /WoW/, or the World of Warcraft 3.3.5a directory.
      • Project Path: Directory for the Noggit project, or where Noggit will save its files to.
      • Import Path: Safe to leave blank. Not entirely sure what it’s meant to point to.
      • WMV Log Path: /WMV/userSettings/log.txt, located in the Wow Model Viewer folder.
  3. Select a Continent from the left panel, and select a square from the right panel.
    • When prompted, select Get Max UID.
      • Assuming the TrinityCore server is a fresh compile (not a repack), its map should be unedited.
      • If the TrinityCore server has custom or edited map, select Fix All UIDs instead.
  4. Once Noggit has loaded a map, you’re all set to start terraforming and worldbuilding WoW to your liking! :grin:
  5. Save any edits with Editor > Save Changed Tiles.
    • Noggit will save to the Project path defined in Settings.
  6. Launch MPQ Editor and create a new .MPQ file, or open an existing .MPQ patch.
    • I would advise leaving the WoW client’s default .MPQ patches alone, and only editing custom-made .MPQ files.
  7. From the Noggit Project directory, add (drag and drop) the world folder to the .MPQ file.
    • Save patch-x.MPQ to the WoW client in: /WoW/Data/ and in: /WoW/Data/enUS/
    • In /WoW/Data/enUS/, rename patch-x.MPQ to: patch-enUS-x.MPQ
  8. Close MPQ Editor and launch the game client to test whether world edits made in Noggit are reflected in-game.

Notice that Noggit only makes changes to the world on the game client’s side. I think there’s some way Noggit integrates with the TrinityCore server (there’s a reference to MySQL in the Settings), but for single-player or low-population private servers, it seems entirely unnecessary to Noggit’s world editing functionality.

Basic Controls
A full list of controls may be viewed from Help > Keybindings (Ctrl + F1).

  • Left-Click: Apply Terrain Editing Tool
  • Right-Click: Hold to Tilt / Pan Camera.
  • WASD: Camera Movement.
  • M: Toggles Minimap.

Terraforming Tools


Raise Terrain / Lower Terrain


Flatten Terrain / Blur Terrain Edges


3D / Terrain Paint


Create Hole in Terrain
Cuts away terrain, used to build basements or caves.


AreaID Paint
Assigns an AreaID to a chunk, which will affect the in-game map (e.g. location name, background music, etc.). AreaIDs are found in AreaTable.dbc.


Impassible Flag
Treats selected chunks like invisible walls for in-game characters.


Water Edit
Adds, removes, and edits liquids (e.g. water, slime, lava) on the terrain.


Shader Editor
Adds, removes, and edits shaders to the terrain.


Object Editor
Has functions to add, delete, scale, and rotate objects.

Script Editor
I’m uncertain how to utilize this function.

Creating a Custom AreaID / Location

  1. From the TrinityCore server files, locate the AreaTable.dbc and Map.dbc files in: /TrinityCore/.../bin/dbc/
    • Copy the AreaTable.dbc file to the Windows system for editing.
    • Copy the Map.dbc file to the Windows system for viewing.
  2. Launch WDBX Editor, and open AreaTable.dbc.
    • If the custom area is to be located within an existing zone, I would recommend studying neighboring areas / landmarks in AreaTable.dbc as a reference for the correct IDs and values.
    • ID: A unique AreaID for each area, used to define and identify the area in-game.
    • ContinentID: The continent map (e.g. 571 for Northrend) associated with the area, defined in Map.dbc.
    • ParentAreaID: The zone map (e.g. 495 for Howling Fjord) associated with the area, defined in AreaTable.dbc.
    • AreaBit: I’m uncertain what this value pertains to, but it seems to (need to?) be unique to each entry. Increase in increments of +1, relative to the previous row’s value.
    • Flags (Hex Value): Flags for the area. Refer to DB/AreaTable for more info.
    • AmbienceID: The ambient sound that will play in the area.
    • ZoneMusic: The zone music that will play in the area.
    • IntroSound: The intro zone music that will play in the area.
    • Exploration Level: The zone level, or the character level at which the area will be explored.
    • AreaName_Lang_enUS: Area text string that will be displayed in-game.
    • Faction_GroupMask: Associates the area with a faction. Leave as 0 for Contested Territory.
      • 0 = Contested Territory | 2 = Alliance Territory | 4 = Horde Territory | 6 = Neutral Territory
  3. Save the edited AreaTable.dbc file.
  4. WIth the same edited AreaTable.dbc file, select Export > To MPQ, and export as patch-x.MPQ.
    • Naming: Follow the convention of patch-x.MPQ, with x as any integer or letter character.
  5. Transfer the edited AreaTable.dbc and patch-x.MPQ files to their respective directories.
    • Copy AreaTable.dbc to the TrinityCore server in: /TrinityCore/.../bin/dbc/
    • Copy patch-x.MPQ to the WoW client in: /WoW/Data/ and in: /WoW/Data/enUS/
    • In /WoW/Data/enUS/, rename patch-x.MPQ to: patch-enUS-x.MPQ
  6. Launch Noggit.
    • Select a Continent from the left panel and load a map chunk from the right panel.
  7. Select AreaID Paint from the left panel.
    • Shift + Click = Paints the chunk with the selected AreaID.
    • Ctrl + Click = Obtains the AreaID of the selected chunk (think, eyedropper tool).
    • Save any edits with Editor > Save Changed Tiles.
  8. Launch MPQ Editor.
    • From the Noggit Project directory, add the world folder to a new or existing .MPQ file.
    • Save patch-x.MPQ to the WoW client in: /WoW/Data/ and in: /WoW/Data/enUS/
    • In /WoW/Data/enUS/, rename patch-x.MPQ to: patch-enUS-x.MPQ
  9. Close MPQ Editor and launch the game client to test whether world edits made in Noggit are reflected in-game.


Custom Area
Location name appears on-screen and in the mini-map. Success!

Adding Objects and Buildings

Wow Model Viewer is optional to Noggit functionality, but it is extremely recommended to easily find, view, and import .M2 (e.g. objects) and .WMO (e.g. buildings, large structures) models into Noggit.

  1. Launch WMV.
    • In the bottom-left corner, select Models (*m.2) to view objects, or WMOs (*.wmo) to view structures.
  2. Launch Noggit.
    • Select a Continent from the left panel and load a map chunk from the right panel.
  3. Import the .M2 or .WMO into Noggit.
    • In WMV, simply load the model in the window for Noggit to import.
    • In Noggit, select Object Editor from the left panel.
      • Import .M2 models with Import > Last M2 from WMV in the right panel, or use Shift + V.
      • Import .WMO models with Import > Last WMO from WMV in the right panel, or use Alt + V.
      • On a successful import, the model will appear at the bottom of the Object Editor panel.
  4. Paste the imported model with Ctrl + V.
    • Save any edits with Editor > Save Changed Tiles.
  5. Launch MPQ Editor.
    • From the Noggit Project directory, add the world folder to the new or existing .MPQ file.
    • Save patch-x.MPQ to the WoW client in: /WoW/Data/ and in: /WoW/Data/enUS/
    • In /WoW/Data/enUS/, rename patch-x.MPQ to: patch-enUS-x.MPQ
  6. Close MPQ Editor and launch the game client to test whether world edits made in Noggit are reflected in-game.

TrinityCore - Updating the Core

When fixes are released, or – more likely, and more impertinently – when MySQL is upgraded with sudo apt update && upgrade -y, the TrinityCore core binaries will need to be recompiled. Fret not, the second going is easier, and any existing database files should not be replaced.

  1. Optional: Prepare for the TrinityCore server update.
    • Navigate to /TrinityCore/.../bin/, and copy cameras, dbc, maps, mmaps, vmaps to a backup location.
    • Navigate to /TrinityCore/.../etc/ and copy worldserver.conf and authserver.conf to a backup location.
    • Delete the server folder (i.e. the parent directory containing /bin/ and /etc/).
  2. Update the TrinityCore source code for either the 3.3.5a Branch (WotLK) or Master Branch.
    • Warning: Avoid cloning, compiling, or running the server as sudo or root . It will create permissions-related issues.
cd ~/TrinityCore/
git pull origin 3.3.5
cd ~/TrinityCore/
git pull origin master
  1. Install the TrinityCore core binaries and server files.
    • Delete /TrinityCore/build/, and create a new build directory.
    • Configure and compile the core with the cmake command.
$ cmake ../ -DCMAKE_INSTALL_PREFIX=~/TrinityCore/wow/server_335
$ time make -j $(nproc) install
  1. Copy cameras, dbc, maps, mmaps, vmaps from the backup location to /TrinityCore/.../bin/.
  2. Copy worldserver.conf and authserver.conf from the backup location to /TrinityCore/.../etc/.
    • Keep the existing worldserver.conf.dist and authserver.conf.dist files, in the event changes have been made to their respective files during the update.
  3. In the Terminal, navigate to /TrinityCore/.../bin/ and run the worldserver file with ./worldserver
  4. In a separate tab in the Terminal, navigate to /TrinityCore/.../bin/ and run the authserver file with ./authserver

Closing Comments
The odd running trend with WoW is that, every time I dip back into it after a long break, I always seem to end up learning something new.

IIRC, the last time I touched WoW was 3+ years ago. I had graduated from Uni, and was being a proper jobless shut-in, living with my mother back in Malaysia. I managed to figure out Noggit and the Item Icon Patch, and all of a sudden, WoW transformed itself into a sandbox ORPG.

This time, I’m adding Linux to my lil’ collection of WoW-related milestones. :sunglasses:
Don’t talk about Wine, I don’t want to talk about Wine and how it isn’t working right now, shush.

I’ve spent a ridiculous amount of my life on playing with and fiddling around with WoW private servers, but all the above barely scratches the surface of what more experienced / compentent folks can really do with WoW.

Someone with Blender experience, for instance, would be able to create their own gameobject models, or edit existing models, and import those into the game.

I think I have a few more tricks up my sleeve for cool WoW private server stuff I can do, but the above is probably the most visually-impressive. :grin:

1 Like