infra/stacks/excalidraw/project/README.md
Viktor Barzin 5a0b24f54e [docs] TrueNAS decommission cleanup — remove references from active docs
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>
2026-04-19 16:55:43 +00:00

2.7 KiB

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 directories
  • X-Authentik-Email - Displayed in UI
  • X-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