# Changelog All notable changes to the portainer-core project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ### Planned - AI Orchestrator Phases 5-6: Multi-agent workflows, RAG optimization, production hardening - Authentik SSO Milestones 4-5: Protect remaining services (deferred) - Disaster recovery and offsite backup strategy ## [0.14.0-home-assistant] - 2025-12-14 ### Added - **Home Assistant** - Smart home automation platform - Stack file: `stacks/home-assistant.yml` - Port: 8123 (Home Assistant default) - External access: https://housekeeping.schweitz.net via NPM with Let's Encrypt SSL - Privileged mode enabled for USB device access (Z-Wave, Zigbee) - Connected to docker-dataplane network - Health check: `/manifest.json` endpoint (30s interval) - Memory limit: 1GB ### Changed - **CONTAINERS.md** - Added Home Assistant service profile and updated all reference tables - **stacks/README.md** - Added Home Assistant to applications table and port allocation ## [0.13.0-healthchecks] - 2025-12-14 ### Added - **Docker Healthchecks** - Added healthcheck configurations to 13 stacks for Portainer container status monitoring - `gitea.yml` - gitea-db (pg_isready), gitea (git.schweitz.internal/api/healthz), gitea-runner (pgrep) - `headscale.yml` - /health endpoint - `jellyfin.yml` - /health endpoint - `netdata.yml` - /api/v1/info endpoint - `nginx-proxy-manager.yml` - /api/ endpoint - `ollama.yml` - /api/tags endpoint - `open-webui.yml` - /health endpoint - `organizr.yml` - root page check - `portainer.yml` - /api/system/status endpoint - `qdrant.yml` - /readyz endpoint - `samba.yml` - pgrep smbd (10m interval) - `watchtower.yml` - pgrep watchtower ### Removed - **Uptime Kuma** - Removed external monitoring service (replaced by Docker healthchecks + Portainer status) - Deleted `stacks/uptime-kuma.yml` - Removed KUMA environment variables from core-api - Removed uptime-kuma-api from requirements.txt - Cleaned up documentation references in CONTAINERS.md, README.md, AGENTS.md, Makefile - **Heimdall** - Cleaned up stale references (service was previously removed) - Removed from documentation and Makefile ### Changed - **CONTAINERS.md** - Updated service count to 21 containers across 16 stacks - **AGENTS.md** - Updated service integration policy (removed Uptime Kuma requirement) - **Makefile** - Simplified deploy-phase3 to Netdata only ## [0.12.0-library-desk-enhancements] - 2025-12-10 ### Added - **Wiki Change Detection** - Real-time page change notifications via PostgreSQL LISTEN/NOTIFY - WikiChangeListener service connects to Wiki.js database - Automatic re-ingestion when pages are created/updated/deleted - Debouncing and loop prevention for automated updates - Webhook router as HTTP fallback mechanism - Setup scripts and documentation for PostgreSQL triggers - **Taxonomy-Aware Classification** - LLM uses existing wiki structure when classifying content - `get_taxonomy_structure()` extracts category/subcategory paths from wiki - Consolidation prompts include existing paths to prefer over creating new ones - Prevents duplicate category creation (e.g., reuses `reference/political-entities/` instead of creating `reference/military-alliances/`) - **WikiJS Client Methods** - `list_all_pages()` - Fetch all pages with path prefix filter (replaces stale search index) - `get_taxonomy_structure()` - Extract category hierarchy for a user namespace - **Test Coverage** - New test files for recent features - `test_graph_service.py` - Document node tags, entity-stub skipping - `test_ingestion.py` - list_all_pages usage, batch ingestion - `test_wiki_change_listener.py` - PostgreSQL notification handling - Updated `test_consolidation.py` with taxonomy and ingestion_service tests - Updated `test_integration.py` with list_all_pages and taxonomy tests ### Fixed - **Ingestion Pipeline** - Pages created during consolidation now properly indexed - `ingestion_service` was not passed to ConsolidationService in router - Added ingestion call to `_update_page_with_facts()` (was only in create path) - **Bulk Re-index** - `/ingest/all` endpoint now works reliably - Changed from `search_pages("")` (stale index) to `list_all_pages()` - Successfully re-indexed 95 pages - **Document Node Tags** - Neo4j Document nodes now include `tags` property - Prevents warnings in related documents query - Set via `d.tags = $tags` in MERGE query - **WikiJS Integration Script** - Page ID fetched via GraphQL - Uses `pages.singleByPath(path, locale)` query during initialization - Replaces unreliable page list search method ### Changed - **Entity Linking** - Improved matching with fuzzy logic - Confidence scoring for containment and token overlap matches - Self-referential link filtering (entities don't link to current page) - Path preservation (keeps full `/users/username/path` format) - Longest-first matching to prevent partial matches - **Consolidation Processing** - Searches marked processed even when skipped/errored - Prevents unprocessed searches from accumulating indefinitely - **Stack Configuration** - Updated library-desk environment variables - Replaced `WIKIJS_API_KEY` with `WIKIJS_USERNAME`/`WIKIJS_PASSWORD` - Added `WIKIJS_DB_PASSWORD` for PostgreSQL connection ### Technical Details - **Dependencies:** Added `asyncpg~=0.29.0` for PostgreSQL async driver - **New Files:** 10 files added (services, routers, tests, documentation) - **Commits:** 10 logical commits covering all changes ## [0.11.0-pydantic-ai-cleanup] - 2025-12-03 ### Major Changes - **Framework Cleanup: PydanticAI Only** ✅ ARCHITECTURAL SIMPLIFICATION - Removed all obsolete agent implementations (OllamaNativeAgent, ADK, LangChain, LangGraph) - Kept only PydanticAgent (primary) and SimpleLiteLLMAgent (fallback) - Single framework approach eliminates confusion and improves maintainability - All documentation updated to reflect PydanticAI architecture ### Removed - **Obsolete Agent Files:** - `src/agents/ollama_native_agent.py` - Replaced by PydanticAgent - Diagnostic and phase completion documentation files - Obsolete test files (`test_ai_flow_quality.py`, test_02/03 diagnostic tests) - Research documentation about ADK/LangChain - **Obsolete Documentation:** - `ARCHITECTURE.md`, `DIAGNOSTIC_RESULTS.md`, `PHASE*.md` files - `docs/ADK_Ollama_Research.md` - `docs/architecture/agent-flow-diagrams.md` (LangGraph references) - Session docs with LangChain/LangGraph implementations - Completed plans about ADK/LangChain migrations ### Changed - **main.py:** Complete refactor to use only PydanticAI (305 lines vs 457 before) - Removed `chat_completions()` endpoint using OllamaNativeAgent - Removed `test_ollama_tools()` diagnostic endpoint - Default `/v1/chat/completions` now routes to PydanticAgent - Simplified health checks (removed ollama-native status) - **agents/__init__.py:** Removed OllamaNativeAgent exports - **Documentation Updates:** - `services/core-ai/README.md` - Complete rewrite for PydanticAI architecture - `plans/active/ai-orchestrator-plan.md` - Updated to reference PydanticAI - `plans/active/unified-agent-architecture.md` - Updated to reference PydanticAI - `STATUS.md` - Updated to show PydanticAI implementation (v0.11.0) - **Plans Cleanup:** - Deleted 5 completed plans about obsolete frameworks - Updated active plans to use PydanticAI terminology ### Technical Details **Current Architecture (as of 2025-12-03):** - **Framework:** PydanticAI with native Ollama SDK - **Agents:** PydanticAgent (primary) + SimpleLiteLLMAgent (fallback) - **Model:** mistral-nemo:latest - **Tools:** 6 core + 28+ OpenAPI-discovered from core-api - **Memory:** 3-tier system with Qdrant - **VRAM:** ~4-6GB **Files Removed:** 13 obsolete files (agents, tests, docs) **Files Modified:** 8 files (main.py, agents/__init__.py, plans, docs) **Lines Removed:** ~3000+ lines of obsolete code ## [0.10.1-phase-completion] - 2025-11-26 ### Added - **Phase 2/3 Completion Documentation** - Added phase2-memory-system-complete.md with full implementation details - Added phase3-multi-agent-workflows-complete.md documenting research capabilities - Added system prompts file (prompts.py) with 7 tested variants for A/B testing - Session documentation for model testing and VRAM optimization - **Test Results & Analysis** - Comprehensive prompt testing results (87/100 score for v1_verbose) - Model comparison testing (Mistral, Gemma, tool calling validation) - Tool logging implementation documentation - Verified test results for production readiness - **Portainer Client Enhancements** - Added comprehensive Portainer API client (148 lines) - Stack management, service monitoring, container operations - Full error handling and async support ### Changed - **Memory System Improvements** - Added user_id parameter for multi-tenancy support - Skip storing system messages (part of agent state_modifier) - Enhanced memory manager with better user isolation - Improved conversation turn tracking - **AI Controller Enhancements** - Better memory integration with user_id support - Improved error handling for memory operations - Enhanced token tracking for usage monitoring - **Architecture Documentation** - Updated agent flow diagrams to reflect ADK architecture - Enhanced core-api README with current setup - Updated Docker compose stack configuration ### Technical Details - **Files Added:** - `services/core-api/src/agent/prompts.py` - 7 system prompt variants - `plans/completed/phase2-memory-system-complete.md` - `plans/completed/phase3-multi-agent-workflows-complete.md` - `services/core-api/COMPREHENSIVE_PROMPT_TEST_RESULTS.md` - `services/core-api/TOOL_LOGGING_IMPLEMENTATION.md` - `docs/sessions/2025-11-24-*.md` - Model testing documentation - **Memory System:** - Multi-tenancy support with user_id throughout - System message filtering (not stored in history) - Improved conversation metadata tracking ## [0.10.0-adk-migration] - 2025-11-26 ### Added - **AI Orchestrator: Google ADK Framework Migration** ✅ MAJOR ARCHITECTURAL CHANGE - **New Framework: Google ADK 1.3.0** - Migrated from LangChain/LangGraph to Google's Agent Development Kit - LiteLLM 1.80.5 integration for Ollama compatibility - Improved tool calling reliability with local models - Better streaming support with ADK event system - **Model Upgrade: gemma3:12b** - Upgraded from mistral:7b for better capability - Optimized for tool calling with ADK framework - ~8GB VRAM usage (vs ~4GB with mistral:7b) - **Tool Migration** - All 9 tools converted to ADK async generator format - Infrastructure tools (7): time, services, stacks, NPM - Research tools (2): web_search, web_scrape - Improved error handling and streaming progress - **System Prompt Optimization** - New v7_adk_best_practice prompt variant - Optimized for ADK agent behavior - Better tool usage patterns - **Enhanced Health Checks** - Agent-specific health monitoring - Tool availability verification - LiteLLM connection validation ### Changed - **Agent Architecture** - Replaced LangGraph `create_react_agent` with ADK `Agent` - Changed from LangChain tools to ADK async generators - Updated streaming pipeline for ADK event format - Simplified orchestrator.py (more maintainable) - **Dependencies** - Removed: langchain, langgraph, langchain-community, langchain-core, langchain-ollama - Added: google-adk==1.3.0, google-genai==1.17.0, litellm==1.80.5 - Updated: pydantic>=2.11.1, uvicorn>=0.34.0, httpx>=0.28.0 - **Configuration** - Default model: mistral:7b → gemma3:12b - Agent model: mistral:7b → gemma3:12b - System prompt: v1_verbose → v7_adk_best_practice ### Fixed - **Tool Calling Reliability** - Issue: LangGraph agents not calling tools with Ollama models - Root cause: LangGraph ReAct agent incompatibility with local models - Fix: Migrated to Google ADK with proven Ollama support - Result: Consistent tool calling across all query types - **Model Compatibility** - Issue: Gemma models failing with LangChain (status 400) - Fix: ADK supports Gemma family natively via LiteLLM - Result: Can now use gemma3:12b, gemma3:4b, and other Gemma variants - **Streaming Consistency** - Issue: Inconsistent streaming behavior with LangGraph - Fix: ADK provides unified event streaming - Result: Clean, consistent SSE output for frontend ### Technical Details - **Files Modified:** - `services/core-api/requirements.txt` - Dependency overhaul - `services/core-api/src/agent/orchestrator.py` - Complete rewrite for ADK - `services/core-api/src/agent/tools.py` - Converted 9 tools to ADK format - `services/core-api/src/agent/streaming.py` - Updated for ADK events - `services/core-api/src/controllers/ai_controller.py` - Enhanced error handling - `services/core-api/src/controllers/health_controller.py` - Added agent health checks - `services/core-api/src/config.py` - Updated model and prompt settings - `services/core-api/Dockerfile` - Updated base dependencies - **Architecture Impact:** - Migration preserves existing API contracts - Memory system (Qdrant) completely unaffected - Tool implementations (logic) unchanged, only decorators updated - Frontend integration (SSE streaming) maintained - **Performance:** - Simple queries: ~0.3-1s (similar to LangChain) - Tool-using queries: ~2-5s (improved from LangChain) - Research queries: ~4-7s (maintained from Phase 3) - VRAM: ~8GB with gemma3:12b (~4GB increase) ### Migration Notes - **Reason for Migration:** LangChain/LangGraph's `create_react_agent` failed to trigger tool calls with Ollama models despite proper configuration - **Migration Duration:** ~6 hours (as estimated in migration plan) - **Testing:** Validated with time queries, service queries, and web searches - **Rollback:** Previous LangChain implementation preserved in git history - **Documentation:** See `MIGRATION_PLAN_LANGCHAIN_TO_ADK.md` for details ### Known Issues - None currently identified - monitoring in progress ### Performance Monitoring - Tool calling success rate: Being tracked post-migration - Response latency: Within targets (<5s for research) - VRAM utilization: ~8GB (acceptable for RTX 2080 Ti 11GB) - Error rate: Monitoring for ADK-specific issues ## [0.9.0-ai-memory-system] - 2025-11-23 ### Added - **AI Orchestrator Phase 2: Memory System** ✅ COMPLETE - **Tier 1: ConversationBufferMemory** - In-memory storage for last 10 turns per conversation - < 1ms access time, automatic pruning - OrderedDict-based storage with conversation metadata - **Tier 2/3: Unified Qdrant Storage** - Collection: `core_api_conversations` - Embedding model: nomic-embed-text (768 dimensions via Ollama) - Persistent storage + semantic search capabilities - Chronological retrieval (Tier 2 mode) - Semantic similarity search (Tier 3 mode) - **Auto-Consolidation Service** - Triggers at 10 turns (when buffer fills) - Moves buffer turns → Qdrant automatically - Maintains conversation continuity - **Dual-Retrieval System** - Checks both buffer (Tier 1) AND Qdrant (Tier 2/3) - Cross-restart persistence working - Combines memory tiers via get_full_history() - **Phase 2.5: Multi-Tenancy** - Added user_id field to all memory schemas - Default user: "llm-testuser" for unauthenticated traffic - Single collection with user_id filtering approach - Tested with multiple users successfully ### Changed - **Memory Architecture** - Original plan: Tier 2 (SQLite summaries) + Tier 3 (Qdrant semantic) - Implemented: Unified Tier 2/3 in Qdrant (simpler, more efficient) - Rationale: Qdrant handles both persistent storage and semantic search - **Embedding Dimension** - Changed from 384d (all-MiniLM-L6-v2) to 768d (nomic-embed-text) - Better semantic quality, still efficient for local deployment - **Logging Level** - Changed memory storage logs from DEBUG to INFO for visibility - Helps verify storage execution without verbose output ### Fixed - **Memory Storage Integration** (Priority 1.1) - Issue: Memory storage code reached but not executing - Root cause: Log level set to WARNING, logger.debug() invisible - Fix: Changed logger.debug() → logger.info() for storage paths - Verification: 32 points successfully stored in Qdrant - **Memory Persistence** (Priority 2.1) - Issue: Agent didn't recall conversations after restart - Root cause: Only checking buffer (Tier 1), empty after restart - Fix: Added dual-check (buffer_exists OR qdrant_exists) - Verification: Agent correctly recalled "purple" after restart ### Technical Details - **Files Modified:** - [src/api/v1/schemas.py](services/core-api/src/api/v1/schemas.py) - Added user_id to ChatCompletionRequest - [src/memory/schemas.py](services/core-api/src/memory/schemas.py) - Added user_id to ConversationTurn and ConversationMetadata - [src/controllers/ai_controller.py](services/core-api/src/controllers/ai_controller.py) - Memory storage and retrieval integration - [src/memory/manager.py](services/core-api/src/memory/manager.py) - Updated add_turn() for user_id - [src/memory/qdrant_memory.py](services/core-api/src/memory/qdrant_memory.py) - Added user_id to payload and retrieval - **Testing:** - Manual testing with curl commands - Multi-user testing (llm-testuser, alice-testuser) - Cross-restart persistence verified - Semantic search verified (AI-related queries ranked correctly) ### Deferred - **Optional Future Enhancements:** - Time-based consolidation for short conversations (< 10 turns) - User filtering in Qdrant queries - User management API (list users, delete user data) - Migration to LangGraph checkpointers (Phase 3 roadmap) ## [0.8.1-authentik-organizr] - 2025-11-21 ### Added - **Standalone Authentik Proxy Outpost** - Container: authentik-proxy (port 9445:9443) - Redis configuration: redis-shared:6379/0 - Memory usage: ~150MB - API token authentication with Authentik server - WebSocket connection to Authentik for config updates - **Forward Authentication for Organizr** - NPM configuration for home.schweitz.net - auth_request directive pointing to standalone outpost - Authentication header forwarding (X-authentik-username, email, groups, name, uid) - Signin redirect handler for unauthenticated requests - WebSocket support enabled - **Documentation** - Session summary: [docs/sessions/2025-11-21-authentik-troubleshooting.md](docs/sessions/2025-11-21-authentik-troubleshooting.md) - NPM configuration template: [docs/npm-configs/organizr-forward-auth.conf](docs/npm-configs/organizr-forward-auth.conf) - Deployment scripts in /tmp for reference ### Fixed - **Embedded Outpost Issue:** Authentik 2024.8.4 embedded outpost not initializing auth endpoint (version-specific bug) - **Network Connectivity:** NPM on host network cannot resolve docker-dataplane container names - use localhost:9445 - **NPM Config Generation:** API updates don't generate config files - manually created /data/nginx/proxy_host/2.conf - **Redirect Loop:** Initial redirect to /outpost.goauthentik.io/start returned 404 - changed to use application domain - **Post-Login Redirect:** Direct flow redirect sent users to /if/user/#/library - use outpost start endpoint instead - **Organizr Auto-Login:** Headers set at server level don't forward - moved proxy_set_header to location / block ### Changed - **Outpost Architecture:** Moved from embedded to standalone for reliability (port 9445:9443) ## [0.8.0-authentik-sso] - 2025-11-20 ### Added - **Authentik Identity Provider** (version 2024.8.4) - Server container (port 9000) with 512MB memory limit - Worker container with 384MB memory limit - Total memory usage: 563MB (80-90% reduction vs previous attempt) - Embedded outpost on port 9444 - **Shared Infrastructure Integration** - PostgreSQL: authentik database with authentik_user - Redis: Database 0 for sessions and cache - Docker network: docker-dataplane - **Google OAuth Integration** - OAuth source configured via API - Google login button on authentication flow - Automatic user creation for external OAuth users - Successful test: jpmschweitzer@gmail.com user created - **NPM Configuration** - Reverse proxy for https://auth.schweitz.net - Let's Encrypt SSL with HSTS - No forward auth on auth.schweitz.net (prevents redirect loops) - **API Automation** - Created proxy provider "Organizr Proxy" via API - Created application "Organizr" via API - Assigned provider to embedded outpost via API - **Documentation** - Session summary: docs/sessions/2025-11-20-authentik-deployment.md - Updated STATUS.md with SSO progress - Updated security implementation plan ### Fixed - Health check failing due to missing wget/curl - switched to Python urllib - Database user authentik_user not created - manually created with grants - Port 9443 conflict - mapped to 9444 on host - NPM proxy host marked as deleted - recreated via UI - Google OAuth enrollment flow error - cleared browser cookies ### Changed - Container count: 19 → 21 (added authentik-server, authentik-worker) - Active priority: AI Orchestrator → Security & SSO Implementation - Deferred AI Orchestrator Phase 2 to focus on security ### Known Issues - **Embedded outpost auth endpoint returns 404** - Endpoint: `/outpost.goauthentik.io/auth/nginx` not available - Ping endpoint works, but auth endpoint not initialized - Blocking forward authentication for Organizr - Investigating provider mode and initialization sequence ## [0.7.1-gitea-deployment] - 2025-11-14 ### Added - Gitea Git repository hosting service (port 3002, SSH port 2222) - PostgreSQL database backend for Gitea - NPM reverse proxy configuration for https://git.schweitz.net with Let's Encrypt SSL - Uptime Kuma monitoring integration for Gitea - Organizr dashboard integration for Gitea - Complete Gitea documentation in CONTAINERS.md ### Changed - Updated infrastructure status to reflect 19 deployed services ## [0.7.0-ai-orchestrator-phase1] - 2025-11-13 ### Added - AI Orchestrator Phase 1: OpenAI-Compatible API - `/v1/chat/completions` endpoint with streaming and non-streaming support - `/v1/models` endpoint for model discovery - Model aliasing system (gpt-3.5-turbo → gemma:7b, etc.) - Ollama client with connection pooling - Pydantic request/response schemas - Server-Sent Events (SSE) streaming format - Comprehensive Phase 1 testing suite - 10/10 tests passing, zero issues - 245ms average response time - 100% OpenAI API compatibility verified - Phase 1 implementation guide and test results documentation ### Fixed - Model ID formatting issue (removed extra quotes in model names) ### Security - Deployed on isolated ai-dataplane network ## [0.6.0-applications] - 2025-11-13 ### Added - Nextcloud cloud storage and collaboration platform (port 8082) - MariaDB database backend - Redis caching - NPM reverse proxy with https://cloud.schweitz.net - Database optimization (indices, bigint conversion) - Cron background jobs via maintenance container - Samba network file sharing (ports 139/445) - Media share (R/W) - Downloads share (R/W) - Backups share (R/O) - UFW firewall rules for Samba ports - Uptime Kuma multi-network bridge for monitoring all services ### Changed - Disabled host Samba service to prevent port conflicts - Relocated Nextcloud cron to maintenance container for centralized scheduling ### Fixed - Uptime Kuma network connectivity issues (added bridges to all service networks) ## [0.5.2-core-api] - 2025-11-13 ### Added - Core API service for Open WebUI integration (port 8083) - Web scraper module with Trafilatura and BeautifulSoup - Infrastructure management API (Portainer/NPM/Kuma integration) - OpenAPI documentation at `/docs` endpoint - Health check endpoint - Uptime Kuma monitoring integration - Organizr dashboard integration ### Changed - Upgraded system Python from 3.8 (EOL) to 3.12 ### Security - Runs as non-root user (uid 1000) - CORS configured for same-network access only ## [0.5.1-open-webui] - 2025-11-12 ### Added - Open WebUI LLM chat interface (port 8081) - Built-in voice capabilities (local STT/TTS) - Ollama integration for local model inference - Uptime Kuma monitoring integration - Organizr dashboard integration (tab + homepage) - Complete Open WebUI documentation in CONTAINERS.md ## [0.5.0-optimization] - 2025-11-11 ### Added - Phase 4: Optimization & Security - Watchtower for automatic container updates (daily at 4 AM) - Maintenance container for automated backups and scheduled tasks - Automated Docker config backups (daily at 3 AM, 30-day retention) - Docker log rotation configuration (10MB max, 3 files per container) - UFW firewall rules (SSH, Tailscale, infrastructure services) ### Security - Firewall enabled and configured for all public-facing services - Automated backup system with 30-day retention (~94MB per backup) ## [0.4.0-monitoring] - 2025-11-11 ### Added - Phase 3: Monitoring Stack - Uptime Kuma service monitoring (port 3001) - Netdata real-time system metrics (port 19999) - Heimdall unified dashboard (port 8888) - Complete monitoring documentation ## [0.3.0-networking] - 2025-11-11 ### Added - Phase 2: Networking & External Access - Headscale mesh VPN control server (port 8085) - Custom 10.99.0.0/16 network range - Homelab user and pre-auth key system - Device connection procedures for all platforms - Headscale setup documentation ## [0.2.0-foundation] - 2025-11-11 ### Added - Phase 1: Foundation Setup - Portainer container management (port 8001, host networking) - Nginx Proxy Manager reverse proxy (port 81, host networking) - Ollama ML model serving (port 11434, GPU-enabled) - NVIDIA Container Toolkit (v1.17.9-1 for driver 470 compatibility) - GPU management via docker-compose deploy configuration - 4TB media drive mounted at /mnt/media - User added to docker group ### Fixed - Docker networking issues (iptables FORWARD chain, host networking solution) - AMP integration (kept on port 8080, no conflicts) ### Security - GPU passthrough configured securely - Storage permissions set for dual-disk strategy ## [0.1.0-planning] - 2025-11-11 ### Added - Initial project structure and documentation - Comprehensive research document (containers/research.md) - Evaluated 8 different home server solutions - Identified Portainer + Docker Compose as optimal choice - Researched SDN solutions (Headscale vs Tailscale) - Detailed implementation plan (containers/implementation-plan.md) - 4-phase deployment strategy - Phase 1: Foundation (Portainer, NPM, Ollama, storage) - Phase 2: Networking (Headscale) - Phase 3: Monitoring (Uptime Kuma, Netdata, Heimdall) - Phase 4: Optimization (Watchtower, backups, security) - Application backlog (Jellyfin, Nextcloud, Samba) - System documentation (SYSTEM.md) - Hardware specifications - Dual-disk storage configuration - Software inventory - Agent guidelines (AGENTS.md) - Project-specific conventions - Docker Compose standards - GPU service requirements - Testing procedures - Commit message format - Project status tracking (STATUS.md) - Version-controlled infrastructure (stacks/ directory) - Maintenance automation (scripts/ directory, Makefile) ### Documented - Storage architecture: SSD (489GB) for configs, HDD (3.7TB) for content - Port allocation strategy - AMP game server integration approach - GPU passthrough requirements for Jellyfin and Ollama - Security considerations (Headscale, UFW, credentials management) ### Decisions - **Architecture:** Portainer + Docker Compose (chosen over TrueNAS Scale, Unraid, Proxmox) - Reason: No OS reinstall required, leverages existing Docker, minimal storage footprint - **Reverse Proxy:** Nginx Proxy Manager on port 8000 (unified web interface) - **SDN:** Headscale (self-hosted Tailscale control server) - **ML Infrastructure:** Ollama with GPU support (RTX 2080 Ti) - **Monitoring:** Uptime Kuma + Netdata + Heimdall - **Storage Strategy:** Dual-disk approach (SSD for performance, HDD for capacity) --- ## Changelog Guidelines ### Categories Use these categories for changes: - **Added** - New features, services, or capabilities - **Changed** - Changes to existing functionality - **Deprecated** - Soon-to-be-removed features - **Removed** - Removed features - **Fixed** - Bug fixes - **Security** - Security improvements ### Version Numbering - **Major (X.0.0)**: Breaking changes, major architecture changes - **Minor (0.X.0)**: New features, service additions, phase completions - **Patch (0.0.X)**: Bug fixes, configuration tweaks, documentation updates - **Suffix**: `-planning`, `-alpha`, `-beta` for pre-release stages ### Example Entry Template ```markdown ## [X.Y.Z] - YYYY-MM-DD ### Added - feat(stack): deployed nginx proxy manager for unified web interface - feat(ollama): configured GPU passthrough for ML model inference ### Changed - config(amp): moved from port 8080 to 8081 to avoid conflicts ### Fixed - fix(storage): corrected permissions on media drive mount ### Security - chore(firewall): configured UFW rules for service isolation ``` --- *This changelog is updated as features are implemented and phases are completed*