Implements Phase 5 containerization specification:
- Add /health endpoint for container monitoring
- Create multi-stage Containerfile (Podman/Docker compatible)
- Add compose.yaml for orchestration
- Add Caddyfile.example for reverse proxy (auto-HTTPS)
- Add nginx.conf.example as alternative
- Update .env.example with container and RSS feed variables
- Add gunicorn WSGI server to requirements.txt
Container features:
- Multi-stage build for smaller image size
- Non-root user (starpunk:1000)
- Health check with database connectivity test
- Volume mount for data persistence
- Resource limits and logging configuration
- Security headers and HTTPS configuration examples
Health check endpoint:
- Tests database connectivity
- Verifies filesystem access
- Returns JSON with status, version, and environment
Following Phase 5 design in docs/designs/phase-5-rss-and-container.md
Fixes:
- Add autouse fixture to clear feed cache between tests
- Fix RSS channel link assertion (feedgen adds feed.xml to links)
- Fix note title test to use minimal valid content
- Fix sample_notes fixture scope issue
All feed tests now pass with proper test isolation.
Adds unit tests for feed module and integration tests for feed route.
test_feed.py:
- Feed generation with various note counts
- RFC-822 date formatting
- Note title extraction
- HTML cleaning for CDATA safety
- Feed structure validation
- Special characters and Unicode handling
test_routes_feed.py:
- Feed route accessibility and response
- Content-Type and cache headers
- ETag generation and validation
- Server-side caching behavior
- Published notes filtering
- Feed item limit configuration
- Configuration integration
All tests follow existing test patterns and use proper fixtures.
Updates RSS feed links to use Flask url_for() and config values.
Changes:
- Use url_for('public.feed') for RSS navigation link
- Use _external=True for feed discovery link (full URL)
- Use config.SITE_NAME in feed title for customization
This ensures proper URL generation and makes the site more customizable.
Implements RSS 2.0 feed generation using feedgen library.
Features:
- generate_feed() creates standards-compliant RSS 2.0 XML
- RFC-822 date formatting for pubDate elements
- Title extraction from note content (first line or timestamp)
- CDATA safety for HTML content
- Configurable feed item limits
Follows ADR-014 RSS implementation strategy.
Related: docs/decisions/ADR-014-rss-feed-implementation.md
Phase 5 adds RSS feed generation and production containerization.
This is a minor version bump per semantic versioning.
Related: docs/decisions/ADR-015-phase-5-implementation-approach.md