505 Commits

Author SHA1 Message Date
fd8a2ca23c fix: smooth color transitions across header, content, and footer
Unified background colors for smoother visual flow:

Changes:
- Header background: bg-darker → bg-dark (matches body)
- Footer background: bg-darker → bg-dark (matches body)
- Body background: bg-darker → bg-dark (consistent base color)
- Removed redundant main content background override

This creates a cohesive color scheme where:
- Body, header, and footer all use bg-dark (HSL 0, 0%, 17.5%)
- Cards and panels use bg-lighter (HSL 0, 0%, 22%) for subtle contrast
- Rose borders on header/footer provide visual separation
- No more jarring black-to-gray transitions

The result is a smooth, unified dark theme with the Pivoine rose
accent colors providing visual interest and hierarchy.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 05:05:34 +01:00
583a77493e feat: improve theme contrast and button styling
Enhanced the Pivoine theme with better visual hierarchy and usability:

Logo improvements:
- Fixed logo selector to target .navbar-brand img (not just .logo)
- Logo now properly colorized with primary rose/magenta color

Contrast improvements:
- Changed body background to darker shade (bg-darker)
- Added main content area with lighter background (bg-dark) for better separation
- Added heading styles with rose accent color
- H1/H2 headings now have rose bottom border for visual hierarchy

Button refinements:
- Split button styling into primary buttons and filter buttons
- Filter buttons (.btn-light in .btn-group) now have subtle, elegant styling:
  * Lighter background with border
  * Smaller size and lighter font weight
  * Hover shows rose border and text color
  * Active state has solid rose background
- Primary buttons maintain bold rose background styling

The result is clearer visual separation between navigation, content, and
interactive elements with better contrast throughout.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 05:01:45 +01:00
09a60e1bd6 fix: remove Bootstrap .container from card styling
Fixed awkward appearance where Bootstrap .container elements were being
styled as cards with backgrounds, borders, and padding.

Changes:
- Removed .container from card/panel styling rule
- Added explicit .container reset to transparent background
- Removed .container from responsive design rule
- .container now maintains proper Bootstrap layout behavior

This fixes the "inner looks like a card" issue where main content areas
had unwanted card styling applied.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:54:17 +01:00
b88a6439f5 fix: target Bootstrap-specific classes in custom theme
Updated custom.css to target the actual Bootstrap classes used by
asciinema server instead of generic selectors:

- Added .navbar-dark and .bg-dark overrides for navigation
- Added .btn-light targeting for button styles
- Added .btn.active and .btn-light.active for active button states

This ensures the Pivoine theme properly overrides Bootstrap's default
dark theme classes.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:50:25 +01:00
5add5f4482 fix: remove pre-compressed CSS files to serve updated custom theme
Updated entrypoint-wrapper.sh to delete .css.gz files after injecting
custom CSS. The web server was serving old pre-compressed files instead
of our updated CSS with the Pivoine theme.

Changes:
- Remove app.css.gz and app-*.css.gz after CSS injection
- Forces web server to serve uncompressed updated CSS files
- Ensures custom Pivoine theme is visible on production

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:45:48 +01:00
c35f941882 fix: correct asciinema entrypoint command for server startup
Fixed server endpoints not starting by correcting the entrypoint wrapper
script to use the proper command: /sbin/tini -- /opt/app/bin/server

Changes:
- Updated entrypoint-wrapper.sh to exec /sbin/tini instead of /opt/app/bin/asciinema
- Removed incorrect command: ["start"] from compose.yaml
- Custom CSS injection now working with proper server startup
- Both main (port 4000) and admin (port 4002) endpoints now running

The custom Pivoine theme CSS is successfully injected at container startup
and served via both app.css and hashed app-*.css files.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:29:13 +01:00
fcf3aa2ff5 feat: inject custom CSS theme into asciinema
Added entrypoint wrapper script that injects custom.css into the
main app.css file at container startup. This allows the custom
Pivoine theme to be applied without building a custom image.

Changes:
- Mount custom.css to static assets directory
- Add entrypoint-wrapper.sh to inject CSS on startup
- Append custom CSS to both app.css and hashed app-*.css

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:24:17 +01:00
a1a3d06e26 fix: explicitly link Traefik routers to services
Fixed 404 error by explicitly specifying which service each router
should use. Traefik was unable to automatically link routers when
multiple services were defined.

Added service specification to all routers:
- asciinema-web → asciinema service
- asciinema-web-secure → asciinema service
- asciinema-admin-web → asciinema-admin service
- asciinema-admin-web-secure → asciinema-admin service

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:17:05 +01:00
9ce78d4df6 feat: disable sign up for asciinema
Set ASCIINEMA_SIGN_UP_DISABLED to true to prevent new user registrations.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:13:37 +01:00
f647e1327b feat: expose asciinema admin interface via Traefik
Added admin interface routing at admin.asciinema.pivoine.art:
- Port 4002 exposed via Traefik
- HTTP Basic Auth protection using AUTH_USERS
- HTTPS with Let's Encrypt certificate
- Security headers and compression middleware

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:07:44 +01:00
be146b2bb5 fix: add extra_hosts for smtp.ionos.de to asciinema
Force IONOS SMTP server IP (213.165.67.97) in /etc/hosts
to bypass potential DNS resolution issues.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:05:00 +01:00
143e102154 fix: simplify asciinema SMTP configuration
Removed unnecessary SMTP settings that were causing issues:
- URL_PORT (not needed)
- SMTP_AUTH (default behavior)
- SMTP_RETRIES (default behavior)
- SMTP_NO_MX_LOOKUPS (causing connection issues)
- MAIL_REPLY_TO_ADDRESS (not essential)
- UNCLAIMED_RECORDING_TTL (not essential)

Using minimal working SMTP configuration.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 04:00:10 +01:00
c3a8b55a58 fix: set SMTP_NO_MX_LOOKUPS to false
Email delivery still failing with true, trying false.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:33:20 +01:00
be6ab97e56 test: change SMTP_NO_MX_LOOKUPS to true
Testing with MX lookups disabled (true).

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:31:14 +01:00
1bbe3085a7 test: add SMTP_NO_MX_LOOKUPS=false to asciinema config
Testing with MX lookups disabled (false).

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:30:05 +01:00
a9327650b3 fix: remove extra SMTP settings from asciinema config
Removed SMTP_NO_MX_LOOKUPS and SMTP_ALLOWED_TLS_VERSIONS settings
that were added during troubleshooting. Using only basic SMTP
configuration that works for other services (mattermost, tandoor).

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:23:11 +01:00
98db62b07b fix: change SMTP_AUTH from login to always
SMTP_AUTH must be 'always', 'never', or 'if_available', not 'login'.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:12:50 +01:00
8ece868a45 fix: add SMTP_AUTH and SMTP_ALLOWED_TLS_VERSIONS
Added SMTP_AUTH: login and SMTP_ALLOWED_TLS_VERSIONS to help
with SSL handshake on port 465.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:10:43 +01:00
7799bb2a82 fix: use SMTP_SSL without SMTP_TLS for port 465
For implicit SSL on port 465, we need SMTP_SSL: true and should
NOT set SMTP_TLS (which is for STARTTLS on port 587).
Added SMTP_NO_MX_LOOKUPS to skip MX record lookups.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:06:26 +01:00
958891d4be fix: revert to use EMAIL_SMTP_PORT from .env
Reverted to use ${EMAIL_SMTP_PORT} from .env (port 465) since
this configuration works for other services.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:04:09 +01:00
042fd5ccd8 fix: switch to port 587 with STARTTLS for IONOS SMTP
Port 465 with implicit SSL is not working. Switching to port 587
with STARTTLS (SMTP_TLS: always) which is more compatible with
Swoosh SMTP adapter.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 03:01:35 +01:00
64f22a2822 fix: add SMTP SSL verification and MX lookup settings
Added SMTP_NO_MX_LOOKUPS, SMTP_TLS_VERIFY_HOST, and
SMTP_TLS_VERIFY_CERT settings to fix SSL connection issues
with IONOS SMTP on port 465.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:59:45 +01:00
bb3bab937b fix: remove colon from SMTP_TLS value
Environment variables are strings. Use 'never' not ':never' so
the Elixir code can convert it to an atom properly.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:57:29 +01:00
c4a1a44bae fix: set SMTP_TLS to :never for Elixir atom
SMTP_TLS must be an Elixir atom (:never, :always, or :if_available).
Using :never for implicit SSL on port 465.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 02:55:54 +01:00
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