All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- 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>
145 lines
4.4 KiB
Markdown
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) |
|