Deployment guide

wallabag

Overview

wallabag is an open-source, self-hosted read-it-later application: the private alternative to Pocket and Instapaper. Save any web page with one click, and wallabag extracts the readable content so you can read it later, distraction-free, on the web or in the official Android and iOS apps. You can tag and annotate articles, let tagging rules organise incoming content automatically, export to EPUB or PDF for offline reading, and import your existing library from Pocket, Instapaper or Readability.

This SecureAnyCloud image ships wallabag 2.6 served by nginx and PHP 8.3 FPM on a hardened Ubuntu 24.04 LTS base, patched at build time. It includes a bundled local MariaDB server, so the appliance is complete and useful on its own.

What you get:

  • wallabag 2.6 served by nginx and PHP 8.3 FPM, managed by systemd
  • A bundled MariaDB server holding the wallabag database, already installed and ready
  • A REST API for the official Android and iOS apps and the wallabagger browser extension
  • A per-VM administrator password generated on the first boot of every VM and recorded in a root-only file
  • No shipped default login: the default account seeded by the wallabag installer is removed before capture, the image ships with an empty users table, and the per-VM administrator is created on first boot
  • Public registration disabled by default, so your instance stays private
  • MariaDB bound to 127.0.0.1 only (the loopback interface, port 3306), never exposed to the network
  • A dedicated Azure data disk carrying both the MariaDB database and wallabag's saved article images
  • nginx.service, php8.3-fpm.service and mariadb.service as enabled systemd units
  • An unauthenticated /healthz endpoint for Azure Load Balancer health probes
  • 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_D2s_v3 (2 vCPU / 8 GiB RAM) is a sensible starting point for typical production use. A smaller size such as Standard_B2s works for personal reading lists.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network, 80/tcp for the application, and 443/tcp if you terminate TLS on the VM. The bundled MariaDB listens on 127.0.0.1 only, so port 3306 stays off the network.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for wallabag 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), HTTP (80) and HTTPS (443).

Review the dedicated data disk on the Disks tab, then select Review + create and 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:wallabag-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name wallabag \
  --image sac1647283583153:wallabag-ubuntu-24-04:default:latest \
  --size Standard_D2s_v3 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard

Open ports 80 and 443:

az vm open-port --resource-group <your-rg> --name wallabag --port 80,443

Step 3 - Confirm the services are running

SSH in as azureuser and confirm that nginx, PHP FPM, MariaDB and the first-boot service are all active. MariaDB listens only on 127.0.0.1:3306, while nginx serves wallabag on port 80.

systemctl is-active nginx php8.3-fpm mariadb wallabag-firstboot
ss -tlnp | grep -E ':80 |:3306 ' | sed 's/ */ /g'

Step 4 - Retrieve the per-VM administrator password

Each VM generates its own wallabag administrator password on first boot. The password, the login user and the application URL are written to a root-only credentials file. Read it with sudo:

sudo cat /root/wallabag-credentials.txt

Sign in to wallabag as user admin with the WALLABAG_ADMIN_PASSWORD from this file. On the VM itself, run sudo mariadb to reach the database directly over the local socket without a password.

Step 5 - Sign in

Browse to http://<vm-public-ip>/. The wallabag sign-in page opens.

Enter username admin and the password from Step 4. After you sign in, the Quickstart page walks you through configuring the application, saving your first article and migrating from an existing service.

Step 6 - Save your first article

Click the + button in the top bar, paste the address of any web page and press Enter. wallabag fetches the page and extracts the readable content. It files the article in your unread list with a preview image and an estimated reading time.

Step 7 - Read without distractions

Open any saved article to read it in wallabag's clean reading view: just the content, without advertising, popups or clutter.

From the reading sidebar you can tag the article, star it, annotate passages, mark it read, share it, or export it to EPUB or PDF for offline reading.

Step 8 - Pair the wallabagger browser extension

Install the official wallabagger extension for Firefox or Chrome to save pages with one click. The extension talks to your instance through the wallabag API.

In the web UI, open the profile menu and choose API clients management. Create a client, then copy the Client ID and Client secret. In the wallabagger settings, enter your wallabag URL, those two values, and your username and password. Every page you save then lands straight in your unread list.

Step 9 - Connect the Android or iOS app

The official wallabag apps for Android and iOS give you offline access to your reading list. In the app, choose to connect to your own wallabag instance and enter your instance URL. Supply the same API client credentials from Step 8, plus your username and password.

Articles sync both ways: save on the phone, read on the web, and the read status follows you.

Step 10 - Import your existing library

wallabag imports from Pocket, Instapaper, Readability, Firefox and Chrome bookmarks, and other wallabag instances. In the web UI, open the profile menu and choose Import. Pick your source and upload the export file from your old service.

Large imports run in the background, and your articles appear in the unread list as they are processed.

Step 11 - Create tagging rules

Tagging rules organise incoming articles automatically. Under Config then Tagging rules, define a rule such as readingTime >= 20 with the tag longread, or domainName = "github.com" with the tag code. Every newly saved article that matches is then tagged for you.

Step 12 - Confirm there are no known or default credentials

The stock wallabag installer seeds a default account named wallabag. The SecureAnyCloud image removes it before the image is captured, ships with an empty users table, and creates the per-VM administrator with a unique random secret on first boot. Public registration is disabled, so no known or blank credential authenticates.

You can prove this with the built-in round-trip check. It confirms that the per-VM administrator signs in through wallabag's own login form, while a blank password, common weak guesses and the removed default login are all rejected:

sudo mariadb --protocol=socket -uroot -N -e "SELECT CONCAT(username,' (per VM super admin)') FROM wallabag.wallabag_user"
sudo bash /usr/local/sbin/wallabag-cred-roundtrip.sh

Step 13 - Verify the stack and where your data lives

Confirm the wallabag version, the health endpoint and the dedicated data disk. The MariaDB database lives on the data disk mounted at /data (bind-mounted onto /var/lib/mysql). The images extracted from your saved articles live on the same disk. All of your reading data is therefore kept separate from the operating system disk and travels with the VM:

grep -m1 'version:' /var/www/wallabag/app/config/wallabag.yml | sed 's/^ *//'
curl -sI http://127.0.0.1/healthz | head -1
findmnt -no SOURCE,TARGET,FSTYPE,SIZE /data;
findmnt -no SOURCE,TARGET /var/lib/mysql

Add your own domain and TLS

The appliance serves plain HTTP on port 80. For production, point a DNS record at your VM and obtain a certificate with Let's Encrypt:

sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d <your-domain>

Next, update the application URL so that links in exports and shared pages use your domain, and clear the cache:

sudo sed -i "s|^\(\s*domain_name:\s*\).*|\1'https://<your-domain>'|" /var/www/wallabag/app/config/parameters.yml
sudo -u www-data php /var/www/wallabag/bin/console cache:clear --env=prod

Two-factor authentication

wallabag supports two-factor authentication with a one-time password (OTP) app. Under Config then Security, enable two-factor authentication by OTP app, scan the QR code with your authenticator and confirm the code. From then on, signing in requires both the password and a fresh code.

Back up your data

Your reading data is the wallabag database plus the extracted article images. Dump the database and archive the images directory:

sudo mysqldump --protocol=socket -uroot wallabag > /tmp/wallabag-backup.sql
sudo tar czf /tmp/wallabag-images-backup.tar.gz -C /data/wallabag images

Copy both files off the VM on your usual schedule. To restore, load the SQL dump into the wallabag database and unpack the archive back to /data/wallabag/images.

Security notes

  • Encrypt web traffic. wallabag serves plain HTTP on port 80 out of the box. For anything beyond a trusted network, add your own domain and TLS as above, or front the VM with Azure Application Gateway.
  • Keep MariaDB private. The bundled MariaDB listens on 127.0.0.1 only and is never reachable from the network. Administer it through wallabag or over SSH.
  • Protect the administrator password. It is unique per VM, and no known or blank credential authenticates. Keep /root/wallabag-credentials.txt protected. To rotate the password, run:
sudo -u www-data php /var/www/wallabag/bin/console fos:user:change-password admin '<new-password>' --env=prod
  • Keep registration closed. Public registration is off by default in this image. Enable it only if you intend to run a shared instance.
  • Keep the VM patched. Apply operating system updates regularly with sudo apt update && sudo apt upgrade. Unattended security updates are enabled by default.
  • Restrict access. Limit inbound 80/tcp and 443/tcp in your NSG to the networks that need access.

Trademark

wallabag is an open-source project distributed under the MIT licence. This image is an independent packaging of the open-source wallabag software by SecureAnyCloud. It is not affiliated with, sponsored by, or endorsed by the wallabag project.

Support

This image is maintained by SecureAnyCloud with 24/7 support. For help deploying or operating wallabag on Azure, contact us at secureanycloud.com.

Deploy on Azure

Launch wallabag 2.6 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