Install (ArgoCD)

🚀Installation

Environment
Install By

Preliminary

1. Kubernetes is installed; if not, check 🔗link


2. Helm is installed; if not, check 🔗link


3. ArgoCD is installed; if not, check 🔗link


1.prepare `charge` DNS A record

Details
# zone 72602.space, RR charge, type A, value 47.110.67.161, TTL 600
# create only when the matching enabled record is absent

2.prepare `charge-spot-quest-argocd.yaml`

Details
git -C /home/aaron/Ops/docs fetch origin main
git -C /home/aaron/Ops/docs \
  show origin/main:manifests/charge-spot-quest-argocd.yaml >/dev/null

argocd app get ops-docs --hard-refresh
argocd app sync ops-docs --revision main
argocd app wait ops-docs --sync --timeout 300

kubectl wait --for=jsonpath='{.status.phase}'=Active \
  namespace/charge-spot --timeout=120s

The parent ops-docs Application reads the manifests path and creates the child Application. The child creates namespace charge-spot through CreateNamespace=true. SQLite is enabled; bundled and external PostgreSQL stay off.

3.prepare `charge-spot-dingtalk`

Details
kubectl -n charge-spot create secret generic charge-spot-dingtalk \
  --from-literal=webhook_url='https://oapi.dingtalk.com/robot/send?access_token=<replace-me>' \
  --from-literal=sec_secret='SEC<replace-me>' \
  --from-literal=revoke_secret="$(openssl rand -hex 32)"

Create the Secret on the cluster only. GitOps values set dingtalk.enabled, dingtalk.existingSecret=charge-spot-dingtalk, and dingtalk.publicBaseUrl=https://charge.72602.space. Do not commit webhook, SEC, or revoke tokens.

4.sync by argocd

Details
argocd app get charge-spot-quest --hard-refresh
argocd app sync charge-spot-quest
argocd app wait charge-spot-quest --sync --health --timeout 600

5.verify

Details
kubectl -n argocd get application charge-spot-quest \
  -o jsonpath='{.spec.source.repoURL}{"\n"}{.spec.source.path}{"\n"}{.spec.source.targetRevision}{"\n"}'

kubectl -n charge-spot get deployment charge-spot-quest \
  -o jsonpath='{range .spec.template.spec.containers[*]}{.name}{"="}{.image}{"\n"}{end}'

kubectl -n charge-spot rollout status deployment/charge-spot-quest --timeout=600s
kubectl -n charge-spot get pods,svc,ingress,pvc
kubectl -n charge-spot get certificate
kubectl -n charge-spot get pods -l app.kubernetes.io/component=postgresql
kubectl -n charge-spot get secret charge-spot-dingtalk \
  -o go-template='{{range $k,$v := .data}}{{$k}}{{"\n"}}{{end}}'
kubectl -n charge-spot get deployment charge-spot-quest \
  -o jsonpath='{range .spec.template.spec.containers[0].env[*]}{.name}{"\n"}{end}'

curl -fsS https://charge.72602.space/health
curl -fsS https://charge.72602.space/readyz
curl -fsS -o /dev/null -w '%{content_type}\n' https://charge.72602.space/
curl -fsS https://charge.72602.space/api/spots >/dev/null

Expected release values: chart charge-spot-quest version 0.1.15 and image ghcr.io/aaronyang0628/charge-spot-quest@sha256:31707edea46707434595c091cf6bdd4da0c6cb652f9831f8feccddda65ada1c2 (upstream did not publish a 0.1.15 GHCR tag; the digest pins the built content, also available as sha-3efdcf1). Ingress / returns text/html. PVC charge-spot-quest-sqlite is Bound at 1Gi. TLS certificate charge.72602.space-tls should be Ready with expiry 2026-12-14T06:20:17Z.

📦Rollback Guidance

If a deployment must be reverted, create a reviewed Git revert for manifests/charge-spot-quest-argocd.yaml, push it, and sync the parent application. The SQLite PVC and TLS certificate are not deleted by rollback.

cd /home/aaron/Ops/docs
git fetch origin main
git revert --no-edit 9a15bea
git push origin main
argocd app sync ops-docs --revision main
argocd app wait ops-docs --sync --health --timeout 300