The goal of this tutorial is to document the setup of a server running:
- the fluffos driver
- a basic mudlib
- a website
This tutorial was inspired by the following LDMud Tutorial: https://github.com/cpu/ldmud-tutorial
As such, this tutorial is opinionated and is based on Ubuntu, Apache2, Certbox, and systemd.
- Prerequisites
- Server Creation
- DNS Records
- Server Setup
- Website Setup
- Git Setup
- Driver and Mudlib
- HTTPS Setup
- Systemd Service
- Test Connections
- Future Updates
This tutorial assumes you have the following:
- a Digital Ocean account
- a domain name
- command line experience
Create the (second) smallest available Digital Ocean droplet (~$6 USD a month).
Configuration options:
- Ubuntu 22.10 (LTS) x64
- 1 vCPU, 1 GB RAM, 25 GB disk
After creation:
- Add your SHH key.
- Make note of
Server IPv4 address
.
Note: Fluffos needs 1 GB RAM to build.
Add an "A" record with Server IPv4 address
for Server Domain Name
.
@ A ###.###.###.###
Connect as root user:
ssh root@`Server Domain Name`
Update existing software:
apt-get update -yy && apt-get upgrade -yy && apt-get dist-upgrade -yy
Install required software:
apt-get install -y build-essential autoconf automake bison \
cmake libpq-dev libtool libz-dev libgtest-dev libicu-dev \
libjemalloc-dev libmysqlclient-dev libsqlite3-dev \
libpcre3-dev libssl-dev telnet telnet-ssl apache2 git
Setup non-root user:
adduser mud
mkdir ~mud/.ssh
cp ~/.ssh/authorized_keys ~mud/.ssh/
chown -R mud:mud ~mud/.ssh
Reboot server after updates:
systemctl reboot
Connect as root user:
ssh root@`Server Domain Name`
Setup website root directory:
mkdir /var/www/mud
cat >> /var/www/mud/index.html << EOF
<html>
<head><title>MUD Website</title>
</head>
<body>MUD Website</body>
</html>
EOF
chown -R mud:www-data /var/www/mud
Setup Apache:
vi /etc/apache2/sites-available/mud.conf
<VirtualHost *:80>
ServerName `Server Domain Name`
DocumentRoot /var/www/mud/
</VirtualHost>
Disable default, enable mud, restart.
a2dissite 000-default
a2ensite mud
systemctl reload apache2
http://Server Domain Name
should connect and display.
Connect as mud user:
ssh mud@`Server Domain Name`
Setup git:
git config --global user.email "your@email"
git config --global user.name "Your Name"
Setup github key:
ssh-keygen -t ed25519 -C "your@email"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Copy ~/.ssh/id_ed25519.pub
to your GitHub SSH keys: https://github.com/settings/keys
Connect as mud user:
ssh mud@`Server Domain Name`
Download mudlib with driver submodule:
git clone --recurse-submodules git@github.com:fluffos/nightmare3.git
Note: Fluffos driver version included with nightmare3 may be outdated.
Setup for mudlib shortcut/permissions:
ln -s /home/mud/nightmare3/ /home/mud/game
chown -R mud:mud ~mud/game
find . -type d -exec chmod -R g+s {} \;
Build the fluffos driver:
cd game
./build.sh
Adjust mudlib config:
vi /home/mud/game/nm3.cfg
# absolute pathname of mudlib
mudlib directory : /home/mud/game/lib
Adjust
Connect as root user:
ssh root@`Server Domain Name`
Setup Certbox:
snap install core
snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
Utilize the LDMud deploy hook to automatically copy renewed certs into mudlib directory:
mkdir -p /etc/letsencrypt/renewal-hooks/deploy/
curl -o /etc/letsencrypt/renewal-hooks/deploy/fluffos-hook \
https://gist.githubusercontent.com/cpu/bec1601816db34bb8c9efeb3f78b37c5/raw/c73c7a0b5ce47318710227d25defcf5ae38fc209/ldmud-hook.py
chmod +x /etc/letsencrypt/renewal-hooks/deploy/fluffos-hook
certbot --apache
Seed initial certificates to mudlib:
certbot --force-renewal
# @TODO verify this section
cp /etc/letsencrypt/live/`Server Domain Name`/fullchain.pem ~mud/game/cert.pem
cp /etc/letsencrypt/live/`Server Domain Name`/chain.pem ~mud/game/issuer.pem
cp /etc/letsencrypt/live/`Server Domain Name`/privkey.pem ~mud/game/key.pem
chown mud:mud ~mud/game/lib/*.pem
https://Server Domain Name
should connect and display.
Connect as root user:
ssh root@`Server Domain Name`
Create /etc/systemd/system/mud.service
:
[Unit]
Description = Fluffos MUD Driver
After = network-online.target
[Service]
Type = simple
User = mud
Group = mud
WorkingDirectory = /home/mud/game
ExecStart = /home/mud/game/run.sh
Restart=always
RestartSec=5
OOMScoreAdjust=-900
[Install]
WantedBy = multi-user.target
Reload, manually start, check status:
systemctl daemon-reload
systemctl start mud
systemctl status mud
Fluffos MUD Driver output:
journalctl -e -u mud
Enable MUD service at restart:
systemctl enable mud
Connect as root user:
ssh root@`Server Domain Name`
Test telnet:
telnet localhost `Telnet Port`
Test SSL telnet:
telnet-ssl -z ssl localhost `TLS Telnet Port`
This tutorial could be improved with the following updates:
- nightmare3 - verify websocket web client works
- nightmare3 - should display if user is connected via TLS port
- nightmare3 - update driver version for efun::sys_refresh_tls(TLS_PORT)
- ldmud-hook.py - possibility of fork for fluffos