TrueNAS VM 9000 was operationally decommissioned 2026-04-13; NFS has been
served by Proxmox host (192.168.1.127) since. This commit scrubs remaining
references from active docs. VM 9000 itself remains on PVE in stopped state
pending user decision on deletion.
In-session cleanup already landed: reverse-proxy ingress + Cloudflare record
removed; Technitium DNS records deleted; Vault truenas_{api_key,ssh_private_key}
purged; homepage_credentials.reverse_proxy.truenas_token removed;
truenas_homepage_token variable + module deleted; Loki + Dashy cleaned;
config.tfvars deprecated DNS lines removed; historical-name comment added to
the nfs-truenas StorageClass (48 bound PVs, immutable name — kept).
Historical records (docs/plans/, docs/post-mortems/, .planning/) intentionally
untouched — they describe state at a point in time.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| static | ||
| .gitignore | ||
| Dockerfile | ||
| go.mod | ||
| main.go | ||
| README.md | ||
Excalidraw Rooms
A self-hosted Excalidraw library with per-user drawing storage and management.
Features
- Dashboard to manage all your drawings
- Per-user storage (via Authentik SSO headers)
- Create, edit, and delete drawings
- Persistent storage via NFS
Docker Image
viktorbarzin/excalidraw-library:v4
Available on Docker Hub: https://hub.docker.com/r/viktorbarzin/excalidraw-library
Configuration
Environment Variables
| Variable | Default | Description |
|---|---|---|
DATA_DIR |
/data |
Directory where drawings are stored |
PORT |
8080 |
HTTP server port |
Storage
Mount a persistent volume to the DATA_DIR path. Drawings are stored as .excalidraw files, organized by username:
/data/
├── user1/
│ ├── drawing1.excalidraw
│ └── drawing2.excalidraw
└── user2/
└── my-diagram.excalidraw
Deployment
Docker
docker run -d \
--name excalidraw-rooms \
-p 8080:8080 \
-v /path/to/storage:/data \
viktorbarzin/excalidraw-library:v4
Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: excalidraw
spec:
replicas: 1
selector:
matchLabels:
app: excalidraw
template:
metadata:
labels:
app: excalidraw
spec:
containers:
- name: excalidraw
image: viktorbarzin/excalidraw-library:v4
ports:
- containerPort: 8080
env:
- name: DATA_DIR
value: /data
- name: PORT
value: "8080"
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
nfs:
server: 192.168.1.127
path: /srv/nfs/excalidraw
With Authentik SSO
The application reads user identity from Authentik headers:
X-Authentik-Username- Used to create per-user storage directoriesX-Authentik-Email- Displayed in UIX-Authentik-Name- Displayed in UI
Configure your ingress to pass these headers:
annotations:
nginx.ingress.kubernetes.io/auth-response-headers: "X-authentik-username,X-authentik-email,X-authentik-name"
Building
# Build the Docker image
docker build -t excalidraw-library .
# Or build locally
go build -o excalidraw-library .
./excalidraw-library
API Endpoints
| Method | Path | Description |
|---|---|---|
| GET | / |
Dashboard UI |
| GET | /api/drawings |
List all drawings for current user |
| GET | /api/drawings/:id |
Get drawing data |
| PUT | /api/drawings/:id |
Save drawing |
| DELETE | /api/drawings/:id |
Delete drawing |
| GET | /api/user |
Get current user info |
| GET | /draw/:id |
Open drawing in editor |
License
MIT