Commit Graph

181 Commits

Author SHA1 Message Date
20458cda6a fix: set SMTP_TLS false and SMTP_SSL true for port 465
IONOS SMTP on port 465 uses implicit SSL, not STARTTLS.
Set SMTP_TLS: false and SMTP_SSL: true.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:54:17 +01:00
339073ab5a fix: use SMTP_TLS instead of SMTP_SSL for asciinema
Port 465 requires implicit TLS, not SSL. Changed SMTP_SSL to SMTP_TLS
with value 'always' and added SMTP_AUTH: always.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:53:41 +01:00
74e5d071a3 fix: configure asciinema SMTP with EMAIL_FROM and disable signup
- Add EMAIL_FROM to arty.yml environment defaults
- Configure asciinema to use EMAIL_FROM for MAIL_FROM_ADDRESS
- Set SMTP_SSL to true for IONOS SMTP on port 465
- Set SIGN_UP_DISABLED default to false (will enable after admin creation)
- Follow netdata compose.yaml pattern for Traefik labels
- Add proper HTTP to HTTPS redirect middlewares
- Configure compression and security headers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:50:40 +01:00
e74a45b2a2 feat: add asciinema backup plan to Restic
Added asciinema-backup plan to backup terminal recording data.

Backup Configuration:
- ID: asciinema-backup
- Schedule: 11 AM daily (0 11 * * *)
- Path: /volumes/asciinema_data
- Retention: 7 daily, 4 weekly, 6 monthly, 2 yearly

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:12:25 +01:00
dc0bc061f8 fix: use compose_network for asciinema stack
Changed network reference from ${NETWORK_NAME} variable to hardcoded
compose_network to fix deployment issue where arty doesn't export
environment variables to docker compose.

Changes:
- Network: ${NETWORK_NAME} → compose_network
- Removed external network declaration (inherited from root)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:10:00 +01:00
c0611cb04f feat: add Asciinema terminal recording server stack
Added new asciinema stack for self-hosted terminal recording and sharing
platform with custom "Pivoine" theme inspired by pivoine.art aesthetic.

New Services:
- **asciinema**: Terminal recording server at asciinema.pivoine.art
  - PostgreSQL backend for recording persistence
  - Email authentication via IONOS SMTP magic links
  - Public/private recording visibility controls
  - Embed recordings on any website
  - Custom rose/magenta themed UI

Custom Theme (asciinema/theme/custom.css):
- Primary color: RGB(206, 39, 91) - Deep rose/magenta
- Dark charcoal backgrounds: HSL(0, 0%, 17.5%)
- High contrast design with bold color accents
- Styled components: navigation, cards, forms, buttons, terminal player
- Smooth animations and hover effects
- Responsive design with mobile breakpoints
- Custom scrollbars, selection colors, loading states

Infrastructure Updates:
- PostgreSQL: Added `asciinema` database to init script
- arty.yml: Added ASCIINEMA_* environment variables
- compose.yaml: Included asciinema stack in root composition
- CLAUDE.md: Comprehensive documentation with CLI setup guide
- Backup: Added asciinema-backup plan (11 AM daily, 7d/4w/6m/2y retention)

Configuration:
- URL: https://asciinema.pivoine.art
- Database: PostgreSQL `asciinema` database
- SMTP: Email auth via IONOS SMTP
- Unclaimed TTL: 30 days (auto-cleanup)
- Secret: Generated 64-char hex key in .env

Features:
- Record terminal sessions with asciinema CLI
- Web player with play/pause controls and speed adjustment
- User profiles with personal recording collections
- Embed recordings via iframe or direct links
- Privacy controls (public/private recordings)
- Automatic cleanup of unclaimed recordings

Integration Points:
- Documentation: Embed terminal demos
- Blog posts: Share command-line tutorials
- GitHub: Link recordings in README files
- Tutorials: Interactive terminal walkthroughs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:00:20 +01:00
cdb8d2ef34 fix: correct LiteLLM environment variable syntax
Changed API key reference from ${ANTHROPIC_API_KEY} to
os.environ/ANTHROPIC_API_KEY to match LiteLLM's documented syntax.

The os.environ/ prefix tells LiteLLM to use os.getenv() to retrieve
the environment variable at runtime, which is the correct way to
reference environment variables in LiteLLM config files.

Reference: https://docs.litellm.ai/docs/proxy/deploy

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 00:30:07 +01:00
f0e99d2776 revert: remove SFTP integration from AI stack
Removed custom Dockerfile and SFTP function integration in favor of
the simpler REST API approach (webui-export.py).

Changes:
- Restored webui service to use official Open WebUI image
- Removed custom Dockerfile.webui (paramiko build)
- Removed ai/functions/save_to_disk.py SFTP function
- Removed SSH key and functions volume mounts

The REST API export script (webui-export.py) is a simpler and more
flexible solution that doesn't require Docker modifications.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 23:15:27 +01:00
a0d5006cf5 feat: add Open WebUI code export script via REST API
Added Python script to extract and save code blocks from Open WebUI
chat conversations to local disk using the REST API.

Features:
- Export code blocks from specific chats or all chats
- Automatic language detection and proper file extensions
- Organizes files by chat title with metadata
- No Docker modifications needed
- Remote access support via SSH tunnel or public URL

Usage:
  python3 ai/webui-export.py --all --output-dir ./exports
  python3 ai/webui-export.py --chat-id <id> --output-dir ./code

This replaces the complex SFTP integration with a simple API-based
approach that's easier to maintain and use.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 23:12:37 +01:00
5818644c1a feat: add SFTP integration for saving code to local disk
Added custom Open WebUI function for SSH/SFTP file operations:

**New Function: save_to_disk.py**
- save_file(): Write generated code to local filesystem via SFTP
- read_file(): Read files from local disk
- list_files(): List directory contents
- Configurable via Valves (host, port, username, paths)

**Custom Dockerfile (Dockerfile.webui)**
- Based on ghcr.io/open-webui/open-webui:main
- Installs paramiko library for SSH/SFTP support
- Creates .ssh directory for key storage

**Configuration Updates**
- Mount SSH private key from host (/root/.ssh/id_rsa)
- Mount functions directory for custom tools
- Build custom image with SFTP capabilities

**Usage in Open WebUI**
Claude can now use these tools to:
- Generate code and save it directly to your local disk
- Read existing files for context
- List project directories
- Create new files in any project

Default base path: /home/valknar/Projects
Authentication: SSH key-based (passwordless)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 23:07:11 +01:00
424e6d044d fix: configure LiteLLM without database requirement 2025-11-08 23:02:07 +01:00
8ee86b2a0d fix: correct LiteLLM config volume mount path 2025-11-08 22:59:50 +01:00
8eae3c650f feat: add LiteLLM proxy for Anthropic Claude models
Added LiteLLM as an OpenAI-compatible proxy for Anthropic's API to
enable Claude models in Open WebUI.

**New Service: litellm**
- Image: ghcr.io/berriai/litellm:main-latest
- Internal proxy on port 4000
- Converts Anthropic API to OpenAI-compatible format
- Health check with 30s intervals
- Not exposed via Traefik (internal only)

**LiteLLM Configuration (litellm-config.yaml)**
- Claude Sonnet 4 (claude-sonnet-4-20250514)
- Claude Sonnet 4.5 (claude-sonnet-4-5-20250929)
- Claude 3.5 Sonnet (claude-3-5-sonnet-20241022)
- Claude 3 Opus (claude-3-opus-20240229)
- Claude 3 Haiku (claude-3-haiku-20240307)

**Open WebUI Configuration Updates**
- Changed OPENAI_API_BASE_URLS to point to LiteLLM proxy
- URL: http://litellm:4000/v1
- Added litellm as dependency for webui service
- Dummy API key for proxy authentication

**Why LiteLLM?**
Anthropic's API uses different endpoint structure and authentication
headers compared to OpenAI. LiteLLM acts as a translation layer,
allowing Open WebUI to use Claude models through its OpenAI-compatible
interface.

**Available Models in Open WebUI**
- claude-sonnet-4 (latest Claude Sonnet 4)
- claude-sonnet-4.5 (Claude Sonnet 4.5)
- claude-3-5-sonnet
- claude-3-opus
- claude-3-haiku

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:58:09 +01:00
d5a3d26c97 docs: add AI stack to README.md
Updated README.md with AI intelligence system:

**Core Systems Table**:
- Added AI system entry with ai.pivoine.art access point

**Infrastructure Section**:
- Added AI Intelligence Core with PostgreSQL 16 + pgvector
- Listed Open WebUI, Crawl4AI, and document embeddings

**Navigation Commands**:
- New AI Operations section with usage instructions
- How to configure Claude API in Open WebUI
- Steps: create account, add API connection, select model, upload docs
- Internal services documentation (Crawl4AI, PostgreSQL)
- n8n workflow integration examples

**Ship Architecture**:
- Added AI Intelligence category with 3 services
- PostgreSQL+pgvector for vector database
- Open WebUI for Claude interface
- Crawl4AI for web scraping (internal)

**Storage Volumes**:
- ai_postgres_data: AI vector database
- ai_webui_data: Open WebUI application data
- ai_crawl4ai_data: Web scraping cache

**Backup Protocol**:
- Updated backup window to 2-10 AM
- Updated count from 11 to 16 backup plans

All AI services accessible at https://ai.pivoine.art with Claude
integration, RAG support, and web search capabilities.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:49:39 +01:00
ec12efb3f1 docs: add AI stack documentation to CLAUDE.md
Updated CLAUDE.md with comprehensive AI stack documentation:

**Compose Include Pattern**:
- Added ai stack to service list

**Service Documentation (ai/compose.yaml)**:
- ai_postgres: PostgreSQL 16 with pgvector extension
- webui: Open WebUI at ai.pivoine.art with Claude integration
- crawl4ai: Internal web scraping API for LLM content

**Configuration Details**:
- Claude API integration via Anthropic OpenAI-compatible endpoint
- RAG support with pgvector for semantic search
- Web search capability enabled
- IONOS SMTP email configuration
- Database: dedicated PostgreSQL instance (ai/openwebui)

**Usage Instructions**:
- Account creation and API key setup
- Document upload for RAG conversations
- n8n workflow automation integration
- Mattermost notification capabilities

**Integration Points**:
- n8n for AI task automation
- Mattermost for notifications
- Crawl4AI for advanced scraping
- Claude API as primary LLM

**Future Enhancements**:
- GPU server integration (IONOS A10 planned)
- Additional AI models (Whisper, Stable Diffusion)
- Enhanced RAG pipelines
- Custom AI agents

**Backup Plans**:
- Updated count to 16 automated daily backups
- Added ai-backup: 3 AM daily (postgres, webui, crawl4ai data)
- Added netdata-backup: 10 AM daily (config data)
- Retention: 7 daily, 4 weekly, 6 monthly, 2 yearly

**Volume Management**:
- Added ai_postgres_data, ai_webui_data, ai_crawl4ai_data
- Added netdata_config

**Environment Variables**:
- AI_DB_PASSWORD: AI PostgreSQL password
- AI_WEBUI_SECRET_KEY: Open WebUI session encryption
- ANTHROPIC_API_KEY: Claude API key

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:42:56 +01:00
cdee0f0c42 fix: rename AI postgres service to avoid conflict with core
Changed service name from 'postgres' to 'ai_postgres' to avoid naming
conflict with the core PostgreSQL service in Docker Compose include.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:35:41 +01:00
0679b7d738 feat: add AI stack with Open WebUI, Crawl4AI, and pgvector
Created complete AI infrastructure stack at ai.pivoine.art:

**New Services:**
- **Open WebUI** (ai.pivoine.art)
  - ChatGPT-like interface for AI models
  - Multi-user chat with authentication
  - RAG (Retrieval-Augmented Generation) support
  - Document upload and processing
  - Claude API integration via Anthropic

- **PostgreSQL with pgvector** (dedicated AI database)
  - Vector similarity search for RAG
  - Separate from production databases
  - Stores embeddings and documents

- **Crawl4AI** (internal API service)
  - Web scraping optimized for LLMs
  - Converts websites to clean Markdown
  - Called by n8n workflows
  - No public exposure (internal only)

**Configuration:**
- Added 18 AI environment variables to arty.yml
- Configured email notifications via IONOS SMTP
- OpenAI API compatibility for Claude integration
- Traefik SSL termination and compression

**Backup:**
- Added 3 AI volumes to Restic backup
- Daily backup at 3 AM
- Retention: 7 daily, 4 weekly, 6 monthly, 2 yearly

**Integration:**
- Shares falcon_network with existing services
- Ready for n8n workflow automation
- Mattermost notifications support
- Watchtower auto-updates enabled

Ready for Phase 2: GPU server integration with Ollama, Whisper, and
Stable Diffusion when IONOS A10 server is provisioned.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:34:46 +01:00
ff7f6ab697 Revert "feat: upgrade PostgreSQL to pgvector-enabled image"
This reverts commit 51081718bd.
2025-11-08 22:31:58 +01:00
51081718bd feat: upgrade PostgreSQL to pgvector-enabled image
Changed PostgreSQL image from postgres:16-alpine to
pgvector/pgvector:pg16-alpine to enable vector similarity search
capabilities for AI/RAG applications.

This is required for Open WebUI's RAG functionality to store and
query document embeddings.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 22:30:39 +01:00
ee25e72616 fix: correct Tandoor Traefik port from 8080 to 80
Tandoor's internal Nginx listens on port 80, not 8080. This was causing
502 Bad Gateway errors because Traefik was trying to connect to the wrong port.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 21:07:02 +01:00
f2f0e2f1eb fix: remove VPN backup (service not running)
Removed VPN backup configuration since the VPN service is not currently
included in the compose.yaml and the vpn_etc_wireguard volume doesn't exist.

Kept Netdata backup as those volumes exist and the service is running.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 21:02:48 +01:00
9e379c008e feat: update Restic backup configuration
Updated Restic backup system to include all current services:

**Volume Mounts Added:**
- vpn_etc_wireguard (WireGuard VPN configuration)
- netdata_config (Netdata monitoring configuration)

**Backup Plans Updated:**
- Replaced gotify-backup with mattermost-backup
  - Now backs up: mattermost_config, mattermost_data, mattermost_plugins
  - Retention: 7 daily, 4 weekly, 6 monthly, 2 yearly
- Added tandoor-backup
  - Backs up: tandoor_staticfiles, tandoor_mediafiles
  - Schedule: 5 AM daily
  - Retention: 7 daily, 4 weekly, 6 monthly
- Added vpn-backup
  - Backs up: vpn_etc_wireguard (critical for VPN restoration)
  - Schedule: 9 AM daily
  - Retention: 7 daily, 4 weekly, 12 monthly, 3 yearly
- Added netdata-backup
  - Backs up: netdata_config
  - Schedule: 10 AM daily
  - Retention: 7 daily, 4 weekly, 3 monthly

**Backup Schedule:**
- 2 AM: postgres, joplin
- 3 AM: redis
- 4 AM: directus (uploads, bundle)
- 5 AM: awesome, mattermost, tandoor
- 6 AM: scrapy, n8n
- 7 AM: filestash, linkwarden
- 8 AM: letsencrypt, vaultwarden
- 9 AM: jellyfin, vpn
- 10 AM: netdata

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 21:01:31 +01:00
af18e8273e feat: add Tandoor recipe manager to infrastructure
Added Tandoor Recipes as a comprehensive recipe management solution:

**Tandoor Stack** (tandoor.pivoine.art):
- Modern recipe manager with smart scaling and collaboration
- PostgreSQL backend for recipe persistence
- Email notifications via IONOS SMTP
- Static and media file storage in dedicated volumes
- User signups disabled (admin-only access)

**Features:**
- Smart recipe scaling (auto-adjust ingredients for servings)
- Spaces for collaboration (family/roommate recipe sharing)
- Meal planning and shopping lists
- Recipe import from URLs
- Mobile app support (Kitshn app)
- Nutritional information and pricing

**Infrastructure updates:**
- Added tandoor database to PostgreSQL init script
- Added environment variables to arty.yml
- Updated compose.yaml include list
- Added Tandoor volumes (staticfiles, mediafiles) to Restic backup
- Configured email notifications for invitations and notifications

**Tech stack:**
- Django/Python backend
- Vue.js frontend
- PostgreSQL database (shared core instance)
- Gunicorn WSGI server

Tandoor provides superior UX compared to Mealie with better recipe
scaling, collaboration features, and mobile app experience.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 20:54:48 +01:00
edbae4e932 docs: update CLAUDE.md and README.md with Mattermost and Netdata
Updated documentation to reflect current infrastructure:

**Added:**
- Mattermost team collaboration platform
  - Team chat, file sharing, integrations
  - Email notifications via IONOS SMTP
  - Incoming webhooks for infrastructure alerts
  - PostgreSQL backend

- Netdata real-time monitoring
  - System and service monitoring
  - PostgreSQL and Docker monitoring
  - Restic backup repository monitoring
  - Email and Mattermost alerts
  - HTTP Basic Auth protection

**Removed:**
- Gotify notification server (replaced by Mattermost)

**Updated:**
- Database initialization: Added mattermost database
- Backup configuration: Added Mattermost volumes
- Environment variables: Added MATTERMOST_WEBHOOK_URL and WATCHTOWER_NOTIFICATION_URL
- Volume management: Added Mattermost, Joplin, and Jellyfin volumes
- Service list in compose include pattern

All documentation now reflects the current state of the infrastructure
with Mattermost as the central notification and collaboration hub.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 20:20:57 +01:00
7874a6c11d feat: add Mattermost volumes to Restic backup
Added Mattermost volumes to backup configuration:
- mattermost_config: Server configuration and settings
- mattermost_data: User data, posts, files, and attachments
- mattermost_plugins: Installed plugins

These volumes contain critical Mattermost data and should be
backed up regularly to ensure team chat history and configurations
can be restored if needed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 20:17:35 +01:00
ab676622cf feat: remove Gotify notification service
Removed Gotify completely from infrastructure, replaced by Mattermost:

- Removed gotify/compose.yaml stack
- Removed Gotify environment variables from arty.yml
- Removed Gotify from compose.yaml include list
- Removed Gotify volume backup from Restic configuration

Gotify has been fully replaced by Mattermost for:
- Infrastructure notifications (Netdata, Watchtower, Restic)
- n8n workflow notifications
- Team collaboration and chat

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 20:15:07 +01:00
b5301684f4 feat: add Mattermost webhook URL to n8n environment
Added MATTERMOST_WEBHOOK_URL environment variable to n8n:
- Available as environment variable in workflow expressions
- Can be used in HTTP Request nodes to send notifications
- Enables easy integration with Mattermost from any workflow

Usage in n8n workflows:
- Use {{ $env.MATTERMOST_WEBHOOK_URL }} in expressions
- Send POST requests with JSON payload to notify Mattermost

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 20:12:06 +01:00
151fdc4b00 feat: configure Mattermost webhook integrations
Added Mattermost webhook notifications for infrastructure services:

- **Netdata**: Health monitoring alerts sent to Mattermost
  - Configured via MATTERMOST_WEBHOOK_URL environment variable
  - All alert roles route to Mattermost notifications channel

- **Restic/Backrest**: Backup status notifications
  - Webhook URL passed as environment variable
  - Backrest web UI can be configured to use the webhook

- **Watchtower**: Container update notifications
  - Uses Shoutrrr mattermost:// URL format
  - Sends notifications when containers are updated

Configuration:
- Webhook URL stored securely in .env file
- All services reference ${MATTERMOST_WEBHOOK_URL} variable
- Watchtower uses specialized Shoutrrr format URL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 19:59:58 +01:00
5342dcfaf2 feat: add Mattermost team chat platform to replace Gotify
Added Mattermost stack to the docker-compose infrastructure:

- **Mattermost stack** (mattermost.pivoine.art):
  - Team collaboration and chat platform
  - PostgreSQL backend for message persistence
  - Email notifications via IONOS SMTP
  - Support for channels, direct messages, and integrations
  - Mobile and desktop app support
  - Full Traefik integration with SSL termination

Infrastructure updates:
- Updated PostgreSQL init script to create mattermost database
- Added environment variables to arty.yml for Mattermost configuration
- Updated compose.yaml include list
- Configured email settings for notifications and invitations

This will replace Gotify as the primary notification and messaging platform.
All services integrated with Traefik for SSL termination and include
Watchtower auto-update labels.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 19:43:11 +01:00
4e43563d06 fix: use apt instead of apk for Netdata Dockerfile
Netdata container is Debian-based, not Alpine. Updated package
manager from apk to apt-get for installing msmtp packages.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 19:27:36 +01:00
7b2c202acc feat: add msmtp to Netdata for email alerts
Created custom Dockerfile for Netdata container that includes msmtp
and msmtp-mta packages for sending email notifications.

Changes:
- Added netdata/Dockerfile extending netdata/netdata:latest
- Installed msmtp, msmtp-mta, and ca-certificates via apk
- Set proper permissions (600) for msmtprc config file
- Updated compose.yaml to build from custom Dockerfile

This enables Netdata to send health alarm notifications via email
using the IONOS SMTP configuration in msmtprc.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 19:27:06 +01:00
50404948f4 feat: configure SMTP email notifications across all services
Added comprehensive email configuration to enable notifications for
password resets, user invitations, system alerts, and backup failures.

**Services configured:**

- **Vaultwarden** (vault/compose.yaml):
  - SMTP settings for password resets, 2FA, emergency access emails
  - Uses IONOS SMTP with force_tls security
  - Sender: hi@pivoine.art

- **Linkwarden** (links/compose.yaml):
  - Email server configuration for user invitations
  - Password reset functionality via email
  - Uses smtp:// connection string format

- **n8n** (n8n/compose.yaml):
  - SMTP mode enabled for workflow notifications
  - User invitation emails
  - Password reset support
  - SSL-secured connection

- **Netdata** (netdata/compose.yaml, health_alarm_notify.conf, msmtprc):
  - Health alarm notifications via email
  - MSMTP configuration for sending alerts
  - Notifications sent to valknar@pivoine.art
  - Alerts for system issues, resource exhaustion, service failures

**Common SMTP settings** (from .env):
- Provider: IONOS (smtp.ionos.de:465)
- From address: hi@pivoine.art
- Transport: SMTP with TLS/SSL
- Admin email: valknar@pivoine.art

**Backrest notifications:**
- Configured via web UI at restic.pivoine.art
- Supports webhooks to Gotify for push notifications
- Email notifications can be added through UI settings

All services now have proper email notification capabilities for
improved monitoring, user management, and security features.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 19:23:56 +01:00
7f892a47d7 fix: mount individual Netdata config files instead of directory
Changed from mounting entire go.d directory to mounting specific
config files (postgres.conf, filecheck.conf) to avoid conflicts
with Netdata's initialization script which needs to write to the
go.d directory during startup.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 18:53:26 +01:00
4b098b9463 feat: configure Netdata monitoring for PostgreSQL and Restic backups
Added monitoring configurations for infrastructure services:

- **PostgreSQL monitoring** (netdata/go.d/postgres.conf):
  - Configured go.d postgres collector with netdata user credentials
  - Monitors core PostgreSQL instance at 172.18.0.5:5432
  - Tracks database performance, connections, queries, and replication

- **Restic backup monitoring** (netdata/go.d/filecheck.conf):
  - Configured go.d filecheck collector for backup repository
  - Monitors /mnt/hidrive/users/valknar/Backup directory
  - Tracks backup repository size and modification times
  - Detects backup failures via directory state changes

Infrastructure updates:
- Mounted go.d configuration directory in Netdata container
- Mounted HiDrive backup directory (read-only) for monitoring
- Persistent collector configurations across container restarts

All monitoring visible in Netdata dashboard at netdata.pivoine.art
with HTTP Basic Auth protection.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 18:50:19 +01:00
3c7aad09ad security: add HTTP Basic Auth to Netdata dashboard
Added HTTP Basic Authentication to secure the Netdata monitoring dashboard:
- Added basicauth middleware using shared AUTH_USERS credentials
- Protects sensitive infrastructure metrics from unauthorized access
- Uses same credentials as Scrapy and other protected services
- Maintains SSL/TLS encryption via Traefik

Security improvements:
- Dashboard now requires username/password
- Prevents public access to server metrics
- Infrastructure monitoring data protected
- Follows security best practices from Netdata documentation

Access requires credentials stored in AUTH_USERS environment variable.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 18:37:01 +01:00
66579fa861 feat: add Netdata monitoring stack
Added Netdata real-time monitoring system at netdata.pivoine.art:
- Real-time infrastructure and container monitoring
- Auto-discovers all Docker containers
- Tracks CPU, memory, disk, network usage per service
- Low overhead monitoring (~1-3% CPU)
- Self-hosted with web dashboard on port 19999

Configuration:
- Created netdata/compose.yaml with full Traefik integration
- Added to main compose.yaml include list
- Added environment variables to arty.yml
- Mounted Docker socket for container metrics
- Mounted system directories for host metrics (/proc, /sys, /var/log)
- Three persistent volumes: config, lib, cache
- Required capabilities: SYS_PTRACE, SYS_ADMIN for system monitoring
- Watchtower enabled for automatic updates

Benefits for infrastructure:
- Monitor 20+ running services in real-time
- Track PostgreSQL, Redis, Traefik performance
- Watch backup processes (Backrest/Restic)
- Monitor Jellyfin transcoding load
- Alert on resource issues before they become critical
- Historical data for capacity planning

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 18:28:47 +01:00
955858a0a1 feat: add Excalidraw to Kit stack
Added Excalidraw collaborative drawing tool to the Kit toolkit at draw.kit.pivoine.art:
- Virtual whiteboard for sketching hand-drawn diagrams
- Infinite canvas with collaborative features
- Image: excalidraw/excalidraw:latest
- Exposed on port 80 via Traefik with SSL

Configuration:
- Added draw service to kit/compose.yaml
- Added KIT_DRAW_IMAGE and KIT_DRAW_TRAEFIK_HOST to arty.yml
- Health check disabled to prevent false negatives
- Follows same pattern as other Kit tools
- Watchtower enabled for automatic updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 17:32:12 +01:00
506d6bc580 fix: disable health check for Units service
Disabled health check for Units converter service as it was failing
due to IPv6 connection attempts. The service is running correctly
but the health check was trying to connect to [::1]:80 instead of
127.0.0.1:80, causing false negatives.

Similar to Pastel services, disabling the built-in health check.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 11:30:37 +01:00
a4f49251e3 fix: correct Units service port from 3000 to 80
Fixed port configuration for Units converter service:
- Changed loadbalancer.server.port from 3000 to 80
- Matches the actual nginx port in the units-ui container

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 11:28:28 +01:00
ad89b96dc0 feat: add Units converter tool to Kit stack
Added Units converter to the Kit toolkit at units.kit.pivoine.art:
- Unit conversion tool for length, weight, temperature, etc.
- Image: ghcr.io/valknarness/units-ui:latest
- Exposed on port 3000 via Traefik with SSL

Configuration:
- Added units service to kit/compose.yaml
- Added KIT_UNITS_IMAGE and KIT_UNITS_TRAEFIK_HOST to arty.yml
- Follows same pattern as other Kit tools (Vert, Paint, Pastel, Stirling)
- Watchtower enabled for automatic updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-08 10:40:30 +01:00
30856e88fc fix: rename sterling to stirling (correct spelling)
Fixed typo in Stirling PDF service naming:
- Renamed service from sterling to stirling
- Updated all variable names: KIT_STERLING_* to KIT_STIRLING_*
- Updated domain: sterling.kit.pivoine.art to stirling.kit.pivoine.art
- Updated container name: kit_sterling to kit_stirling

This matches the correct spelling of Stirling-PDF.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 19:09:05 +01:00
aab8470d77 feat: add Stirling PDF tool to Kit stack
Added Stirling PDF (S-PDF) to the Kit toolkit at sterling.kit.pivoine.art:
- PDF manipulation tool with 100+ features
- Merge, split, convert, OCR, compress PDFs
- Privacy-focused: local processing, no data collection
- Image: frooodle/s-pdf:latest
- Exposed on port 8080 via Traefik with SSL

Configuration:
- Added sterling service to kit/compose.yaml
- Added KIT_STERLING_IMAGE and KIT_STERLING_TRAEFIK_HOST to arty.yml
- Follows same pattern as other Kit tools (Vert, Paint, Pastel)
- Watchtower enabled for automatic updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 19:06:23 +01:00
8dabe7a40b refactor: remove Traefik exposure from Pastel API
Removed all Traefik labels from pastel_api service since the API
is now only accessed internally by pastel_ui via Docker network.

Changes:
- Removed traefik.enable and all HTTP/HTTPS router configurations
- Removed path prefix routing (/api)
- Kept only Watchtower label for auto-updates
- API now accessible only at http://pastel_api:3000 internally

This simplifies the configuration and improves security by not
exposing the API endpoint externally.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 16:12:04 +01:00
5d1094efbb fix: update Pastel UI to use internal API URL
Changed Pastel UI environment variable to use internal Docker
network communication instead of external HTTPS:
- Changed from NEXT_PUBLIC_API_URL/NEXT_PUBLIC_APP_URL to PASTEL_API_URL
- Use internal container name: http://pastel_api:3000
- Removes dependency on external domain resolution
- Improves performance by avoiding Traefik proxy for internal calls

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 16:10:34 +01:00
85e0aa4fb6 refactor: switch Filestash from custom build to official image
Removed custom Dockerfile and switched to using the official
machines/filestash image from Docker Hub:
- Removed stash/Dockerfile (custom build with ffmpeg)
- Updated compose.yaml to use ${STASH_IMAGE} variable
- Defaults to machines/filestash:latest

This simplifies maintenance and ensures we use the officially
maintained image with proper updates via Watchtower.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 15:57:51 +01:00
fed4f23015 fix: update Pastel UI environment variables format
Changed environment variable format from array to object syntax
for better Docker Compose compatibility:
- NEXT_PUBLIC_API_URL: https://pastel.kit.pivoine.art
- NEXT_PUBLIC_APP_URL: https://pastel.kit.pivoine.art

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 15:43:41 +01:00
e5aba18249 fix: add environment variables and disable health checks for Pastel services
Fixed Pastel color palette generator services in Kit stack:
- Disabled health checks for pastel_api (curl not available in image)
- Disabled health checks for pastel_ui (unnecessary)
- Added NEXT_PUBLIC_API_URL environment variable to pastel_ui
- Added NEXT_PUBLIC_APP_URL environment variable to pastel_ui

Health checks were showing containers as unhealthy even though services
were running correctly. The API health check used curl which isn't
installed in the image, causing false negatives.

Environment variables configure the Next.js frontend to correctly
connect to the API endpoint.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 15:37:26 +01:00
7b8b414dd3 fix: pastel ports 2025-11-07 15:18:59 +01:00
9a77bdb211 feat: add Pastel color palette generator to Kit stack
Added Pastel service with API and UI to the Kit toolkit:

**New Services:**
- pastel_api: Backend API for color palette generation
  - Image: ghcr.io/valknarness/pastel-api:latest
  - Routes: https://pastel.kit.pivoine.art/api

- pastel_ui: Frontend UI for interactive palette generation
  - Image: ghcr.io/valknarness/pastel-ui:latest
  - Routes: https://pastel.kit.pivoine.art

**Features:**
- Color harmony algorithms
- Interactive palette generation
- Export in various formats
- Programmatic API access
- Path-based routing (UI on root, API on /api)

**Configuration:**
- Updated arty.yml with KIT_PASTEL_* variables
- Updated documentation (CLAUDE.md, README.md)
- Added Traefik labels with SSL, compression, security headers
- Watchtower auto-update enabled

Kit stack now includes 5 services:
- Landing page (kit.pivoine.art)
- Vert file converter (vert.kit.pivoine.art)
- Paint image editor (paint.kit.pivoine.art)
- Pastel color generator (pastel.kit.pivoine.art)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 14:43:50 +01:00
739982d8a7 feat: remove HTTP Basic Auth from Kit stack services
Removed authentication middleware from Vert and Paint services:
- Removed basicauth middleware labels from vert service
- Removed basicauth middleware labels from paint service
- Updated middleware chains to exclude auth
- Updated CLAUDE.md to reflect public access

All Kit stack services (landing, vert, paint) are now publicly
accessible without authentication as they are client-side tools
that don't require protection.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 12:14:46 +01:00