mirror of
https://github.com/wahyd4/home-docker.git
synced 2026-08-09 04:15:52 +10:00
431 lines
12 KiB
Markdown
431 lines
12 KiB
Markdown
# AI Agent Context: Home Docker Infrastructure
|
|
|
|
> **Purpose**: This document helps AI assistants (GitHub Copilot, Claude, ChatGPT, etc.) understand the repository structure, architecture, and context for better code assistance.
|
|
|
|
DO NOT DELETE ANY LOCAL OR REMOTE FILES WITHOUT ASKING ME TO CONFIRM!
|
|
---
|
|
|
|
## 📋 Repository Overview
|
|
|
|
**Name**: `home-docker` (wahyd4/home-docker)
|
|
**Purpose**: Home media server and personal cloud infrastructure managed via Kubernetes (K3s) and Terraform
|
|
**Architecture**: Self-hosted Kubernetes cluster with NGINX Ingress, cert-manager, and various homelab applications
|
|
**Primary Technologies**: Kubernetes (K3s), Terraform, Docker, Helm, ArgoCD
|
|
|
|
---
|
|
|
|
## 🏗️ Infrastructure Architecture
|
|
|
|
### Kubernetes Cluster Setup
|
|
|
|
- **Distribution**: K3s (lightweight Kubernetes)
|
|
- **Control Plane**: 192.168.1.2 (server-3)
|
|
- **Container Runtime**: containerd 2.0.5-k3s2
|
|
- **Kubernetes Version**: v1.33.3+k3s1
|
|
- **OS**: Ubuntu 24.04.3 LTS
|
|
- **Network**: 192.168.1.0/24 (local network)
|
|
|
|
### Key Infrastructure Components
|
|
|
|
1. **Ingress Controller**: NGINX Ingress Controller (ingress-nginx namespace)
|
|
- NodePort on ports 80/443
|
|
- Handles all external traffic
|
|
- Integrated with cert-manager for TLS
|
|
- Domain *.junv.cc
|
|
|
|
2. **Certificate Management**: cert-manager
|
|
- Let's Encrypt integration (letsencrypt-prod ClusterIssuer)
|
|
- Automatic TLS certificate provisioning
|
|
- Email: me@junv.cc
|
|
|
|
3. **GitOps**: ArgoCD
|
|
- Continuous deployment from Git
|
|
- Web UI: https://argo.junv.cc
|
|
- Uses external Redis (redis-master.db.svc.cluster.local)
|
|
|
|
4. **Security**: Multi-layered protection
|
|
|
|
**CrowdSec** (Community threat intelligence):
|
|
- Monitors NGINX Ingress logs
|
|
- SSH monitoring (port 22422)
|
|
- System log analysis
|
|
- Enrolled in CrowdSec Console
|
|
- Storage: /mnt/k8s/crowdsec/ on server-3
|
|
|
|
**fail2ban** (Local intrusion prevention):
|
|
- SSH brute force protection (port 22422)
|
|
- Ban time: 1 hour (3600 seconds)
|
|
- Max retries: 5 attempts in 10 minutes
|
|
- Recidive jail: 24 hour ban for repeat offenders
|
|
- Ignores local network (192.168.1.0/24)
|
|
|
|
5. **Monitoring**: Prometheus + Grafana
|
|
- Metrics collection
|
|
- Custom dashboards
|
|
- ServiceMonitor for various services
|
|
|
|
---
|
|
|
|
## 📁 Directory Structure
|
|
|
|
### Root Level Files
|
|
|
|
- **terraform/**: Terraform configurations for infrastructure as code
|
|
- `main.tf`: K3s cluster setup, SSH configuration
|
|
- `argocd.tf`: ArgoCD, cert-manager, NGINX Ingress deployment
|
|
- `crowdsec.tf`: CrowdSec security engine setup
|
|
- `fail2ban.tf`: fail2ban intrusion prevention setup
|
|
- `postgres.tf`: PostgreSQL installation via SSH
|
|
- `redis.tf`: Redis installation via SSH
|
|
|
|
- **home-apps/**: Home automation and productivity apps
|
|
- `ddns.yaml`: Dynamic DNS clients (Cloudflare, Aliyun)
|
|
- `n8n.yaml`: Workflow automation platform
|
|
- `searxng.yaml`: Privacy-respecting search engine
|
|
- `home.yaml`: Home dashboard application
|
|
- `server-backup.yaml`: Backup automation
|
|
|
|
- **apps/**: General applications
|
|
- `passkey-auth.yaml`: Authentication service
|
|
|
|
- **ai/**: AI/ML applications
|
|
- `crawl4ai.yaml`: AI web crawler
|
|
|
|
- **media/**: Media server applications
|
|
- `alist.yaml`: File listing service
|
|
- `jackett.yaml`: Torrent indexer
|
|
- `media.yaml`: Media server deployment
|
|
- `nextcloud-pv.yaml`: Nextcloud persistent volume
|
|
- `static-file.yaml`: Static file server
|
|
|
|
- **db/**: Database services
|
|
- `redis-values.yaml`: Redis Helm values
|
|
- `qdrant.yaml`: Vector database for AI
|
|
|
|
- **archive/**: Deprecated/archived configurations
|
|
- Legacy configurations no longer in active use
|
|
- Old services like Jellyfin, Plex, Metabase, etc.
|
|
|
|
### Key Scripts
|
|
|
|
- `apply.sh`: Manual kubectl apply commands (mostly deprecated in favor of Terraform)
|
|
- `backup-k8s.sh`: Kubernetes cluster backup script
|
|
- `restore-k8s.sh`: Kubernetes cluster restoration
|
|
- `k3s.sh`: K3s installation and management notes
|
|
- `fix_redis.sh`: Redis troubleshooting script
|
|
|
|
---
|
|
|
|
## 🔧 Terraform Configuration
|
|
|
|
### SSH Access Configuration
|
|
|
|
```hcl
|
|
locals {
|
|
ssh_host = "192.168.1.2"
|
|
ssh_user = "junv"
|
|
ssh_port = 22422 # Custom SSH port
|
|
ssh_private_key = file("~/.ssh/id_ed25519")
|
|
}
|
|
```
|
|
|
|
### Terraform Providers
|
|
|
|
1. **ssh** (loafoe/ssh v2.6.0): Remote command execution
|
|
2. **kubernetes** (hashicorp/kubernetes v2.27.0): K8s resource management
|
|
3. **helm** (hashicorp/helm v2.12.1): Helm chart deployment
|
|
4. **kubectl** (gavinbunney/kubectl v1.14.0): Raw K8s manifests
|
|
|
|
### Storage Strategy
|
|
|
|
- **Local Path Storage**: `/mnt/k8s/` on server-3 (192.168.1.2)
|
|
- **Storage Class**: `local-path` (K3s default)
|
|
- **Node Affinity**: Resources pinned to `server-3` hostname
|
|
- **Examples**:
|
|
- CrowdSec: `/mnt/k8s/crowdsec/`
|
|
- PostgreSQL: `/mnt/k8s/postgres/`
|
|
- Redis: `/mnt/k8s/redis/`
|
|
|
|
---
|
|
|
|
## 🔐 Security & Access
|
|
|
|
### SSH Configuration
|
|
|
|
- **Port**: 22422 (non-standard for security)
|
|
- **Key**: Ed25519 (~/.ssh/id_ed25519)
|
|
- **User**: junv
|
|
- **Host**: 192.168.1.2
|
|
|
|
### Network Security
|
|
|
|
- **Local Network**: 192.168.1.0/24 (trusted)
|
|
- **CrowdSec**: Monitors external threats
|
|
- **iptables**: Previously attempted but removed due to kubectl connectivity issues
|
|
|
|
### CrowdSec Configuration
|
|
|
|
- **Monitored Logs**:
|
|
- NGINX Ingress Controller logs (container logs with poll_without_inotify)
|
|
- SSH attempts: /var/log/auth.log
|
|
- System logs: /var/log/kern.log, /var/log/syslog
|
|
|
|
- **Collections Installed**:
|
|
- crowdsecurity/nginx
|
|
- crowdsecurity/base-http-scenarios
|
|
- crowdsecurity/linux
|
|
- crowdsecurity/sshd
|
|
- crowdsecurity/iptables
|
|
- crowdsecurity/endlessh
|
|
|
|
- **Enrollment**: junv-home-k3s-cluster (enrolled in CrowdSec Console)
|
|
|
|
---
|
|
|
|
## 🚀 Common Operations
|
|
|
|
### Terraform Workflow
|
|
|
|
```bash
|
|
cd terraform/
|
|
terraform init
|
|
terraform plan
|
|
terraform apply
|
|
```
|
|
|
|
### Kubernetes Access
|
|
|
|
```bash
|
|
# Copy kubeconfig from server
|
|
scp -P 22422 junv@192.168.1.2:/etc/rancher/k3s/k3s.yaml ~/.kube/config
|
|
sed -i '' 's/127.0.0.1/192.168.1.2/g' ~/.kube/config
|
|
|
|
# Or use Terraform local
|
|
# Defined in main.tf as local.kubeconfig_cmd
|
|
```
|
|
|
|
### CrowdSec Commands
|
|
|
|
```bash
|
|
# View metrics
|
|
kubectl exec -n crowdsec deployment/crowdsec-lapi -- cscli metrics
|
|
|
|
# List decisions (bans)
|
|
kubectl exec -n crowdsec deployment/crowdsec-lapi -- cscli decisions list
|
|
|
|
# List bouncers
|
|
kubectl exec -n crowdsec deployment/crowdsec-lapi -- cscli bouncers list
|
|
|
|
# Quick status view
|
|
./terraform/view_crowdsec.sh
|
|
```
|
|
|
|
### fail2ban Commands
|
|
|
|
```bash
|
|
# View status
|
|
ssh -p 22422 junv@192.168.1.2 "sudo fail2ban-client status"
|
|
|
|
# SSH jail status
|
|
ssh -p 22422 junv@192.168.1.2 "sudo fail2ban-client status sshd"
|
|
|
|
# List banned IPs
|
|
ssh -p 22422 junv@192.168.1.2 "sudo fail2ban-client status sshd | grep 'Banned IP'"
|
|
|
|
# Unban an IP
|
|
ssh -p 22422 junv@192.168.1.2 "sudo fail2ban-client set sshd unbanip <IP>"
|
|
|
|
# Quick status view
|
|
./terraform/view_fail2ban.sh
|
|
```
|
|
|
|
### Backup/Restore
|
|
|
|
```bash
|
|
# Backup cluster
|
|
./backup-k8s.sh
|
|
|
|
# Restore cluster
|
|
./restore-k8s.sh
|
|
```
|
|
|
|
---
|
|
|
|
## 📦 Helm Charts Used
|
|
|
|
| Chart | Repository | Version | Namespace | Purpose |
|
|
|-------|-----------|---------|-----------|---------|
|
|
| crowdsec | https://crowdsecurity.github.io/helm-charts | 0.20.0 | crowdsec | Security engine |
|
|
| cert-manager | https://charts.jetstack.io | v1.17.2 | cert-manager | Certificate management |
|
|
| ingress-nginx | https://kubernetes.github.io/ingress-nginx | 4.10.5 | ingress-nginx | Ingress controller |
|
|
| argocd | https://argoproj.github.io/argo-helm | latest | argocd | GitOps CD |
|
|
| kube-prometheus-stack | prometheus-community | latest | default | Monitoring |
|
|
| redis | bitnami | latest | db | Cache/queue |
|
|
|
|
---
|
|
|
|
## 🗄️ Persistent Storage Locations
|
|
|
|
All persistent data stored on **server-3** at `192.168.1.2:/mnt/k8s/`
|
|
|
|
```
|
|
/mnt/k8s/
|
|
├── crowdsec/
|
|
│ ├── lapi-config/ (1Gi)
|
|
│ └── lapi-data/ (2Gi)
|
|
├── postgres/
|
|
├── redis/
|
|
└── [other services]
|
|
```
|
|
|
|
---
|
|
|
|
## 🌐 Domain Configuration
|
|
|
|
- **Primary Domain**: junv.cc
|
|
- **Subdomains**:
|
|
- argo.junv.cc (ArgoCD)
|
|
- [other services configured via Ingress resources]
|
|
|
|
---
|
|
|
|
## 🔍 Important Patterns & Conventions
|
|
|
|
### Namespace Organization
|
|
|
|
- `crowdsec`: Security monitoring
|
|
- `ingress-nginx`: Ingress controller
|
|
- `cert-manager`: Certificate management
|
|
- `argocd`: GitOps deployment
|
|
- `home-apps`: Home automation apps
|
|
- `media`: Media server apps
|
|
- `db`: Database services
|
|
- `default`: Legacy prometheus/monitoring
|
|
|
|
### Resource Naming
|
|
|
|
- PersistentVolumes: `{service}-{type}-pv` (e.g., `crowdsec-lapi-config-pv`)
|
|
- Deployments: Usually match service name
|
|
- Secrets: `{service}-credentials` or `{service}-{purpose}`
|
|
|
|
### Storage Classes
|
|
|
|
- `local-path`: K3s default local storage (most common)
|
|
- `nfs-client`: NFS-based storage (if NFS provisioner installed)
|
|
|
|
---
|
|
|
|
## ⚠️ Known Issues & Fixes
|
|
|
|
### Issue: iptables blocking kubectl
|
|
|
|
**Problem**: CrowdSec iptables rules blocked kubectl access to port 6443
|
|
**Solution**: Disabled iptables integration in `crowdsec.tf` (commented out `ssh_resource.iptables_logging`)
|
|
**Status**: CrowdSec still works via log analysis without iptables
|
|
|
|
### Issue: Container log symlinks
|
|
|
|
**Problem**: CrowdSec warning about inotify polling with symlinked container logs
|
|
**Solution**: Added `poll_without_inotify: true` to NGINX Ingress acquisition config
|
|
**Status**: Resolved
|
|
|
|
### Issue: SSH timeout during Terraform apply
|
|
|
|
**Problem**: SSH connection timeout when iptables rules were being applied
|
|
**Root Cause**: iptables port scan detection was blocking Terraform's own SSH connections
|
|
**Solution**: Removed iptables integration entirely
|
|
|
|
---
|
|
|
|
## 🔗 External Dependencies
|
|
|
|
- **NFS Server**: 192.168.1.5:/fs/1000/nfs/k8s (for NFS storage provisioner)
|
|
- **External etcd Cluster**:
|
|
- 192.168.1.6:2379
|
|
- 192.168.1.10:2379
|
|
- 192.168.1.11:2379
|
|
- **CrowdSec Console**: https://app.crowdsec.net
|
|
|
|
---
|
|
|
|
## 📝 Migration Notes
|
|
|
|
### From Docker Compose to Kubernetes
|
|
|
|
- **legacy-docker-compose/**: Contains old Docker Compose configurations
|
|
- Most services migrated to Kubernetes YAML manifests
|
|
- Some services archived if no longer needed
|
|
|
|
### From Manual kubectl to Terraform
|
|
|
|
- **apply.sh**: Contains legacy manual kubectl commands
|
|
- Gradually being replaced by Terraform resources
|
|
- Reference for secret creation and one-time setup tasks
|
|
|
|
---
|
|
|
|
## 🎯 Development Workflow
|
|
|
|
### Adding a New Service
|
|
|
|
1. Create YAML manifest in appropriate directory (home-apps/, media/, etc.)
|
|
2. Define namespace, deployment, service, ingress
|
|
3. If needs persistence: create PV/PVC with `/mnt/k8s/{service}/` path
|
|
4. If needs TLS: add cert-manager annotations to Ingress
|
|
5. If monitoring needed: add ServiceMonitor resource
|
|
6. Consider adding to ArgoCD for GitOps deployment
|
|
|
|
### Modifying Terraform Infrastructure
|
|
|
|
1. Edit appropriate `.tf` file in `terraform/`
|
|
2. Run `terraform plan` to preview changes
|
|
3. Run `terraform apply` to apply changes
|
|
4. For SSH-based resources: ensure connectivity to 192.168.1.2:22422
|
|
|
|
### Debugging
|
|
|
|
- **Pod logs**: `kubectl logs -n {namespace} {pod-name}`
|
|
- **Pod shell**: `kubectl exec -it -n {namespace} {pod-name} -- /bin/bash`
|
|
- **Events**: `kubectl get events -n {namespace} --sort-by='.lastTimestamp'`
|
|
- **CrowdSec**: `./terraform/view_crowdsec.sh`
|
|
|
|
---
|
|
|
|
## 🤖 AI Assistant Guidelines
|
|
|
|
When assisting with this repository:
|
|
|
|
1. **Always consider the namespace** - resources are organized by namespace
|
|
2. **Use Terraform when possible** - prefer Terraform over manual kubectl
|
|
3. **Respect storage patterns** - use `/mnt/k8s/{service}/` for persistence
|
|
4. **Check SSH port** - always use port 22422, not default 22
|
|
5. **Local network trust** - 192.168.1.0/24 is trusted, don't block it
|
|
6. **CrowdSec integration** - avoid iptables, use log-based monitoring only
|
|
7. **Node affinity** - resources should be pinned to "server-3" hostname
|
|
8. **Poll without inotify** - use for container logs (symlinks)
|
|
9. **Ingress patterns** - use cert-manager annotations for TLS
|
|
10. **Secret management** - reference existing secrets in apply.sh for creation patterns
|
|
|
|
---
|
|
|
|
## 📚 Reference Documentation
|
|
|
|
- **K3s Docs**: https://docs.k3s.io/
|
|
- **CrowdSec Docs**: https://docs.crowdsec.net/
|
|
- **NGINX Ingress**: https://kubernetes.github.io/ingress-nginx/
|
|
- **cert-manager**: https://cert-manager.io/
|
|
- **ArgoCD**: https://argo-cd.readthedocs.io/
|
|
- **Terraform Kubernetes Provider**: https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs
|
|
|
|
---
|
|
|
|
## 🏷️ Tags & Keywords
|
|
|
|
`kubernetes` `k3s` `terraform` `homelab` `nginx-ingress` `crowdsec` `argocd` `cert-manager` `prometheus` `grafana` `self-hosted` `infrastructure-as-code` `gitops` `security` `monitoring` `media-server` `home-automation`
|
|
|
|
---
|
|
|
|
**Last Updated**: October 5, 2025
|
|
**Maintainer**: junv (wahyd4)
|
|
**Repository**: https://github.com/wahyd4/home-docker
|