Deployment guide

Wizarr

Overview

Wizarr is a popular open-source, self-hosted invitation and user onboarding manager for Jellyfin, Plex, Emby and other media servers. Administrators create time-limited, permission-scoped invitation links. New users redeem them through a multi-step onboarding wizard that provisions their media server account and walks them through installing and using the client apps.

The SecureAnyCloud image builds Wizarr 2026.7.1 from source under /opt/wizarr and runs it as the dedicated wizarr system user, with gunicorn bound to loopback 127.0.0.1:5690. nginx fronts it on port 80. The datastore is an embedded SQLite database at /data/database/database.db, so nothing listens on a public interface except nginx, which is ready for your TLS certificate.

Secure by default: the image ships with no administrator and no shared secret. Your first visit lands on the create-admin setup wizard, where you choose your own admin username and password and then connect your media server. The Flask session signing secret (SECRET_KEY) is generated per VM on first boot and never shared between instances. The wizarr-firstboot.service oneshot generates that secret, applies the database migrations, resolves the instance URL and starts the stack, then disables itself.

What you get:

  • Wizarr 2026.7.1 (MIT) under /opt/wizarr
  • Embedded SQLite datastore at /data/database/database.db
  • wizarr.service running as wizarr, with gunicorn bound to 127.0.0.1:5690
  • nginx reverse proxy on port 80, ready for TLS
  • wizarr-firstboot.service for per-VM secret generation and stack start
  • uv-managed Python 3.13 runtime and Node.js 22 LTS build toolchain
  • Ubuntu 24.04 LTS base, patched at build time
  • 24/7 SecureAnyCloud support, 24h response SLA

Prerequisites

  • An active Azure subscription, an SSH key pair, and a VNet with a subnet
  • Recommended VM size: Standard_B2s. Wizarr is lightweight, and 4 GB RAM is comfortable.
  • A reachable Jellyfin, Plex, Emby or other supported media server that you want to invite users onto
1

Deploy from the Azure Portal

Search the Azure Marketplace for Wizarr on Ubuntu 24.04 and choose your VM size. Attach a network security group that allows TCP 22 (SSH) from your management network, and TCP 80 and 443 (the web app) from the networks that need them.

In production, front port 80 with TLS (see Step 12).

2

Deploy from the Azure CLI

RG="wizarr-prod"; LOCATION="eastus"; VM_NAME="wizarr-01" IMAGE_URN="sac1647283583153:wizarr-ubuntu-24-04:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name wz-vnet --address-prefix 10.90.0.0/16 --subnet-name wz-subnet --subnet-prefix 10.90.1.0/24 az network nsg create -g "$RG" --name wz-nsg az network nsg rule create -g "$RG" --nsg-name wz-nsg --name allow-ssh --priority 100 \
  --source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name wz-nsg --name allow-web --priority 110 \
  --source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 80 443 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:wizarr-ubuntu-24-04:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
  --size Standard_B2s --storage-sku StandardSSD_LRS \
  --admin-username azureuser --ssh-key-values "$SSH_KEY" \
  --vnet-name wz-vnet --subnet wz-subnet --nsg wz-nsg --public-ip-sku Standard
3

Connect via SSH

ssh azureuser@<vm-ip>
4

Verify the services are running

Wizarr listens on loopback only, and nginx fronts the web app on port 80. Run these checks:

sudo systemctl is-active wizarr nginx ss -tln | grep -E ':80 |127.0.0.1:5690' curl -s -o /dev/null -w 'GET /setup/ -> HTTP %{http_code}\n' http://127.0.0.1/setup/

Both services report active. The gunicorn app is bound to 127.0.0.1:5690, nginx is bound to :80, and the setup wizard returns HTTP 200 through nginx.

5

Confirm the secure defaults

Nothing sensitive ships in the image. While no administrator exists, the app redirects every request to the create-admin wizard, so / returns a redirect and the admin dashboard is never reachable without authentication.

The per-VM credentials note in /root is readable by root only. The Flask SECRET_KEY is generated on first boot, and the command below masks it.

curl -s -o /dev/null -w 'GET / -> HTTP %{http_code} (redirect to /setup/)\n' http://127.0.0.1/
sudo stat -c '%n perms=%a owner=%U:%G' /root/wizarr-credentials.txt
sudo sed -E 's/^SECRET_KEY=.*/SECRET_KEY=**** (per-VM, generated at first boot)/' /root/wizarr-credentials.txt | grep -E '^WIZARR_URL|^SETUP_WIZARD|^SECRET_KEY|^NOTE'
curl -s -o /dev/null -w 'GET /admin (no auth) -> HTTP %{http_code} (redirect, protected)\n' http://127.0.0.1/admin

The homepage redirects to the setup wizard, and the credentials note is 600 root:root. The session secret is unique to this VM, and the admin dashboard is refused without authentication.

6

Complete the first-run setup wizard

Open http://<vm-ip>/ in your browser. Because no administrator ships, Wizarr shows the create admin page.

Choose your own admin username and password (at least 8 characters), then submit.

7

Connect your media server

After you create your admin account, open Settings. Use the Servers and Connections tabs to connect your media server (Jellyfin, Plex, Emby, Audiobookshelf, Komga, Kavita and more) with its URL and an API key.

Wizarr uses this connection to provision accounts for the users you invite.

8

Log in

Wizarr requires authentication for the admin area. Sign in at /login with the admin username and password that you created during setup.

9

Create and manage invitations

You land on the admin dashboard. From there, create invitation links, scope each one to specific libraries and permissions, set expiry and usage limits, and track who has joined.

New users redeem an invitation through a guided, multi-step onboarding experience that provisions their media server account.

10

Check the runtime stack

Print the version of each component:

/opt/wizarr/.venv/bin/python --version uv --version node -v nginx -v grep -m1 '^version = ' /opt/wizarr/pyproject.toml

A uv-managed Python 3.13 runs the Flask app under gunicorn. Node.js 22 LTS built the front-end assets, nginx fronts the app, and the pinned Wizarr release is 2026.7.1.

11

Data and persistence

All Wizarr data lives in the embedded SQLite database at /data/database/database.db, which is captured into the image and carried onto every instance. The first-boot service applies migrations and generates the per-VM secret, then disables itself.

sudo ls -la /data/database/database.db systemctl is-enabled wizarr-firstboot.service apt-mark showhold

The database is present, the first-boot service has run and disabled itself for this instance, and there are no held packages, so the OS security baseline is intact.

12

Enable HTTPS

nginx already fronts Wizarr on port 80 and is ready for TLS. Point a DNS record at your VM, then obtain a certificate with certbot.

sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d <your-domain> --agree-tos -m <your-email> --redirect

certbot installs the certificate, rewrites the nginx server block for TLS, and sets up automatic renewal. Your onboarding portal is then served over HTTPS.

Managing the service

Check, restart and read the logs of the service:

sudo systemctl status wizarr --no-pager sudo systemctl restart wizarr
sudo journalctl -u wizarr -n 20 --no-pager

The gunicorn app logs to the journal. nginx logs are under /var/log/nginx/, and the SQLite data lives under /data/database.

To back up the instance, snapshot the OS disk. Alternatively, copy /data/database/database.db while the service is stopped.

Support

SecureAnyCloud provides 24/7 support for this image by email and live chat. It covers deployment, nginx TLS termination, upgrades, media server integration and API keys, and backups. Email sales@secureanycloud.com.

This is a repackaged open-source software product with additional charges for SecureAnyCloud support services. Wizarr, Jellyfin, Plex and Emby are trademarks of their respective owners. All product and company names are trademarks or registered trademarks of their respective holders. Their use does not imply any affiliation with or endorsement by them.

Deploy on Azure

Launch Wizarr on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.

View this image

Need Help?

Our support team is available 24/7.

sales@secureanycloud.com

Deploy on Azure