Commit Graph

458 Commits

Author SHA1 Message Date
813823995c fix: disable prompt caching for claude-sonnet-4.5
Explicitly set drop_params and supports_prompt_caching=false for
claude-sonnet-4.5 model to prevent prompt_cache_key parameter from
being sent to Anthropic API.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 12:22:27 +01:00
f36e0fa9eb fix: enhance litellm parameter dropping for codex compatibility
Add router_settings and default_litellm_params to ensure unsupported
parameters like prompt_cache_key are properly dropped when using codex
with the litellm proxy.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-11 12:14:00 +01:00
ce6c60d8e0 fix: disable responses ID security for Codex CLI compatibility
Added disable_responses_id_security setting to allow Codex CLI to access
the /responses endpoint without 401 errors. This removes the encryption
requirement on response IDs while maintaining API key authentication.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 19:00:55 +01:00
db69b30d06 feat: add PostgreSQL initialization script for AI stack
Created database initialization script following the core stack pattern.
The script automatically creates required databases on first initialization:
- openwebui: Open WebUI application database
- litellm: LiteLLM proxy database for API key management and tracking

Changes:
- Created ai/postgres/init/01-init-databases.sh
- Mounted init directory in ai_postgres service
- Added automatic privilege grants to AI_DB_USER

Note: Init script only runs on first database creation when volume is empty.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:36:50 +01:00
5a6b007cf3 feat: connect LiteLLM to AI PostgreSQL database
LiteLLM now uses the ai_postgres database instance with a dedicated
'litellm' database for API key management, usage tracking, and rate limiting.

Changes:
- Set DATABASE_URL to postgresql://ai:password@ai_postgres:5432/litellm
- Added depends_on ai_postgres to ensure DB starts first

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:34:10 +01:00
b6cb155da8 fix: remove HTTP Basic Auth from LiteLLM proxy
Removed authentication middleware to simplify access. LiteLLM now relies
solely on Bearer token authentication via LITELLM_MASTER_KEY.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:30:57 +01:00
87654f5ae8 feat: enable LiteLLM API key authentication
Re-enabled LITELLM_MASTER_KEY for proper API key authentication.
LiteLLM supports master key without database for simple auth scenarios.

- LiteLLM validates Bearer token against master key
- Open WebUI uses same key for internal communication
- External access requires both HTTP Basic Auth + API key

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:25:57 +01:00
7ea4b3ab57 fix: remove LiteLLM MASTER_KEY requirement
Removed LITELLM_MASTER_KEY as it requires a database for virtual key
management. Security is already provided by HTTP Basic Auth on the
public Traefik endpoint. Internal Open WebUI communication doesn't
need additional API key auth.

Security layers:
- Public access: HTTP Basic Auth via Traefik
- Internal LiteLLM: Network isolation (no auth needed)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:21:13 +01:00
2055cbb675 feat: secure LiteLLM API key with environment variable
- Added AI_LITELLM_API_KEY environment variable to .env
- Configured LiteLLM MASTER_KEY for authentication
- Updated Open WebUI to use secure API key from environment
- Generated secure 64-character hex key: sk-77b42236...

This replaces the insecure hardcoded sk-1234 key with proper
secret management via environment variables.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:19:26 +01:00
16dd8064d4 fix: disable LiteLLM healthcheck due to missing curl
Healthcheck was failing because curl is not installed in the LiteLLM
container, causing Traefik to mark it as unhealthy and not route traffic.
Disabled healthcheck as Traefik doesn't require it for routing.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:13:26 +01:00
c86faf1898 fix: bind LiteLLM to 0.0.0.0 for Traefik accessibility
LiteLLM was binding to localhost by default, making it unreachable
from Traefik reverse proxy. Added --host 0.0.0.0 parameter to allow
connections from the Docker network.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:10:15 +01:00
eb4a025c20 feat: add HTTP Basic Auth to LiteLLM for enhanced security
Added Traefik Basic Auth middleware to LiteLLM public endpoint for
two-layer security:
1. HTTP Basic Auth (Traefik level)
2. API Key authentication (LiteLLM level)

Changes:
- Added basicauth middleware using AUTH_USERS credentials
- Chained auth middleware before compression and security headers
- Prevents unauthorized access to public LiteLLM endpoint

Usage with Codex:
export OPENAI_BASE_URL=https://username:password@llm.ai.pivoine.art
export OPENAI_API_KEY=sk-1234

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 18:04:09 +01:00
1d69107ebb feat: expose LiteLLM publicly for Codex CLI integration
Added Traefik configuration to make LiteLLM accessible at llm.ai.pivoine.art
for use with @openai/codex CLI tool.

Changes:
- Added AI_LITELLM_TRAEFIK_HOST to arty.yml (llm.ai.pivoine.art)
- Updated ai/compose.yaml litellm service with full Traefik labels
- HTTP to HTTPS redirect
- SSL termination via Let's Encrypt
- Compression and security headers

This allows external tools like Codex to use Claude models via
OpenAI-compatible API endpoint.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 17:56:34 +01:00
e41335d2ee refactor: remove paint service from kit stack
Removed miniPaint image editor service from the kit stack:
- Deleted paint service definition from kit/compose.yaml
- Removed Dockerfile for paint build
- Removed KIT_PAINT_TRAEFIK_HOST from arty.yml
- Stopped and removed kit_paint container

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 15:18:53 +01:00
893f11db20 fix: disable Watchtower auto-updates for paint service
Paint service uses a custom Dockerfile build from GitHub, so it shouldn't
be auto-updated by Watchtower. Set watchtower.enable=false explicitly.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 14:47:35 +01:00
81ad33dce1 feat: add Mattermost notifications to Backrest via Shoutrrr hooks
Added global notification hook for all backup operations (backup, prune, check)
using Shoutrrr with Mattermost webhook.

Configuration:
- Hook ID: mattermost-notifications
- Conditions: * (all operations)
- Shoutrrr URL: mattermost://mattermost.pivoine.art/nxsqk4x86jr9bgniheaksem8qy
- Template: Shows operation type, plan/repo ID, status, and errors

Notifications will be sent for:
- All backup operations (17 daily backup plans)
- Weekly prune operations (Sundays at 2 AM)
- Weekly check operations (Sundays at 3 AM)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 14:29:48 +01:00
04ac34444f fix: change Watchtower notification type from mattermost to shoutrrr
Watchtower was failing with "Unknown notification type 'mattermost'" because
'mattermost' is not a valid WATCHTOWER_NOTIFICATIONS value. When using
Shoutrrr URLs (WATCHTOWER_NOTIFICATION_URL), the notification type should
be set to 'shoutrrr' or left empty, as the service type is inferred from
the URL format (mattermost://...).

Changed WATCHTOWER_NOTIFICATIONS from 'mattermost' to 'shoutrrr' to fix
the fatal error that was occurring every minute.

The mattermost:// Shoutrrr URL in WATCHTOWER_NOTIFICATION_URL is correct
and will work once the notification type is fixed.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 14:24:02 +01:00
aba3a22d30 fix: configure netdata to use Slack-compatible webhook for Mattermost
Netdata v2.7 doesn't natively support Mattermost notifications, but
Mattermost supports Slack-compatible webhooks. Changed configuration to
use SEND_SLACK with SLACK_WEBHOOK_URL pointing to the Mattermost webhook.

Configuration changes:
- Changed SEND_MATTERMOST="YES" to SEND_SLACK="YES"
- Changed MATTERMOST_WEBHOOK_URL to SLACK_WEBHOOK_URL
- Updated role_recipients_mattermost to role_recipients_slack
- Webhook URL still uses ${MATTERMOST_WEBHOOK_URL} env var from .env

Tested with: alarm-notify.sh test
Result: All three alarm types (WARNING, CRITICAL, CLEAR) show "OK"

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 14:19:56 +01:00
b471a125a0 feat: add figlet tool to kit stack
Added figlet-ui service to kit stack:
- Image: ghcr.io/valknarness/figlet-ui:latest
- Host: figlet.kit.pivoine.art
- Traefik routing with HTTPS and compression
- Watchtower auto-update enabled

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 13:35:15 +01:00
46ba4e0e06 chore: remove custom theme customization
Remove all theme customization code:
- Removed theme directory (custom.css, custom.js, favicon.svg)
- Removed app.html.heex template override
- Removed Dockerfile for custom build
- Reverted compose.yaml to only mount custom.exs for SMTP config

Keeping only SMTP configuration in custom.exs.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 11:13:09 +01:00
2381076947 feat: mount custom theme template to inject CSS and favicon
Mount app.html.heex template with custom theme links:
- Custom CSS at /assets/custom.css via Routes.static_path()
- Custom favicon at /images/favicon-custom.svg

Phoenix will use the external template file instead of compiled version.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 10:15:49 +01:00
b3bffd8ba8 fix: mount custom.css to assets directory, not css
static_paths only includes: assets, fonts, images, js
The css directory is NOT served by Phoenix.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 09:55:58 +01:00
60e118be31 fix: mount theme files to correct static directory
Static files are in /opt/app/lib/asciinema-1.0.0/priv/static/
not /opt/app/priv/static/

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 09:53:46 +01:00
dd73774f7d fix: remove broken CustomThemeInjector Plug from custom.exs
The Plug was causing AsciinemaWeb.Endpoint to fail on startup.
Reverting to just SMTP configuration while we find a proper way
to inject custom theme.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 09:52:16 +01:00
63b96bb8e7 feat: add custom Pivoine Rose theme to asciinema
- Mount custom CSS, favicon, and JS into static directories
- Create custom.js to inject theme CSS and favicon via JavaScript
- Add CustomThemeInjector Plug in custom.exs to inject script tag
- Custom theme features:
  - Pivoine rose primary color (#CE275B)
  - Gray tone backgrounds
  - Custom SVG favicon with rose gradient
  - Bootstrap 4 component overrides

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 09:50:07 +01:00
95b01afafa feat: patch HTML template to inject custom theme 2025-11-09 09:26:35 +01:00
dce10fb971 feat: override static_paths and add custom head view for theme injection 2025-11-09 09:19:10 +01:00
6fd7c32669 fix: update theme paths to match new mount location 2025-11-09 09:12:41 +01:00
f0540c52bc feat: use Phoenix config for theme injection (cleaner approach) 2025-11-09 08:48:22 +01:00
d37ff0de47 feat: add nginx proxy for theme injection (cleaner approach) 2025-11-09 08:43:36 +01:00
428fd70ac3 feat: add custom Pivoine Rose theme with Bootstrap 4 styling and SVG favicon 2025-11-09 08:34:02 +01:00
73b4fec389 chore: cleanup asciinema SMTP environment variables 2025-11-09 08:21:56 +01:00
5f126d9d8b feat: add custom.exs to skip SMTP TLS certificate verification 2025-11-09 08:18:13 +01:00
5a6ca58e5d test: change SMTP_NO_MX_LOOKUPS to true 2025-11-09 08:13:25 +01:00
f04e182804 fix: change SMTP_AUTH from login to always 2025-11-09 08:06:12 +01:00
8e6cb9018d fix: use SMTP port 465 with SSL instead of STARTTLS 2025-11-09 08:02:06 +01:00
bfe4b467f0 fix: disable SMTP TLS encryption to bypass certificate validation 2025-11-09 08:00:13 +01:00
39426baf9b fix: set SMTP_NO_MX_LOOKUPS to false 2025-11-09 07:56:53 +01:00
6124229f85 fix: specify TLS versions for SMTP connection 2025-11-09 07:49:10 +01:00
ce3a3514a7 fix: remove hardcoded SMTP IP and use port 587 with TLS 2025-11-09 07:45:35 +01:00
aad4c89ab9 fix: use minimal SMTP configuration without explicit port and TLS settings 2025-11-09 07:41:51 +01:00
51fd63cf24 test: disable SMTP TLS encryption to bypass certificate validation 2025-11-09 07:38:01 +01:00
4a3b29a6ea fix: use SMTP_TLS=if_available to allow fallback from TLS 2025-11-09 07:36:29 +01:00
f797945b52 fix: disable TLS certificate verification for IONOS SMTP 2025-11-09 07:32:52 +01:00
d529a4c268 fix: use STARTTLS on port 587 for SMTP instead of SSL 465 2025-11-09 07:29:08 +01:00
0efae463c9 chore: remove custom CSS theme files from repository 2025-11-09 06:07:43 +01:00
e4c0a74437 revert: remove custom CSS theming from asciinema 2025-11-09 06:06:22 +01:00
bf8faccaf8 fix: increase specificity for navbar background override 2025-11-09 05:50:04 +01:00
29c52e3c43 fix: override black navbar background with higher specificity selector 2025-11-09 05:44:55 +01:00
8d66212d9a fix: override default light backgrounds for body, main, pre
Added explicit overrides for body, main, and pre elements to prevent
default light gray (#f7f7f7) backgrounds from showing through.

- Body and main: metal-bg-base (dark)
- Pre/code blocks: metal-bg-elevated (slightly lighter)
- Main container: metal-bg-surface with proper spacing

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 05:40:19 +01:00