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.