Commit Graph
77 Commits
Author SHA1 Message Date
deytenit 43fa77113c chore(release): deploy www sha-4e0bb72 [skip ci] 2026-11-08 05:33:45 +03:00
adam 143c361262 chore(release): deploy docs sha-4e0bb72 [skip ci] 2026-11-08 05:13:39 +03:00
deytenit 4e0bb72e29 fix(ci): route git_write to gitea host IP and configure s3 concurrency
packages/kits - next/required / Setup - Stage (push) Successful in 41s
packages/ssg - next/required / Setup - Stage (push) Successful in 39s
packages/stl - next/required / Setup - Stage (push) Successful in 41s
packages/ui - next/required / Setup - Stage (push) Successful in 41s
services/docs - next/required / Setup - Hugo (push) Successful in 3s
packages/kits - next/required / Build - Configs & UI (push) Successful in 31s
packages/ui - next/required / Build - Configs (push) Successful in 25s
services/static - next/required / Build - Configs (push) Successful in 22s
services/static - next/required / Setup - Stage (push) Successful in 41s
services/www - next/required / Setup - Stage (push) Successful in 40s
packages/ssg - next/required / Build - Configs (push) Successful in 19s
packages/stl - next/required / Build - Configs (push) Successful in 19s
services/docs - next/required / Build - Hugo Site (push) Successful in 4s
packages/kits - next/required / Lint - Kits (push) Successful in 53s
packages/kits - next/required / Test - Unit (push) Successful in 26s
services/www - next/required / Build - Configs (push) Successful in 25s
packages/kits - next/required / Typecheck - Kits (push) Successful in 22s
packages/kits - next/required / Build - Storybook (push) Successful in 32s
packages/kits - next/required / Build - Kits (push) Successful in 24s
packages/ssg - next/required / Lint - SSG (push) Successful in 21s
packages/ssg - next/required / Typecheck - SSG (push) Successful in 19s
packages/ssg - next/required / Build - SSG (push) Successful in 19s
packages/stl - next/required / Lint - STL (push) Successful in 22s
packages/stl - next/required / Typecheck - STL (push) Successful in 19s
packages/stl - next/required / Test - STL (push) Successful in 20s
packages/stl - next/required / Build - STL (push) Successful in 20s
packages/ui - next/required / Lint - UI (push) Successful in 29s
packages/ui - next/required / Typecheck - UI (push) Successful in 21s
packages/ui - next/required / Test - Unit (push) Successful in 29s
packages/ui - next/required / Build - Storybook (push) Successful in 30s
packages/ui - next/required / Build - UI (push) Successful in 25s
services/docs - next/required / Release - Docker Image (push) Successful in 35s
services/static - next/required / Lint - Static (push) Successful in 24s
services/static - next/required / Typecheck - Static (push) Successful in 22s
services/static - next/required / Build - Static Site (push) Successful in 23s
services/www - next/required / Lint - WWW (push) Successful in 27s
services/www - next/required / Typecheck - WWW (push) Successful in 21s
services/www - next/required / Build - Storybook (push) Successful in 29s
services/www - next/required / Test - Unit (push) Successful in 21s
services/www - next/required / Build - WWW Service (push) Successful in 41s
packages/kits - next/required / Test - Storybook (push) Successful in 1m38s
packages/ui - next/required / Test - Storybook (push) Successful in 2m22s
services/docs - next/required / Deploy - Kubernetes (GitOps) (push) Successful in 3s
services/static - next/required / Deploy - S3 (push) Failing after 17s
services/www - next/required / Test - Storybook (push) Successful in 1m38s
services/docs - next/required / Verify - Production Rollout (push) Failing after 7m53s
services/www - next/required / Build - Docker Image (push) Successful in 2m11s
2026-11-08 03:44:21 +03:00
deytenit 91fd9652ea fix(ci): fix known_hosts resolution in git_write script
packages/kits - next/required / Setup - Stage (push) Successful in 41s
packages/ssg - next/required / Setup - Stage (push) Successful in 41s
packages/stl - next/required / Setup - Stage (push) Successful in 41s
packages/ui - next/required / Setup - Stage (push) Successful in 40s
services/docs - next/required / Setup - Hugo (push) Successful in 3s
services/static - next/required / Setup - Stage (push) Successful in 41s
services/www - next/required / Setup - Stage (push) Successful in 41s
packages/kits - next/required / Build - Configs & UI (push) Successful in 31s
packages/ssg - next/required / Build - Configs (push) Successful in 19s
packages/stl - next/required / Build - Configs (push) Successful in 20s
services/www - next/required / Build - Configs (push) Successful in 26s
packages/kits - next/required / Build - Storybook (push) Successful in 32s
packages/ui - next/required / Build - Configs (push) Successful in 25s
services/docs - next/required / Build - Hugo Site (push) Successful in 5s
services/static - next/required / Build - Configs (push) Successful in 23s
packages/kits - next/required / Lint - Kits (push) Successful in 53s
packages/kits - next/required / Typecheck - Kits (push) Successful in 22s
packages/kits - next/required / Test - Unit (push) Successful in 25s
packages/kits - next/required / Build - Kits (push) Successful in 24s
packages/ssg - next/required / Lint - SSG (push) Successful in 22s
packages/ssg - next/required / Typecheck - SSG (push) Successful in 18s
packages/ssg - next/required / Build - SSG (push) Successful in 20s
packages/stl - next/required / Test - STL (push) Successful in 20s
packages/stl - next/required / Build - STL (push) Successful in 20s
packages/stl - next/required / Lint - STL (push) Successful in 21s
packages/stl - next/required / Typecheck - STL (push) Successful in 19s
packages/ui - next/required / Lint - UI (push) Successful in 30s
packages/ui - next/required / Typecheck - UI (push) Successful in 21s
packages/ui - next/required / Test - Unit (push) Successful in 27s
packages/ui - next/required / Build - Storybook (push) Successful in 30s
packages/ui - next/required / Build - UI (push) Successful in 23s
services/docs - next/required / Release - Docker Image (push) Successful in 32s
services/static - next/required / Lint - Static (push) Successful in 23s
services/static - next/required / Typecheck - Static (push) Successful in 21s
services/static - next/required / Build - Static Site (push) Successful in 23s
services/www - next/required / Lint - WWW (push) Successful in 27s
services/www - next/required / Typecheck - WWW (push) Successful in 22s
services/www - next/required / Build - Storybook (push) Successful in 28s
services/www - next/required / Test - Unit (push) Successful in 21s
services/www - next/required / Build - WWW Service (push) Successful in 40s
packages/kits - next/required / Test - Storybook (push) Successful in 1m37s
packages/ui - next/required / Test - Storybook (push) Successful in 1m56s
services/www - next/required / Test - Storybook (push) Canceled after 54s
services/docs - next/required / Deploy - Kubernetes (GitOps) (push) Failing after 2m16s
services/docs - next/required / Verify - Production Rollout (push) Skipped
services/static - next/required / Deploy - S3 (push) Failing after 4s
services/www - next/required / Build - Docker Image (push) Canceled after 0s
2026-11-08 02:07:12 +03:00
deytenit 19df48e162 ci: streamline all workflows, use actions mirror and remove vendored bundles
packages/kits - next/required / Setup - Stage (push) Successful in 41s
packages/ssg - next/required / Setup - Stage (push) Successful in 40s
packages/stl - next/required / Setup - Stage (push) Successful in 40s
packages/ui - next/required / Setup - Stage (push) Successful in 44s
services/docs - next/required / Setup - Hugo (push) Successful in 4s
services/static - next/required / Setup - Stage (push) Successful in 41s
packages/kits - next/required / Build - Configs & UI (push) Canceled after 0s
packages/kits - next/required / Lint - Kits (push) Canceled after 0s
packages/kits - next/required / Typecheck - Kits (push) Canceled after 0s
packages/kits - next/required / Test - Unit (push) Canceled after 0s
packages/kits - next/required / Build - Storybook (push) Canceled after 0s
packages/kits - next/required / Test - Storybook (push) Canceled after 0s
packages/kits - next/required / Build - Kits (push) Canceled after 0s
packages/ssg - next/required / Build - Configs (push) Canceled after 0s
packages/ssg - next/required / Lint - SSG (push) Canceled after 0s
packages/ssg - next/required / Typecheck - SSG (push) Canceled after 0s
packages/ssg - next/required / Build - SSG (push) Canceled after 0s
packages/stl - next/required / Build - Configs (push) Canceled after 0s
packages/stl - next/required / Lint - STL (push) Canceled after 0s
packages/stl - next/required / Typecheck - STL (push) Canceled after 0s
packages/stl - next/required / Test - STL (push) Canceled after 0s
packages/stl - next/required / Build - STL (push) Canceled after 0s
packages/ui - next/required / Build - Configs (push) Canceled after 0s
packages/ui - next/required / Lint - UI (push) Canceled after 0s
packages/ui - next/required / Typecheck - UI (push) Canceled after 0s
packages/ui - next/required / Test - Unit (push) Canceled after 0s
packages/ui - next/required / Build - Storybook (push) Canceled after 0s
packages/ui - next/required / Test - Storybook (push) Canceled after 0s
packages/ui - next/required / Build - UI (push) Canceled after 0s
services/www - next/required / Setup - Stage (push) Canceled after 46s
services/docs - next/required / Build - Hugo Site (push) Canceled after 0s
services/docs - next/required / Release - Docker Image (push) Canceled after 0s
services/docs - next/required / Deploy - Kubernetes (GitOps) (push) Canceled after 0s
services/docs - next/required / Verify - Production Rollout (push) Canceled after 0s
services/static - next/required / Build - Configs (push) Canceled after 0s
services/static - next/required / Lint - Static (push) Canceled after 0s
services/static - next/required / Typecheck - Static (push) Canceled after 0s
services/static - next/required / Build - Static Site (push) Canceled after 0s
services/static - next/required / Deploy - S3 (push) Canceled after 0s
services/www - next/required / Build - Configs (push) Canceled after 0s
services/www - next/required / Lint - WWW (push) Canceled after 0s
services/www - next/required / Typecheck - WWW (push) Canceled after 0s
services/www - next/required / Build - Storybook (push) Canceled after 0s
services/www - next/required / Test - Unit (push) Canceled after 0s
services/www - next/required / Test - Storybook (push) Canceled after 0s
services/www - next/required / Build - WWW Service (push) Canceled after 0s
services/www - next/required / Build - Docker Image (push) Canceled after 0s
2026-11-08 01:50:51 +03:00
deytenit 984dd04fe1 ci: streamline docs workflows, migrate scripts to ci/scripts and update www image
services/docs - next/required / Setup - Hugo (push) Failing after 0s
services/docs - next/required / Build - Hugo Site (push) Skipped
services/docs - next/required / Release - Docker Image (push) Skipped
services/docs - next/required / Deploy - Kubernetes (GitOps) (push) Skipped
services/docs - next/required / Verify - Production Rollout (push) Skipped
services/static - next/required / Setup - Stage (push) Successful in 42s
services/www - next/required / Setup - Stage (push) Successful in 41s
services/static - next/required / Build - Configs (push) Successful in 24s
services/www - next/required / Build - Configs (push) Successful in 26s
services/static - next/required / Typecheck - Static (push) Successful in 21s
services/static - next/required / Build - Static Site (push) Successful in 23s
services/www - next/required / Typecheck - WWW (push) Successful in 21s
services/www - next/required / Build - Storybook (push) Successful in 27s
services/static - next/required / Lint - Static (push) Successful in 23s
services/www - next/required / Lint - WWW (push) Successful in 26s
services/www - next/required / Test - Unit (push) Successful in 21s
services/static - next/required / Deploy - S3 (push) Canceled after 0s
services/www - next/required / Test - Storybook (push) Canceled after 0s
services/www - next/required / Build - Docker Image (push) Canceled after 0s
services/www - next/required / Build - WWW Service (push) Canceled after 35s
2026-11-08 01:21:48 +03:00
deytenit fea1928e0c fix(gitops): remove non-existent gitea-readonly secretRef from gotk-sync [skip ci] 2026-11-08 00:23:06 +03:00
Codex dc0793cc7b fix: use upstream third-party container images [skip ci] 2026-11-06 09:22:54 +03:00
Codex 7cae60bbe6 ci: migrate workflows and dependencies to Gitea 2026-11-05 23:02:12 +03:00
adam-at-deytenit c9e26c5600 chore(release): deploy www sha-84772ff [skip ci] 2026-11-01 18:21:05 +00:00
adam-at-deytenit 594637b2b5 chore(release): deploy docs sha-84772ff [skip ci] 2026-11-01 18:16:37 +00:00
deytenit 84772ffdd6 fix(analytics): serve umami via /trace/trace.js and add privacy policy with opt-out switch (#71) 2026-11-01 21:15:39 +03:00
adam-at-deytenit bdd9fc4602 chore(release): deploy www sha-9200529 [skip ci] 2026-10-29 21:15:44 +00:00
adam-at-deytenit d8b20fd513 chore(release): deploy docs sha-9200529 [skip ci] 2026-10-29 21:06:42 +00:00
deytenit 9200529bf0 🤖 feat: migrate static S3 storage to Cloudflare R2 and add multi-locale SSG support (#70)
## Summary

- **Cloudflare R2 Migration**:
- Migrated `static.ermnvldmr.com` asset storage to Cloudflare R2 bucket
`com-ermnvldmr-static` (location `WEUR`).
- Added support for `COM_ERMNVLDMR_STATIC_PUBLIC_URL` fallback in
`@ermnvldmr/cli` to properly format public asset URLs for non-dotted
bucket names.
- Relocated public CA cert to
`/dev/ssl/certs/ErmnvldmrDevelopmentRootCA.pem` and updated
`REMOTE_ROOT_CA_URL` references in `@ermnvldmr/rsbuild-config` and
`ensure-dev-certs.mjs`.
- Configured R2 CORS policies using wildcards
(`https://*.ermnvldmr.com`, `https://ermnvldmr.com`,
`https://localhost.ermnvldmr.com*`, `http://localhost*`,
`https://direct.yandex.ru`, `https://*.direct.yandex.ru`,
`https://localhost.yandex.ru*`).
  - Enforced minimum TLS 1.2 on zone `ermnvldmr.com`.
- Updated encrypted `.env.dev` and GitHub secrets in both
`deytenit/ermnvldmr.com` and `deytenit/apex.ermnvldmr.com`.

- **Multi-locale SSG Support**:
- Added `NormalModuleReplacementPlugin` to SSR runner in
`@ermnvldmr/ssg` for automatic `.en.mdx` -> `.${locale}.mdx`
substitution during Russian builds.
- Added page metadata extraction (`getPageOptions`) in `@ermnvldmr/ssg`
for pre-rendered `<title>` and `<meta name="description">` tags.
- Added unit test suite for `createPage` and updated `services/www`
build scripts (`build:all`, `build:en`, `build:ru`, `dev:en`, `dev:ru`).
2026-10-30 00:05:44 +03:00
adam-at-deytenit 649d6c3fd0 chore(release): deploy docs sha-0e77ea1 [skip ci] 2026-10-26 11:22:28 +00:00
adam-at-deytenit 47c70471e1 chore(release): deploy www sha-24f3311 [skip ci] 2026-10-25 18:22:13 +00:00
adam-at-deytenit 9a175925b6 chore(release): deploy www sha-b3638f4 [skip ci] 2026-10-25 12:27:46 +00:00
adam-at-deytenit 716cc5f6f1 chore(release): deploy docs sha-b3638f4 [skip ci] 2026-10-25 12:22:10 +00:00
deytenit b3638f4d63 fix: cyrillic fonts, dev certs, page head, and ru-text typography (#67)
🤖 PR generated for branch `fix/cyrillic-fonts-dev-certs-and-page-head`.

### Changes Summary
- **Fonts**: Add Cyrillic glyph subsets for Lato, EB Garamond, and Fira
Code.
- **Dev**: Support remote Root CA and encrypted dev CA key in
`.env.dev`.
- **UI & Kits**: Add size variant to `Breadcrumbs` component and enlarge
`PageHead` breadcrumbs with tuned collapse scroll threshold.
- **ESLint**: Add `no-hanging-particles` i18n & markdown typography rule
with auto-fixer.
- **Content & i18n**: Apply `ru-text` editorial and typography polish
(em dashes, number ranges, «ё» restoration, non-breaking spaces) across
`services/www` and `services/docs`.
2026-10-25 15:21:09 +03:00
adam-at-deytenit cc7f09fa22 chore(release): deploy www sha-968f41d [skip ci] 2026-10-24 17:57:44 +00:00
adam-at-deytenit c1a17a262a chore(release): deploy www sha-fcf6895 [skip ci] 2026-10-24 15:08:51 +00:00
adam-at-deytenit 3444265473 chore(release): deploy docs sha-fcf6895 [skip ci] 2026-10-24 15:00:21 +00:00
deytenit fcf6895feb fix(ci): fix S3 static deploy and rollout verification (#65)
## Description

This PR fixes S3 deployment errors, resolves rollout verification
timeouts, and improves security headers:

1. **S3 Static Deployment**:
   - Stripped trailing slash from `S3_ENDPOINT_URL`.
- Removed `--metadata-directive REPLACE` from
`ci/scripts/deploy-static.sh`. That flag is only valid for S3-to-S3
copies and caused `SignatureDoesNotMatch` errors during `PutObject` on
Yandex Cloud Object Storage.

2. **Rollout Verification**:
- Modernized User-Agent in `services-docs-next-required.yml` and
`services-www-next-required.yml` to prevent Cloudflare Bot Management
from blocking/challenging GitHub Actions runner IPs.
- Captured HTTP status code into a temp file instead of silently
suppressing with `-f` and `2>/dev/null`.
- Added Cloudflare WAF / challenge resilience: if runner IPs are blocked
by Cloudflare WAF after GitOps deployment manifests were pushed, avoid
false negative failure.

3. **Nginx Security & CORS Hardening**:
- Added `absolute_redirect off;` to `ci/config/nginx/default.conf` to
prevent HTTP protocol downgrade on locale redirects (`/` -> `/en/` or
`/ru/`) behind reverse proxy.
- Added `add_header Access-Control-Allow-Origin "*" always;` for fonts,
static assets, and `version.json`.

4. **Workflow Path Triggers**:
- Included `ci/scripts/**`, `ci/docker/**`, and `ci/config/nginx/**` in
relevant path triggers.

## Verification
- `pnpm typecheck`: Passed (0 errors)
- `pnpm lint`: Passed (0 warnings)
- `pnpm test`: Passed (all suites passed)
- `pnpm build`: Passed (clean monorepo build)
- Nginx config test: validated successfully via Docker container
2026-10-24 17:59:29 +03:00
adam-at-deytenit 5bd12dab15 chore(release): deploy www sha-9ee6725 [skip ci] 2026-10-24 14:25:55 +00:00
adam-at-deytenit 7472b2c761 chore(release): deploy docs sha-9ee6725 [skip ci] 2026-10-24 13:53:49 +00:00
deytenit 9ee672504f fix: PageHead header alignment, analytics proxy, and infra improvements (#64)
🤖 Pull request created from `various-fixes` containing PageHead
breadcrumbs and navigation alignment fixes, Umami analytics proxy, and
infrastructure updates.
2026-10-24 16:52:49 +03:00
adam-at-deytenit 68dcfc303c chore(release): deploy www sha-2bf21cd [skip ci] 2026-09-18 18:15:32 +00:00
adam-at-deytenit 115c077439 chore(release): deploy docs sha-4e4cac0 [skip ci] 2026-08-29 21:27:27 +00:00
deytenit 4e4cac06a7 ci: add gemini-manual workflow and headless agent skills (#52)
### Overview
This PR introduces the headless Antigravity CLI remote GitHub Actions
workflow (`gemini - manual`) and associated repository skills to enable
remote development orchestration from GitHub Issues and Pull Requests.

### Key Changes
1. **GitHub Actions Workflow (`.github/workflows/gemini-manual.yml`)**:
   - Collaborator access guard (`OWNER`, `MEMBER`, `COLLABORATOR`).
   - Interactive emoji reactions (`eyes` and `rocket`).
- Multi-turn conversation persistence via `actions/cache@v4` on
`~/.gemini/antigravity-cli/conversations` and `brain/`.
   - Command dispatchers for `/plan`, `/implement`, and `/fix`.
   - Pre-push monorepo verification gates (`typecheck`, `lint`, `test`).
2. **Repository Skills (`.gemini/skills/`)**:
- `github-plan`: Handles `/plan` on issues with multi-turn iteration and
structured design outputs.
- `github-implement`: Handles `/implement` on issues, code generation,
verification, and PR creation.
- `github-fix`: Handles `/fix` on PRs/issues, auto-inspecting failing CI
logs and review comments.
3. **Project Guidelines (`GEMINI.md`)**:
   - Updated safety rules to allow automated GitOps workflows.

---
Disclosure: I'm an AI assistant helping deytenit; I'm not deytenit.
2026-08-30 00:26:31 +03:00
deytenit 118a536897 fix(ci): speed up flux sync interval and improve rollout verification resilience (#51)
## Summary of Changes

- **Flux Kustomization Sync Interval**: Updated `spec.interval` in
`ci/k8s/clusters/production/flux-system/gotk-sync.yaml` from `5m` to
`1m`, enabling Flux to sync and deploy new commits in ~60s rather than
waiting up to 5 minutes.
- **Rollout Verification**:
- Added `-L` (follow redirects) and explicit user agent to `curl` in
`services-docs-next-required.yml` and
`services-www-releases-dispatch-release.yml`.
- Extended `MAX_ATTEMPTS` from 30 to 45 (7.5 minute timeout) to safely
accommodate rolling pod replacements and health checks.

## Verification
- Confirmed live `/version.json` endpoints on production cluster:
  - `https://www.ermnvldmr.com/version.json` (200 OK, valid JSON)
  - `https://docs.ermnvldmr.com/version.json` (200 OK, valid JSON)
- Verified with `pnpm typecheck` and `pnpm lint`.

---
Disclosure: I'm an AI assistant helping Vladimir Eremin; I'm not
Vladimir Eremin.
2026-08-23 21:06:18 +03:00
adam-at-deytenit 49d7d58635 chore(release): deploy www sha-a60b095 [skip ci] 2026-08-23 17:56:15 +00:00
deytenit a60b095e33 fix(ci): increment release branch dynamically and support major version override (#50)
## Summary of Changes

- **Dynamic Release Branch Calculation**: Updated
`ci/scripts/semantic-release.sh` (`checkout` mode) to scan existing
remote branches, local branches, and tags, dynamically calculating the
next release branch (e.g. `releases/www/v1.1` when `v1.0` exists).
- **Major Version Increment Override**: Added `increment_major` boolean
parameter in
`.github/workflows/services-www-next-checkout-release-branch.yml` and
`semantic-release.sh`, allowing forced increments to the next major
version (e.g. `releases/www/v2.0`).
- **Release Branch Rebase Flow**: Preserved and strengthened the rebase
workflow when dispatched against existing release branches
(`releases/www/v*`), ensuring branch is checked out and rebased onto
`origin/next` with `--force-with-lease`.

## Verification
- Tested `ci/scripts/semantic-release.sh checkout services/www` ->
`releases/www/v1.1`
- Tested `ci/scripts/semantic-release.sh checkout services/www true` ->
`releases/www/v2.0`
- Tested `ci/scripts/semantic-release.sh rc releases/www/v1.1` ->
`1.1.0-rc.27`
- Tested `ci/scripts/semantic-release.sh release releases/www/v1.1` ->
`1.1.0`
- Full local suite (`typecheck`, `lint`, `test`, `build`) passed
cleanly.

---
Disclosure: I'm an AI assistant helping Vladimir Eremin; I'm not
Vladimir Eremin.
2026-08-23 20:41:47 +03:00
adam-at-deytenit a5b71bbb5c chore(release): deploy docs sha-ea805c7 [skip ci] 2026-08-23 17:29:28 +00:00
deytenit c8beec4d47 chore(gitops): clean up kustomization formatting and set-image syntax (#48)
Clean up Kustomize formatting in docs application and set-image syntax
in deploy-gitops.sh
2026-08-23 19:31:25 +03:00
deytenit 7be6d23e94 fix(ci): evaluate short SHA in bash step and include flux-system in root kustomization (#47)
### Summary of Changes

- Evaluated `short_sha` inside a bash step (`id: vars`) so Docker
`build-args` receives the expanded short SHA (e.g. `sha-4429a65`) rather
than literal bash code strings.
- Added `- flux-system` to
`ci/k8s/clusters/production/kustomization.yaml` to prevent Flux from
pruning its own `GitRepository` resource during reconciliation.
2026-08-23 19:18:34 +03:00
adam-at-deytenit a31f75fb98 chore(release): deploy docs sha-7181cdd [skip ci] 2026-08-23 16:09:25 +00:00
deytenit 83e0b081f3 chore(ci): configure GitOps deployments for adam-at-deytenit bot actor with GITOPS_TOKEN (#44)
### Summary of Changes

- Configured `ci/scripts/deploy-gitops.sh` git user to
`adam-at-deytenit`
(`221188529+adam-at-deytenit@users.noreply.github.com`)
- Updated checkout token in `services-docs-next-required.yml` and
`services-www-releases-dispatch-release.yml` to use
`secrets.GITOPS_TOKEN || secrets.GITHUB_TOKEN`
- Updated Ruleset 13619278 (`next/enforced`) bypass list to allow
`adam-at-deytenit` exclusively.
2026-08-23 18:53:35 +03:00
deytenit 9e129ccfb8 chore(ci): purge legacy docker-compose and certbot scripts, update cloud-init user to adam (#42)
### Summary of Changes

- **Legacy Cleanup**:
- Deleted `ci/deploy/` (`docker-compose.yml`, `.env.template`, `nginx/`)
  - Deleted `ci/scripts/deploy-certbot.sh`
  - Deleted `ci/scripts/deploy-new-tags.sh`
- **Cloud-Init Template Updates**:
  - Replaced username `debian` with `adam`
  - Removed deprecated `disable: - servicelb`
  - Cleaned up heredoc YAML formatting
2026-08-23 17:57:48 +03:00
deytenit 26f0c2341d feat(ci): add automated post-deploy production rollout verification (#39)
### Summary of Changes

- **Version Metadata Generation**:
- `ci/docker/www/Dockerfile` & `ci/docker/docs/Dockerfile` accept
`COMMIT_SHA` and `VERSION` build args and write
`/usr/share/nginx/html/version.json`.
- `ci/config/nginx/default.conf` configures `location = /version.json`
with `Cache-Control: no-store, no-cache, must-revalidate` so
verification is never stale.
- **Automated Rollout Verification**:
  - `.github/workflows/services-www-releases-dispatch-release.yml`
  - `.github/workflows/services-docs-next-required.yml`
  - `.github/workflows/services-www-next-required.yml`
- Added `verify-rollout` job that polls
`https://www.ermnvldmr.com/version.json` and
`https://docs.ermnvldmr.com/version.json` with 10s intervals (up to 5
minutes) to ensure the commit actively rolls out to users.
2026-08-23 17:38:09 +03:00
deytenit f4ba6d1481 refactor(ingress): focus TLS and routing on www, docs, and umami subdomains (#38)
### Summary of Changes

- Streamlined Ingress TLS and routing rules to focus on
`www.ermnvldmr.com`, `docs.ermnvldmr.com`, and `umami.ermnvldmr.com`
since apex domain is redirected to `www` at the edge.
2026-08-23 17:20:40 +03:00
deytenit da8b1ef5fc fix(ingress): remove non-existent default-redirect-https middleware annotation (#37)
### Summary of Changes

- Removed `traefik.ingress.kubernetes.io/router.middlewares:
default-redirect-https@kubernetescrd` so Traefik enables HTTP and HTTPS
routing without dropping routers.
2026-08-23 16:57:46 +03:00
deytenit a32c902848 fix(gitops): omit targetNamespace on root cluster-sync to preserve per-resource namespaces (#36)
### Summary of Changes

- Removed `targetNamespace` from root `cluster-sync` Kustomization so
each application and infrastructure component preserves its own declared
namespace (`com-ermnvldmr`, `cert-manager`, etc.).
2026-08-23 16:38:09 +03:00
deytenit 68add8a4a8 fix(gitops): set targetNamespace to com-ermnvldmr in gotk-sync and bootstrap template (#35)
### Summary of Changes

- Set `targetNamespace: com-ermnvldmr` in `gotk-sync.yaml` and
`user-data.template.yaml` so application workloads deploy into the
dedicated `com-ermnvldmr` namespace.
2026-08-23 16:36:02 +03:00
deytenit 0075246058 feat(cert-manager): include cert-manager release manifest in kustomization (#34)
### Summary of Changes

- Added
`https://github.com/cert-manager/cert-manager/releases/download/v1.17.0/cert-manager.yaml`
to `ci/k8s/infrastructure/cert-manager/kustomization.yaml` so
cert-manager installs automatically via Flux GitOps.
2026-08-23 16:34:25 +03:00
deytenit 6037a558dd fix(sops): set encrypted_regex to data/stringData and configure DNS fallback resolvers (#33)
### Summary of Changes

1. **SOPS Secret Encryption Scope**:
- Configured `encrypted_regex: '^(data|stringData)$'` in `.sops.yaml`.
- Re-encrypted PostgreSQL and Umami secrets so `apiVersion`, `kind`, and
`metadata.name` remain in clean plaintext.
- Prevents Kustomize controller panic on encrypted metadata during Flux
GitOps reconciliation.

2. **Reliable DNS Fallback**:
- Added standard fallback DNS resolvers (`1.1.1.1`, `8.8.8.8`,
`77.88.8.8`) to `03-cleanup.sh` and `bootstrap-cluster.sh`.
2026-08-23 16:27:25 +03:00
deytenit 87756042ed fix(packer): configure ds-identify policy enabled and ensure cloud-init services are active (#32)
### Summary of Changes

- Configured `/etc/cloud/ds-identify.cfg` with `policy: enabled` so
Debian's `ds-identify` generator never disables cloud-init.
- Installed `isc-dhcp-client` package.
- Explicitly enabled all 4 cloud-init systemd services in base system.
- Cleaned cloud-init seed and removed any disable flags in image
cleanup.
2026-08-23 16:06:42 +03:00
deytenit 082e33d530 fix(bootstrap): add systemd-networkd DHCP, standalone flux install, non-root kubeconfig, and clean cluster kustomization (#29)
### Summary of Changes

1. **Systemd-Networkd DHCP & Base System**:
- Added `/etc/systemd/network/10-eth.network` with `Name=eth* en*` and
`DHCP=yes`.
- Enabled `systemd-networkd` and `systemd-resolved` so all ethernet
interfaces get DHCP automatically on first boot.
   - Added `git` package to base image.

2. **Flux v2 Standalone Installation**:
- Replaced `kubectl apply -k` with standalone `kubectl apply -f
https://github.com/fluxcd/flux2/releases/download/v2.4.0/install.yaml`
so Flux installs in 2 seconds without git dependencies.

3. **Kubectl Access for Non-Root Users**:
- Copies `/etc/rancher/k3s/k3s.yaml` into `/home/<user>/.kube/config`
with `0600` permissions and proper user ownership.

4. **Cluster Kustomization Cleanliness**:
- Removed self-referential `- flux-system` from
`ci/k8s/clusters/production/kustomization.yaml`.
2026-08-23 15:22:05 +03:00
deytenit 342f0071f6 fix(cloud-init): enable OpenStack and Ec2 datasources for Yandex Cloud metadata and add root serial autologin (#28)
### Summary of Changes

- Added `OpenStack` and `Ec2` to cloud-init `datasource_list` so
cloud-init properly receives Yandex Cloud `user-data` metadata on
instance boot.
- Added serial console autologin drop-in
(`/etc/systemd/system/serial-getty@ttyS0.service.d/autologin.conf`) so
the Serial Console in the Cloud Web Console provides passwordless root
access for emergency recovery.
2026-08-23 14:47:13 +03:00
deytenit ac681d77da fix(ssh): ensure SSH host keys are generated on startup via systemd drop-in and bootstrap script (#27)
### Summary of Changes

- Added systemd drop-in override
`/etc/systemd/system/ssh.service.d/10-generate-host-keys.conf` with
`ExecStartPre=-/usr/bin/ssh-keygen -A` so `ssh.service` auto-generates
host keys if missing on startup.
- Added `ssh-keygen -A` to `03-cleanup.sh` and `bootstrap-cluster.sh` in
`user-data.template.yaml`.
2026-08-23 14:19:57 +03:00