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
memerimage 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)
- Go to Docker tab → Add Container
- 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_URLis what gets embedded in share links. Set it to your actual external URL.ADMIN_PASSis required — the gallery is publicly viewable but upload/edit/delete require this password. Change it before exposing the container to the internet.
-
Click Apply. Unraid will pull/start the container.
-
Check the container log (click the container name → Log) — you should see:
Memer running at http://0.0.0.0:3000 -
Navigate to
http://<unraid-ip>:3000to 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:
- Proxy Hosts → Add Proxy Host
- 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
- Domain Names:
- On the SSL tab, request a Let's Encrypt certificate.
- Make sure
PUBLIC_URLin the container matcheshttps://meme.alwisp.comexactly — 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 |