- Removed initContainer running as root (violates PodSecurity restricted:latest)
- Removed shared emptyDir /etc mount (no longer needed)
- Rely on fsGroup:1000 + runAsUser:1000 for volume ownership and container UID
- Added runAsNonRoot: true to podSecurityContext and both containers for policy compliance
Pod will now start, webui runs as UID 1000 == WANTED_UID, init.bash skips chown/sudo.
Swap the generic Open WebUI frontend for the purpose-built
hermes-webui (nesquena) with full CLI parity:
- 3-panel layout: sessions, chat, workspace file browser
- Native session, cron, skills, memory, profile management
- Themes (dark/light/slate/solarized/monokai/nord/oled)
- Mobile responsive
- Sidecar container sharing the hermes-agent PVC
- Exposed via Tailscale on port 8787 (plain HTTP)
Access: http://hermes-webui.tail14a963.ts.net:8787
tailscale.com/https-only: 'false' still attempts TLS termination,
causing ERR_SSL_PROTOCOL_ERROR when the backend speaks plain HTTP.
Replaced with tailscale.com/ports: 'http:8080' to explicitly tell
the operator to serve unencrypted HTTP on this port.
Tailscale defaults to HTTPS (443) but Open WebUI only serves HTTP (8080).
- Add tailscale.com/https-only: "false" annotation
- Now hermes-webui.tail14a963.ts.net:8080 works without SSL errors
Fixes ERR_SSL_PROTOCOL_ERROR
Open WebUI crashes on startup because it can't write its SQLite database to
/app/backend/data.
- Add emptyDir volume at /app/backend/data
- Pod restarts will lose data (dev-only acceptable)
Fixes pod crash: peewee.OperationalError: unable to open database file
- Enable Hermes API Server (port 8642) in gateway deployment
- Add Open WebUI deployment connected to Hermes API Server
- Expose Open WebUI via Tailscale using Service annotations
- Create ClusterIP Service for Hermes Agent API Server
- All deployments follow PodSecurity restricted policy
- Fixed containerPort, Service targetPort, and all probes to use 8080
- Added startupProbe (15s delay, 30 failure threshold) to prevent connection refused errors
- Improved readiness and liveness probes with better timing and timeoutSeconds
- Resolves 'fault filter abort' and 'connection refused' probe failures
- database.py: remove dead pre-definition of DATABASE_URL with
undefined db_user/db_pass variables
- models.py: add missing Table import from sqlalchemy
- alembic/env.py: replace deprecated run_async() with asyncio.run()
(removed in SQLAlchemy 2.0)
- alembic 001_initial: use raw SQL for CREATE TYPE instead of
op.create_enum() which requires alembic_postgresql_enum
Migration 001_initial successfully applied to trading_data DB.
- Build and push Docker image to ghcr.io on push to master
- Update deployment to pull from ghcr.io instead of GCR
- Tags: commit SHA + latest on default branch