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 ssh and scp.

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.

Windows, macOS and Linux
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.

  1. Sign up and add a payment method. Most hosts ask for one even when you have free credit.
  2. Click Create › Droplets.
  3. Region: the one closest to most of your members.
  4. Image: Ubuntu 24.04 (LTS) x64.
  5. 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.
  6. Authentication: choose SSH Key › New SSH Key, paste the key you copied in step 1, give it a name like my-pc and make sure it's ticked.
  7. Hostname: something you'll recognise, like my-forum.
  8. Click Create Droplet. When it's ready, copy its IPv4 address. That's YOUR-SERVER-IP from 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:

TypeHostAnswer / value
Aforum for forum.example.com, or blank for example.com itselfYOUR-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 www with the same IP.

To check it has spread, run this on your computer. It should print your server's IP:

Windows, macOS and Linux
nslookup 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 Linux
ssh 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 ssh line to get back in, and type exit to 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:

  1. Sign up at resend.com and go to Domains › Add Domain. Enter your domain.
  2. 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.
  3. Click Verify and wait until the domain says Verified, usually a few minutes.
  4. 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.
  5. In your forum, open Admin › Site & Style. Under Notifications and email, fill in:
    SMTP serversmtp.resend.com
    Port2587
    SecuritySTARTTLS
    Usernameresend
    Passwordyour re_ API key
    Send asMy Forum <noreply@forum.example.com>, on the domain you verified
  6. 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):

Windows (PowerShell)
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).

ToRun
See if it's runningdocker compose ps
Read the forum's log (Ctrl+C to stop)docker compose logs -f murof
Restartdocker compose restart
Stopdocker compose down
Start, or apply a change to .envdocker compose up -d
Get back into a locked Owner accountdocker 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 .pub key in step 2 and that the user name is right (root or ubuntu). 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-IP on your computer, then connect again.
  • The site doesn't load. Check nslookup forum.example.com shows your server's IP, ports 80 and 443 are open at your host, and docker compose ps shows both parts up.
  • "502 Bad Gateway". Caddy is up but the forum isn't. docker compose logs murof shows 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_DOMAIN in .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.log in 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.