Skip to content

Troubleshooting

You will learn: how to troubleshoot OpenFlare Server, database, login, Agent, OpenResty, and config release issues by symptom.

First determine which layer the problem is in: browser, Server, database, Agent, OpenResty, origin, or DNS. OpenFlare configs are not written to all nodes online directly — only after the active version changes do Agents detect and apply it in their heartbeat.

Quick Locate

SymptomLook Here First
Admin panel won't openServer container/process logs, port listening
Login abnormaldefault account, Session Cookie, Server logs
Data won't saveDB connection, SQLite file permissions, PostgreSQL health
Agent offlineAgent logs, Token, Server address, network connectivity
Node not updated after releaseactive version, node heartbeat, apply records
OpenResty apply failureapply records, Agent logs, certificates, upstream addresses, port usage
Access analytics emptyOpenResty container state, observability port, Agent backfill logs
Static assets never hit cacheglobal/site cache switch, policy extensions, whether config released, access log cache_status, origin Set-Cookie / Cache-Control

Server Won't Start

  1. Check the logs:
bash
docker compose logs -n 200 openflare

For source runs, check terminal output.

  1. Check port usage:
bash
lsof -i :3000
  1. If using PostgreSQL, confirm DB health:
bash
docker compose ps postgres
docker compose logs -n 100 postgres
  1. If using SQLite, confirm the DB file directory is writable:
bash
ls -ld "$(dirname /path/to/openflare.db)"

Common causes:

Log or SymptomHandling
DB connection failedcheck DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME, DB_SSL_MODE consistency
SQLite can't create filecheck the SQLITE_PATH directory exists and is writable
Port occupiedchange PORT or --port, or stop the process holding the port

Admin Panel Won't Open or Is Blank

  1. Confirm the Server is listening:
bash
curl -I http://127.0.0.1:3000
  1. Check that the browser access address matches the reverse proxy config.

Default Account Can't Log In

The default account is admin / 12345678. If the password was changed after first login, use the changed one.

Steps:

  1. Confirm you're connected to the intended database — avoid SQLITE_PATH or DB_HOST / DB_NAME pointing at another environment.
  2. Check whether the Server log uses sqlite or postgres.
  3. In browser dev tools, confirm admin API requests carry the Session Cookie correctly.
  4. Clear browser cache and cookies, then log in again.

Emergency Admin Password Reset

If you forget the admin password, reset it with the reset-passwd command (supports SQLite and PostgreSQL):

bash
go run main.go reset-passwd --user admin --password your-new-password

With SQLite, stop the Server process first to avoid DB file lock conflicts. Without --password, the command generates a random password and prints it. After resetting, log in and change the password immediately.

Agent Can't Register or Stays Offline

On the Agent node:

bash
curl -I http://your-server:3000

Check Agent logs:

bash
journalctl -u openflare-agent -n 200 --no-pager

Check the config file:

bash
sed -n '1,160p' /opt/openflare-agent/agent.json

Confirm:

ConfigDescription
server_urlmust be a Server address reachable by the Agent node
agent_token / discovery_tokenat least one filled in
heartbeat_intervalsupports millisecond integer or Go duration string
request_timeoutincrease for slow networks

If logs say the Token is invalid, prepare a new Token in the admin panel, update agent.json, then restart:

bash
systemctl restart openflare-agent

Node Didn't Apply the New Version After Release

Check in order:

  1. Is the target version activated in the version page?
  2. Is the node online, and did the last heartbeat time update?
  3. Do the apply records show success, warning, or failure for the target version?
  4. Is the website config enabled? Disabled sites don't participate in release rendering.
  5. Do Agent logs show pull, validation, reload, or rollback messages?

View Agent logs:

bash
journalctl -u openflare-agent -f

Note: once a target version + checksum fails to apply and rolls back, the Agent blocks retrying that target in local state. After fixing the config, republish to generate a new checksum, or activate an older version to roll back.

If this is the Agent's first config apply with no historical nginx.conf to roll back to, the failed target is still blocked, but the Agent enters a safe fallback runtime. The apply records and Agent logs will contain fallback runtime started; OpenResty only listens on port 80 and returns 503 with OpenFlare: No Valid Configuration for everything, while keeping the local stub_status health endpoint. After fixing the config and republishing a new version, the Agent overwrites the fallback config and resumes normal proxying.

OpenResty Apply Failure

Common causes:

CauseTroubleshooting
Domain or server block conflictcheck whether the same domain is used by multiple site configs
Invalid upstream addressconfirm all upstreams are http:// or https://
Multi-upstream format violates constraintsmulti-upstream must be plain scheme://host[:port]
Certificate missing or wrong pathcheck whether the domain is bound to a cert and the Agent cert dir is writable
Port occupiedcheck local 80, 443 ports

OpenResty config validation:

bash
openresty -t -c /path/to/openflare/data/etc/nginx/nginx.conf

OpenResty running state:

bash
ps aux | grep openresty

The Agent's periodic health check probes the local http://127.0.0.1:<openresty_observability_port>/openflare/stub_status to judge OpenResty liveness — it does not repeatedly run openresty -t. If a node is marked unhealthy, first confirm that local observability port is listening; if host not found in upstream appears only during config apply, the failure comes from config validation or reload, not the periodic health probe.

Actual binary and main config paths follow openresty_path and main_config_path in agent.json.

HTTPS Not Taking Effect

  1. Confirm the certificate is uploaded or managed.
  2. Confirm the site config's domain is bound to a certificate.
  3. Confirm a new version was published and activated.
  4. Check whether the apply records succeeded.
  5. Inspect the certificate and status code with curl:
bash
curl -Iv https://your-domain

Domains without a bound certificate are not auto-added to the HTTPS config — that's expected.

Access Analytics Empty

  1. Confirm the node successfully applied config including the observability Lua assets.
  2. Confirm OpenResty is running.
  3. Check Agent logs for observability collection or backfill failures.
  4. Check whether openresty_observability_port is occupied (default 18081).
  5. Confirm the Server's DB cleanup policy hasn't deleted the relevant time window.

Edge Cache Hit-Rate Anomalies

Access log cache three states: hit (HIT/STALE/REVALIDATED/UPDATING), origin (MISS/EXPIRED), not cached (BYPASS or empty — request didn't enter a cacheable path or response wasn't stored). Design: Edge Cache Strategy Design.

Checklist

  1. Global OpenResty cache enabled in Performance Settings.
  2. Site Cache enabled and policy matches the path (「Standard static assets」covers only built-in extensions, not HTML/JSON; .js.map's extension is map, in the default table).
  3. Config version published and activated, node apply records succeeded (changing cache rules without publishing leaves nodes on old bypass logic).
  4. Request method is GET (non-GET is never cached).
  5. Origin doesn't return Set-Cookie for the target URL (if so, not written to the edge).
  6. Origin doesn't declare Cache-Control: private / no-store (shared caches won't store).
  7. Browser DevTools "Disable cache" only affects the browser; whether the edge HITs is judged by access log cache_status, not the Network panel.

Common Misconceptions

SymptomExplanation
Everything「not cached」after login, never republishedold config bypassed session cookies; after upgrade you must republish node configs
/api/foo or /index.html not cached under staticexpected (extension not in the default cacheable table)
HTML cross-user leakage after switching to allorigin didn't forbid shared caching; switch back to static or add private/no-store to dynamic responses
URLs with ?v= have low hit ratesdefault cache key includes the full $request_uri; different query = different object
First MISS, second still MISScheck whether the origin sets Set-Cookie/private every time, or node disk/cache inactive is too short

Expected Behavior (aligned with Cloudflare defaults)

  • A logged-in user accessing /_app/**/*.js static assets: can HIT.
  • Response with Set-Cookie or private: not stored.
  • Cacheable status codes without origin cache headers: use the default Edge TTL (e.g. ~120 min for 200).

Released under the Apache License 2.0