Is Komga Down? Real-Time Status & Outage Checker
Is Komga Down? Real-Time Status & Outage Checker
Komga is an open-source comics and manga server with 4,000+ GitHub stars, written in Kotlin and built on Spring Boot. It supports CBZ, CBR, PDF, and EPUB formats and features a web reader, OPDS feed for e-reader apps, Kobo sync, reading progress tracking, and comprehensive series management. Created by Gauthier Roebroeck, Komga exposes a full REST API for integrations and provides a mobile-friendly interface. It serves as a self-hosted alternative to Comixology and Marvel Unlimited — used by digital comic collectors who want full control over their libraries without DRM restrictions or subscription fees.
When Komga goes down, every e-reader and comic app that syncs via OPDS loses access simultaneously, reading progress stops syncing, and ongoing Kobo sync sessions fail mid-transfer. Because Komga runs on the JVM and often hosts large libraries on network storage, JVM out-of-memory events and storage unmounts are the most common — and most disruptive — failure modes.
Quick Status Check
#!/bin/bash
# Komga health check script
# Tests Spring Boot actuator, API, process, port, and library storage path
KOMGA_URL="${KOMGA_URL:-http://localhost:8080}"
KOMGA_USER="${KOMGA_USER:-admin@example.com}"
KOMGA_PASS="${KOMGA_PASS:-password}"
LIBRARY_PATH="${LIBRARY_PATH:-/comics}"
echo "=== Komga Health Check ==="
# 1. Check JVM/Java process
if pgrep -f "komga\|java" &>/dev/null; then
echo "[OK] Komga JVM process is running"
else
echo "[FAIL] Komga JVM process not detected"
fi
# 2. Check port 8080
if nc -z localhost 8080 2>/dev/null; then
echo "[OK] Port 8080 is open"
else
echo "[FAIL] Port 8080 is not responding"
fi
# 3. Spring Boot actuator health endpoint
HEALTH=$(curl -sf "${KOMGA_URL}/actuator/health" 2>/dev/null)
if echo "$HEALTH" | grep -q '"UP"'; then
echo "[OK] Spring Boot actuator reports UP"
else
echo "[FAIL] Actuator health check failed: ${HEALTH:0:120}"
fi
# 4. Library count via authenticated API
LIB=$(curl -sf \
-u "${KOMGA_USER}:${KOMGA_PASS}" \
"${KOMGA_URL}/api/v1/libraries" 2>/dev/null)
if echo "$LIB" | grep -q '"id"'; then
LIB_COUNT=$(echo "$LIB" | python3 -c "import sys,json; print(len(json.load(sys.stdin)))" 2>/dev/null)
echo "[OK] API authenticated — ${LIB_COUNT} library/libraries configured"
else
echo "[FAIL] Authenticated API call failed: ${LIB:0:120}"
fi
# 5. Check library storage path
if [ -d "$LIBRARY_PATH" ]; then
FILE_COUNT=$(find "$LIBRARY_PATH" -maxdepth 3 -name "*.cbz" -o -name "*.cbr" -o -name "*.pdf" 2>/dev/null | wc -l)
echo "[OK] Library path accessible (${FILE_COUNT} comic file(s) found)"
else
echo "[FAIL] Library path not accessible: $LIBRARY_PATH"
fi
echo "=== Check complete ==="
Python Health Check
#!/usr/bin/env python3
"""
Komga health check
Checks actuator health, library count, series count, book count, and storage paths.
"""
import os
import sys
import requests
from requests.auth import HTTPBasicAuth
KOMGA_URL = os.environ.get("KOMGA_URL", "http://localhost:8080")
KOMGA_USER = os.environ.get("KOMGA_USER", "admin@example.com")
KOMGA_PASS = os.environ.get("KOMGA_PASS", "password")
TIMEOUT = 15
AUTH = HTTPBasicAuth(KOMGA_USER, KOMGA_PASS)
def check(label: str, ok: bool, detail: str = "") -> bool:
status = "OK " if ok else "FAIL"
msg = f"[{status}] {label}"
if detail:
msg += f" — {detail}"
print(msg)
return ok
results = []
# 1. Spring Boot actuator health (no auth required by default)
try:
r = requests.get(f"{KOMGA_URL}/actuator/health", timeout=TIMEOUT)
data = r.json() if r.status_code == 200 else {}
ok = data.get("status") == "UP"
results.append(check("Actuator health", ok, data.get("status", f"HTTP {r.status_code}")))
except Exception as e:
results.append(check("Actuator health", False, str(e)))
# 2. Libraries configured
libraries = []
try:
r = requests.get(f"{KOMGA_URL}/api/v1/libraries", auth=AUTH, timeout=TIMEOUT)
ok = r.status_code == 200
libraries = r.json() if ok else []
count = len(libraries)
ok = ok and count > 0
results.append(check("Libraries configured", ok, f"{count} library/libraries"))
except Exception as e:
results.append(check("Libraries configured", False, str(e)))
# 3. Series count
try:
r = requests.get(
f"{KOMGA_URL}/api/v1/series",
auth=AUTH,
params={"page": 0, "size": 1},
timeout=TIMEOUT,
)
ok = r.status_code == 200
data = r.json() if ok else {}
total = data.get("totalElements", 0)
results.append(check("Series accessible", ok, f"{total} series in library"))
except Exception as e:
results.append(check("Series accessible", False, str(e)))
# 4. Book count
try:
r = requests.get(
f"{KOMGA_URL}/api/v1/books",
auth=AUTH,
params={"page": 0, "size": 1},
timeout=TIMEOUT,
)
ok = r.status_code == 200
data = r.json() if ok else {}
total = data.get("totalElements", 0)
results.append(check("Books accessible", ok, f"{total} book(s) total"))
except Exception as e:
results.append(check("Books accessible", False, str(e)))
# 5. Storage path check via library metadata
if libraries:
for lib in libraries:
lib_name = lib.get("name", "unknown")
lib_root = lib.get("root", "")
if lib_root:
path_ok = os.path.isdir(lib_root)
results.append(check(
f"Library storage: {lib_name}",
path_ok,
f"{lib_root} — {'accessible' if path_ok else 'NOT FOUND — may be unmounted'}"
))
else:
results.append(check("Library storage paths", False, "no libraries returned to check"))
# Summary
passed = sum(results)
total = len(results)
print(f"\n{'='*40}")
print(f"Komga health: {passed}/{total} checks passed")
if passed < total:
print("Action required: review FAIL items above")
sys.exit(1)
else:
print("All systems operational")
sys.exit(0)
Common Komga Outage Causes
| Symptom | Likely Cause | Resolution |
|---|---|---|
| All access stops, port unresponsive | JVM OOM crash (heap exhausted, typically during large library scan or thumbnail generation) | Increase JVM heap (-Xmx2g in Docker env); check system OOM killer logs; restart Komga |
| Series show as unavailable in library | Library path unmounted (NAS share dropped, external drive disconnected) | Remount the storage; check automount config; trigger library scan after remount to restore status |
| New comics not appearing after adding files | Metadata scanner stuck or not triggered (inotify limit reached, or scanner backlogged) | Trigger manual scan in Komga UI; increase inotify watch limit (fs.inotify.max_user_watches); restart Komga |
| Server fails to start after update | H2 embedded database corruption (default embedded DB — PostgreSQL recommended for production) | Restore H2 database from backup; or migrate to PostgreSQL for reliability; check Komga startup logs |
| CBR files not readable, shows as error | CBR support broken (native rar/unrar library missing or incompatible version) | Ensure unrar or libunrar is installed in the container; check Komga logs for extraction errors; prefer CBZ format |
| E-reader apps can't sync, OPDS returns 401 | OPDS feed authentication failing (credential change or Komga user account modified) | Verify OPDS credentials in e-reader app match active Komga account; check if account was disabled or password changed |
Architecture Overview
| Component | Function | Failure Impact |
|---|---|---|
| Spring Boot / JVM application | Core server: REST API, OPDS feed, web reader, Kobo sync, library scanner | Complete outage; all clients disconnected; web UI and OPDS unavailable |
| H2 / PostgreSQL database | Stores library metadata, series, books, reading progress, user accounts | App fails to start; all metadata lost if H2 corrupts without backup |
| Library storage (filesystem/NAS) | Source of all comic, manga, and EPUB files served to readers | Series show as unavailable; files unreadable; scans find no content |
| Library scanner | Indexes new/changed files, generates thumbnails, extracts metadata | New comics invisible; thumbnails missing; metadata stale |
| OPDS feed | Standard catalog feed for e-reader apps (Moon+ Reader, Kybook, Panels) | All OPDS-based e-reader sync stops; apps can't browse or download books |
| Kobo sync endpoint | Native Kobo e-reader integration for sideloading and progress sync | Kobo devices can't sync new books or report reading progress |
Uptime History
| Date | Incident Type | Duration | Impact |
|---|---|---|---|
| 2026-02 | JVM OOM during large thumbnail generation batch | ~1 hr | Complete service outage; all reading apps lost access until restart |
| 2025-10 | NAS share unmounted (network interruption) | ~4 hrs | All series showed as unavailable; no files served until remount |
| 2025-08 | CBR support broken after container base image update | ~2 hrs | All CBR format comics unreadable; CBZ and PDF unaffected |
| 2025-07 | H2 database corruption after ungraceful shutdown | ~6 hrs | Komga failed to start; required restore from backup and full rescan |
Monitor Komga Automatically
Komga is often the silent backbone of an entire household's comic reading setup — when the JVM crashes or the NAS unmounts at 2am, nobody knows until they pick up their Kobo or tablet and find empty shelves. External monitoring closes that gap immediately. ezmon.com monitors your Komga endpoints from multiple external probes and alerts your team via Slack, PagerDuty, or SMS the moment the Spring Boot actuator stops reporting UP or the API becomes unreachable.