How to self-host Readeck, a Pocket alternative, on Azure
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.

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
- Image Source -> Select "Docker hub or other registries"
- Registry login server:
codeberg.org - Image and tag:
readeck/readeck:latest - Go to Ingress tab
- Turn on "Ingress"
- Select "Accepting traffic from anywhere"
- Fill "Target port" with
8000
- Create the resource


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

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".

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.

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".

- Name: whatever you want to call it
- Fill storage account name and key with info we copied eailer
- File share name: the ONE we created in Storage Account
- It has to match!!!
- Access Mode: read/write
- 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.

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".

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.
Create PostgreSQL
Again, go to Azure portal and create "Azure Database for PostgreSQL".
- Remember to choose the lowest spec because this shit is expensive
- 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".

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.

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.

Save as a new revision.
Now everything should work.
Cleanup
The website is ready to use now.
Some cleanup work worth considering
- Remove public access to database
- You can create a virtual network and put the DB and Container App inside the same subnet.
- Create and map to a domain name
- The default URL created for our container app is long, if you feel like, buy a domain and map to it.