Commit Graph

359 Commits

Author SHA1 Message Date
f9c953ecbc feat: add Authelia SSO authentication service
- Add Authelia service to NET stack for centralized SSO
- Create configuration.yml with PostgreSQL storage
- Create users_database.yml for file-based user management
- Add authelia database to PostgreSQL init script
- Configure Traefik ForwardAuth middleware
- Add environment variables to arty.yml
- Supports TOTP and WebAuthn 2FA
- Email notifications via Mailpit SMTP relay
- Protected services: netdata, mailpit, scrapy, restic, traefik, dev, n8n, asciinema, coolify
2025-11-15 19:53:04 +01:00
b19afa6a04 fix: move Gitea APP_NAME to root level config 2025-11-15 19:18:24 +01:00
eb61a9971c feat: set Gitea APP_NAME to dev.pivoine.art 2025-11-15 19:16:38 +01:00
8dcf503724 feat: update Gitea branding - change icons to #6cb6eb blue, fix icon and title 2025-11-15 19:13:29 +01:00
a39c4fb0fe feat: recolor Gitea logo to #d38aea pink/magenta
Add CSS filter to logo.svg and favicon.svg to change color to #d38aea

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 19:06:08 +01:00
56a8f2d6a3 feat: add custom Gitea landing page and re-enable public access
- Disable REQUIRE_SIGNIN_VIEW to allow public landing page
- Mount custom templates directory
- Add custom home.tmpl with simple welcome page and sign-in button
- Remove default Gitea promotional content

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 19:00:37 +01:00
c57897652e feat: set Gitea default theme to edge-dark and require sign-in
- Change default theme from gitea-dark to edge-dark
- Enable REQUIRE_SIGNIN_VIEW to hide landing page from anonymous users

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 18:56:33 +01:00
498f142fc8 fix: use SMTP relay instead of forward with MP_SMTP_RELAY_ALL
- Change from MP_SMTP_FORWARD_* to MP_SMTP_RELAY_*
- Add MP_SMTP_RELAY_ALL=true to relay all emails
- Preserves original recipients (relay vs forward)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 18:50:01 +01:00
c0c9d77164 fix: use correct Mailpit SMTP forward environment variables
Use MP_SMTP_FORWARD_* not MP_SMTP_RELAY_*
Add MP_SMTP_FORWARD_TLS for port 465 implicit TLS

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 18:48:54 +01:00
5fdde76285 fix: remove STARTTLS config for IONOS port 465
Port 465 uses implicit TLS, not STARTTLS.
Mailpit auto-detects TLS for port 465.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 18:46:48 +01:00
ea6587f176 fix: configure Mailpit relay via environment variables
- Remove mailpit-relay.yaml file (env vars not substituted in mounts)
- Use MP_SMTP_RELAY_* environment variables directly
- Fixes crash loop due to missing relay host configuration

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 18:46:01 +01:00
51267cc674 feat: add Mailpit SMTP relay and migrate all services
- Add Mailpit service to NET stack with web UI at mailpit.pivoine.art
- Configure Mailpit to relay all emails through IONOS SMTP
- Migrate all 11+ services to use Mailpit instead of direct IONOS SMTP:
  * SEXY: Directus API
  * UTIL: Joplin, Mattermost, Vaultwarden, Tandoor, Linkwarden
  * DEV: Gitea, n8n, Asciinema
  * AI: Open WebUI
  * NET: Netdata (via msmtp)
- Centralize SMTP credentials in mailpit-relay.yaml
- Simplify service configs (no auth/TLS for internal SMTP)
- Enable email monitoring via Mailpit web UI with Basic Auth

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 18:34:38 +01:00
5bc790b79b docs: comprehensive README update to reflect current 7-stack architecture with 29 services 2025-11-15 18:23:53 +01:00
4999ace4bd docs: add CI/CD pipeline section and update ship's log 2025-11-15 18:18:31 +01:00
bab9ed4d09 feat: switch sexy frontend to use Gitea container registry image 2025-11-15 18:15:54 +01:00
b5eec43304 feat: add runner config to mount Docker socket in job containers 2025-11-15 17:39:04 +01:00
808044bc2e fix: use catthehacker/ubuntu images with Docker for Gitea runner 2025-11-15 17:32:10 +01:00
c78ffb953a fix: mount Docker binary in Gitea runner for Docker commands 2025-11-15 17:31:01 +01:00
3dab00b6d4 fix: add privileged mode to Gitea runner for Docker access 2025-11-15 17:30:18 +01:00
8d6791a246 feat: add Coolify network to Traefik for routing to Coolify containers 2025-11-15 17:28:32 +01:00
f72c2ef2b5 chore: remove obsolete environment variables from arty.yml
Removed duplicate STASH_* and JELLY_* variables that have been replaced by MEDIA_* variables after consolidation into the media stack.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 17:09:45 +01:00
becfc4cde2 chore: remove old restic stack directory
Backrest service has been moved to core stack.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 17:06:51 +01:00
d55fde92b6 feat: move restic (backrest) to core stack
- Add backrest service to core/compose.yaml with CORE_RESTIC_ prefix
- Update arty.yml with CORE_RESTIC_* environment variables
- Remove restic from compose.yaml includes
- Backrest now part of core infrastructure stack

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 17:05:18 +01:00
34ac4a35c3 chore: remove old proxy, netdata, watch, and umami stack directories
All services have been consolidated into the net stack.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 17:03:09 +01:00
23fbae0228 feat: create net stack consolidating proxy, netdata, watchtower, and umami
- Create net/compose.yaml with 4 services (traefik, netdata, watchtower, umami)
- Update arty.yml with NET_* environment variables
- Update compose.yaml to include net instead of individual stacks
- Update restic volume references to net_letsencrypt_data and net_netdata_config
- Copy configuration files to net/ directory (Dockerfile, dynamic/, go.d/, etc.)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 17:00:36 +01:00
f0ab11502a feat: create util stack consolidating utility services
Consolidates 6 utility services into a single util stack:
- drop (PairDrop) - P2P file sharing
- joplin (Joplin Server) - Note-taking and sync
- links (Linkwarden) - Bookmark manager with Meilisearch
- mattermost (Mattermost) - Team collaboration
- vault (Vaultwarden) - Password manager
- tandoor (Tandoor) - Recipe manager

Changes:
- Created util/compose.yaml with all 6 services
- Moved rtc_config.json to util directory
- Updated environment variables to use UTIL_ prefix
- Updated restic volume references to util_* names
- Container names changed from {service}_app to util_{service}
- Volume names changed from {service}_* to util_{service}_*
- Removed individual stack directories (drop, joplin, links, mattermost, vault, tandoor)
- Updated compose.yaml to include util/compose.yaml instead of individual stacks

All services maintain their original hostnames and functionality.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 16:44:21 +01:00
c506a92800 feat: move asciinema to dev stack under asciinema.dev.pivoine.art
- Moved asciinema service from standalone stack to dev/compose.yaml
- Updated hostname from asciinema.pivoine.art to asciinema.dev.pivoine.art
- Updated environment variables to use DEV_ASCIINEMA_ prefix
- Updated restic backup volume reference (asciinema_data -> dev_asciinema_data)
- Moved custom.exs to dev/asciinema-custom.exs
- Removed standalone asciinema/compose.yaml directory
- Container name changes from asciinema_app to dev_asciinema
- Volume name changes from asciinema_data to dev_asciinema_data
- Preserved admin interface at admin.asciinema.dev.pivoine.art with Basic Auth

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 16:34:28 +01:00
4f01e01cae feat: move n8n to dev stack under n8n.dev.pivoine.art
- Moved n8n service from standalone stack to dev/compose.yaml
- Updated hostname from n8n.pivoine.art to n8n.dev.pivoine.art
- Updated environment variables to use DEV_N8N_ prefix
- Updated restic backup volume reference (n8n_n8n_data -> dev_n8n_data)
- Removed standalone n8n/compose.yaml
- Container name changes from n8n_app to dev_n8n
- Volume name changes from n8n_n8n_data to dev_n8n_data

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 16:28:15 +01:00
e7390a5ab1 chore: remove sablier, scrapy, and vpn stacks
Remove three unused stacks and related configuration:
- Removed sablier, scrapy, vpn from compose includes
- Deleted sablier/compose.yaml, scrapy/compose.yaml, vpn/compose.yaml
- Removed scrapy-backup from restic config
- Removed scrapy volume mounts from restic compose
- Removed SABLIER, SCRAPY, VPN env vars from arty.yml
- Cleaned up sexy/uploads directory

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 16:22:45 +01:00
37c45065e2 chore: remove kit stack
Remove kit service and related configuration:
- Removed kit from compose includes
- Deleted kit/compose.yaml (landing, vert, pastel, stirling, units, draw, figlet)
- Removed KIT env vars from arty.yml

Kit services were stateless and don't require data migration.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 16:17:28 +01:00
07b107c865 chore: remove awsm stack
Remove awsm service and related configuration:
- Removed awsm from compose includes
- Deleted awsm/compose.yaml
- Removed awesome-backup from restic config
- Removed awsm volume mount from restic
- Removed AWSM env vars from arty.yml
- Removed awsm/import script

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 16:11:33 +01:00
91fd8be904 refactor: consolidate WebSocket config to PUSHER_* variables
- Change PUSHER_HOST to public URL (coolify-realtime.coolify.dev.pivoine.art)
- Update PUSHER_PORT from 6001 to 443 (HTTPS)
- Add PUSHER_SCHEME=https
- Remove VITE_PUSHER_* variables (redundant)
- Change label quotes from single to double

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 14:48:36 +01:00
5a42268369 feat: add VITE_PUSHER environment variables for frontend WebSocket
Configure browser to connect to Soketi via HTTPS through Traefik:
- VITE_PUSHER_HOST: coolify-realtime.coolify.dev.pivoine.art
- VITE_PUSHER_PORT: 443
- VITE_PUSHER_SCHEME: https

This fixes the 'Cannot connect to real-time service' warning.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 14:39:06 +01:00
ab632fd054 feat: expose Soketi WebSocket server via Traefik
Add Traefik labels to Soketi to make it accessible at
coolify-realtime.coolify.dev.pivoine.art for browser WebSocket connections

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 14:05:44 +01:00
8a1eee975f fix: update Soketi healthcheck to use 127.0.0.1 instead of localhost
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 13:56:37 +01:00
44ecff89c8 fix: use correct Coolify port 8080 for Traefik routing 2025-11-15 13:32:44 +01:00
3ff112ccb3 fix: use shared core PostgreSQL for Coolify instead of separate instance 2025-11-15 13:31:05 +01:00
30249bd3ca fix: use correct soketi image tag (1.0-16-alpine) 2025-11-15 13:28:27 +01:00
7e9a58357f feat: add Coolify volumes to Restic backup configuration
Add Coolify data and PostgreSQL volumes to daily backup schedule:
- dev_coolify_data - Coolify application data
- dev_coolify_postgres_data - Coolify database

Backup schedule: Daily at midnight (0 0 * * *)
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-15 13:25:08 +01:00
140b240bab feat: add Coolify deployment platform to dev stack
Add Coolify self-hosted deployment platform with:
- Coolify main service at coolify.dev.pivoine.art
- Dedicated PostgreSQL database (uses shared core instance)
- Soketi WebSocket server for real-time features
- Traefik routing with HTTPS and compression
- Environment variables in arty.yml (secrets in .env)
- Database creation in PostgreSQL init script

Coolify enables deploying applications from Git repositories,
including the pivoine.art Jekyll site from Gitea.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 13:24:09 +01:00
5d3fa7618b fix: expose Gitea SSH port 2222 and update SSH_PORT setting
- Add ports mapping to expose SSH port 2222 on host
- Change SSH_PORT from 22 to 2222 for correct clone URL display
- Gitea will now show git@dev.pivoine.art:2222/user/repo.git in UI

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 13:07:49 +01:00
414ff269b2 fix: correct Gitea custom assets mount path for themes and favicon
Move custom assets from /data/gitea/custom/public to /data/gitea/public
to properly serve custom themes and favicon/logo files. Gitea expects
custom public assets at /data/gitea/public, not nested under custom/.

- Restructured dev/custom/public/ to dev/public/
- Updated volume mount in dev/compose.yaml
- Includes 21 custom themes from sainnhe/gitea-themes
- Includes custom favicon and logo

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 12:20:42 +01:00
485edffa48 docs: update README with gitea-dark as default theme
Note that custom themes are available for manual selection but may not work as default

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 12:16:53 +01:00
77a81d29f0 fix: change default theme to gitea-dark (built-in)
Custom themes not loading properly, reverting to built-in theme.
Custom themes still available in theme list for manual selection.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 12:16:07 +01:00
07bcba01fa feat: set edge-dark as default Gitea theme
- Change DEFAULT_THEME from gitea-auto to edge-dark
- Add THEME_COLOR_META_TAG for edge-dark (#333644)
- Custom favicon and logo already configured in custom directory

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 12:13:46 +01:00
d73504a1de fix: use correct default theme name for Gitea
- Change DEFAULT_THEME from 'auto' to 'gitea-auto'
- Add 'arc-green' to themes list (standard Gitea theme)
- Remove invalid 'auto' theme name from THEMES list

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 12:03:22 +01:00
644c437b31 fix: remove deprecated Gravatar environment variables
- Remove GITEA__picture__* environment variables (deprecated in Gitea 1.18+)
- Gravatar must be configured via admin panel in modern Gitea versions
- Add README.md with post-installation configuration instructions
- Document Gravatar setup, runner registration, themes, and custom assets

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 12:01:20 +01:00
fbdca7c5a2 fix: correct Gitea custom directory mount path
Change from ./dev/custom to ./custom since compose.yaml is in dev/ directory

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 11:57:24 +01:00
17653546b8 fix: reorganize Gitea customizations to proper directory structure
- Move themes to dev/custom/public/assets/css/ (correct Gitea custom path)
- Add custom favicon.svg and logo.svg to dev/custom/public/assets/img/
- Update volume mount to use /data/gitea/custom instead of incorrect path
- Follows Gitea customization documentation structure

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 11:56:23 +01:00
92a96b5f6e feat: add custom themes and enable Gravatar for Gitea
- Add 21 custom themes from sainnhe/gitea-themes:
  - Edge (auto, dark, light)
  - Everforest (auto, dark, light)
  - Gruvbox (auto, dark, light)
  - Gruvbox Material (auto, dark, light)
  - Nord, Palenight, Soft Era
  - Sonokai (base + 5 variants)
- Enable Gravatar for user avatars
- Set default theme to auto (system preference)
- Mount themes directory to Gitea container

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 11:53:16 +01:00