How to self-host Readeck, a Pocket alternative, on Azure

Jeff posted on  (updated on )

Contents

Intro

I have been a happy user of Pocket for many years. it's like a bookmark on-the-cloud, you can save links to Pocket and read them later. Unfortunately, it has gone out of service since mid 2025, and I have been actively looking for alternatives, hence Readeck.

Readeck provides all the features that I use Pocket for: it's a website where you can add links to read later.

image1

However, Readeck is a free open source software, and you need to host this software yourself. Running a website isn't cheap and that's what got Pocket(I assume), Readeck avoids this entirely by providing software only, not the service.

In this article, I am going to show you how I self-hosted a Readeck website: https://readeck.asurada.biz/

TLDR: Create container app from Readeck Docker image, and configure Docker volume + SQL Database for it.

Create Container App

Readeck provides a Docker image we can directly run: https://readeck.org/en/docs/#installation

docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest

Let's create a Azure Container App and use this Docker image https://portal.azure.com/#create/Microsoft.ContainerApp

Detailed setting for this container app:

For fields I don't mention, complete at your own discretion

  1. Image Source -> Select "Docker hub or other registries"
  2. Registry login server: codeberg.org
  3. Image and tag: readeck/readeck:latest
  4. Go to Ingress tab
    1. Turn on "Ingress"
    2. Select "Accepting traffic from anywhere"
    3. Fill "Target port" with 8000
  5. Create the resource

image2

image3

After the deployment is successful, you can access the website using the "Application Url" on the Overview tab.

image4

Adjust min replicas

By default, the minimal replicas count is 0, which means if there is no traffic to this website, it will complete shuts down. And it will take ~20 seconds to cold start if we visit the website.

Set this to 1 so it's "always online".

image5

Attach container volume

To preserve data across reboot, lets attach a persist Docker volume to the Docker container.

Create storage account

We will need to create a Storage account resource https://portal.azure.com/#create/Microsoft.StorageAccount-ARM

Set "Preferred storage type" to "Azure Files", and create.

Create File Share

Go to the created "Storage account" resource, go to "File Shares" tab under "Data Storage". And add a new File Share object.

image6

Keep note of the name of this File Share, we will need it later.

Obtain access key to storage account

Now go back to "Storage account" resource, go to "Access Key" tab under "Security + Networking".

Copy the "Storage account name" and key1's key value to somewhere.

Add volume mount to Container App Env

Then, go to the resource group and find the "Container Apps Environment" created alone with our container app.

Go to tab "Volume mounts" under "Settings", click "Add" > "SMB".

image7

  1. Name: whatever you want to call it
  2. Fill storage account name and key with info we copied eailer
  3. File share name: the ONE we created in Storage Account
    1. It has to match!!!
  4. Access Mode: read/write
  5. Save

Add volume to container app

Once done, go back to Container App, "Volumes" tab under "Application", and add new volume. Select the volume mount we created in above step.

image8

Leave mount options blank.

Save, it will ask to start a new revision, do it.

Alright... we finally done creating a volume, one last step: let's mount it to our Docker container.

Actually mount it

Go to "Containers" under "Application", select "Volume mounts" tab, add the volume, mount path set to /readeck (you can find this from Readeck document), then "Save as a new revision".

image9

After deployment, you should be able to see some files in this File Share in storage account. That confirms you have correctly set it up.

Shit happens

Oh no! Now my app won't start!
After above step, you would notice the revision fails to start, and if you check logs, you would see "Database is locked" error message.

Don't worry, that's expected. Because by default the app uses SQLite, which doesn't work with network based filesystem we just setup.

The solution? Create a proper SQL Database. Unfortunately Readeck only supports PostgreSQL out of box, so that's what we will create.

https://readeck.org/en/docs/compose#with-postgresql

Create PostgreSQL

Again, go to Azure portal and create "Azure Database for PostgreSQL".

  1. Remember to choose the lowest spec because this shit is expensive
  2. For networking, enable "Allow public access from any Azure service within Azure to this server"

Create database

Once the DB is created. Let's create a Database called "readeck".

image10

Enable feature

Readeck will use a database feature that is not enabled by default. Let's enable it.

If not enabled, the error would be
extension "unaccent" is not allow-listed for users in Azure Database for PostgreSQL (SQLSTATE 0A000)"}

Go to "Server parameters" tab under "Settings", search for "extensions", then select "unaccent". Save.

image11

Set connection string to container app

After creating the database, go back to the container app, lets add DB connection string to it.

Go to "Containers" tab under "Application", select "Env variables", add an entry

# Key
READECK_DATABASE_SOURCE

# Value (fill yourself)
postgres://<username>:<password>@<db-resourcename>.postgres.database.azure.com:5432/readeck

The username and password is what you filled when creating PostgreSQL.

image12

Save as a new revision.

Now everything should work.

Cleanup

The website is ready to use now.

Some cleanup work worth considering

  1. Remove public access to database
    1. You can create a virtual network and put the DB and Container App inside the same subnet.
  2. Create and map to a domain name
    1. The default URL created for our container app is long, if you feel like, buy a domain and map to it.