## 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.
## 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.
### 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.
### 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.
### Summary of Changes
- Added `skip_ci: boolean` input to
`services-www-releases-dispatch-release.yml`
- When `skip_ci: true`, all CI test/lint/typecheck/storybook jobs are
bypassed and the workflow executes immediately:
1. Build Docker image with version metadata
2. Push image to GHCR and tag
3. Deploy updated image tag to GitOps
(`ci/k8s/apps/www/kustomization.yaml`)
4. Verify production rollout on `https://www.ermnvldmr.com/version.json`
### Summary of Changes
- Reverted accidental deploy and verify-rollout jobs in
`services-www-next-required.yml` so that `services/www` deployments to
production remain strictly controlled by the formal release dispatch
flow.
### 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.
### Summary of Changes
- Added automatic cleanup of older images in `dev/images/` before
uploading new golden image to prevent S3 bucket storage quota
exhaustion.
### Summary of Changes
This PR incorporates the final infrastructure optimizations following
the initial merge of PR #25:
1. **SOPS & Secrets Management**:
- Generated dedicated Age keypair
(`age1jpa7hqyzzdfq7lvnw3l8qy6648mtjgpcqnljl5jz92dcqjrnsqfsn7m0fl`) and
updated `.sops.yaml`.
- Added SOPS-encrypted production secrets for PostgreSQL
(`ci/k8s/apps/postgres/secret.sops.yaml`) and Umami Analytics
(`ci/k8s/apps/umami/secret.sops.yaml`).
- Verified 100% clean round-trip decryption.
2. **Cloud-Init Template & Git Safety**:
- Converted `user-data.yaml` into `user-data.template.yaml` with clear
stubs for public SSH keys and private Age keys.
- Added `ci/cloud-init/user-data.yaml` to `.gitignore` to prevent
accidental secret leaks.
3. **Persistent Secondary Storage**:
- Added automated detection, ext4 formatting, and mounting of secondary
persistent disk (`/dev/vdb`) to `/var/lib/rancher/k3s/storage` with
`noatime` in `user-data.template.yaml`.
4. **Golden Image Naming & Workflows**:
- Updated image naming convention to include hyphenated UTC timestamps:
`com-ermnvldmr-debian-12-k3s-amd64-YYYY-MM-DD-HH-MM-SS-sha-<short_sha>.qcow2`.
- Verified successful CI golden image build and S3 upload.
Build @ermnvldmr/i18n and include its dist in the config-artifacts
bundle for services-www-releases-required and
services-www-releases-dispatch-release workflows, matching the fix
already applied to pr/next workflows.
Made-with: Cursor
This PR extends the build pipeline of the www service to support
locale-prefixed static builds (EN/RU) with build-time SSG output
injection, while also refactoring UI typography to a tokenized Tailwind
v4 @theme-driven approach.
Changes:
- Add build-time SSG plugin to @ermnvldmr/rsbuild-config and wire
multi-locale builds (/en/, /ru/) into services/www.
- Introduce new @ermnvldmr/i18n package (locale constants, path helpers,
keysets, pluralization) and apply it to www navigation/text.
- Refactor ui typography to a shared getTypographyClassNames utility +
Tailwind token definitions, with stl/cn updated for correct
Tailwind-merge behavior.