Commit Graph
8 Commits
Author SHA1 Message Date
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
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
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