Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
0f0fcb8
helm: default secrets.create to false in every chart
abd-ulbasit Oct 23, 2026
cb19e95
helm: pin the migrate initContainer image by digest
abd-ulbasit Oct 23, 2026
d636d12
deploy: run postgres, grafana and ollama with read-only root filesystems
abd-ulbasit Oct 23, 2026
d3da918
deploy: pin third-party images by tag and digest
abd-ulbasit Oct 23, 2026
db2f8d1
terraform: commit the provider lock file
abd-ulbasit Oct 23, 2026
005498b
log connection URLs with the password redacted
abd-ulbasit Oct 23, 2026
1899dc1
compose: bind the local stack to 127.0.0.1 and require Redis/NATS auth
abd-ulbasit Oct 23, 2026
8e81eb4
terraform: stop public subnets auto-assigning public IPs
abd-ulbasit Oct 23, 2026
a9db793
terraform: keep the EKS API private in the example tfvars
abd-ulbasit Oct 23, 2026
b4ea7f2
terraform: let RDS manage the master password, keep it out of state
abd-ulbasit Oct 23, 2026
5a9adad
terraform: make destructive settings variables with safe defaults
abd-ulbasit Oct 23, 2026
80f812e
terraform: give the artifacts bucket its own KMS key
abd-ulbasit Oct 23, 2026
251e68b
terraform: harden the state backend and add a bootstrap root
abd-ulbasit Oct 23, 2026
761b0d0
terraform: add a monthly cost budget with email alerts
abd-ulbasit Oct 23, 2026
f545e46
terraform: add the ai-gateway ECR repo and move EKS off 1.30
abd-ulbasit Oct 23, 2026
d54ebed
terraform: add an opt-in GitHub OIDC role that can push to ECR
abd-ulbasit Oct 23, 2026
0f189d7
build: declare the VERSION build arg and stamp it into the binaries
abd-ulbasit Oct 23, 2026
d04a049
ci(security): triage the red Trivy gate and widen what it actually scans
abd-ulbasit Oct 23, 2026
7bc38e5
docs(security): list the dependency CVEs the Dependabot PRs leave open
abd-ulbasit Oct 23, 2026
ba1e40d
ci(security): scan images before pushing them, publish from a separat…
abd-ulbasit Oct 23, 2026
d35fa3b
ci: add a Terraform workflow (fmt, init with read-only lock, validate)
abd-ulbasit Oct 23, 2026
e8d76e1
deps: add docker, helm, docker-compose and terraform to Dependabot
abd-ulbasit Oct 23, 2026
fd5ffae
policies: verify cosign signatures and stop trusting every AWS accoun…
abd-ulbasit Oct 23, 2026
d04b80e
argocd: split the AppProject, keep child apps out of the argocd names…
abd-ulbasit Oct 23, 2026
753661d
rollouts: pin images, drop the phantom fetcher, query the real Promet…
abd-ulbasit Oct 23, 2026
c8207ac
ci(security): scan the full git history for secrets with gitleaks
abd-ulbasit Oct 23, 2026
b8e1d59
ci(security): drop the literal dev JWT value from .gitleaks.toml
abd-ulbasit Oct 23, 2026
90f45e7
docs(adr): propose asymmetric JWT signing and per-service DB users
abd-ulbasit Oct 23, 2026
b1e2b19
ci(security): scan third-party images weekly, document every gate's b…
abd-ulbasit Oct 23, 2026
aaa484b
argocd: spell namespaceResourceWhitelist correctly, deny-all the defa…
abd-ulbasit Oct 23, 2026
5710920
ci(security): allowlist the one gitleaks false positive in history
abd-ulbasit Oct 23, 2026
bc44e4e
terraform: percent-encode the Redis token in the ElastiCache rediss:/…
abd-ulbasit Oct 23, 2026
dc54865
terraform: stop claiming the state bucket is already restricted to Te…
abd-ulbasit Oct 23, 2026
6b82d5e
argocd: say which apps need a Secret before their first sync
abd-ulbasit Oct 23, 2026
bde56b9
policies: allowlist the pinned observability images
abd-ulbasit Oct 23, 2026
c831592
docs: fix three stale or contradictory statements
abd-ulbasit Oct 23, 2026
a3d222b
ci(security): keep scheduled runs from cancelling pending push runs
abd-ulbasit Oct 23, 2026
dc9a4e3
build: pin Go 1.26.10 in go.mod, go.work, CI and Dockerfiles
abd-ulbasit Oct 23, 2026
7168edd
web: bump axios to 1.20.0 and follow-redirects to 1.16.1
abd-ulbasit Oct 23, 2026
ece4442
docs(security): record what still keeps Security red
abd-ulbasit Oct 23, 2026
4915ca9
deps: clear the Go advisories still failing govulncheck and Trivy
abd-ulbasit Oct 24, 2026
b00771f
deps: run go work sync and tidy gen/go after the bump
abd-ulbasit Oct 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,21 @@
# make up
#
# If .env is absent, docker-compose uses the defaults shown here (via ${VAR:-default}).
# The defaults are safe for a local-only stack; change them if you expose
# the stack on a shared network.
# The defaults are PUBLISHED dev values. They are acceptable only because every
# port binds to 127.0.0.1 (see FP_BIND_ADDR below). Replace every *_PASSWORD
# before binding to anything else.
#
# ============================================================================

# ----------------------------------------------------------------------------
# NETWORK EXPOSURE
# ----------------------------------------------------------------------------
# Address every published port binds to. With a REMOTE docker engine (docker
# context over ssh) this address is on the engine host, not your laptop, and
# 0.0.0.0 there means its LAN and VPN interfaces. Prefer an ssh tunnel
# (ssh -L 6379:127.0.0.1:6379 <engine-host>) over changing this.
FP_BIND_ADDR=127.0.0.1

# ----------------------------------------------------------------------------
# POSTGRES
# ----------------------------------------------------------------------------
Expand All @@ -29,6 +39,16 @@ POSTGRES_PASSWORD=fp
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin

# ----------------------------------------------------------------------------
# REDIS / NATS (both require auth)
# ----------------------------------------------------------------------------
# The Go services' local defaults use these same dev values:
# FP_REDIS_URL=redis://:${REDIS_PASSWORD}@localhost:6379
# FP_NATS_URL=nats://fp:${NATS_PASSWORD}@localhost:4222
# If you change a password here, export the matching FP_* URL before `go run`.
REDIS_PASSWORD=fp
NATS_PASSWORD=fp

# ----------------------------------------------------------------------------
# GRAFANA
# ----------------------------------------------------------------------------
Expand Down
116 changes: 116 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
# that would have caught the failure that kept Security red for a month:
# the pinned trivy-action v0.29.0 referenced aquasecurity/setup-trivy@v0.2.2,
# a tag upstream deleted, so the job died in "Set up job" in four seconds.
# - docker / helm / docker-compose: the digest-pinned base images, the infra
# images in deploy/, the migrate image in the charts, and the compose
# stack. (Added 2026-10: before that nothing refreshed a single digest pin.)
# - terraform: provider constraints + .terraform.lock.hcl per root module.
#
# WHY GROUPED UPDATES:
# 15 modules x N dependencies of individual PRs is noise nobody reads, and
Expand Down Expand Up @@ -102,3 +106,115 @@ updates:
update-types:
- minor
- patch

# ---------------------------------------------------------------------------
# Docker images — base images in the Dockerfiles and the images the raw
# Kubernetes manifests run.
# ---------------------------------------------------------------------------
# WHY: every Dockerfile pins golang:<ver>-alpine and distroless by DIGEST, and
# the infra manifests pin postgres/redis/nats/ollama/... by tag AND digest. A
# digest pin is only safe while something refreshes it: without this entry
# the pins silently go stale and the images keep their CVEs forever.
# Dependabot's docker ecosystem reads Dockerfiles and, per GitHub's docs,
# Kubernetes manifests; it rewrites tag and digest together.
- package-ecosystem: docker
directories:
- /services/*
- /deploy/k8s/infra/*
- /deploy/k8s/observability/*
- /deploy/llm
- /deploy/backup
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 10
commit-message:
prefix: deps(docker)
groups:
docker-minor-and-patch:
update-types:
- minor
- patch
ignore:
# A database major is a data migration (pg_upgrade / dump-restore for
# Postgres, a licence and persistence-format change for Redis 8), not a
# dependency bump. Plan those by hand.
- dependency-name: postgres
update-types: ["version-update:semver-major"]
- dependency-name: redis
update-types: ["version-update:semver-major"]

# ---------------------------------------------------------------------------
# Helm charts — images referenced in deploy/helm/*/values.yaml (the
# migrate/migrate initContainer, pinned by digest).
# ---------------------------------------------------------------------------
- package-ecosystem: helm
directories:
- /deploy/helm/*
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: deps(helm)
groups:
helm-minor-and-patch:
update-types:
- minor
- patch

# ---------------------------------------------------------------------------
# docker-compose — the local dev stack (docker-compose.yaml).
# ---------------------------------------------------------------------------
- package-ecosystem: docker-compose
directory: /
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: deps(compose)
groups:
compose-minor-and-patch:
update-types:
- minor
- patch
ignore:
- dependency-name: postgres
update-types: ["version-update:semver-major"]
- dependency-name: redis
update-types: ["version-update:semver-major"]

# ---------------------------------------------------------------------------
# pre-commit — the pinned gitleaks hook in .pre-commit-config.yaml.
# ---------------------------------------------------------------------------
- package-ecosystem: pre-commit
directory: /
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 2
commit-message:
prefix: deps(pre-commit)

# ---------------------------------------------------------------------------
# Terraform — provider constraints AND the committed .terraform.lock.hcl,
# one entry per root module.
# ---------------------------------------------------------------------------
# Majors stay separate (an AWS provider major, e.g. 5 -> 6, renames and
# removes arguments and needs a reviewed migration).
- package-ecosystem: terraform
directories:
- /deploy/terraform/bootstrap
- /deploy/terraform/environments/dev
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: deps(terraform)
groups:
terraform-minor-and-patch:
update-types:
- minor
- patch
12 changes: 8 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,15 @@ concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

# Pin the toolchain to the go.work `go 1.26.0` directive. The Go toolchain
# refuses to build a workspace whose go directive is newer than the toolchain,
# so this MUST track go.work (bump both together on a Go upgrade).
# Pin the toolchain to the exact patch release in go.work's `go 1.26.10`
# directive. setup-go sets GOTOOLCHAIN=local, so a toolchain older than that
# directive refuses to build the workspace; this MUST track go.work, every
# go.mod and the golang builder image in services/*/Dockerfile (bump all of
# them together on a Go upgrade). A bare "1.26" let setup-go pick whatever
# 1.26.x the runner had cached (1.26.9, which govulncheck flags for
# GO-2026-6809 in crypto/x509).
env:
GO_VERSION: "1.26"
GO_VERSION: "1.26.10"

jobs:
# ---------------------------------------------------------------------------
Expand Down
Loading
Loading