Readeck Installation on Debian 12

Info

Readeck is a handy tool for saving web content, especially articles and texts, so you can read them later in a simple, easy-to-read view. You can change the font, font size and line height to suit your needs. The app is open source and it can be self-hosted. You can use a browser extension to save just certain parts of a website, and if you provide a video link, the transcript will be saved. I think the e-book export feature is pretty unique compared to the alternatives, such as Pocket, Instapaper, Omnivore and Wallabag.

I’ve installed Readeck 0.14 on Debian 12.

Binary Installation

You can run Readeck in a container using Docker or Podman, or you can use the binary file, which is what I’ve done here.

Just create a directory, and download the binary file and make it executable:

mkdir -p readeck-install
cd readeck-install
wget https://codeberg.org/readeck/readeck/releases/download/0.14.0/readeck-0.14.0-linux-amd64
chmod +x readeck-0.14.0-linux-amd64

First launch

You can start it for the first time with the serve parameter:

./readeck-0.14.0-linux-amd64 serve

Now you can access it on http://localhost:8000/ and try it out, and if you like it, you can create a systemd service for permanent use.

Deploy as systemd service

You should definitely not run it as root, so create a readeck user and group:

groupadd --system readeck
useradd --system -d /var/lib/readeck -M -s /bin/false -g readeck readeck
mkdir /var/lib/readeck
chown readeck:readeck /var/lib/readeck

Next, download the Readeck binary file, or take the one you used before, and make it executable:

wget -O /usr/local/bin/readeck https://codeberg.org/readeck/readeck/releases/download/0.14.0/readeck-0.14.0-linux-amd64
chown readeck:readeck /usr/local/bin/readeck
chmod +x /usr/local/bin/readeck

Now we create a configuration directory and set the correct permissions:

mkdir /etc/readeck
chown readeck:root /etc/readeck
chmod 0750 /etc/readeck

After that, we create a systemd service unit file based on the template in the Readeck documentation. But here I had to add ReadWritePaths=/etc/readeck, because ProtectSystem=full makes /boot, /usr, /etc, /home, /root, /run/user not writable and the Readeck service needs write permissions on /etc/readeck to work properly.

vim /etc/systemd/system/readeck.service

[Unit]
Description=Readeck - Open Source bookmark manager
After=network.target

[Service]
User=readeck
Group=readeck
ExecStart=/usr/local/bin/readeck serve -config /etc/readeck/config.toml
Restart=on-failure
RestartSec=5

ProtectSystem=full
ReadWritePaths=/etc/readeck
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

As always with a new unit file, reload and start the service:

systemctl daemon-reload
systemctl start readeck

Check the status:

systemctl status readeck

Web access

  • http://«your-local-ip-address»:8000

If you want to change the IP address that the service listens on, by default it uses 0.0.0.0, so it uses all available network interfaces, you can easily do this in /etc/readeck/config.toml:

[server]
host = "192.168.0.111"

Reverse Proxy and certificate

Of course you can set up a reverse proxy in front of Readeck or use an existing one and use a TLS certificate to access it securely with https. I haven’t done this on my system yet because I’m doing some major changes in my HomeLab using Ansible, Terraform and a Linux-based PKI.

But for full coverage, this is what /etc/readeck/config.toml should look like if you have the reverse proxy on the same host:

[server]
host = "127.0.0.1"
port = 8000
allowed_hosts = ["read.example.net"]
use_x_forwarded_for = true
use_x_forwarded_host = true
use_x_forwarded_proto = true

Example nginx reverse proxy configuration code:

server {
    server_name readeck.example.net;

    listen 443 ssl http2;
    listent [::]:443 ssl http2;

    # ... certificate configuration

    location / {
        proxy_pass http://127.0.0.1:8000/;
        proxy_set_header  X-Real-IP         $remote_addr;
        proxy_set_header  Host              $host;
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_redirect off;
        proxy_buffering off;
        client_max_body_size 50M;
    }
}

Troubleshooting

If you come across any errors, you can always check the logs: journalctl -fu readeck


UPDATE-2024-08-10: With the Readeck 0.15 release, they have added the information about the systemd unit file to their documentation.
To update Readeck, simply stop the service with systemctl stop readeck, download the new binary file and move it to /usr/local/bin/ named as readeck and then start the service again.

Resources