• v0.3.3 0781bfc9b1

    v0.3.3 Stable

    ric released this 2026-02-11 21:18:41 +00:00 | 0 commits to main since this release

    Added

    • Enforce enabled: false in .pages File: Sites can now be fully disabled by setting enabled: false
      • When enabled: false is set, the site returns 404 "Site is not available" for all requests
      • Enabled check runs before password check and content cache for immediate blocking
      • Enabled status cached with 60-second TTL to avoid API calls on every request
      • All cached data is automatically cleaned up when a site is disabled (custom domain mappings, Traefik routers, redirect middleware, content cache, password/enabled/settings cache)
      • Cleanup occurs on three paths: pages domain requests, custom domain requests, and registerCustomDomain
      • New functions: deregisterSite(), deregisterTraefikRouter(), cleanupRedirectMiddleware()
    • DeleteByPrefix Cache Method: Pattern-based cache deletion for bulk key removal
      • Added DeleteByPrefix(prefix string) to the Cache interface
      • MemoryCache: iterates map and deletes keys with matching prefix
      • RedisCache: uses cursor-based SCAN with MATCH pattern (non-blocking), then DEL

    Fixed

    • Disabled Site Content Cache Bypass: Enabled check now runs before content cache lookup, eliminating the window where stale content could be served after setting enabled: false
    • Disabled Site Password Cache Leak: Enabled check now runs before password check, preventing password cache from being re-populated for disabled sites
    • Reaper Script Key Casing: Fixed incorrect Redis key casing (entrypointsentryPoints, certresolvercertResolver)
    • Reaper Script enabled: false Support: Reaper now checks if sites are disabled and cleans them up accordingly

    Tests

    • Added 12 new tests covering deregistration, disabled sites, cache prefix deletion, and Redis integration

    Documentation

    • Added "Disabling a Site" sections to README.md, wiki, and troubleshooting docs
    • Updated reaper documentation with corrected key casing and enabled: false support
    Downloads
  • v0.3.2 02870a1ebe

    v0.3.2 Stable

    ric released this 2026-01-30 22:46:20 +00:00 | 5 commits to main since this release

    Release v0.3.2 - Branch Subdomains, Passwords, Landing Page, Auto Router Registration

    Added

    • Automatic PagesDomain Router Registration: Register the base pagesDomain as a Traefik router on startup

      • Automatically creates Traefik router configuration in Redis during plugin initialization
      • Enables SSL certificate generation for the base pages domain (e.g., pages.example.com)
      • No manual Traefik router configuration needed for the base pages domain
    • Landing Page for Base Domain: Serve a landing page when accessing the base pagesDomain URL

      • Add public/index.html to error pages repository to create a landing page
      • Serves at base domain URL (e.g., https://pages.example.com/)
    • Branch Subdomain Password Protection: Per-repository password protection for branch subdomains

      • Add branchesPassword field to .pages file with SHA256 hash
      • Protects all branch subdomains (e.g., stage.example.com, qa.example.com)
      • Main branch sites are NOT affected by branchesPassword
    • Branch Subdomains: Serve content from specific Git branches as subdomains

      • Add enable_branches array to .pages file
      • Example: stage.example.com serves from stage branch

    Documentation

    • Full wiki documentation (7 pages)
    • Updated README.md with comprehensive feature documentation
    Downloads
  • v0.1.5 3e9adc9596

    ric released this 2026-01-29 11:13:22 +00:00 | 12 commits to main since this release

    Added

    • Configurable Redis Connection Pooling: New configuration options to prevent Redis connection exhaustion under high load
      • redisPoolSize (default: 10) - Size of the idle connection pool per cache instance
      • redisMaxConnections (default: 20) - Maximum total connections allowed per cache instance
      • redisConnWaitTimeout (default: 5) - Seconds to wait for a connection when pool is exhausted
      • Implements semaphore-based connection limiting with blocking
      • Graceful fallback to in-memory cache when connection wait times out
      • Prevents unbounded connection creation that could exhaust Redis server resources
      • Note: With 3 cache instances (content, custom domain, password), total max connections = 3 × redisMaxConnections

    Fixed

    • Redis Connection Exhaustion: Fixed issue where unlimited connections could be created under high load
      • Previously, when the connection pool was empty, new connections were created without limit
      • Now respects redisMaxConnections limit and waits for available connections
      • Connections are properly reused from the pool instead of creating new ones unnecessarily

    Installation

    Update your Traefik static configuration:

    experimental:
      plugins:
        pages-server:
          moduleName: github.com/sqcows/pages-server
          version: v0.1.5
    

    Configuration Example

    http:
      middlewares:
        pages-server:
          plugin:
            pages-server:
              redisHost: localhost
              redisPort: 6379
              redisPoolSize: 10          # Idle connections per cache
              redisMaxConnections: 20    # Max connections per cache
              redisConnWaitTimeout: 5    # Seconds to wait before fallback
    

    Full Changelog

    https://github.com/sqcows/pages-server/compare/v0.1.4...v0.1.5

    Downloads
  • v0.1.4 c38204b3c6

    ric released this 2025-12-15 17:50:46 +00:00 | 15 commits to main since this release

    Added

    • Plugin Icon for Traefik Plugin Catalog: Added visual branding to improve plugin identification
      • Added .assets/icon.png with SquareCows logo for plugin catalog display
      • Added iconPath configuration to .traefik.yml pointing to plugin icon
      • Enhances plugin visibility and recognition in Traefik Plugin Catalog
      • Uses official SquareCows branding (black text cutout logo)

    Installation

    Add the plugin to your Traefik static configuration:

    experimental:
      plugins:
        pages-server:
          moduleName: github.com/sqcows/pages-server
          version: v0.1.4
    

    For complete installation and configuration instructions, see the README.

    Downloads
  • v0.1.3 67533c62df

    ric released this 2025-12-15 17:43:27 +00:00 | 16 commits to main since this release

    Changes

    This release removes the unused external dependency (github.com/go-acme/lego/v4) from go.mod, ensuring full compliance with Traefik plugin requirements.

    Changed

    • Removed External Dependencies: Removed unused external dependency from go.mod
      • Ensures full compliance with Traefik plugin requirements (standard library only)
      • Plugin now exclusively uses Go standard library packages
      • No functional changes to plugin behavior
      • Reduces potential security surface and dependency management overhead
      • Improves plugin compatibility with Traefik's Yaegi interpreter

    Installation

    Update your Traefik static configuration:

    experimental:
      plugins:
        pages-server:
          moduleName: github.com/sqcows/pages-server
          version: v0.1.3
    

    Upgrade Notes

    This is a maintenance release with no breaking changes. Simply update the version number in your Traefik configuration to upgrade.

    Full Changelog

    https://github.com/sqcows/pages-server/compare/v0.1.2...v0.1.3

    Downloads
  • v0.1.2 50ecf3b0ba

    ric released this 2025-12-15 17:29:52 +00:00 | 18 commits to main since this release

    Repository Migration to GitHub

    This release migrates the repository from code.squarecows.com/SquareCows/pages-server to github.com/sqcows/pages-server to comply with Traefik Plugin Catalog requirements.

    Changed

    • Repository Migration to GitHub: Migrated repository from code.squarecows.com/SquareCows/pages-server to github.com/sqcows/pages-server
      • Updated module path in go.mod to reflect new GitHub location
      • Updated all repository references in documentation to point to GitHub
      • Migration required for Traefik Plugin Catalog compatibility
      • Traefik requires plugins to be hosted on GitHub for proper plugin discovery and installation
      • No functional changes to the plugin code
      • All existing features and functionality remain unchanged

    Installation

    Update your Traefik configuration to use the new GitHub module path:

    experimental:
      plugins:
        pages-server:
          moduleName: github.com/sqcows/pages-server
          version: v0.1.2
    

    Full Changelog: https://github.com/sqcows/pages-server/compare/v0.1.1...v0.1.2

    Downloads
  • v0.1.1 05d7060670

    ric released this 2025-12-04 19:37:37 +00:00 | 20 commits to main since this release

    What's New in v0.1.1

    This release adds two major security and functionality features to Bovine Pages Server.

    DNS TXT Record Verification for Custom Domains

    A new optional security feature to prevent domain hijacking:

    • Ownership Verification: Requires DNS TXT record to prove domain ownership before registering custom domains
    • Security: SHA256 hash with constant-time comparison prevents timing attacks
    • Format: bovine-pages-verification=<SHA256_HASH> where hash = SHA256(owner/repository)
    • Configuration: Enable with enableCustomDomainDNSVerification: true (disabled by default)
    • Backward Compatible: Existing domains continue working when disabled
    • Helper Script: examples/generate-dns-verification-hash.sh for generating hashes
    • Comprehensive Tests: Full test coverage for hash generation and DNS verification

    Custom Domain Redirects

    A powerful URL redirect system for custom domains:

    • Simple Configuration: .redirects file in repository root with FROM:TO format
    • Easy Activation: Visit /LOAD_REDIRECTS endpoint to activate redirects
    • Traefik Integration: Automatically creates Traefik redirectregex middleware
    • Persistent Storage: Stores middleware configuration in Redis
    • Security: Configurable maxRedirects parameter (default: 25) prevents resource exhaustion
    • Flexible Format: Supports comments (#) and empty lines
    • Safe Regex: Automatic escaping of special characters
    • Permanent Redirects: 301 status for all redirects
    • Custom Domains Only: Works only on custom domains, not pages domain URLs
    • Redis Required: Requires Redis cache for middleware storage
    • User-Friendly: Beautiful HTML success/error pages with detailed instructions
    • Well Tested: >90% test coverage for redirects module

    Example: DNS Verification Setup

    # 1. Generate verification hash
    ./examples/generate-dns-verification-hash.sh squarecows bovine-website
    # Output: 73bb8214899661e7f7900c77714586cc51702e6cf26a58c62e17fa9d88f3d3d3
    
    # 2. Add DNS TXT record
    TXT bovine.squarecows.com bovine-pages-verification=73bb8214899661e7f7900c77714586cc51702e6cf26a58c62e17fa9d88f3d3d3
    
    # 3. Add to .pages file
    enabled: true
    custom_domain: bovine.squarecows.com
    
    # 4. Visit pages URL to register
    https://squarecows.pages.example.com/bovine-website
    

    Example: Custom Domain Redirects Setup

    # .redirects file in repository root
    # Redirect old blog to new location
    /old-blog:/blog
    /about-us:/about
    
    # Visit to activate
    https://yourdomain.com/LOAD_REDIRECTS
    

    Breaking Changes

    None - both features are opt-in and backward compatible.

    Configuration

    DNS Verification (optional):

    enableCustomDomainDNSVerification: true  # default: false
    

    Redirects (optional):

    maxRedirects: 25  # default: 25, max redirects per domain
    

    Full Changelog

    See CHANGELOG.md for complete details.


    🤖 Generated with Claude Code

    Downloads
  • v0.0.9 4fcbebc218

    ric released this 2025-12-04 13:42:30 +00:00 | 27 commits to main since this release

    Documentation Improvements

    This release focuses on enhancing project documentation through comprehensive wiki updates.

    Wiki Updates

    • Cache Management Page: Created comprehensive guide for managing Redis/Valkey cache including key structures, manual cache management commands, and troubleshooting tips
    • Quick Start Guide Enhancements: Improved getting started experience with clearer installation steps and configuration examples
    • Custom Domains Documentation Updates: Enhanced custom domain setup documentation with detailed DNS verification flow for the upcoming 0.1.0 release
    • Home Page Improvements: Restructured wiki home page for better navigation and accessibility

    Notes

    This is a documentation-only release with no code changes to the plugin itself. The wiki improvements provide better guidance for administrators and users deploying and managing the pages-server plugin.

    Installation

    No changes to installation process. Continue using v0.0.3 for production deployments.


    📚 Generated with Claude Code

    Downloads
  • v0.0.8 e8cdc8f173

    ric released this 2025-12-03 20:24:24 +00:00 | 29 commits to main since this release

    Highlights

    This release adds directory listings functionality and improves custom domain management with several bug fixes.

    New Features

    Directory Index (Apache-style directory listings)

    • Enable Apache-style directory listings for directories without index.html
    • Configure per-repository with directory_index: true in .pages file
    • Beautiful responsive HTML listing with file names, types, and sizes
    • Color-coded icons for files and folders
    • Parent directory navigation
    • Mobile-responsive design
    • Cached for 60 seconds for optimal performance

    Cache Reaper Script

    • Python script for automated cleanup of stale domain mappings
    • Connects to Redis and validates domain mappings against Forgejo API
    • Dry-run mode for safe testing
    • Designed for cron scheduling (hourly, daily, etc.)
    • Exit codes for monitoring and alerting
    • Full documentation in reaper/ directory

    Custom Domain Conflict Prevention

    • Validates custom domain ownership during registration
    • Prevents domain hijacking by checking existing mappings
    • Allows re-registration for the same repository (updates mappings)

    Bug Fixes

    Reaper Script: Added missing priority key to Traefik router cleanup

    • Now properly deletes all 6 Traefik router configuration keys
    • Prevents orphaned keys from remaining in Redis

    Custom Domain Reverse Mapping: Added persistent reverse mapping cache

    • Caches both forward (custom_domain:domain -> username:repository) and reverse (username:repository -> domain) mappings
    • Prevents custom domain resolution failures when forward mapping expires
    • Both mappings use TTL=0 (persistent storage) for reliability

    Documentation

    • Comprehensive wiki documentation for directory listings feature
    • Enhanced Quick Start guide with Traefik and Docker setup
    • Added Redis/Valkey requirement documentation
    • Architecture diagrams using Mermaid.js
    • Rebranded to "Bovine Pages Server"

    Installation

    Add to your Traefik configuration:

    experimental:
      plugins:
        pages-server:
          moduleName: code.squarecows.com/SquareCows/pages-server
          version: v0.0.8
    

    See the Quick Start Guide for complete setup instructions.

    Full Changelog

    See CHANGELOG.md for complete details.

    Downloads
  • v0.0.7 be39b4bccb

    ric released this 2025-12-01 21:15:59 +00:00 | 37 commits to main since this release

    Release v0.0.7

    🎉 What's New

    🔒 Password Protection

    Protect your websites with secure password authentication:

    • Add password: field in .pages file with SHA256 hash
    • Automatic login page with beautiful gradient UI
    • Secure HMAC-signed cookies (HttpOnly, Secure, SameSite=Strict)
    • Configurable auth cookie duration (default: 1 hour)
    • Password hash caching with 60-second TTL
    • Per-repository authentication

    🐛 Critical Bug Fixes

    • CRITICAL: Traefik Router Expiration: Fixed bug where router configurations were expiring after 10 minutes
      • Changed default traefikRedisRouterTTL from 600 seconds to 0 (persistent)
      • Router configurations now persist until explicitly deleted
      • Prevents custom domain sites from disappearing from Traefik
      • External reaper process should clean up stale routers

    📚 Documentation

    • Moved CUSTOM_DOMAINS.md to wiki for better organization
    • Added comprehensive password protection documentation to README and wiki
    • Updated configuration examples with new auth parameters

    📦 Installation

    Update your Traefik configuration to use v0.0.7:

    experimental:
      plugins:
        pages-server:
          moduleName: code.squarecows.com/SquareCows/pages-server
          version: v0.0.7
    
    Downloads