Files
memer/UNRAID.md
2026-03-28 01:23:53 -05:00

5.8 KiB

Unraid Installation Guide

Two methods: GUI (Docker tab) and CLI (terminal). Both result in the same running container.


Prerequisites

  • Unraid 6.10 or later
  • Docker enabled (Settings > Docker > Enable Docker: Yes)
  • The memer image available — either:
    • Built locally and transferred, or
    • Pushed to a registry (Docker Hub, GHCR, your own) and pulled by Unraid
  • A reverse proxy pointed at the container port if you want HTTPS (Nginx Proxy Manager, Swag, Traefik, etc.)

Build and push the image (from your dev machine)

docker build -t youruser/memer:latest .
docker push youruser/memer:latest

Or load a local tarball directly on the Unraid terminal:

# On dev machine
docker save memer:latest | gzip > memer.tar.gz
scp memer.tar.gz root@<unraid-ip>:/tmp/

# On Unraid terminal
docker load -i /tmp/memer.tar.gz

Method 1 — Unraid GUI (Docker Tab)

  1. Go to Docker tab → Add Container
  2. Fill in the fields as follows:

Basic

Field Value
Name memer
Repository youruser/memer:latest (or memer:latest if loaded locally)
Network Type bridge
Restart Policy unless-stopped
Console shell sh

Port Mappings

Click Add another Path, Port, Variable, Label or Device → select Port

Config Type Name Container Port Host Port Connection Type
Port Web UI 3000 3000 TCP

Change the host port (e.g. 3001) if 3000 is already in use on your server.

Volume Mappings

Add two path mappings (click Add another Path → select Path for each):

Config Type Name Container Path Host Path Access Mode
Path Images /data/images /mnt/user/appdata/memer/images Read/Write
Path Database /data/db /mnt/user/appdata/memer/db Read/Write

You can substitute /mnt/user/appdata/ with any share path — just keep both sub-paths consistent.

Environment Variables

Add five variables (click Add another Path → select Variable for each):

Config Type Name Key Value
Variable Public URL PUBLIC_URL https://meme.alwisp.com
Variable Port PORT 3000
Variable Data Dir DATA_DIR /data
Variable Admin Username ADMIN_USER admin
Variable Admin Password ADMIN_PASS (your password)

PUBLIC_URL is what gets embedded in share links. Set it to your actual external URL. ADMIN_PASS is required — the gallery is publicly viewable but upload/edit/delete require this password. Change it before exposing the container to the internet.

  1. Click Apply. Unraid will pull/start the container.

  2. Check the container log (click the container name → Log) — you should see:

    Memer running at http://0.0.0.0:3000
    
  3. Navigate to http://<unraid-ip>:3000 to confirm it's working.


Method 2 — CLI (Unraid Terminal)

SSH into your Unraid server or open a terminal via the web UI (Tools > Terminal).

Create appdata directories

mkdir -p /mnt/user/appdata/memer/images
mkdir -p /mnt/user/appdata/memer/db

Run the container

docker run -d \
  --name memer \
  --restart unless-stopped \
  -p 3000:3000 \
  -v /mnt/user/appdata/memer/images:/data/images \
  -v /mnt/user/appdata/memer/db:/data/db \
  -e PUBLIC_URL="https://meme.alwisp.com" \
  -e PORT="3000" \
  -e DATA_DIR="/data" \
  -e ADMIN_USER="admin" \
  -e ADMIN_PASS="yourpassword" \
  memer:latest

Verify it started

docker ps | grep memer
docker logs memer

You should see the server startup line and no errors.

Quick health check

curl -s http://localhost:3000/api/tags
# Should return: []

Reverse Proxy (Nginx Proxy Manager)

If you're using Nginx Proxy Manager to serve meme.alwisp.com:

  1. Proxy HostsAdd Proxy Host
  2. Set:
    • Domain Names: meme.alwisp.com
    • Scheme: http
    • Forward Hostname / IP: your Unraid LAN IP (e.g. 192.168.1.100)
    • Forward Port: 3000
    • Enable Block Common Exploits
  3. On the SSL tab, request a Let's Encrypt certificate.
  4. Make sure PUBLIC_URL in the container matches https://meme.alwisp.com exactly — this is what share links are built from.

Updating the Container

GUI

Docker tab → click the container → Force Update (or remove and re-add with the same settings).

CLI

# Pull or load the new image first, then:
docker stop memer
docker rm memer

docker run -d \
  --name memer \
  --restart unless-stopped \
  -p 3000:3000 \
  -v /mnt/user/appdata/memer/images:/data/images \
  -v /mnt/user/appdata/memer/db:/data/db \
  -e PUBLIC_URL="https://meme.alwisp.com" \
  -e PORT="3000" \
  -e DATA_DIR="/data" \
  -e ADMIN_USER="admin" \
  -e ADMIN_PASS="yourpassword" \
  memer:latest

Data is safe — it lives in the host paths, not in the container.


Backup

Everything is in two host directories:

# Backup
tar -czf memer-backup-$(date +%F).tar.gz \
  /mnt/user/appdata/memer/images \
  /mnt/user/appdata/memer/db

# Restore
tar -xzf memer-backup-<date>.tar.gz -C /

The SQLite database file is /mnt/user/appdata/memer/db/memer.db. Image files are organized by upload month under /mnt/user/appdata/memer/images/YYYY-MM/.


Variable Reference

Variable Default Description
PUBLIC_URL http://localhost:3000 External URL embedded in share links — must match your domain
PORT 3000 Port the Node server listens on inside the container
DATA_DIR /data Root path for images and DB inside the container — do not change unless remapping volumes
ADMIN_USER admin Username for admin login
ADMIN_PASS (none) Password for admin login — required, set before exposing to the internet