Commit Graph

299 Commits

Author SHA1 Message Date
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
f26f0976b5 fix: improve theme consistency and layout
- Added 8px gap to button groups for better spacing
- Fixed header/nav background overlay issue (consolidated styling)
- Added gray background to main container (metal-bg-surface)
- Fixed heading section (removed margin, border-radius, transparent bg)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 05:33:59 +01:00
d6db298409 refactor: polish asciinema theme with cohesive metal grays
Refined the metal gray palette for better consistency and polish:

- Renamed variables to semantic names (base, elevated, surface, interactive, input)
- Reduced color range from 10%-30% to 16%-28% for smoother transitions
- Adjusted saturation to 10-12% for more cohesive palette
- Softened shadows and reduced motion for subtle elegance
- Added distinct heading area background for better hierarchy
- Improved button states with smoother hover transitions
- Refined border weights (1px default, 2px for accents)
- Updated all components to use new semantic variable names

Color hierarchy:
- metal-bg-base (16%): Body, terminal, code blocks
- metal-bg-elevated (19%): Header, footer, control bars, headings
- metal-bg-surface (22%): Cards, tables
- metal-bg-interactive (25%): Buttons, pagination
- metal-bg-input (28%): Form inputs
- metal-border (32%): Subtle borders
- metal-border-strong (40%): Accent borders

Rose accents preserved for all interactive elements.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-09 05:27:42 +01:00
112dc7076d feat: apply varied metal gray backgrounds with rose accents
- Updated color palette to use multiple metal gray shades for visual hierarchy
- Kept original Pivoine rose accent colors for borders, links, and highlights
- Background variations:
  - Darkest (10%): Body, terminal player, code blocks
  - Darker (15%): Header/navbar, table headers
  - Dark (18%): Footer, control bars
  - Base (22%): Filter buttons, pagination
  - Light (26%): Cards, tables, recording items
  - Lighter (30%): Form inputs
  - Border (35%): Borders and separators
- All rose accents preserved for visual pop on dark metal backgrounds

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

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