Files
homelab-optimized/docs/services/fluxer-deployment.md
Gitea Mirror Bot 5735cfcb2c
Some checks failed
Documentation / Build Docusaurus (push) Failing after 5m0s
Documentation / Deploy to GitHub Pages (push) Has been skipped
Sanitized mirror from private repository - 2026-04-08 00:57:50 UTC
2026-04-08 00:57:50 +00:00

5.3 KiB

Fluxer Chat Server Deployment

Overview

Fluxer is an open-source, independent instant messaging and VoIP platform deployed on st.vish.gg, replacing the previous Stoat Chat installation.

Deployment Details

Domain Configuration

  • Primary Domain: st.vish.gg
  • DNS Provider: Cloudflare (DNS-only, A record to Seattle VM YOUR_WAN_IP)
  • SSL/TLS: Wildcard Let's Encrypt certificate (*.st.vish.gg + st.vish.gg)
  • Reverse Proxy: nginx on the host, proxying to Docker containers

Architecture

Fluxer uses a unified server architecture (fluxer-server) that bundles all backend services into a single deployable container.

Core Services (bundled in fluxer_server)

  • app: Frontend web application
  • api: REST API backend
  • gateway: WebSocket gateway for real-time communication
  • admin: Administrative panel
  • media_proxy: Media processing and proxying
  • s3: Built-in S3-compatible object storage

Supporting Services

  • valkey: Cache and session storage (Redis-compatible)
  • meilisearch: Full-text search engine (optional, search profile)
  • elasticsearch: Alternative search backend (optional, search profile)
  • livekit: Voice and video calling infrastructure (optional, voice profile)
  • nats-core: Message broker
  • nats-jetstream: Persistent message streaming

Docker Compose Configuration

The deployment uses two compose files:

  • /root/fluxer/compose.yaml: Base service definitions
  • /root/fluxer/compose.override.yaml: Local overrides (build from source, port binding to 127.0.0.1:8088)

Nginx Configuration

The nginx reverse proxy is configured at /etc/nginx/sites-available/fluxer (symlinked to sites-enabled) and routes:

Domain Upstream
st.vish.gg http://127.0.0.1:8088 (main app + all routes)
api.st.vish.gg http://127.0.0.1:8088/api/
events.st.vish.gg http://127.0.0.1:8088/gateway/ (WebSocket)
files.st.vish.gg http://127.0.0.1:8088/media/
proxy.st.vish.gg http://127.0.0.1:8088/s3/
voice.st.vish.gg http://127.0.0.1:8088/livekit/

SSL certificates are at /etc/nginx/ssl/st.vish.gg.{crt,key}.

Current Status

DEPLOYED AND RUNNING on st.vish.gg (Seattle VM)

Service Health (as of April 2026)

CONTAINER         STATUS            PORT
fluxer_server     Up (healthy)      127.0.0.1:8088->8080/tcp
valkey            Up (healthy)      6379/tcp (internal)
livekit           Up (healthy)      7880-7881/tcp, 50000-50100/udp
nats-core         Up                4222/tcp (internal)
nats-jetstream    Up                4223/tcp (internal)
meilisearch       Up (healthy)      7700/tcp
elasticsearch     Up (healthy)      9200/tcp

Health Check

# Internal health check
curl -fsS http://127.0.0.1:8088/_health

# Returns JSON with status of: kv, s3, jetstream, mediaProxy, admin, api, app

Maintenance

Container Management

cd /root/fluxer

# View logs
MEILI_MASTER_KEY=<key> docker compose logs -f fluxer_server

# Restart services
MEILI_MASTER_KEY=<key> docker compose restart fluxer_server

# Rebuild from source and redeploy
MEILI_MASTER_KEY=<key> docker compose build --no-cache fluxer_server
MEILI_MASTER_KEY=<key> docker compose up -d fluxer_server

Note: MEILI_MASTER_KEY must be set (or use a .env file) because compose.yaml requires it, even if the meilisearch service is not started.

Updating

cd /root/fluxer
git fetch --all
git pull origin refactor   # Currently tracking the 'refactor' branch

# Rebuild and redeploy
MEILI_MASTER_KEY=<key> docker compose build --no-cache fluxer_server
MEILI_MASTER_KEY=<key> docker compose up -d fluxer_server

Nginx Management

# Test configuration
nginx -t

# Reload after config changes
systemctl reload nginx

# View active sites
ls -la /etc/nginx/sites-enabled/

SSL Certificate Renewal

The wildcard cert covers all *.st.vish.gg subdomains. Renew with:

sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  -d st.vish.gg \
  -d "*.st.vish.gg"

Current certificate expires: May 16, 2026.

Configuration

Fluxer Config

  • Application config: /root/fluxer/config/config.json
  • Environment overrides: /root/fluxer/dev/.env
  • Base domain: st.vish.gg
  • Database: SQLite at /usr/src/app/data/db/fluxer.db (inside container volume fluxer_data)
  • Cache: Valkey (Redis-compatible) at redis://valkey:6379/0

Repository

Security Notes

  • All services run in isolated Docker containers
  • nginx handles SSL termination on the host
  • fluxer_server binds only to 127.0.0.1:8088 (not exposed publicly)
  • Internal services (valkey, nats) are not exposed to the host network

Changelog

  • April 7, 2026: Removed stale nextcloud nginx config that was interfering with routing. Rebuilt fluxer_server from latest source on refactor branch.
  • March 21, 2026: Migrated from dev multi-container architecture to unified fluxer-server:stable image with compose.override.yaml for local builds.
  • February 15, 2026: Initial deployment, replacing Stoat Chat.

Last Updated: April 7, 2026 Status: Production Running