feat(gitops): migrate domain to riotpiao.com, add CNPG + Forgejo HA on Redis/Postgres, wire ArgoCD apps — enables cluster rebuild after etcd wipe and unblocks the git-source chicken-egg via standalone Helm-source Applications
This commit is contained in:
@@ -78,7 +78,7 @@ cd /Users/rockliang/workplace/homelab
|
||||
python3 k8s/talos-iam/register_oauth_app.py \
|
||||
--service-name my-app \
|
||||
--namespace my-namespace \
|
||||
--redirect-uri "https://my-app.riotpiao.homelab.com/oauth2/callback" \
|
||||
--redirect-uri "https://my-app.riotpiao.com/oauth2/callback" \
|
||||
--service-name-in-vault "MY_SERVICE" \
|
||||
--vault-jwt-policy "shell-secrets"
|
||||
```
|
||||
@@ -127,7 +127,7 @@ kubectl port-forward -n iam svc/authentik-server 7000:80 &
|
||||
- **Name:** `yourservice`
|
||||
- **Client ID:** `yourservice` (or custom)
|
||||
- **Client Secret:** (paste from `$CLIENT_SECRET` above)
|
||||
- **Redirect URIs:** `https://your-app.riotpiao.homelab.com/oauth2/callback` (or your app's callback URL)
|
||||
- **Redirect URIs:** `https://your-app.riotpiao.com/oauth2/callback` (or your app's callback URL)
|
||||
- **Sub Mode:** `Hashed User ID`
|
||||
- **Include claims in ID Token:** ✓ Enabled
|
||||
- **Grant Types:** `Authorization Code`, `Refresh Token`
|
||||
@@ -143,7 +143,7 @@ kubectl port-forward -n iam svc/authentik-server 7000:80 &
|
||||
- **Name:** `Your App Display Name`
|
||||
- **Slug:** `yourservice` (must match provider slug)
|
||||
- **Provider:** (select the provider created above)
|
||||
- **Meta Launch URL:** `https://your-app.riotpiao.homelab.com` (optional, for app launcher)
|
||||
- **Meta Launch URL:** `https://your-app.riotpiao.com` (optional, for app launcher)
|
||||
|
||||
3. **Save**
|
||||
|
||||
@@ -160,7 +160,7 @@ OIDC_CLIENT_ID=yourservice
|
||||
OIDC_CLIENT_SECRET=$CLIENT_SECRET
|
||||
|
||||
# Redirect URI (must match what you configured in step 2)
|
||||
OIDC_REDIRECT_URI=https://your-app.riotpiao.homelab.com/oauth2/callback
|
||||
OIDC_REDIRECT_URI=https://your-app.riotpiao.com/oauth2/callback
|
||||
|
||||
# Optionally, token validation endpoint
|
||||
OIDC_TOKEN_URL=http://authentik-server.iam.svc.cluster.local/application/o/yourservice/token/
|
||||
@@ -179,7 +179,7 @@ talos put cluster/YOURSERVICE_OIDC_CLIENT_SECRET YOURSERVICE_OIDC_CLIENT_SECRET=
|
||||
talos put cluster/yourservice-oidc \
|
||||
client_id=yourservice \
|
||||
issuer_url="http://authentik-server.iam.svc.cluster.local/application/o/yourservice/" \
|
||||
callback_uri="https://your-app.riotpiao.homelab.com/oauth2/callback"
|
||||
callback_uri="https://your-app.riotpiao.com/oauth2/callback"
|
||||
```
|
||||
|
||||
### Step 5: Mount Credentials in Your Service
|
||||
@@ -378,7 +378,7 @@ kubectl get secret yourservice-oidc -n your-namespace -o jsonpath='{.data}' | ba
|
||||
vault read auth/jwt/role/yourservice
|
||||
|
||||
# 5. Test OAuth login (requires port-forward to your app)
|
||||
# Open http://your-app.riotpiao.homelab.com/login
|
||||
# Open http://your-app.riotpiao.com/login
|
||||
# Should redirect to Authentik, then back to your app
|
||||
|
||||
# 6. Test JWT auth to Vault (if applicable)
|
||||
|
||||
@@ -227,7 +227,7 @@ The homelab provides **automated OAuth registration** for new services via `regi
|
||||
python3 k8s/talos-iam/register_oauth_app.py \
|
||||
--service-name my-service \
|
||||
--namespace my-ns \
|
||||
--redirect-uri "https://my-service.riotpiao.homelab.com/oauth2/callback" \
|
||||
--redirect-uri "https://my-service.riotpiao.com/oauth2/callback" \
|
||||
--service-name-in-vault MY_SERVICE \
|
||||
--vault-jwt-policy shell-secrets \
|
||||
--add-group my-service-admins
|
||||
@@ -254,7 +254,7 @@ export DASHBOARD_OIDC_CLIENT_SECRET
|
||||
python3 k8s/talos-iam/register_oauth_app.py \
|
||||
--service-name dashboard-service \
|
||||
--namespace apps \
|
||||
--redirect-uri "https://dashboard.riotpiao.homelab.com/oauth2/callback" \
|
||||
--redirect-uri "https://dashboard.riotpiao.com/oauth2/callback" \
|
||||
--service-name-in-vault DASHBOARD \
|
||||
--vault-jwt-policy shell-secrets \
|
||||
--add-group dashboard-admins \
|
||||
@@ -282,7 +282,7 @@ kubectl get secret my-service-oidc -n my-ns -o yaml
|
||||
vault read auth/jwt/role/my-service
|
||||
|
||||
# Test OAuth login
|
||||
# Browser: https://my-service.riotpiao.homelab.com/login
|
||||
# Browser: https://my-service.riotpiao.com/login
|
||||
# Should redirect to Authentik → back to service with session
|
||||
```
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ authentik:
|
||||
# Must match what the browser sees — if it returns an internal svc URL,
|
||||
# the browser's redirect after login will fail (can't reach svc DNS externally).
|
||||
# HTTP (not HTTPS) because the Authentik ingress has no TLS cert configured.
|
||||
host: "https://authentik.riotpiao.homelab.com"
|
||||
host: "https://authentik.riotpiao.com"
|
||||
|
||||
error_reporting:
|
||||
enabled: false # do not phone home to Sentry
|
||||
@@ -103,7 +103,7 @@ _caEnv: &caEnv
|
||||
# ── Authentik server (UI + API) ───────────────────────────────────────────────
|
||||
# Handles all browser traffic: login flows, admin UI, OAuth2 authorize/token endpoints.
|
||||
# NodePort 32172 is a fallback for direct node access during troubleshooting;
|
||||
# normal access is via nginx ingress (authentik.riotpiao.homelab.com → svc:80).
|
||||
# normal access is via nginx ingress (authentik.riotpiao.com → svc:80).
|
||||
# Recreate: single replica + RWO-adjacent state — avoids split-brain on redeploy.
|
||||
server:
|
||||
replicas: 1
|
||||
@@ -221,5 +221,5 @@ redis:
|
||||
operator: Exists
|
||||
architecture: standalone
|
||||
|
||||
# Ingress disabled — rule lives in k8s/ingress/ingress.yaml (authentik.riotpiao.homelab.com).
|
||||
# Ingress disabled — rule lives in k8s/ingress/ingress.yaml (authentik.riotpiao.com).
|
||||
# For direct access during bootstrap: kubectl -n iam port-forward svc/authentik-server 7000:80
|
||||
|
||||
@@ -23,7 +23,7 @@ To use this example:
|
||||
python3 register_oauth_app.py \\
|
||||
--service-name dashboard-service \\
|
||||
--namespace apps \\
|
||||
--redirect-uri "https://dashboard.riotpiao.homelab.com/oauth2/callback" \\
|
||||
--redirect-uri "https://dashboard.riotpiao.com/oauth2/callback" \\
|
||||
--service-name-in-vault DASHBOARD \\
|
||||
--vault-jwt-policy shell-secrets \\
|
||||
--add-group dashboard-admins \\
|
||||
@@ -34,7 +34,7 @@ To use this example:
|
||||
http://localhost:7000/api/v3/core/applications/?slug=dashboard-service | jq .
|
||||
|
||||
# 5. Test OAuth callback (requires app running)
|
||||
# Browser: http://dashboard.riotpiao.homelab.com/login
|
||||
# Browser: http://dashboard.riotpiao.com/login
|
||||
# Should redirect to Authentik → back to dashboard with session
|
||||
"""
|
||||
|
||||
@@ -68,7 +68,7 @@ def example_dashboard_service():
|
||||
"register_oauth_app.py",
|
||||
"--service-name", "dashboard-service",
|
||||
"--namespace", "apps",
|
||||
"--redirect-uri", "https://dashboard.riotpiao.homelab.com/oauth2/callback",
|
||||
"--redirect-uri", "https://dashboard.riotpiao.com/oauth2/callback",
|
||||
"--service-name-in-vault", "DASHBOARD",
|
||||
"--vault-jwt-policy", "shell-secrets",
|
||||
"--add-group", "dashboard-admins",
|
||||
@@ -122,7 +122,7 @@ def verify_example():
|
||||
print()
|
||||
|
||||
print("✅ Test OAuth redirect (requires app running):")
|
||||
print(" curl -L https://dashboard.riotpiao.homelab.com/login")
|
||||
print(" curl -L https://dashboard.riotpiao.com/login")
|
||||
print(" # Should redirect to Authentik, then back to dashboard")
|
||||
print()
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ Usage:
|
||||
python3 register_oauth_app.py \\
|
||||
--service-name my-service \\
|
||||
--namespace my-ns \\
|
||||
--redirect-uri "https://my-service.riotpiao.homelab.com/oauth2/callback" \\
|
||||
--redirect-uri "https://my-service.riotpiao.com/oauth2/callback" \\
|
||||
[--service-name-in-vault MY_SERVICE] \\
|
||||
[--vault-jwt-policy shell-secrets]
|
||||
|
||||
@@ -28,13 +28,13 @@ Examples:
|
||||
python3 register_oauth_app.py \\
|
||||
--service-name myapp \\
|
||||
--namespace apps \\
|
||||
--redirect-uri "https://myapp.riotpiao.homelab.com/callback"
|
||||
--redirect-uri "https://myapp.riotpiao.com/callback"
|
||||
|
||||
# Advanced: full service with Vault JWT auth
|
||||
python3 register_oauth_app.py \\
|
||||
--service-name myservice \\
|
||||
--namespace my-namespace \\
|
||||
--redirect-uri "https://myservice.riotpiao.homelab.com/oauth2/callback" \\
|
||||
--redirect-uri "https://myservice.riotpiao.com/oauth2/callback" \\
|
||||
--service-name-in-vault MYSERVICE \\
|
||||
--vault-jwt-policy shell-secrets \\
|
||||
--add-group myservice-admins \\
|
||||
@@ -328,7 +328,7 @@ def main() -> None:
|
||||
parser.add_argument(
|
||||
"--redirect-uri",
|
||||
required=True,
|
||||
help="OAuth2 redirect URI (e.g., https://myapp.riotpiao.homelab.com/callback)"
|
||||
help="OAuth2 redirect URI (e.g., https://myapp.riotpiao.com/callback)"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--service-name-in-vault",
|
||||
@@ -420,7 +420,7 @@ def main() -> None:
|
||||
display_name=service_name.replace("-", " ").title(),
|
||||
slug=service_name,
|
||||
provider_pk=provider_pk,
|
||||
launch_url=f"https://{service_name}.riotpiao.homelab.com"
|
||||
launch_url=f"https://{service_name}.riotpiao.com"
|
||||
)
|
||||
print()
|
||||
|
||||
|
||||
@@ -238,7 +238,7 @@ _vault_browser_payload=$(jq -n \
|
||||
invalidation_flow: $inval_flow,
|
||||
signing_key: $signing_key,
|
||||
redirect_uris: [
|
||||
{"matching_mode": "strict", "url": "http://vault.riotpiao.homelab.com/ui/vault/auth/oidc/oidc/callback"},
|
||||
{"matching_mode": "strict", "url": "http://vault.riotpiao.com/ui/vault/auth/oidc/oidc/callback"},
|
||||
{"matching_mode": "strict", "url": "http://localhost:8250/oidc/callback"}
|
||||
]
|
||||
}')
|
||||
@@ -465,7 +465,7 @@ step oidc_enable "Enabling OIDC auth method for browser login..."
|
||||
vault auth enable oidc 2>/dev/null || echo "OIDC auth already enabled."
|
||||
|
||||
vault write auth/oidc/config \
|
||||
oidc_discovery_url="http://authentik.riotpiao.homelab.com/application/o/vault-browser/" \
|
||||
oidc_discovery_url="http://authentik.riotpiao.com/application/o/vault-browser/" \
|
||||
oidc_client_id="vault-browser" \
|
||||
oidc_client_secret="${VAULT_BROWSER_CLIENT_SECRET}" \
|
||||
default_role="homelab"
|
||||
@@ -475,7 +475,7 @@ vault write auth/oidc/config \
|
||||
vault write auth/oidc/role/homelab \
|
||||
role_type=oidc \
|
||||
bound_audiences="vault-browser" \
|
||||
allowed_redirect_uris="http://vault.riotpiao.homelab.com/ui/vault/auth/oidc/oidc/callback,http://localhost:8250/oidc/callback" \
|
||||
allowed_redirect_uris="http://vault.riotpiao.com/ui/vault/auth/oidc/oidc/callback,http://localhost:8250/oidc/callback" \
|
||||
user_claim="sub" \
|
||||
oidc_scopes="openid,profile,email" \
|
||||
token_policies="shell-secrets,cluster-admin" \
|
||||
@@ -483,8 +483,8 @@ vault write auth/oidc/role/homelab \
|
||||
token_max_ttl=12h
|
||||
|
||||
echo "OIDC auth configured."
|
||||
echo " Browser login: http://vault.riotpiao.homelab.com → sign in with Authentik"
|
||||
echo " CLI login: VAULT_ADDR=http://vault.riotpiao.homelab.com vault login -method=oidc"
|
||||
echo " Browser login: http://vault.riotpiao.com → sign in with Authentik"
|
||||
echo " CLI login: VAULT_ADDR=http://vault.riotpiao.com vault login -method=oidc"
|
||||
|
||||
# ── 14. Seed initial secrets ──────────────────────────────────────────────────
|
||||
step seed_secrets "Seeding initial secrets from environment (accessible after OIDC login)..."
|
||||
@@ -519,8 +519,8 @@ echo "==> Vault bootstrap complete."
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Move ${UNSEAL_KEYS_FILE} OFFLINE (USB / password manager)."
|
||||
echo " 2. Browser login: open http://vault.riotpiao.homelab.com → choose OIDC → sign in with Authentik"
|
||||
echo " 3. CLI login: export VAULT_ADDR=http://vault.riotpiao.homelab.com"
|
||||
echo " 2. Browser login: open http://vault.riotpiao.com → choose OIDC → sign in with Authentik"
|
||||
echo " 3. CLI login: export VAULT_ADDR=http://vault.riotpiao.com"
|
||||
echo " vault login -method=oidc"
|
||||
echo " 4. Read MinIO credentials from Vault after login:"
|
||||
echo " vault kv get secret/cluster/minio"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
# once after first install to initialize and store the keys).
|
||||
|
||||
# ── Global ────────────────────────────────────────────────────────────────────
|
||||
# tlsDisable: true — TLS terminated at the nginx ingress (vault.riotpiao.homelab.com)
|
||||
# tlsDisable: true — TLS terminated at the nginx ingress (vault.riotpiao.com)
|
||||
# or at port-forward. In-cluster traffic to Vault is plain HTTP; this is acceptable
|
||||
# because all clients are on the pod network (not crossing node boundaries).
|
||||
global:
|
||||
@@ -137,7 +137,7 @@ server:
|
||||
|
||||
# ── Service ─────────────────────────────────────────────────────────────────
|
||||
# NodePort 32171 — fallback for direct node access during bootstrap before
|
||||
# the ingress is up. Normal access is via nginx ingress (vault.riotpiao.homelab.com).
|
||||
# the ingress is up. Normal access is via nginx ingress (vault.riotpiao.com).
|
||||
service:
|
||||
type: NodePort
|
||||
port: 8200
|
||||
@@ -155,7 +155,7 @@ server:
|
||||
# ── UI ────────────────────────────────────────────────────────────────────────
|
||||
# Vault's web UI is used for the OIDC browser login flow (Vault as an OIDC
|
||||
# provider, if configured) and for manual operator inspection.
|
||||
# Accessible at http://vault.riotpiao.homelab.com or via port-forward.
|
||||
# Accessible at http://vault.riotpiao.com or via port-forward.
|
||||
ui:
|
||||
enabled: true
|
||||
|
||||
|
||||
Reference in New Issue
Block a user