Install on a VPS over SSH
Every step for first-timers: rent a server, connect from Windows, macOS or Linux, and go live with HTTPS, email and backups.
This guide walks you through every click and command, from renting a server to a live forum with HTTPS, email and backups. You don't need any server experience. Plan on about 45 minutes the first time, most of it waiting for DNS and email checks.
In the commands below, replace YOUR-SERVER-IP with your server's IP address, forum.example.com with your forum's domain and murof-1.0.0.zip with the exact name of the file you downloaded. Everything else is copied as it is.
What you need
- Your Murof download and licence key, both on your account page. The key starts with
MUROF1. - A domain or subdomain you control, such as
forum.example.com, at any registrar. - A small Linux server (a VPS) with Ubuntu 24.04, 1 GB of memory or more (2 GB is comfortable) and 10 GB of disk. These cost about $4 to $6 a month at DigitalOcean, Hetzner, Vultr, Linode and others, and less on yearly plans from smaller hosts.
- An email sending account such as Resend, Postmark, Mailgun or Brevo. Without it, members can't confirm their email or reset passwords. Step 11 covers it.
- A terminal on your own computer. Windows 10 and 11 have PowerShell (search for it in the Start menu). macOS has Terminal (in Applications › Utilities). Linux has a terminal app. All three already include
sshandscp.
Shared hosting can't run Murof today. Murof is a program that keeps running all the time, so it needs a server where it can do that. Cheap shared plans that only run PHP or plain web pages, such as Porkbun Easy PHP, most cPanel plans and WordPress hosting, can't run it. Any VPS can.
1. Make an SSH key on your computer
An SSH key is a pair of files that lets you sign in to your server without a password. The public half (ending in .pub) goes to your host. The private half never leaves your computer. Do this once; the same key works for every server you make. If you already have a key, skip to copying it.
ssh-keygen -t ed25519
Press Enter to accept where it saves the key. It then asks for a passphrase: type one for extra safety, or press Enter twice for none. Nothing shows while you type, which is normal.
Now copy the public key so you can paste it into your host:
Windows (PowerShell)Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard
macOS
pbcopy < ~/.ssh/id_ed25519.pub
Linux
cat ~/.ssh/id_ed25519.pub
On Linux, select the line it prints, which starts with ssh-ed25519, and copy it. Never share the file without .pub.
2. Rent a server
These steps use DigitalOcean as the example. Every VPS host has the same choices under slightly different names.
- Sign up and add a payment method. Most hosts ask for one even when you have free credit.
- Click Create › Droplets.
- Region: the one closest to most of your members.
- Image: Ubuntu 24.04 (LTS) x64.
- Size: Basic, Regular, the $6/mo plan with 1 GB of memory and 25 GB of disk. You may need to scroll the row of prices sideways to find it.
- Authentication: choose SSH Key › New SSH Key, paste the key you copied in step 1, give it a name like
my-pcand make sure it's ticked. - Hostname: something you'll recognise, like
my-forum. - Click Create Droplet. When it's ready, copy its IPv4 address. That's
YOUR-SERVER-IPfrom now on.
On other hosts: pick Ubuntu 24.04 (22.04 also works) and add your SSH key if offered. Some hosts email you a root password instead; that works too, and ssh will ask for it. If your host's login isn't root (Oracle and AWS use ubuntu, for example), use that name instead of root below and put sudo in front of each server command. If your host has a firewall in its own control panel, open TCP ports 80 and 443 there.
3. Point your domain at the server
Do this now, because DNS takes a few minutes to an hour to spread and HTTPS needs it. At your domain registrar, open the DNS settings for your domain and add one record:
| Type | Host | Answer / value |
|---|---|---|
| A | forum for forum.example.com, or blank for example.com itself | YOUR-SERVER-IP |
- Delete clashing records first. If the same host already has an A, ALIAS or CNAME record (often a parking page or old hosting), delete it. Also delete a wildcard
*CNAME if it points to old hosting. - Leave MX and TXT records alone. They run your email and email forwarding.
- If you use the bare domain, add a second A record for
wwwwith the same IP.
To check it has spread, run this on your computer. It should print your server's IP:
Windows, macOS and Linuxnslookup forum.example.com
4. Upload Murof to the server
Download your Murof zip from your account page, then copy it to the server. These lines assume it's in your Downloads folder.
Windows (PowerShell)scp "$env:USERPROFILE\Downloads\murof-1.0.0.zip" root@YOUR-SERVER-IP:/root/
macOS and Linux
scp ~/Downloads/murof-1.0.0.zip root@YOUR-SERVER-IP:/root/
The first time, it asks "Are you sure you want to continue connecting?". Type yes and press Enter. That's your computer remembering this server. If you'd rather drag and drop, FileZilla works too: choose SFTP, port 22, user root, and add your key under Edit › Settings › SFTP.
5. Connect to the server
Windows, macOS and Linuxssh root@YOUR-SERVER-IP
When you see a prompt like root@my-forum:~#, you're typing on the server. Every command from here to step 8 runs there.
- Pasting: right-click in PowerShell, Cmd+V in macOS Terminal, Ctrl+Shift+V in most Linux terminals.
- Notices when you sign in about updates or a new Ubuntu release are normal. Don't run
do-release-upgrade. - Closing the window doesn't stop the server or Murof. Run the same
sshline to get back in, and typeexitto leave.
6. Install Docker
Docker runs Murof and the web server in front of it that handles HTTPS. Paste these two lines:
apt-get update && apt-get install -y unzip
curl -fsSL https://get.docker.com | sh
It takes a minute or two. If a purple screen asks which services to restart, press Enter. When it finishes, docker compose version should print a version number.
7. Unpack Murof and set your domain
mkdir -p /opt/murof
unzip -q /root/murof-1.0.0.zip -d /opt/murof
cd /opt/murof
cp .env.example .env
nano .env
A simple editor opens. Use the arrow keys to reach the MUROF_DOMAIN= line and change it to your domain:
MUROF_DOMAIN=forum.example.com
Leave the other lines as they are. Save with Ctrl+O, then Enter, then leave with Ctrl+X.
Firewall: new DigitalOcean servers have none turned on, so there's nothing to do. If you want Ubuntu's firewall on, these lines allow SSH first, so you can't lock yourself out, then the web ports:
ufw allow OpenSSH
ufw allow 80,443/tcp
ufw allow 443/udp
ufw enable
8. Start Murof
cd /opt/murof
docker compose up -d
The first start builds Murof, which takes a minute or two. It starts two parts: murof, the forum, and caddy, which gets and renews your free HTTPS certificate. Check on them with:
docker compose ps
Both should say Up, and murof shows (healthy) within about 30 seconds. All your forum's data is in /opt/murof/data. Never keep your own files in /opt/murof/app, because updates replace it.
9. Run the setup wizard
Open https://forum.example.com in your browser. The wizard asks for your licence key first, from your account page. It must match this domain. Then it checks the server and asks for your forum's name, your Owner account and the look. When it finishes you're signed in.
If the browser warns about the certificate, DNS hadn't reached the server yet. Wait a few minutes, run docker compose restart caddy on the server, and reload.
10. Turn on two-factor and take a first backup
Turn on two-factor sign-in under your profile › Security; staff need it before Admin opens. Then press Admin › Health & backups › Back up now. Your first 15 minutes covers the rest.
11. Set up email
Most VPS hosts block the usual email ports (25, 465 and 587) on new accounts to stop spam. DigitalOcean does. So pick an email provider that also listens on another port. Resend uses port 2587, and its free plan covers about 100 emails a day. Postmark, Mailgun, SendGrid and Brevo offer port 2525. Or ask your host to unblock port 587.
With Resend:
- Sign up at resend.com and go to Domains › Add Domain. Enter your domain.
- Resend lists 3 or 4 DNS records (MX, TXT and DKIM). Add each one at your registrar exactly as shown. They are new records; don't change your existing MX or TXT records.
- Click Verify and wait until the domain says Verified, usually a few minutes.
- Go to API Keys › Create API Key with Sending access and copy the key, which starts with
re_. Treat it like a password: it goes only into your forum, never into a chat or email. - In your forum, open Admin › Site & Style. Under Notifications and email, fill in:
SMTP server smtp.resend.comPort 2587Security STARTTLS Username resendPassword your re_API keySend as My Forum <noreply@forum.example.com>, on the domain you verified - Click Save settings, then Admin › Health & backups › Send me a test email. If it doesn't arrive (check spam too), the Email card on that page shows the exact error.
12. Keep a copy of your backups off the server
Murof backs up every night and before every update, into /opt/murof/data/backups. A backup on the same server won't help if the server is lost, so copy them to your computer now and then, for example weekly. Run this on your computer, not on the server (open a second terminal window if you're still connected):
mkdir -Force "$env:USERPROFILE\Desktop\murof-backups"
scp -r root@YOUR-SERVER-IP:/opt/murof/data/backups root@YOUR-SERVER-IP:/opt/murof/data/secret.key "$env:USERPROFILE\Desktop\murof-backups"
macOS and Linux
mkdir -p ~/Desktop/murof-backups
scp -r root@YOUR-SERVER-IP:/opt/murof/data/backups root@YOUR-SERVER-IP:/opt/murof/data/secret.key ~/Desktop/murof-backups
Each run refreshes murof-backups/backups and murof-backups/secret.key on your computer.
Keep secret.key with your backups and private. Murof encrypts saved passwords and keys, such as your email password, with it. A backup restored without it still has every member and post, but you'd have to type those settings in again. Your host's paid backups or snapshots are a good extra layer.
13. Update Murof
The easy way: Admin › Licence & updates › Check for updates, then Install. Murof checks the download is signed, backs up first and rolls itself back if the new version doesn't come up healthy.
By hand, from a new release zip: take a backup in Admin, upload the new zip as in step 4, then on the server:
cd /opt/murof
docker compose down
unzip -oq /root/murof-1.0.1.zip -d /opt/murof
docker compose up -d --build
Your data folder and .env aren't in the zip, so they're never touched. Database upgrades run by themselves on start, after a backup.
14. Move to a new server
To switch hosts, or to a bigger server, set up the new one with steps 2 and 4 to 7 (don't start it yet), then copy the forum across. On the old server:
cd /opt/murof
docker compose down
tar czf /root/murof-data.tgz data .env
On your computer, download it from the old server and upload it to the new one:
Windows (PowerShell)scp root@OLD-SERVER-IP:/root/murof-data.tgz "$env:USERPROFILE\Desktop\"
scp "$env:USERPROFILE\Desktop\murof-data.tgz" root@NEW-SERVER-IP:/root/
macOS and Linux
scp root@OLD-SERVER-IP:/root/murof-data.tgz ~/Desktop/
scp ~/Desktop/murof-data.tgz root@NEW-SERVER-IP:/root/
On the new server:
cd /opt/murof
tar xzf /root/murof-data.tgz
docker compose up -d
Finally, change your domain's A record to the new IP (step 3). Members see the forum exactly as it was once DNS updates. Keep the old server until you've checked everything, then delete it at your host so it stops billing.
Everyday commands
Run these on the server, inside /opt/murof (type cd /opt/murof first).
| To | Run |
|---|---|
| See if it's running | docker compose ps |
| Read the forum's log (Ctrl+C to stop) | docker compose logs -f murof |
| Restart | docker compose restart |
| Stop | docker compose down |
Start, or apply a change to .env | docker compose up -d |
| Get back into a locked Owner account | docker compose exec murof python run.py --reset-owner |
Troubleshooting
- "Permission denied (publickey)". The server doesn't have the key you're using. Check you pasted the
.pubkey in step 2 and that the user name is right (rootorubuntu). Most hosts have a web console for the server where you can add a key. - "Connection timed out". The IP is wrong, the server is still starting, or a firewall at your host blocks port 22.
- "REMOTE HOST IDENTIFICATION HAS CHANGED". Expected if you rebuilt the server on the same IP. Run
ssh-keygen -R YOUR-SERVER-IPon your computer, then connect again. - The site doesn't load. Check
nslookup forum.example.comshows your server's IP, ports 80 and 443 are open at your host, anddocker compose psshows both parts up. - "502 Bad Gateway". Caddy is up but the forum isn't.
docker compose logs murofshows why. - The wizard says the key doesn't match. The key is for a different domain. Change the domain on your account page, or check
MUROF_DOMAINin.env. - Emails don't arrive. Use Send me a test email and read the error. Most often the port is blocked (use 2587 or 2525), the password is wrong, or the Send as address isn't on your verified domain. Until email is set, messages are written to
mail.login the data folder instead.
Still stuck? Contact support with the This install box from Admin › Health & backups and the last 50 lines of docker compose logs murof.