# Guava - TrueNAS Scale Server

**Hostname**: guava  
**IP Address**: 192.168.0.100  
**Tailscale IP**: 100.75.252.64  
**Domain**: guava.crista.home  
**OS**: TrueNAS Scale 25.04.2.6 (Debian 12 Bookworm)  
**Kernel**: 6.12.15-production+truenas

---

## Hardware Specifications

| Component | Specification |
|-----------|---------------|
| **CPU** | 12 cores |
| **RAM** | 30 GB |
| **Storage** | ZFS pools (1.5TB+ available) |
| **Docker** | 27.5.0 |
| **Compose** | v2.32.3 |

---

## Storage Layout

### Boot Pool
- `/` - Root filesystem (433GB available)
- ZFS dataset: `boot-pool/ROOT/25.04.2.6`

### Data Pool (`/mnt/data/`)
| Dataset | Size Used | Purpose |
|---------|-----------|---------|
| `data/guava_turquoise` | 3.0TB / 4.5TB | Primary storage (67% used) |
| `data/photos` | 159GB | Photo storage |
| `data/jellyfin` | 145GB | Media library |
| `data/llama` | 59GB | LLM models |
| `data/plane-data` | ~100MB | Plane.so application data |
| `data/iso` | 556MB | ISO images |
| `data/cocalc` | 324MB | Computational notebook |
| `data/website` | 59MB | Web content |
| `data/openproject` | 13MB | OpenProject (postgres) |
| `data/fasten` | 5.7MB | Health records |
| `data/fenrus` | 3.5MB | Dashboard config |
| `data/medical` | 14MB | Medical records |
| `data/truenas-exporters` | - | Prometheus exporters |

### TrueNAS Apps (`/mnt/.ix-apps/`)
- Docker storage: 28GB used
- App configs and mounts for TrueNAS-managed apps

---

## Network Configuration

| Service | Port | Protocol | URL |
|---------|------|----------|-----|
| Portainer | 31015 | HTTPS | https://guava.crista.home:31015 |
| **Plane.so** | 3080 | HTTP | **http://guava.crista.home:3080** |
| Plane.so HTTPS | 3443 | HTTPS | https://guava.crista.home:3443 |
| Jellyfin | 30013 | HTTP | http://guava.crista.home:30013 |
| Jellyfin HTTPS | 30014 | HTTPS | https://guava.crista.home:30014 |
| Gitea | 30008-30009 | HTTP | http://guava.crista.home:30008 |
| WireGuard | 51827 | UDP | - |
| wg-easy UI | 30058 | HTTP | http://guava.crista.home:30058 |
| Fenrus | 45678 | HTTP | http://guava.crista.home:45678 |
| Fasten | 9090 | HTTP | http://guava.crista.home:9090 |
| Node Exporter | 9100 | HTTP | http://guava.crista.home:9100/metrics |
| nginx | 28888 | HTTP | http://guava.crista.home:28888 |
| iperf3 | 5201 | TCP | - |
| SSH | 22 | TCP | - |
| SMB | 445 | TCP | - |
| Pi-hole DNS | 53 | TCP/UDP | - |

---

## Portainer Access

| Setting | Value |
|---------|-------|
| **URL** | `https://guava.crista.home:31015` |
| **API Endpoint** | `https://localhost:31015/api` (from guava) |
| **Endpoint ID** | 3 (local) |
| **API Token** | `ptr_REDACTED_PORTAINER_TOKEN` |

### API Examples

```bash
# List stacks
curl -sk -H 'X-API-Key: "REDACTED_API_KEY" \
  'https://localhost:31015/api/stacks'

# List containers
curl -sk -H 'X-API-Key: "REDACTED_API_KEY" \
  'https://localhost:31015/api/endpoints/3/docker/containers/json'

# Create stack from compose string
curl -sk -X POST \
  -H 'X-API-Key: "REDACTED_API_KEY" \
  -H 'Content-Type: application/json' \
  'https://localhost:31015/api/stacks/create/standalone/string?endpointId=3' \
  -d '{"name": "my-stack", "REDACTED_APP_PASSWORD": "..."}'
```

---

## Deployed Stacks (Portainer)

| ID | Name | Status | Description |
|----|------|--------|-------------|
| 2 | nginx | ✅ Active | Reverse proxy (:28888) |
| 3 | ddns | ✅ Active | Dynamic DNS updater (crista.love) |
| 4 | llama | ⏸️ Inactive | LLM server |
| 5 | fenrus | ✅ Active | Dashboard (:45678) |
| 8 | fasten | ✅ Active | Health records (:9090) |
| 17 | node-exporter | ✅ Active | Prometheus metrics (:9100) |
| 18 | iperf3 | ✅ Active | Network speed testing (:5201) |
| 25 | cocalc | ⏸️ Inactive | Computational notebook |
| **26** | **plane-stack** | ✅ Active | **Project management (:3080)** |

### TrueNAS-Managed Apps (ix-apps)
| App | Container | Port | Description |
|-----|-----------|------|-------------|
| Portainer | ix-portainer-portainer-1 | 31015 | Container management |
| Gitea | ix-gitea-gitea-1 | 30008-30009 | Git server |
| Gitea DB | ix-gitea-postgres-1 | - | PostgreSQL for Gitea |
| Jellyfin | ix-jellyfin-jellyfin-1 | 30013, 30014 | Media server |
| WireGuard | ix-wg-easy-wg-easy-1 | 30058, 51827/udp | VPN server |
| Tailscale | ix-tailscale-tailscale-1 | - | Mesh VPN |
| Pi-hole | (configured) | 53 | DNS server |

---

## SSH Access

### Via Cloudflare Tunnel

```bash
# Install cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /tmp/cloudflared
chmod +x /tmp/cloudflared

# SSH config
cat >> ~/.ssh/config << 'EOF'
Host guava
    HostName ruled-bowl-dos-jews.trycloudflare.com
    User vish
    IdentityFile ~/.ssh/id_ed25519
    ProxyCommand /tmp/cloudflared access ssh --hostname %h
EOF

# Connect
ssh guava
```

### Direct (Local Network)

```bash
ssh vish@192.168.0.100
```

**Note**: Docker commands require `sudo` on guava.

---

## Services Documentation

### Plane.so

See [plane.yaml](../../hosts/physical/guava/plane.yaml) for the full stack configuration.

| Component | Container | Port | Purpose |
|-----------|-----------|------|---------|
| Frontend | plane-web | 3000 | Web UI |
| Admin | plane-admin | 3000 | Admin panel |
| Space | plane-space | 3000 | Public pages |
| API | plane-api | 8000 | Backend API |
| Worker | plane-worker | 8000 | Background jobs |
| Beat | plane-beat | 8000 | Scheduled tasks |
| Live | plane-live | 3000 | Real-time updates |
| Database | plane-db | 5432 | PostgreSQL |
| Cache | plane-redis | 6379 | Valkey/Redis |
| Queue | plane-mq | 5672 | RabbitMQ |
| Storage | plane-minio | 9000 | MinIO S3 |
| Proxy | plane-proxy | 80/443 | Caddy reverse proxy |

**Access URL**: http://guava.crista.home:3080

**Data Location**: `/mnt/data/plane-data/`

---

## Maintenance

### Backup Locations

| Data | Path | Priority |
|------|------|----------|
| Plane DB | `/mnt/data/plane-data/postgres/` | High |
| Plane Files | `/mnt/data/plane-data/minio/` | High |
| Gitea | `/mnt/.ix-apps/app_mounts/gitea/` | High |
| Jellyfin Config | `/mnt/.ix-apps/app_mounts/jellyfin/config/` | Medium |
| Photos | `/mnt/data/photos/` | High |

### Common Commands

```bash
# Check all containers
sudo docker ps -a

# View stack logs
sudo docker compose -f /path/to/stack logs -f

# Restart a stack via Portainer API
curl -sk -X POST \
  -H 'X-API-Key: TOKEN' \
  'https://localhost:31015/api/stacks/STACK_ID/stop?endpointId=3'

curl -sk -X POST \
  -H 'X-API-Key: TOKEN' \
  'https://localhost:31015/api/stacks/STACK_ID/start?endpointId=3'
```

---

## Related Documentation

- [Plane.so Service Docs](../services/individual/plane.md)
- [TrueNAS Scale Documentation](https://www.truenas.com/docs/scale/)
- [AGENTS.md](../../AGENTS.md) - Quick reference for all hosts

---

*Last updated: February 4, 2026*  
*Verified via SSH - all services confirmed running*
