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) andlinux/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.