2026-01-06 16:43:57 +01:00
|
|
|
# Project Reference
|
|
|
|
|
|
|
|
|
|
Quick reference for essential project information and common operations.
|
|
|
|
|
|
|
|
|
|
## Project Structure
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
infrastructure/
|
|
|
|
|
├── ansible/ # Ansible playbooks and roles
|
|
|
|
|
│ ├── hcloud.yml # Dynamic inventory (Hetzner Cloud)
|
|
|
|
|
│ ├── playbooks/ # Main playbooks
|
|
|
|
|
│ │ ├── deploy.yml # Deploy applications to clients
|
|
|
|
|
│ │ └── setup.yml # Setup base server infrastructure
|
2026-01-08 16:56:19 +01:00
|
|
|
│ └── roles/ # Ansible roles (traefik, authentik, nextcloud, etc.)
|
2026-01-06 16:43:57 +01:00
|
|
|
├── keys/
|
|
|
|
|
│ └── age-key.txt # SOPS encryption key (gitignored)
|
|
|
|
|
├── secrets/
|
|
|
|
|
│ ├── clients/ # Per-client encrypted secrets
|
|
|
|
|
│ │ └── test.sops.yaml
|
|
|
|
|
│ └── shared.sops.yaml # Shared secrets
|
|
|
|
|
└── terraform/ # Infrastructure as Code (Hetzner)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Essential Configuration
|
|
|
|
|
|
|
|
|
|
### SOPS Age Key
|
|
|
|
|
**Location**: `infrastructure/keys/age-key.txt`
|
|
|
|
|
**Usage**: Always set before running Ansible:
|
|
|
|
|
```bash
|
|
|
|
|
export SOPS_AGE_KEY_FILE="../keys/age-key.txt"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Hetzner Cloud Token
|
|
|
|
|
**Usage**: Required for dynamic inventory:
|
|
|
|
|
```bash
|
|
|
|
|
export HCLOUD_TOKEN="MlURmliUzLcGyzCWXWWsZt3DeWxKcQH9ZMGiaaNrFM3VcgnASlEWKhhxLHdWAl0J"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Ansible Paths
|
|
|
|
|
**Working Directory**: `infrastructure/ansible/`
|
|
|
|
|
**Inventory**: `hcloud.yml` (dynamic, pulls from Hetzner Cloud API)
|
|
|
|
|
**Python**: `~/.local/bin/ansible-playbook` (user-local installation)
|
|
|
|
|
|
|
|
|
|
## Current Deployment
|
|
|
|
|
|
|
|
|
|
### Client: test
|
|
|
|
|
- **Hostname**: test (from Hetzner Cloud)
|
2026-01-08 16:56:19 +01:00
|
|
|
- **Authentik SSO**: https://auth.test.vrije.cloud
|
2026-01-06 16:43:57 +01:00
|
|
|
- **Nextcloud**: https://nextcloud.test.vrije.cloud
|
|
|
|
|
- **Secrets**: `secrets/clients/test.sops.yaml`
|
|
|
|
|
|
|
|
|
|
## Common Operations
|
|
|
|
|
|
|
|
|
|
### Deploy Applications
|
|
|
|
|
```bash
|
|
|
|
|
cd infrastructure/ansible
|
|
|
|
|
export HCLOUD_TOKEN="MlURmliUzLcGyzCWXWWsZt3DeWxKcQH9ZMGiaaNrFM3VcgnASlEWKhhxLHdWAl0J"
|
|
|
|
|
export SOPS_AGE_KEY_FILE="../keys/age-key.txt"
|
|
|
|
|
|
|
|
|
|
# Deploy everything to test client
|
|
|
|
|
~/.local/bin/ansible-playbook -i hcloud.yml playbooks/deploy.yml --limit test
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Check Service Status
|
|
|
|
|
```bash
|
|
|
|
|
# List inventory hosts
|
|
|
|
|
export HCLOUD_TOKEN="..."
|
|
|
|
|
~/.local/bin/ansible-inventory -i hcloud.yml --list
|
|
|
|
|
|
|
|
|
|
# Run ad-hoc commands
|
|
|
|
|
~/.local/bin/ansible test -i hcloud.yml -m shell -a "docker ps"
|
2026-01-07 11:10:32 +01:00
|
|
|
~/.local/bin/ansible test -i hcloud.yml -m shell -a "docker logs nextcloud 2>&1 | tail -50"
|
2026-01-06 16:43:57 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Edit Secrets
|
|
|
|
|
```bash
|
|
|
|
|
cd infrastructure
|
|
|
|
|
export SOPS_AGE_KEY_FILE="keys/age-key.txt"
|
|
|
|
|
|
|
|
|
|
# Edit client secrets
|
|
|
|
|
sops secrets/clients/test.sops.yaml
|
|
|
|
|
|
|
|
|
|
# View decrypted secrets
|
|
|
|
|
sops --decrypt secrets/clients/test.sops.yaml
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Architecture Notes
|
|
|
|
|
|
|
|
|
|
### Service Stack
|
|
|
|
|
- **Traefik**: Reverse proxy with automatic Let's Encrypt certificates
|
2026-01-08 16:56:19 +01:00
|
|
|
- **Authentik 2025.10.3**: Identity provider (OAuth2/OIDC, SAML, LDAP)
|
|
|
|
|
- **PostgreSQL 16**: Database for Authentik
|
2026-01-06 16:43:57 +01:00
|
|
|
- **Nextcloud 30.0.17**: File sync and collaboration
|
|
|
|
|
- **Redis**: Caching for Nextcloud
|
2026-01-07 11:10:32 +01:00
|
|
|
- **MariaDB**: Database for Nextcloud
|
2026-01-06 16:43:57 +01:00
|
|
|
|
|
|
|
|
### Docker Networks
|
|
|
|
|
- `traefik`: External network for all web-accessible services
|
2026-01-08 16:56:19 +01:00
|
|
|
- `authentik-internal`: Internal network for Authentik ↔ PostgreSQL
|
2026-01-07 11:10:32 +01:00
|
|
|
- `nextcloud-internal`: Internal network for Nextcloud ↔ Redis/DB
|
2026-01-06 16:43:57 +01:00
|
|
|
|
|
|
|
|
### Volumes
|
2026-01-08 16:56:19 +01:00
|
|
|
- `authentik_authentik-db-data`: Authentik PostgreSQL data
|
|
|
|
|
- `authentik_authentik-media`: Authentik uploaded media
|
|
|
|
|
- `authentik_authentik-templates`: Custom Authentik templates
|
2026-01-06 16:43:57 +01:00
|
|
|
- `nextcloud_nextcloud-data`: Nextcloud files and database
|
|
|
|
|
|
|
|
|
|
## Service Credentials
|
|
|
|
|
|
2026-01-08 16:56:19 +01:00
|
|
|
### Authentik Admin
|
|
|
|
|
- **URL**: https://auth.test.vrije.cloud
|
|
|
|
|
- **Setup**: Complete initial setup at `/if/flow/initial-setup/`
|
|
|
|
|
- **Username**: akadmin (recommended)
|
|
|
|
|
|
2026-01-06 16:43:57 +01:00
|
|
|
### Nextcloud Admin
|
|
|
|
|
- **URL**: https://nextcloud.test.vrije.cloud
|
|
|
|
|
- **Username**: admin
|
|
|
|
|
- **Password**: In `secrets/clients/test.sops.yaml` → `nextcloud_admin_password`
|
2026-01-08 16:56:19 +01:00
|
|
|
- **SSO**: Login with Authentik button (auto-configured)
|