research-notes/ops.md
jordan a65c3f7243
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Initial orchard9 deployment
- Add Dockerfile with multi-stage standalone build
- Add Woodpecker CI pipeline (.woodpecker.yml)
- Add Kubernetes manifests for deployment, service, ingress
- Add ops.md with deployment documentation
- Configure Next.js for standalone output
- Move deployment files to root level

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 14:42:06 -07:00

145 lines
4.4 KiB
Markdown

# Operations: notes.orchard9.ai
Research notes journal deployed to orchard9 k3s fleet.
## Architecture
```
┌─────────────┐ push ┌─────────────┐ webhook ┌─────────────┐
│ Local │ ────────► │ Gitea │ ─────────► │ Woodpecker │
│ Dev │ │ threesix.ai │ │ CI │
└─────────────┘ └─────────────┘ └──────┬──────┘
┌─────────────┐ ingress ┌─────────────┐ deploy ┌─────────────┐
│ Browser │ ◄──────── │ k3s │ ◄──────── │ Kaniko │
│ notes. │ │ projects │ │ build │
│ orchard9.ai │ │ namespace │ └──────┬──────┘
└─────────────┘ └─────────────┘ │
┌─────────────┐
│ Zot Registry│
│ registry. │
│ threesix.ai │
└─────────────┘
```
## Infrastructure
| Component | Location |
|-----------|----------|
| Domain | notes.orchard9.ai |
| DNS Provider | GoDaddy (via squiddy-dns) |
| Ingress IP | 208.122.204.172 |
| TLS | cert-manager / letsencrypt-prod |
| Registry | registry.threesix.ai |
| Git Origin | git.threesix.ai/jordan/research-notes |
| Namespace | projects |
## Local Development
```bash
cd blog
npm install # or pnpm install
npm run dev # http://localhost:19197
```
## Deployment
Push to origin triggers automatic deployment:
```bash
git push origin main
```
Pipeline:
1. Woodpecker receives webhook from Gitea
2. Kaniko builds container image (amd64)
3. Image pushed to `registry.threesix.ai/research-notes/web:${SHA}`
4. kubectl rolls out new image to deployment
## Initial Setup (one-time)
### 1. Create Gitea Repository
```bash
# Create repo at git.threesix.ai/jordan/research-notes
# Then set origin:
git remote add origin https://git.threesix.ai/jordan/research-notes.git
```
### 2. Configure DNS
```bash
squiddy-dns record create orchard9.ai A notes 208.122.204.172 \
--ttl 300 --provider godaddy --profile orchard9
```
### 3. Apply Kubernetes Manifests
```bash
export KUBECONFIG=~/.kube/orchard9-k3sf.yaml
kubectl apply -f deploy/k8s/notes.yaml
```
### 4. First Deploy
```bash
git add .
git commit -m "Initial deployment setup"
git push origin main
```
## Verify Deployment
```bash
# Check pod status
kubectl get pods -n projects -l app=research-notes
# Check ingress
kubectl get ingress -n projects research-notes
# Check TLS certificate
kubectl get certificate -n projects research-notes-tls
# View logs
kubectl logs -n projects -l app=research-notes --tail=50
# Port forward for debugging
kubectl port-forward -n projects svc/research-notes 8080:80
```
## Troubleshooting
### Build not triggering?
- Verify push went to `origin` (Gitea), not GitHub
- Check Woodpecker webhook exists on Gitea repo
- Check Woodpecker at ci.threesix.ai
### Image not deploying?
```bash
# Check if image exists in registry
curl -s https://registry.threesix.ai/v2/research-notes/web/tags/list
# Check deployment events
kubectl describe deployment -n projects research-notes
```
### TLS certificate not ready?
```bash
# Check certificate status
kubectl describe certificate -n projects research-notes-tls
# Check cert-manager logs
kubectl logs -n cert-manager -l app=cert-manager --tail=50
```
## Files
| File | Purpose |
|------|---------|
| `Dockerfile` | Multi-stage Next.js standalone build |
| `.woodpecker.yml` | CI/CD pipeline config |
| `deploy/k8s/notes.yaml` | Deployment, Service, Ingress |
| `blog/next.config.ts` | Next.js config (standalone output) |