Commit Graph

23 Commits

Author SHA1 Message Date
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
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
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