308 lines
7.5 KiB
Markdown
308 lines
7.5 KiB
Markdown
````markdown
|
|
# infra-nix: NixOS Infrastructure
|
|
|
|
Dieses Repository enthält die deklarative NixOS-Infrastruktur für:
|
|
- **fileserver**: SMB, FileBrowser, rclone-Backup, DJ-Beets Musik-Library
|
|
- **gateway**: AdGuardHome (DNS), Caddy (Reverse Proxy)
|
|
|
|
## Quick Deploy
|
|
|
|
```bash
|
|
# Alle Systeme deployen
|
|
make deploy
|
|
|
|
# Nur fileserver deployen
|
|
make deploy-fileserver
|
|
|
|
# Nur gateway deployen
|
|
make deploy-gateway
|
|
```
|
|
|
|
---
|
|
|
|
## DJ-Beets Projekt (`src/dj-beets/`)
|
|
|
|
Dein eigenes Projekt als Beets-Ersatz. Wird beim Deploy auf `/opt/dj-beets` kopiert.
|
|
|
|
**Details siehe:** [src/dj-beets/README.md](src/dj-beets/README.md)
|
|
|
|
**Workflow:**
|
|
1. Lokal in `src/dj-beets/` entwickeln
|
|
2. `make deploy-fileserver` → deployed auf Server
|
|
3. Auto-Import läuft alle 10 Minuten via Timer
|
|
|
|
---
|
|
|
|
## Fileserver: rclone + SMB Quickstart
|
|
|
|
This guide covers setting up rclone (Google Drive) and setting the SMB password for user `danlin`.
|
|
|
|
---
|
|
|
|
## rclone (Google Drive)
|
|
|
|
The system has `rclone` installed and a systemd job to sync `/data` to a remote named `gdrive`:
|
|
|
|
- Service: `rclone-backup.service` (oneshot)
|
|
- Timer: `rclone-backup.timer` (runs daily 03:00)
|
|
- Log: `/var/log/rclone-backup.log`
|
|
|
|
### 1) Create the remote `gdrive`
|
|
Run on the fileserver:
|
|
|
|
```bash
|
|
sudo -i
|
|
rclone config
|
|
```
|
|
|
|
Then:
|
|
- n) New remote
|
|
- name: `gdrive`
|
|
- storage: `drive` (Google Drive)
|
|
- Use auto config? For headless server choose "No"
|
|
- Follow the printed instructions using another machine, or run on a desktop and copy the token
|
|
- Keep defaults unless you need a service account
|
|
- y) Yes to save
|
|
|
|
Verify:
|
|
```bash
|
|
rclone lsd gdrive:
|
|
rclone mkdir gdrive:backup-daten
|
|
```
|
|
|
|
### 2) Test backup manually
|
|
```bash
|
|
sudo systemctl start rclone-backup.service
|
|
sudo journalctl -u rclone-backup -e
|
|
sudo tail -n 100 /var/log/rclone-backup.log
|
|
```
|
|
|
|
### 3) Check/enable timer
|
|
```bash
|
|
systemctl list-timers '*rclone*'
|
|
sudo systemctl enable --now rclone-backup.timer
|
|
```
|
|
|
|
---
|
|
|
|
## SMB password for `danlin`
|
|
|
|
The share configuration:
|
|
- Protected share: `daten` → requires user `danlin`
|
|
- Guest share: `daten-share` → guest access allowed
|
|
|
|
Set the Samba password for `danlin` (independent from system login password):
|
|
|
|
```bash
|
|
sudo smbpasswd -a danlin
|
|
```
|
|
|
|
Useful commands:
|
|
```bash
|
|
sudo pdbedit -L # list Samba users
|
|
sudo systemctl status samba
|
|
sudo journalctl -u samba -e
|
|
```
|
|
|
|
Access examples:
|
|
- Windows: `\\fileserver\daten` or `\\fileserver\daten-share`
|
|
- macOS Finder: Go → Connect to Server → `smb://fileserver/daten` or `smb://fileserver/daten-share`
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
- rclone auth on headless: use `rclone authorize 'drive'` on a desktop and paste token
|
|
- Permissions: ensure `/data/daten` and `/data/daten/share` exist and are writable (`systemd-tmpfiles` creates them)
|
|
- Firewall: SMB ports 139/445 are open by module config
|
|
|
|
---
|
|
|
|
## K8s-Server: Docker Registry
|
|
|
|
The k8s-server runs a private Docker Registry v2 with self-signed TLS certificate. Authentication is handled by Caddy for external access.
|
|
|
|
**Access:**
|
|
- External URL: `https://registry.home.lindenfelser.de` (authenticated via Caddy)
|
|
- Internal URL: `https://10.202.82.7:5000` (direct, no auth - K8s pods)
|
|
- Default credentials: `admin` / `changeme` (Caddy basic auth)
|
|
- Storage: `/var/lib/docker-registry` (root partition)
|
|
|
|
### 1) Login from external machine
|
|
|
|
```bash
|
|
# Login to registry
|
|
docker login registry.home.lindenfelser.de
|
|
# Username: admin
|
|
# Password: changeme
|
|
```
|
|
|
|
### 2) Push an image
|
|
|
|
```bash
|
|
# Tag your image
|
|
docker tag myapp:latest registry.home.lindenfelser.de/myapp:latest
|
|
|
|
# Push to registry
|
|
docker push registry.home.lindenfelser.de/myapp:latest
|
|
```
|
|
|
|
### 3) Pull from Kubernetes pods
|
|
|
|
The k8s cluster is configured to authenticate automatically. Create a deployment:
|
|
|
|
```yaml
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: myapp
|
|
spec:
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app: myapp
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: myapp
|
|
spec:
|
|
containers:
|
|
- name: myapp
|
|
image: registry.home.lindenfelser.de/myapp:latest
|
|
```
|
|
|
|
### 4) Change registry password
|
|
|
|
Authentication is handled by Caddy. Generate new password hash and update:
|
|
|
|
```bash
|
|
# Generate new password hash locally
|
|
caddy hash-password --plaintext 'yournewpassword'
|
|
```
|
|
|
|
Then update the hash in [modules/gateway.nix](modules/gateway.nix) in the `basicauth` section and redeploy:
|
|
|
|
```bash
|
|
make deploy-gateway
|
|
```
|
|
|
|
### 5) Monitor storage usage
|
|
|
|
Check daily storage logs:
|
|
|
|
```bash
|
|
# View growth tracking
|
|
sudo journalctl -u docker-registry-growth-tracker
|
|
|
|
# View last 30 days of size tracking
|
|
sudo tail -n 30 /var/log/docker-registry-growth.log
|
|
|
|
# Check current usage
|
|
sudo du -sh /var/lib/docker-registry
|
|
df -h /
|
|
```
|
|
|
|
### 6) Manual garbage collection
|
|
|
|
Garbage collection runs automatically every Sunday at 03:00. To run manually:
|
|
|
|
```bash
|
|
sudo systemctl start docker-registry-garbage-collect
|
|
sudo journalctl -u docker-registry-garbage-collect -e
|
|
```
|
|
|
|
### 7) List images in registry
|
|
|
|
```bash
|
|
# List all repositories
|
|
curl -u admin:changeme https://registry.home.lindenfelser.de/v2/_catalog
|
|
|
|
# List tags for a specific image
|
|
curl -u admin:changeme https://registry.home.lindenfelser.de/v2/myapp/tags/list
|
|
```
|
|
|
|
### Troubleshooting
|
|
- **TLS certificate errors**: Registry uses self-signed certificate. External Docker clients need to add to insecure registries or install the cert
|
|
- **Authentication fails**: Verify Caddy basicauth configuration in [modules/gateway.nix](modules/gateway.nix). K8s pods access registry directly without auth.
|
|
- **Storage full**: Check root partition usage with `df -h /` and run garbage collection
|
|
- **K8s pods can't pull**: Verify `registries.yaml` points to internal registry (10.202.82.7:5000) and restart k3s: `sudo systemctl restart k3s`
|
|
|
|
````
|
|
|
|
---
|
|
|
|
## rclone (Google Drive)
|
|
|
|
The system has `rclone` installed and a systemd job to sync `/data` to a remote named `gdrive`:
|
|
|
|
- Service: `rclone-backup.service` (oneshot)
|
|
- Timer: `rclone-backup.timer` (runs daily 03:00)
|
|
- Log: `/var/log/rclone-backup.log`
|
|
|
|
### 1) Create the remote `gdrive`
|
|
Run on the fileserver:
|
|
|
|
```bash
|
|
sudo -i
|
|
rclone config
|
|
```
|
|
|
|
Then:
|
|
- n) New remote
|
|
- name: `gdrive`
|
|
- storage: `drive` (Google Drive)
|
|
- Use auto config? For headless server choose "No"
|
|
- Follow the printed instructions using another machine, or run on a desktop and copy the token
|
|
- Keep defaults unless you need a service account
|
|
- y) Yes to save
|
|
|
|
Verify:
|
|
```bash
|
|
rclone lsd gdrive:
|
|
rclone mkdir gdrive:backup-daten
|
|
```
|
|
|
|
### 2) Test backup manually
|
|
```bash
|
|
sudo systemctl start rclone-backup.service
|
|
sudo journalctl -u rclone-backup -e
|
|
sudo tail -n 100 /var/log/rclone-backup.log
|
|
```
|
|
|
|
### 3) Check/enable timer
|
|
```bash
|
|
systemctl list-timers '*rclone*'
|
|
sudo systemctl enable --now rclone-backup.timer
|
|
```
|
|
|
|
---
|
|
|
|
## SMB password for `danlin`
|
|
|
|
The share configuration:
|
|
- Protected share: `daten` → requires user `danlin`
|
|
- Guest share: `daten-share` → guest access allowed
|
|
|
|
Set the Samba password for `danlin` (independent from system login password):
|
|
|
|
```bash
|
|
sudo smbpasswd -a danlin
|
|
```
|
|
|
|
Useful commands:
|
|
```bash
|
|
sudo pdbedit -L # list Samba users
|
|
sudo systemctl status samba
|
|
sudo journalctl -u samba -e
|
|
```
|
|
|
|
Access examples:
|
|
- Windows: `\\fileserver\daten` or `\\fileserver\daten-share`
|
|
- macOS Finder: Go → Connect to Server → `smb://fileserver/daten` or `smb://fileserver/daten-share`
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
- rclone auth on headless: use `rclone authorize 'drive'` on a desktop and paste token
|
|
- Permissions: ensure `/data/daten` and `/data/daten/share` exist and are writable (`systemd-tmpfiles` creates them)
|
|
- Firewall: SMB ports 139/445 are open by module config
|