Commit Graph
36 Commits
Author SHA1 Message Date
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
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
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
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 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
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 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 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 502ef94bb2 feat(infra): update SOPS configuration, cloud-init templates, and secondary disk automation (#26)
### 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.
2026-08-23 14:02:08 +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