Skip to main content

Installation Guide

Detailed deployment considerations, volume storage, file permissions, and reverse proxy configurations.

System requirements​

  • Runtime: Docker Engine 20.10+ and Docker Compose v2.
  • Architecture: Supports linux/amd64 (Intel/AMD) and linux/arm64 (Apple Silicon, Raspberry Pi 4/5).
  • Memory: 150 MB baseline RAM.
  • Storage: 400 MB for the image, plus storage for cached previews. A library of 2,000 bookmarks usually consumes 300 to 500 MB of image cache.

File permissions and ownership​

The Pocket container runs as the unprivileged node user with UID 1000 and GID 1000. If your host directory is owned by root or a different NAS system user, Pocket cannot create or write to pocket.db.

You have two solutions:

Option A: Adjust host folder permissions​

Set the mounted folder ownership to UID 1000:

sudo chown -R 1000:1000 ./data

Option B: Run container as custom UID​

Find your NAS or host user UID and GID by running id <username>. Then configure the container to run under those IDs in compose.yml:

services:
pocket:
image: ghcr.io/pinkpixel-dev/pocket:latest
container_name: pocket
user: '1026:100'
restart: unless-stopped
ports:
- '8420:8420'
volumes:
- ./data:/data

Reverse proxy setup​

Pocket runs behind any standard reverse proxy. When accessing Pocket over HTTPS, cookies should be marked secure. Pocket automatically detects HTTPS when X-Forwarded-Proto: https is forwarded, or you can force it by setting POCKET_SECURE_COOKIES=1.

Caddy​

Caddy automatically handles HTTPS certificates and sets required proxy headers:

pocket.local.example {
reverse_proxy 127.0.0.1:8420
}

Nginx​

If running Nginx, configure the proxy headers properly:

server {
listen 443 ssl http2;
server_name pocket.local.example;

ssl_certificate /etc/letsencrypt/live/pocket.local.example/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pocket.local.example/privkey.pem;

client_max_body_size 25M;

location / {
proxy_pass http://127.0.0.1:8420;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

Cloudflare Tunnels​

If you run Cloudflare Tunnels (cloudflared), map the service to http://localhost:8420.

In your compose.yml, set:

environment:
- POCKET_SECURE_COOKIES=1

This ensures session cookies are protected across the Cloudflare edge.

Updating Pocket​

To update to the latest release:

docker compose pull pocket
docker compose up -d pocket

SQLite schema migrations run automatically on startup. Pocket wraps migrations in database transactions and checks integrity before accepting traffic.