Wallabag Read-It-Later Service
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:latest4 environment: 5 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}6 SYMFONY__ENV__DATABASE_DRIVER: pdo_pgsql7 SYMFONY__ENV__DATABASE_HOST: postgres8 SYMFONY__ENV__DATABASE_PORT: 54329 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: redis16 ports: 17 - "8080:80"18 volumes: 19 - wallabag_images:/var/www/wallabag/web/assets/images20 - wallabag_data:/var/www/wallabag/data21 depends_on: 22 - postgres23 - redis24 networks: 25 - wallabag-net26 restart: unless-stopped2728 postgres: 29 image: postgres:15-alpine30 environment: 31 POSTGRES_USER: ${POSTGRES_USER}32 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}33 POSTGRES_DB: ${POSTGRES_DB}34 volumes: 35 - postgres_data:/var/lib/postgresql/data36 networks: 37 - wallabag-net38 restart: unless-stopped3940 redis: 41 image: redis:alpine42 volumes: 43 - redis_data:/data44 networks: 45 - wallabag-net46 restart: unless-stopped4748 nginx: 49 image: nginx:alpine50 ports: 51 - "80:80"52 - "443:443"53 volumes: 54 - ./nginx.conf:/etc/nginx/nginx.conf:ro55 depends_on: 56 - wallabag57 networks: 58 - wallabag-net59 restart: unless-stopped6061volumes: 62 wallabag_images: 63 wallabag_data: 64 postgres_data: 65 redis_data: 6667networks: 68 wallabag-net: 69 driver: bridge.env Template
.env
1# PostgreSQL2POSTGRES_USER=wallabag3POSTGRES_PASSWORD=secure_postgres_password4POSTGRES_DB=wallabag56# MySQL (required by image)7MYSQL_ROOT_PASSWORD=not_used_but_required89# Domain10DOMAIN_NAME=https://wallabag.example.comUsage Notes
- 1Web UI at http://localhost:8080
- 2Default login: wallabag / wallabag
- 3Supports mobile apps and browser extensions
- 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 file2cat > docker-compose.yml << 'EOF'3services:4 wallabag:5 image: wallabag/wallabag:latest6 environment:7 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}8 SYMFONY__ENV__DATABASE_DRIVER: pdo_pgsql9 SYMFONY__ENV__DATABASE_HOST: postgres10 SYMFONY__ENV__DATABASE_PORT: 543211 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: redis18 ports:19 - "8080:80"20 volumes:21 - wallabag_images:/var/www/wallabag/web/assets/images22 - wallabag_data:/var/www/wallabag/data23 depends_on:24 - postgres25 - redis26 networks:27 - wallabag-net28 restart: unless-stopped2930 postgres:31 image: postgres:15-alpine32 environment:33 POSTGRES_USER: ${POSTGRES_USER}34 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}35 POSTGRES_DB: ${POSTGRES_DB}36 volumes:37 - postgres_data:/var/lib/postgresql/data38 networks:39 - wallabag-net40 restart: unless-stopped4142 redis:43 image: redis:alpine44 volumes:45 - redis_data:/data46 networks:47 - wallabag-net48 restart: unless-stopped4950 nginx:51 image: nginx:alpine52 ports:53 - "80:80"54 - "443:443"55 volumes:56 - ./nginx.conf:/etc/nginx/nginx.conf:ro57 depends_on:58 - wallabag59 networks:60 - wallabag-net61 restart: unless-stopped6263volumes:64 wallabag_images:65 wallabag_data:66 postgres_data:67 redis_data:6869networks:70 wallabag-net:71 driver: bridge72EOF7374# 2. Create the .env file75cat > .env << 'EOF'76# PostgreSQL77POSTGRES_USER=wallabag78POSTGRES_PASSWORD=secure_postgres_password79POSTGRES_DB=wallabag8081# MySQL (required by image)82MYSQL_ROOT_PASSWORD=not_used_but_required8384# Domain85DOMAIN_NAME=https://wallabag.example.com86EOF8788# 3. Start the services89docker compose up -d9091# 4. View logs92docker compose logs -fOne-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 | bashTroubleshooting
- 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
Components
wallabagpostgresqlredisnginx
Tags
#wallabag#read-later#articles#pocket-alternative#self-hosted
Category
Productivity & CollaborationAd Space
Shortcuts: C CopyF FavoriteD Download