Sign inSign up

maxsudmutalov/flarex

By maxsudmutalov

•Updated 5 months ago

Real-time log monitoring dashboard. Self-hosted alternative to Seq.

Image
Buildkit cache
0

2.1K

maxsudmutalov/flarex repository overview

⁠Flarex

Real-time log monitoring dashboard. A free, self-hostable alternative to Seq⁠.

Your apps send logs via the standard Serilog.Sinks.Seq package — Flarex shows everything live in one dashboard.

docker run -d --name flarex -p 5341:5341 -p 5342:5342 maxsudmutalov/flarex:latest

Then open http://localhost:5341⁠ (default login: admin / admin — change it in production!).

Flarex listens on two ports: 5341 (UI / REST API / SignalR) and 5342 (log ingestion). Your apps push logs to 5342; only 5341 needs to be reachable from the browser.


⁠Features

  • Real-time — logs stream into the UI via SignalR
  • Seq-compatible — point any Serilog.Sinks.Seq exporter at it
  • Log Analytics — time-series histogram, level distribution, top errors, status code breakdown
  • Search & filters — fast token search via SQLite FTS5 (BM25 ranking) with an "Exact substring" toggle for LIKE-style matches, plus level, CorrelationId, and time-range filters
  • Authentication — username / password protected
  • Multi-arch — linux/amd64 and linux/arm64
  • 3 UI languages — Uzbek, English, Russian
  • Single container — bundles backend (.NET) + frontend (React) + SQLite
  • Lightweight — ~150 MB image, no external dependencies

⁠Tags

TagDescription
latestLatest stable release
1.x.xSpecific version (recommended for production)

Architectures: linux/amd64, linux/arm64.


⁠Quick Start

⁠One-line run
docker run -d \
  --name flarex \
  -p 5341:5341 \
  -p 5342:5342 \
  -v flarex-logs:/app/logs \
  -e FLAREX_USER=admin \
  -e FLAREX_PASSWORD=strong_password \
  maxsudmutalov/flarex:latest

Open http://localhost:5341⁠ and sign in.

⁠docker-compose
services:
  flarex:
    image: maxsudmutalov/flarex:latest
    container_name: flarex
    ports:
      - "5341:5341"   # UI + REST API + SignalR
      - "5342:5342"   # Log ingestion (Serilog.Sinks.Seq)
    volumes:
      - flarex-logs:/app/logs
    environment:
      - FLAREX_USER=admin
      - FLAREX_PASSWORD=strong_password
      - DemoLogs__Enabled=false
    restart: unless-stopped

volumes:
  flarex-logs:
docker compose up -d

⁠Configuration

⁠Environment variables
VariableDefaultDescription
FLAREX_USERadminLogin username
FLAREX_PASSWORDadminLogin password — change in production
DemoLogs__Enabledfalsetrue / false / auto (Development env). When false, the Demo button in the UI is disabled and no synthetic logs are generated
ASPNETCORE_URLShttp://+:5341Listening URL inside the container
ASPNETCORE_ENVIRONMENTProductionProduction / Development
Logging__RealFilePathlogs/real/app-.jsonPath for ingested-app log files
Logging__DemoFilePathlogs/demo/demo-.jsonPath for demo-generator log files

Use double underscore __ to nest config sections (ASP.NET Core convention).

⁠Ports
  • 5341 — UI + REST API + SignalR hub (browser-facing)
  • 5342 — Log ingestion endpoint (/api/events/raw). Strict isolation: this port serves only ingestion; the UI port refuses ingestion requests. Recommended: only expose 5342 to your internal network.

You can override the defaults via configuration:

environment:
  - Ports__Ui=5341
  - Ports__Ingestion=5342
⁠Volumes
  • /app/logs — log files (real + demo) and the flarex-logs.db SQLite database. Mount a named volume or host path so data persists across container restarts.

⁠Connecting Your App — Logs

Flarex exposes a Seq-compatible HTTP ingestion endpoint, so any client that targets Seq works out of the box.

⁠.NET (Serilog)
dotnet add package Serilog.Sinks.Seq
Log.Logger = new LoggerConfiguration()
    .Enrich.WithProperty("Application", "MyApp")
    .WriteTo.Seq(builder.Configuration["SEQ_URL"] ?? "http://localhost:5342")
    .CreateLogger();

Apps push to 5342 (the ingestion port). The browser-facing 5341 does not accept ingestion requests.

⁠docker-compose with your app
services:
  flarex:
    image: maxsudmutalov/flarex:latest
    ports:
      - "5341:5341"   # UI
      - "5342:5342"   # Ingestion
    volumes: [flarex-logs:/app/logs]
    environment:
      - FLAREX_USER=admin
      - FLAREX_PASSWORD=strong_password
    networks: [app-network]

  myapp:
    image: myapp:latest
    environment:
      - SEQ_URL=http://flarex:5342
    depends_on: [flarex]
    networks: [app-network]

networks:
  app-network: {}
volumes:
  flarex-logs:

In the Flarex UI, choose your app from the Source dropdown — logs appear instantly.


⁠Production checklist

  • Override FLAREX_USER and FLAREX_PASSWORD
  • Mount /app/logs to a persistent volume (named volume or host path)
  • Keep DemoLogs__Enabled=false (default in the image)
  • Place behind HTTPS reverse proxy (nginx / Caddy / Traefik) — the container only speaks HTTP
  • Pin a specific version tag (e.g. 1.3.0) instead of latest
⁠Reverse proxy notes

Flarex uses SignalR (WebSockets) for live updates. Make sure your proxy forwards the Upgrade and Connection headers (most do this by default for /hubs/* paths).

Example nginx snippet:

location / {
    proxy_pass http://flarex:5341;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}

⁠What's inside

  • Backend: ASP.NET Core 10 (REST + SignalR)
  • Frontend: React 18 + Vite + Tailwind, served as static assets
  • Storage: SQLite (single file under /app/logs)
  • Image: mcr.microsoft.com/dotnet/aspnet:10.0 base, multi-stage build

⁠License

MIT — free for commercial and personal use.

Tag summary

Content type

Image

Digest

sha256:927adcf92…

Size

108.5 MB

Last updated

5 months ago

docker pull maxsudmutalov/flarex