docs: add CLAUDE.md for AI assistant context

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 17:32:13 +08:00
parent 7eb6dd1e8a
commit 34751e4013

132
CLAUDE.md Normal file
View File

@@ -0,0 +1,132 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Repository Overview
This is a personal K3s Kubernetes cluster repository containing manifests and maintenance scripts for self-hosted services. The cluster runs on 3 nodes (vm120 master + vm121/vm122 workers) at 192.168.42.120.
### Quick Connection
```bash
ssh ubuntu@192.168.42.120
sudo -i
cd /root/k8s
```
### Git Workflow
1. Local edits happen in `/Users/timmy/42_120/k8s/`
2. Remote path on cluster: `/root/k8s`
3. Git repo: `http://192.168.42.124:31337/timmy/k3s.git`
After local changes:
```bash
git add -A && git commit -m "description" && git push
# Then on remote: git -C /root/k8s pull
```
## Architecture
### Ingress & Routing
- **Traefik** is the ingress controller
- Services exposed via Ingress with subdomains: `<service>.lotimmy.com`
- TLS is handled at the ingress level
### Storage
- **Longhorn** provides persistent storage
- PVCs use Longhorn storage class for data persistence
- PVCs are NOT deleted by `stop.sh` - data is preserved
### Naming Conventions
Manifests in each app's `manifests/` directory are prefixed with numbers for ordering:
- `00-*.yaml` - Middleware/config
- `01-*.yaml` - Secrets
- `02-*.yaml` - PVCs
- `03-*.yaml` - Database deployments
- `04-*.yaml` - Database services
- `05-*.yaml` - App deployments
- `06-*.yaml` - App services
- `07-*.yaml` - Ingress
## App Directory Structure
Each app in `apps/` follows this structure:
```
apps/<appname>/
├── manifests/ # Kubernetes YAML files
├── deploy.sh # Apply manifests and wait for rollout
├── stop.sh # Delete Deployment/Service/Ingress (keeps PVC/Secret)
├── status.sh # Show pods, services, PVC, ingress status
├── backup.sh # Backup data to local backup/ directory
├── restore.sh # Restore from backup (if available)
└── backup/ # Local backups (gitignored)
```
## Common Commands
### Deploy an app
```bash
cd apps/<appname>/
./deploy.sh
```
### Check app status
```bash
cd apps/<appname>/
./status.sh
```
### Stop an app (preserves data)
```bash
cd apps/<appname>/
./stop.sh
```
### Cluster diagnostics
```bash
cd cluster/
./check_all.sh # Run all diagnostics
./check_nodes.sh # Node status
./check_storage.sh # Longhorn volumes
./check_resources.sh # Pod/Service/PVC summary
```
### Manual kubectl
```bash
kubectl get pods -A
kubectl get ingress -A
kubectl get pvc -A
kubectl logs -f <pod-name>
```
## Adding a New App
1. Copy the template: `cp -r apps/template apps/your-app`
2. Replace placeholders in manifests and scripts:
- `{{APP_NAME}}` - app name
- `{{IMAGE}}` - Docker image
- `{{TAG}}` - version tag
- `{{PORT}}` - container port
- `{{HOST}}` - domain name
- `{{SIZE}}` - storage size (e.g., 10Gi)
3. Make scripts executable: `chmod +x apps/your-app/*.sh`
4. Deploy: `cd apps/your-app && ./deploy.sh`
## Deployed Services
| App | Purpose | Ingress |
|-----|---------|---------|
| CodiMD | Markdown collaborative notes | codimd.lotimmy.com |
| Opengist | Git snippets management | opengist.lotimmy.com |
| Vaultwarden | Password manager | vaultwarden.lotimmy.com |
| Adminer | Database management tool | adminer.lotimmy.com |
| PostgreSQL | General database service | Cluster-internal only |
## Important Notes
- **Always run `status.sh` before making changes** to understand current state
- **PVCs are never deleted by `stop.sh`** - data persists across deployments
- **Secrets are stored in manifests** - these are committed to git (private repo)
- **Manifest ordering matters** - use number prefixes for correct apply order
- **Database apps** (like CodiMD) include both app and database deployments