38 Commits
Author SHA1 Message Date
valknar 21a8ae3897 Revert "fix(gitea): revert cache workarounds, rely on CONFIG_FILE fix instead"
This reverts commit b62b9b1871.
2026-08-24 12:02:47 +02:00
valknar b62b9b1871 fix(gitea): revert cache workarounds, rely on CONFIG_FILE fix instead
Now that CONFIG_FILE is actually loaded by the daemon (see previous
commit), retest with the embedded cache server and default settings
instead of the dedicated cache-server/host.docker.internal workaround -
that whole setup was built to route around a config file that was
silently never being read in the first place.
2026-08-24 12:00:57 +02:00
valknar 50b7ee1b5c fix(gitea): migrate to gitea/runner image, fix daemon config not loading
The renamed gitea/runner project (v1.0.0+) is a straight rename of
act_runner with the binary renamed to gitea-runner. While inspecting
its run.sh, found the actual root cause of the cache config being
ignored all along: run.sh builds --config from the CONFIG_FILE env
var, not from any command: override - it always execs the binary
itself regardless of passed args. The runner service never set
CONFIG_FILE, so runner-config.yaml was never actually loaded by the
daemon despite being correctly mounted.
2026-08-24 11:55:54 +02:00
valknar 79f0c1a293 fix(gitea): cache-server needs external_secret, not external_secret_file
The cache-server subcommand only checks the literal external_secret
field at startup and errors out if just external_secret_file is set
(unlike the daemon, which handles _file fine). Move its config out of
git entirely - it now has to hold the actual secret value - generated
straight into .data on the VPS instead.
2026-08-24 11:39:06 +02:00
valknar e1a540f110 fix(gitea): bypass run.sh entrypoint for the cache-server container
run.sh (act_runner's default image entrypoint) ignores any command args
entirely - it always registers then execs `act_runner daemon`
regardless, with no cache-server mode. The cache-server container was
silently running as a second runner daemon instead. Override the
entrypoint directly to tini + act_runner, skipping run.sh.
2026-08-24 11:30:22 +02:00
valknar 0d85ef73b9 fix(gitea): runner config for caching 4 2026-08-24 11:26:54 +02:00
valknar 99ff1c0c4e fix: wrong act runner config 2026-08-24 09:12:42 +00:00
valknar 6353f662fa fix(gitea): runner config for caching 3 2026-08-24 11:08:48 +02:00
valknar 5b00a9809d fix(gitea): runner config for caching 2 2026-08-24 10:58:15 +02:00
valknar 30ac8954ad fix(gitea): runner config for caching 2026-08-24 10:30:33 +02:00
valknarandClaude Sonnet 5 f151cd9aae fix(gitea): color ui warning/success/error/info message text, not just header
.ui.negative.message .header only tinted the header; the message body and
the warning/success/info variants had no color rule at all across every
Catppuccin theme.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 18:35:13 +02:00
valknarandClaude Sonnet 4.6 aaa4564a0b revert(gitea): remove custom images, use default Gitea logo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 19:27:12 +02:00
valknarandClaude Sonnet 4.6 824c78535b fix(gitea): transparent background, flower maximized to fill square
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 19:01:14 +02:00
valknarandClaude Sonnet 4.6 b46f553457 feat(gitea): replace icons with square Catppuccin Frappé peony icon
Dark Frappé base (#303446) background with the pivoine.art peony
centered and padded. Replaces logo.svg/png, favicon.svg/png, and
apple-touch-icon.png.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 18:52:35 +02:00
valknarandClaude Sonnet 4.6 66536adde7 fix(gitea): set default theme to catppuccin-frappe-blue
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 18:04:21 +02:00
valknarandClaude Sonnet 4.6 9065421264 feat(gitea): replace custom themes with Catppuccin v1.0.2
70 CSS files covering all 4 flavors (Latte/Frappé/Macchiato/Mocha)
× 14 accents + 14 auto variants. Default theme set to Mocha Mauve.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-29 18:01:35 +02:00
valknarandClaude Sonnet 4.6 ec92d55e3c fix(mailpit): bind UI to port 8025 so healthcheck passes; revert email FROM changes
Port 0 disabled the web UI but broke the built-in /readyz healthcheck.
Binding to 8025 keeps the UI accessible within the Docker network only
(no Traefik labels) and lets the container report healthy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:34:40 +02:00
valknarandClaude Sonnet 4.6 1be281ec97 fix(mail): change FROM address to hi@pivoine.art for IONOS relay compatibility
IONOS rejects relay from VPS IPs when sender doesn't match authenticated
account. Switch gitea and passbolt FROM to the actual IONOS account address.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-27 19:09:00 +02:00
valknarandClaude Sonnet 4.6 f65034a2e2 refactor(gitea): move VPS IPv4 address to .env as VPS_IPV4
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 20:42:26 +02:00
valknarandClaude Sonnet 4.6 fa0f5cba4b fix(gitea): update SSH_PORT to 22 to match new external port
Clone URLs now show the correct standard port 22.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 20:27:01 +02:00
valknarandClaude Sonnet 4.6 8797a42d61 fix(gitea): bind SSH explicitly to IPv4 to avoid conflict with sshd on IPv6
Docker binds to both [::]:22 and 0.0.0.0:22 without an explicit IP,
conflicting with sshd on [::]:22.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 20:25:59 +02:00
valknarandClaude Sonnet 4.6 1e5d5254a6 feat(gitea): expose SSH on port 22
sshd is now IPv6-only (ListenAddress ::, bindv6only=1), freeing
IPv4 port 22 for Gitea SSH.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 20:25:42 +02:00
valknarandClaude Sonnet 4.6 8d33836714 fix(gitea): block scraper IP and add rate limiting
74.7.243.196 was crawling valknar/home SVG icon tree at 1.8 req/s.
- Denylist the IP in fail2ban dynamic config
- Add rate-limit@file middleware to Gitea's Traefik router to throttle
  future scrapers on public repos

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-17 10:27:56 +02:00
valknarandClaude Sonnet 4.6 cf32e669cb fix(gitea): use .RunModeIsProd and hardcode Umami values in header template
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:34:21 +02:00
valknarandClaude Sonnet 4.6 e613d766ec fix(gitea): revert to UMAMI_ID/UMAMI_SRC and use .UmamiSrc/.UmamiId template vars
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:26:39 +02:00
valknarandClaude Sonnet 4.6 53608a7195 fix(gitea): use .UmamiSrc/.UmamiScript template vars for Umami analytics
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:24:57 +02:00
valknarandClaude Sonnet 4.6 735adfabea feat(gitea): add conditional Umami analytics via env vars in header
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-16 10:17:19 +02:00
valknarandClaude Sonnet 4.6 f231dd5432 feat: externalize EMAIL_FROM and EMAIL_USER to .env for gitea and passbolt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 18:38:22 +02:00
valknarandClaude Sonnet 4.6 afec1c03f5 feat(gitea): set mailer FROM address
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 18:01:08 +02:00
valknarandClaude Sonnet 4.6 40dfe5776a feat(gitea): add Umami analytics via direct custom header template
Mount templates/custom/ directly to Gitea's default GITEA_CUSTOM templates
path. No entrypoint override or envsubst needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 12:58:25 +02:00
valknarandClaude Sonnet 4.6 e5e6a2c302 feat(gitea): add Umami analytics via custom header template
Injects the Umami tracking script into every Gitea page using a custom
header.tmpl generated at startup via envsubst. Script URL and website ID
are externalized to UMAMI_SCRIPT_URL / UMAMI_WEBSITE_ID env vars.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-10 12:49:26 +02:00
valknarandClaude Sonnet 4.6 31841d1ac3 fix(compose): remove empty labels keys left after watchtower label removal
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 19:44:01 +02:00
valknarandClaude Sonnet 4.6 4c522961a9 feat(_update): replace watchtower with custom nightly update script
Removes the watchtower container in favour of a host-side script that
runs daily at 2:00 AM via systemd timer.  Mirrors the _backup pattern:
auto-discovers stacks, pulls images, recreates changed containers,
prunes dangling images, and notifies via n8n → Telegram.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 19:42:25 +02:00
valknarandClaude Sonnet 4.6 28b31e91e4 chore: add .env.example files for all stacks
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-08 18:55:30 +02:00
valknar adfb6032ee chore: format 2026-03-18 17:39:36 +01:00
valknar 9e068eb7b3 style: customize gitea 2026-03-14 20:03:05 +01:00
valknar 1865844260 chore: cleanup 2026-03-05 09:51:40 +01:00
valknarandClaude Opus 4.6 f21e0611b4 Add self-contained Docker Compose stacks for pivoine.art infrastructure
Migrated 11 services from monolithic docker-compose project into independent stacks,
each with dedicated databases, minimal .env configuration, and bind-mount data volumes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 22:41:50 +01:00