# 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.

---

## 📋 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
