docker.recipes

Wallabag Read-It-Later Service

intermediate

Self-hosted read-it-later app with article extraction, tagging, and mobile apps support.

Overview

Wallabag is a self-hosted read-it-later application that serves as an open-source alternative to commercial services like Pocket or Instapaper. Originally developed in France in 2013, wallabag extracts article content from web pages, stores them locally for offline reading, and provides powerful tagging and search capabilities. The application supports mobile apps for iOS and Android, browser extensions for major browsers, and offers a full REST API for third-party integrations. This Docker stack combines wallabag with PostgreSQL for robust article storage, Redis for caching and session management, and NGINX as a reverse proxy for production-ready deployment. PostgreSQL's full-text search capabilities enhance wallabag's article search functionality, while Redis dramatically improves performance by caching frequently accessed content and managing user sessions. NGINX handles SSL termination, static file serving, and provides load balancing capabilities for high-traffic deployments. This configuration is ideal for privacy-conscious users, organizations wanting to maintain control over their reading data, and teams needing a centralized article sharing platform. The stack supports thousands of concurrent users while maintaining fast article extraction and search performance, making it suitable for both personal use and enterprise deployments where data sovereignty is critical.

Key Features

  • Full-text article extraction with readability optimization and image preservation
  • PostgreSQL-powered advanced search with ranking, highlighting, and tag-based filtering
  • Redis-accelerated article caching for sub-second page load times
  • Native mobile app synchronization for iOS and Android devices
  • Pocket API compatibility for seamless migration from commercial services
  • Multi-user support with role-based access control and reading statistics
  • Browser extension integration for Chrome, Firefox, Safari, and Edge
  • EPUB and PDF export functionality for offline reading and archival

Common Use Cases

  • 1Personal knowledge management system for researchers and academics
  • 2Corporate article sharing platform for distributed teams and remote workers
  • 3Privacy-focused alternative to commercial read-it-later services for security-conscious users
  • 4Content curation system for marketing teams and content creators
  • 5Digital library solution for educational institutions and libraries
  • 6News aggregation platform for journalism organizations and media companies
  • 7Research documentation system for legal firms and consulting agencies

Prerequisites

  • Minimum 2GB RAM (PostgreSQL requires 1GB+, wallabag 512MB, Redis 256MB)
  • Docker and Docker Compose v2.0 or higher with BuildKit support
  • Ports 80, 443, and 8080 available for NGINX and wallabag access
  • Valid domain name and SSL certificates for production HTTPS deployment
  • Basic understanding of PostgreSQL administration for database maintenance
  • 10GB+ available disk space for article storage and database growth

For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms

docker-compose.yml

docker-compose.yml
1services:
2 wallabag:
3 image: wallabag/wallabag:latest
4 environment:
5 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
6 SYMFONY__ENV__DATABASE_DRIVER: pdo_pgsql
7 SYMFONY__ENV__DATABASE_HOST: postgres
8 SYMFONY__ENV__DATABASE_PORT: 5432
9 SYMFONY__ENV__DATABASE_NAME: ${POSTGRES_DB}
10 SYMFONY__ENV__DATABASE_USER: ${POSTGRES_USER}
11 SYMFONY__ENV__DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
12 SYMFONY__ENV__DOMAIN_NAME: ${DOMAIN_NAME}
13 SYMFONY__ENV__SERVER_NAME: "Wallabag"
14 SYMFONY__ENV__FOSUSER_REGISTRATION: "false"
15 SYMFONY__ENV__REDIS_HOST: redis
16 ports:
17 - "8080:80"
18 volumes:
19 - wallabag_images:/var/www/wallabag/web/assets/images
20 - wallabag_data:/var/www/wallabag/data
21 depends_on:
22 - postgres
23 - redis
24 networks:
25 - wallabag-net
26 restart: unless-stopped
27
28 postgres:
29 image: postgres:15-alpine
30 environment:
31 POSTGRES_USER: ${POSTGRES_USER}
32 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
33 POSTGRES_DB: ${POSTGRES_DB}
34 volumes:
35 - postgres_data:/var/lib/postgresql/data
36 networks:
37 - wallabag-net
38 restart: unless-stopped
39
40 redis:
41 image: redis:alpine
42 volumes:
43 - redis_data:/data
44 networks:
45 - wallabag-net
46 restart: unless-stopped
47
48 nginx:
49 image: nginx:alpine
50 ports:
51 - "80:80"
52 - "443:443"
53 volumes:
54 - ./nginx.conf:/etc/nginx/nginx.conf:ro
55 depends_on:
56 - wallabag
57 networks:
58 - wallabag-net
59 restart: unless-stopped
60
61volumes:
62 wallabag_images:
63 wallabag_data:
64 postgres_data:
65 redis_data:
66
67networks:
68 wallabag-net:
69 driver: bridge

.env Template

.env
1# PostgreSQL
2POSTGRES_USER=wallabag
3POSTGRES_PASSWORD=secure_postgres_password
4POSTGRES_DB=wallabag
5
6# MySQL (required by image)
7MYSQL_ROOT_PASSWORD=not_used_but_required
8
9# Domain
10DOMAIN_NAME=https://wallabag.example.com

Usage Notes

  1. 1Web UI at http://localhost:8080
  2. 2Default login: wallabag / wallabag
  3. 3Supports mobile apps and browser extensions
  4. 4API compatible with Pocket

Individual Services(4 services)

Copy individual services to mix and match with your existing compose files.

wallabag
wallabag:
  image: wallabag/wallabag:latest
  environment:
    MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    SYMFONY__ENV__DATABASE_DRIVER: pdo_pgsql
    SYMFONY__ENV__DATABASE_HOST: postgres
    SYMFONY__ENV__DATABASE_PORT: 5432
    SYMFONY__ENV__DATABASE_NAME: ${POSTGRES_DB}
    SYMFONY__ENV__DATABASE_USER: ${POSTGRES_USER}
    SYMFONY__ENV__DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
    SYMFONY__ENV__DOMAIN_NAME: ${DOMAIN_NAME}
    SYMFONY__ENV__SERVER_NAME: Wallabag
    SYMFONY__ENV__FOSUSER_REGISTRATION: "false"
    SYMFONY__ENV__REDIS_HOST: redis
  ports:
    - "8080:80"
  volumes:
    - wallabag_images:/var/www/wallabag/web/assets/images
    - wallabag_data:/var/www/wallabag/data
  depends_on:
    - postgres
    - redis
  networks:
    - wallabag-net
  restart: unless-stopped
postgres
postgres:
  image: postgres:15-alpine
  environment:
    POSTGRES_USER: ${POSTGRES_USER}
    POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    POSTGRES_DB: ${POSTGRES_DB}
  volumes:
    - postgres_data:/var/lib/postgresql/data
  networks:
    - wallabag-net
  restart: unless-stopped
redis
redis:
  image: redis:alpine
  volumes:
    - redis_data:/data
  networks:
    - wallabag-net
  restart: unless-stopped
nginx
nginx:
  image: nginx:alpine
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf:ro
  depends_on:
    - wallabag
  networks:
    - wallabag-net
  restart: unless-stopped

Quick Start

terminal
1# 1. Create the compose file
2cat > docker-compose.yml << 'EOF'
3services:
4 wallabag:
5 image: wallabag/wallabag:latest
6 environment:
7 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
8 SYMFONY__ENV__DATABASE_DRIVER: pdo_pgsql
9 SYMFONY__ENV__DATABASE_HOST: postgres
10 SYMFONY__ENV__DATABASE_PORT: 5432
11 SYMFONY__ENV__DATABASE_NAME: ${POSTGRES_DB}
12 SYMFONY__ENV__DATABASE_USER: ${POSTGRES_USER}
13 SYMFONY__ENV__DATABASE_PASSWORD: ${POSTGRES_PASSWORD}
14 SYMFONY__ENV__DOMAIN_NAME: ${DOMAIN_NAME}
15 SYMFONY__ENV__SERVER_NAME: "Wallabag"
16 SYMFONY__ENV__FOSUSER_REGISTRATION: "false"
17 SYMFONY__ENV__REDIS_HOST: redis
18 ports:
19 - "8080:80"
20 volumes:
21 - wallabag_images:/var/www/wallabag/web/assets/images
22 - wallabag_data:/var/www/wallabag/data
23 depends_on:
24 - postgres
25 - redis
26 networks:
27 - wallabag-net
28 restart: unless-stopped
29
30 postgres:
31 image: postgres:15-alpine
32 environment:
33 POSTGRES_USER: ${POSTGRES_USER}
34 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
35 POSTGRES_DB: ${POSTGRES_DB}
36 volumes:
37 - postgres_data:/var/lib/postgresql/data
38 networks:
39 - wallabag-net
40 restart: unless-stopped
41
42 redis:
43 image: redis:alpine
44 volumes:
45 - redis_data:/data
46 networks:
47 - wallabag-net
48 restart: unless-stopped
49
50 nginx:
51 image: nginx:alpine
52 ports:
53 - "80:80"
54 - "443:443"
55 volumes:
56 - ./nginx.conf:/etc/nginx/nginx.conf:ro
57 depends_on:
58 - wallabag
59 networks:
60 - wallabag-net
61 restart: unless-stopped
62
63volumes:
64 wallabag_images:
65 wallabag_data:
66 postgres_data:
67 redis_data:
68
69networks:
70 wallabag-net:
71 driver: bridge
72EOF
73
74# 2. Create the .env file
75cat > .env << 'EOF'
76# PostgreSQL
77POSTGRES_USER=wallabag
78POSTGRES_PASSWORD=secure_postgres_password
79POSTGRES_DB=wallabag
80
81# MySQL (required by image)
82MYSQL_ROOT_PASSWORD=not_used_but_required
83
84# Domain
85DOMAIN_NAME=https://wallabag.example.com
86EOF
87
88# 3. Start the services
89docker compose up -d
90
91# 4. View logs
92docker compose logs -f

One-Liner

Run this command to download and set up the recipe in one step:

terminal
1curl -fsSL https://docker.recipes/api/recipes/wallabag-read-later/run | bash

Troubleshooting

  • Database connection refused: Ensure PostgreSQL container is fully initialized before wallabag starts, add healthcheck or sleep delay
  • Article extraction fails for certain sites: Configure wallabag's site credentials or adjust extraction rules in the admin panel
  • Redis connection timeout errors: Increase Redis memory limits and check for memory pressure on the host system
  • Mobile app sync issues: Verify API endpoints are accessible and check firewall rules for external access
  • NGINX 502 Bad Gateway: Check wallabag container health and verify internal network connectivity between services
  • PostgreSQL disk space errors: Monitor database size growth and implement log rotation or archive old articles

Community Notes

Loading...
Loading notes...

Download Recipe Kit

Get all files in a ready-to-deploy package

Includes docker-compose.yml, .env template, README, and license

Ad Space