Commit Graph
12 Commits
Author SHA1 Message Date
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
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
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
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 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 710873e72c feat(infra): add K3s GitOps infrastructure and Packer golden image build (#25)
### Summary of Changes

This PR introduces a declarative, GitOps-managed cloud infrastructure
for the monorepo using K3s, Flux v2, and HashiCorp Packer:

1. **Packer Golden Image Builder (`ci/packer/`)**:
- Automated Debian 12 minimal base OS image creation using QEMU builder,
UEFI firmware, GPT partition scheme, and 2M cluster size `.qcow2`
conversion.
- Cloud-init, `virtio` kernel drivers, and serial console (`ttyS0`,
115200 baud).
- Pre-installed K3s binary (`v1.31.2+k3s1`) with isolated first-boot
token and cert generation.
   - Full identity sanitization (`machine-id` and SSH host key resets).

2. **First-Boot Cloud-Init Bootstrapping
(`ci/cloud-init/user-data.yaml`)**:
- Configures K3s with `servicelb` disabled and TLS SANs for custom
domains and static IP.
- Waits for API readiness, initializes `flux-system` namespace, injects
`sops-age` secret, and triggers Flux sync.

3. **SOPS & GitOps Root Orchestration (`.sops.yaml`,
`ci/k8s/clusters/production/`)**:
- SOPS encryption configuration targeting Kubernetes secrets with `age`
key recipient.
- Flux v2 `GitRepository` and `Kustomization` manifests tracking `next`.

4. **Infrastructure & Networking (`ci/k8s/base/`,
`ci/k8s/infrastructure/`)**:
   - Dedicated `com-ermnvldmr` namespace.
- `cert-manager` HTTP-01 `ClusterIssuer` (`letsencrypt-prod` &
`letsencrypt-staging`).
- Traefik Ingress routing for `ermnvldmr.com`, `www.ermnvldmr.com`,
`docs.ermnvldmr.com`, and `analytics.ermnvldmr.com`.

5. **PostgreSQL & Applications (`ci/k8s/apps/`)**:
- PostgreSQL 16 StatefulSet on 5Gi `local-path` persistent storage with
low-memory tuning.
- Deployments for `www` (pinned `sha-6d33b71`), `docs` (pinned
`sha-91f5245`), and `umami` (pinned `postgresql-v2.14.0`) with
zero-downtime rolling update strategy.

6. **CI/CD Workflows (`.github/workflows/`)**:
- `ci - next/build-golden-image`: Workflow to build and upload
`com-ermnvldmr-debian-12-k3s-amd64-<tag>.qcow2` to static S3
`/dev/images/`.
- Updated `services-www-releases-dispatch-release.yml` and
`services-docs-next-required.yml` with GitOps deployment steps.
2026-08-23 02:11:54 +03:00
deytenit 91f5245823 fix, feat, doc: massive build system refactorion, bug fixes and apex documentation (#19) 2026-07-12 01:57:40 +03:00
deytenit df2abc06f2 feat: Add more base component to UI 2026-02-01 16:24:45 +03:00
deytenit 2da10d8a35 ci(docs): rename deploy job and add SSH port secret 2026-01-25 21:29:39 +03:00
deytenit 72c9d43f8c ci(docs): add deployment job using VPS secrets 2026-01-25 21:03:41 +03:00
deytenit 0d8a706af3 ci: Add release workflows for docs and www 2026-01-25 19:51:56 +03:00
deytenit 46a2f68342 refactor: Migrate to monorepo
BREAKING CHANGE: Complete structure overhaul
2026-01-24 23:28:36 +03:00