Deployment guide

Duplicati

Overview

Duplicati is free, open source backup software with a modern web interface. It compresses your files, encrypts them with AES-256 on the machine before upload, and deduplicates them so that each run stores only the blocks that changed. Backups can go to a local folder, a network share or a wide range of cloud storage providers. Because encryption happens before upload, the destination only ever sees encrypted blocks.

This SecureAnyCloud image installs the pinned Duplicati 2.3.0.4 stable release, runs its server under systemd, and fronts the web UI with an nginx reverse proxy that terminates HTTPS. The scheduler, retention rules, backup jobs and a file-by-file restore browser are all driven from the web UI. The web UI and REST API require a password generated on the first boot of every VM, and a per-VM key encrypts the server configuration database, so stored destination credentials and backup passphrases are protected at rest.

What you get:

  • Duplicati 2.3.0.4 running as the duplicati systemd service (self contained .NET 10 build)
  • The Duplicati web UI and REST API bound to loopback 127.0.0.1:8200, never exposed directly
  • An nginx reverse proxy terminating TLS on :443 with a per-VM self-signed certificate, and :80 redirecting to HTTPS
  • A unique web UI password generated on first boot, so no shared credential ships in the image
  • A per-VM settings encryption key so the server configuration database is encrypted at rest
  • An unauthenticated /healthz endpoint for Azure Load Balancer health probes
  • The duplicati-cli command line tool for scripted backups, restores and verification
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.

Standard_B2s (2 vCPU / 4 GiB RAM) is a comfortable starting size. Duplicati is light on resources, but large backup sets benefit from more memory.

In the network security group (NSG), allow inbound 22/tcp from your management network and 443/tcp for the web UI. Port 80/tcp is optional and only redirects to HTTPS. The UI uses a self-signed per-VM certificate. For production, put your own domain and a CA-signed certificate or a reverse proxy in front of it (see Maintenance).

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Duplicati by SecureAnyCloud, and select Create.

On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTPS (443).

Select Review + create, then Create.

Step 2 - Deploy from the Azure CLI

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:duplicati-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name duplicati \
  --image sac1647283583153:duplicati-ubuntu-24-04:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --vnet-name <your-vnet> --subnet <your-subnet> \
  --public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name duplicati --port 443 --priority 1010

Step 3 - Connect to your VM

ssh azureuser@<vm-public-ip>

Step 4 - Confirm the services are running

systemctl is-active duplicati nginx

Both services report active. The Duplicati server serves the web UI and REST API only on the loopback connector 127.0.0.1:8200. nginx fronts it on port 443 with TLS and redirects port 80 to HTTPS, so the nginx TLS proxy is the only way in.

Step 5 - Retrieve your web UI password

Duplicati protects its web UI and REST API with a login password. Your VM generates a unique password on first boot and writes it to a root-only file. Read it with sudo:

sudo cat /root/duplicati-credentials.txt

The file contains DUPLICATI_URL, the address to open in a browser, and DUPLICATI_PASSWORD, the generated login password. The password is set only in the per-VM options file /etc/default/duplicati (mode 0600), so no shared password ships in the image. Store it somewhere safe.

Step 6 - Confirm the health endpoint

Query the unauthenticated health endpoint that nginx serves for load balancers and probes:

curl -sk https://localhost/healthz

The endpoint returns ok. It never requires authentication, so it is safe to use as an Azure Load Balancer health probe. A plain request to port 80 returns 301 and redirects to HTTPS.

Step 7 - Confirm authentication is enforced

Because a password is set on first boot, an unauthenticated request to the REST API returns HTTP 401, so nobody reaches your backups without it. The commands below read the per-VM password from the credentials file and show that an unauthenticated call is rejected. They then log in to obtain a token and show that an authenticated call succeeds:

PW=$(sudo grep '^DUPLICATI_PASSWORD=' /root/duplicati-credentials.txt | cut -d= -f2-)
echo "unauth: $(curl -sk -o /dev/null -w '%{http_code}' https://localhost/api/v1/backups)"
TOKEN=$(curl -sk -X POST https://localhost/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d "{\"Password\":\"$PW\",\"RememberMe\":false}" \
  | python3 -c 'import sys,json;print(json.load(sys.stdin)["AccessToken"])')
echo "authed: $(curl -sk -o /dev/null -w '%{http_code}' -H "Authorization: Bearer $TOKEN" https://localhost/api/v1/backups)"

The output is unauth: 401 followed by authed: 200. The login returns a signed JSON Web Token that authorizes every subsequent API call.

Step 8 - Sign in to the web UI

Browse to https://<vm-public-ip>/. The certificate is self-signed and unique to your VM, so your browser shows a certificate warning the first time. Accept it to continue, or install the certificate from /etc/nginx/tls/duplicati.crt to trust it.

At the password prompt, enter the password from Step 5 and select Login.

Step 9 - The dashboard

After you sign in, Duplicati opens on the Home dashboard. The left navigation offers Add backup, Restore, Destinations and Settings.

The main area lists your backup jobs with their last run time, duration, source and destination sizes, and number of stored versions.

Step 10 - Create a backup

Select Add backup, then Add a new backup, and step through the wizard.

Give the backup a name and a strong passphrase. Duplicati encrypts everything with this passphrase before upload. Pick a destination, such as a local folder, an SMB or SFTP share, S3, Azure Blob Storage, Backblaze B2, Google Drive and many more. Select the source folders to protect, and set an optional schedule and retention policy.

Step 11 - Restore files

Select Restore to recover data. Duplicati lists your configured backups. Pick one and choose Restore to browse it by version and select the files or folders to bring back.

To recover from a destination on a machine that has no local configuration, use Direct restore from backup files. This is the option you need in a disaster recovery scenario.

Step 12 - Verify a backup and restore from the command line

The image includes duplicati-cli, so you can script and verify backups without the web UI. The commands below back up a folder to a local destination, encrypted with a passphrase. They then restore it to a new directory so you can confirm the restored file is identical:

sudo duplicati-cli backup file:///tmp/dr-dest /etc/hostname --passphrase='choose-a-strong-passphrase' sudo duplicati-cli restore file:///tmp/dr-dest '*' --restore-path=/tmp/dr-out --passphrase='choose-a-strong-passphrase'

Duplicati reports Backup completed successfully! and then Restored 1 (...) files. This round trip shows that your encrypted backup can be read back and recovered end to end.

Maintenance

  • Password: the web UI password is set on first boot and stored in /etc/default/duplicati as --webservice-password inside DAEMON_OPTS. To change it, edit that file (as root) and run sudo systemctl restart duplicati.
  • Settings encryption: the server configuration database is encrypted with a per-VM key held in /etc/default/duplicati (SETTINGS_ENCRYPTION_KEY), which protects the destination credentials and passphrases you store in Duplicati. Keep a copy of this file if you need to recover the configuration on another machine.
  • Backup destinations: Duplicati supports local folders, SMB and SFTP, S3 compatible object storage, Azure Blob Storage, Backblaze B2, Google Drive, and many more; add them under Destinations or when creating a backup.
  • Retention: set keep rules per backup (keep a number of versions, or a smart retention schedule) in the backup's options so old versions are pruned automatically.
  • TLS: the UI is served over HTTPS with a self-signed per-VM certificate at /etc/nginx/tls/duplicati.crt. For production, replace it with a CA-signed certificate for your own domain, or place a reverse proxy in front.
  • Upgrades: Duplicati is installed from the official Debian package; to upgrade, download a newer stable release, verify its checksum, install it with apt, and restart the service. Your backup jobs and history are preserved in /var/lib/duplicati.
  • Security patches: unattended-upgrades remains enabled so the OS continues to receive security updates automatically.

Support

SecureAnyCloud provides 24/7 expert support for this image. Contact sales@secureanycloud.com.

Deploy on Azure

Launch Duplicati 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