15 KiB
Configuration Reference
You will learn: What configuration sources are supported by OpenFlare Server, frontend builds, and Agents, what the default values of configuration items are, and how common deployment combinations should be configured.
This document summarizes the Server and Agent configuration items supported by OpenFlare 1.0.0, retaining only the startup, deployment, and runtime parameters that remain valid.
Configuration Sources
The Server supports three types of configuration sources:
- Command-line parameters.
- Environment variables.
- Runtime configurations in the database
Optiontable.
The Agent supports:
-configcommand-line parameter.agent.jsonconfiguration file.- A few log-related environment variables.
Configuration File Locations
| Component | Default Location | Description |
|---|---|---|
| Server SQLite | openflare.db |
Can be modified via SQLITE_PATH |
| Server Uploads Directory | upload |
Can be modified via UPLOAD_PATH |
| Agent Configuration File | ./agent.json |
Can be specified via -config |
| One-click Install Agent Config | /opt/openflare-agent/agent.json |
Default generated by the installation script |
| Agent Data Directory | data under the config directory |
Can be modified via data_dir |
Server CLI Flags
cd openflare_server
go run . --port 3000 --log-dir ./logs
| Flag | Purpose | Default |
|---|---|---|
--port |
Specify the port the Server listens on | 3000 |
--log-dir |
Specify the log directory | empty |
--version |
Print the current version and exit | false |
--help |
Print help information and exit | false |
Server Environment Variables
| Variable | Purpose | Default |
|---|---|---|
PORT |
Server listen port | 3000 |
GIN_MODE |
Gin execution mode | release unless debug |
LOG_LEVEL |
Log level | info |
SESSION_SECRET |
Session signing secret | randomly generated on startup |
SQLITE_PATH |
SQLite database file path | openflare.db |
DSN |
PostgreSQL DSN, preferred over SQLite when set | empty |
SQL_DSN |
Legacy PostgreSQL DSN, lower priority than DSN |
empty |
REDIS_CONN_STRING |
Redis connection string | empty |
UPLOAD_PATH |
Upload directory | upload |
AGENT_TOKEN |
Legacy global Agent token | empty |
Description:
- When both
DSNandSQL_DSNexist,DSNtakes precedence. - When
DSN/SQL_DSNandSQLITE_PATHexist simultaneously, PostgreSQL takes precedence. - When the target PostgreSQL database is empty and a local SQLite file exists at
SQLITE_PATH, the Server automatically migrates SQLite data at startup and prints table-by-table migration progress in the logs. SESSION_SECRETmust be explicitly configured in production.- When
REDIS_CONN_STRINGis not configured, related capabilities fall back to in-process implementations.
Runtime Options
The following options are maintained on the settings page of the management console and can be hot-updated:
| Option | Purpose | Default |
|---|---|---|
AgentHeartbeatInterval |
Agent heartbeat interval (milliseconds) | 10000 |
AgentWebsocketUpgradeEnabled |
Whether to allow Agents to upgrade to WebSockets after successful HTTP heartbeats | true |
NodeOfflineThreshold |
Node offline threshold (milliseconds) | 120000 |
AgentUpdateRepo |
Agent self-update repository | Rain-kl/OpenFlare |
GeoIPProvider |
Node/IP region lookup provider | ipinfo |
DatabaseAutoCleanupEnabled |
Whether to enable daily automatic cleanup of observability data | false |
DatabaseAutoCleanupRetentionDays |
In-database retention days, at least 1 day | 30 |
GlobalApiRateLimitNum / GlobalApiRateLimitDuration |
Global API rate limit count / window | 300 / 180 |
GlobalWebRateLimitNum / GlobalWebRateLimitDuration |
Global Web rate limit count / window | 300 / 180 |
UploadRateLimitNum / UploadRateLimitDuration |
Upload API rate limit count / window | 50 / 60 |
DownloadRateLimitNum / DownloadRateLimitDuration |
Download API rate limit count / window | 50 / 60 |
CriticalRateLimitNum / CriticalRateLimitDuration |
Sensitive API rate limit count / window | 100 / 1200 |
Description:
- When
DatabaseAutoCleanupEnabledis enabled, the Server automatically cleans up three types of observability data (node_access_logs,node_metric_snapshots,node_request_reports) at 3:00 AM every day. DatabaseAutoCleanupRetentionDaysis the unified retention count and must be greater than or equal to 1.- The management console supports leaving the retention days blank during manual cleanup to directly delete all history of the corresponding datasets.
- The GitHub Release pointed to by
AgentUpdateRepomust provide a matching.sha256checksum file for each Agent binary, such asopenflare-agent-linux-amd64.sha256; the self-update validates this SHA-256 digest before replacing the executable. - Third-party logins no longer use
GitHubOAuthEnabled,GitHubClientId, orGitHubClientSecretas primary configuration entries; these legacy options are only used for migration to the default GitHub authentication source during upgrades. - Legacy options for WeChat login are retained for compatibility, but the management console no longer provides WeChat login configuration entries.
- Legacy options for Turnstile and backend verification remain, and existing configurations will continue to take effect.
OpenResty Parameters
OpenResty performance and caching parameters continue to be stored uniformly in the Option table. Currently common items include:
OpenRestyWorkerProcessesOpenRestyWorkerConnectionsOpenRestyWorkerRlimitNofileOpenRestyKeepaliveTimeoutOpenRestyProxyConnectTimeoutOpenRestyProxySendTimeoutOpenRestyProxyReadTimeoutOpenRestyProxyBufferingEnabledOpenRestyGzipEnabledOpenRestyCacheEnabledOpenRestyCachePathOpenRestyCacheMaxSize
These parameters must be validated, saved, and participate in version rendering in a structured way.
Constraints:
- The management console no longer exposes
resolverconfiguration. - Upstreams are uniformly rendered as named
upstreamblocks with keepalives enabled. - A single upstream carrying a base path or query will append the original URI in
proxy_pass. - Multiple upstreams still require each upstream to be pure
scheme://host[:port], and the protocol must be consistent within the same rule. OpenRestyCacheEnabledis used to enable the caching infrastructure and global default parameters; the actual caching enablement and hit policies (based on URL, suffix, or path) are decided separately by each individualproxy_routes.- The default cache key is
$scheme$host$request_uri. - The default
keepalive_timeoutis20seconds, and the defaultproxy_connect_timeoutis3seconds. - The default event model is
epoll, andmulti_acceptis enabled by default. - HTTPS listeners use the independent
http2 on;directive by default to avoid deprecation warnings forlisten ... http2in newer Nginx/OpenResty versions.
Frontend Build Variables
| Variable | Purpose | Default |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL |
Frontend API request base path | /api |
NEXT_PUBLIC_APP_VERSION |
Frontend displayed version number | dev |
NEXT_DEV_BACKEND_URL |
Dev backend proxy target | http://127.0.0.1:3000 |
Agent Environment Variables
| Variable | Purpose | Default |
|---|---|---|
LOG_LEVEL |
Agent log level | info |
OPENFLARE_SERVER_URL |
Control plane URL, can override agent.json |
empty |
OPENFLARE_AGENT_TOKEN |
Node-exclusive auth token, can override agent.json |
empty |
OPENFLARE_DISCOVERY_TOKEN |
Global token for first registration, can override agent.json |
empty |
OPENFLARE_NODE_NAME |
Node name, can override agent.json |
empty |
OPENFLARE_NODE_IP |
Node IP, can override agent.json |
empty |
OPENFLARE_DATA_DIR |
Agent data directory, can override agent.json |
empty |
OPENFLARE_OPENRESTY_PATH |
OpenResty binary path, can override agent.json |
empty |
OPENFLARE_HEARTBEAT_INTERVAL |
Heartbeat interval, can override agent.json |
empty |
OPENFLARE_REQUEST_TIMEOUT |
Request timeout, can override agent.json |
empty |
OPENFLARE_OPENRESTY_OBSERVABILITY_PORT |
Local observability port, can override agent.json |
empty |
OPENFLARE_MMDB_PATH |
WAF GeoIP mmdb path, can override agent.json |
empty |
OPENFLARE_MMDB_UPDATE_INTERVAL |
WAF GeoIP mmdb update interval, can override agent.json |
empty |
OPENFLARE_MMDB_DOWNLOAD_URL |
WAF GeoIP mmdb download URL, can override agent.json |
empty |
Agent CLI Flags
| Flag | Purpose | Default |
|---|---|---|
-config |
Specify the path to the Agent configuration file | ./agent.json |
Agent Configuration Fields
| Field | Purpose | Required | Default / Behavior |
|---|---|---|---|
server_url |
Control plane URL | yes | none |
agent_token |
Node-exclusive auth token | one of agent_token/discovery_token |
empty |
discovery_token |
Global token for first registration | one of agent_token/discovery_token |
empty |
node_name |
Node name | no | automatically uses host name |
node_ip |
Node IP | no | auto-detected; prioritizes obtaining the real public egress IP via third-party APIs, falling back to local interfaces on failure |
openresty_path |
OpenResty binary path | no | openresty |
openresty_observability_port |
Local observability and OpenResty health-check port | no | 18081 |
data_dir |
Agent data directory | no | data under the config file directory |
main_config_path |
OpenResty main config write path | no | data_dir/etc/nginx/nginx.conf |
route_config_path |
Route config write path | no | data_dir/etc/nginx/conf.d/openflare_routes.conf |
access_log_path |
OpenResty access log path | no | data_dir/var/log/openflare/access.log |
cert_dir |
Certificate write directory | no | data_dir/etc/nginx/certs |
openresty_cert_dir |
Certificate read directory in OpenResty config | no | same as cert_dir |
lua_dir |
Lua scripts and static resources write directory | no | data_dir/etc/nginx/lua |
openresty_lua_dir |
Lua read directory in OpenResty config | no | same as lua_dir |
runtime_config_dir |
Agent runtime config write directory, e.g., pow_config.json |
no | data_dir/etc/openflare |
mmdb_path |
WAF GeoIP mmdb file path | no | data_dir/etc/openflare/GeoLite2-Country.mmdb |
mmdb_update_interval |
WAF GeoIP mmdb update interval | no | 86400000 milliseconds |
mmdb_download_url |
WAF GeoIP mmdb download URL | no | built-in GeoLite2 Country download URL |
observability_buffer_path |
Observability buffering file path | no | data_dir/var/lib/openflare/observability-buffer.json |
observability_replay_minutes |
Minutes to automatically replay recent observability data | no | 15 |
state_path |
Agent local state file path | no | data_dir/var/lib/openflare/agent-state.json |
heartbeat_interval |
Heartbeat interval | no | 10000 milliseconds |
request_timeout |
HTTP request timeout | no | 10000 milliseconds |
Description:
agent_tokenanddiscovery_tokencannot both be empty.heartbeat_intervalandrequest_timeoutsupport integer milliseconds or Go duration strings.- When the Server runtime option
AgentWebsocketUpgradeEnabledis enabled, the Agent will attempt to upgrade to a WebSocket after a successful HTTP heartbeat; it automatically falls back to HTTP heartbeats when connection fails or is disconnected. - When
openresty_pathis not configured,openrestyis called by default. - The Agent's periodic health checks request
http://127.0.0.1:<openresty_observability_port>/openflare/stub_status, no longer judging runtime health via high-frequencyopenresty -t; validation before configuration application, startup recovery, and reloads will still executeopenresty -t -c <main_config_path>. - The Agent initializes and periodically updates
mmdb_pathfor OpenResty WAF Lua to execute country-level geographical rules; update failures only record warnings, and do not block sync or reloads. - If
agent.jsondoes not exist but environment variables such asOPENFLARE_SERVER_URLand tokens are sufficient, the Agent can start directly; environment variables take precedence when both exist. - When the Agent is not configured with
node_ip, it first querieshttps://realip.ccfor the real public egress IP, adapting to Docker/NAT scenarios; it falls back to local interface detection on failure, preferring a public IPv4 address. - When the Agent automatically detects a private
node_ip, the Server prioritizes retaining the public address of the Agent's direct connection during registration/heartbeat phases, avoiding misregistering internal interface addresses in NAT or multi-interface scenarios. - When "Lock node IP" is enabled in the admin UI, the Server keeps the manually configured node IP and Agent registration, HTTP heartbeat, or WebSocket status reports will not overwrite that field; after unlocking, the next report can fill it again.
Common Configuration Combinations
Production Server + PostgreSQL
export SESSION_SECRET='replace-with-a-long-random-string'
export DSN='postgres://openflare:replace-with-strong-password@postgres:5432/openflare?sslmode=disable'
export GIN_MODE='release'
export LOG_LEVEL='info'
Local Server + SQLite
export SESSION_SECRET='dev-session-secret'
export SQLITE_PATH='./openflare-dev.db'
export LOG_LEVEL='debug'
go run .
Agent + Default OpenResty
{
"server_url": "http://your-server:3000",
"agent_token": "replace-with-node-auth-token",
"data_dir": "/opt/openflare-agent/data",
"openresty_path": "openresty",
"heartbeat_interval": 10000,
"request_timeout": 10000
}
Agent + Customized OpenResty Path
{
"server_url": "http://your-server:3000",
"agent_token": "replace-with-node-auth-token",
"data_dir": "/var/lib/openflare-agent",
"openresty_path": "/usr/local/openresty/nginx/sbin/openresty",
"main_config_path": "/var/lib/openflare-agent/etc/nginx/nginx.conf",
"route_config_path": "/var/lib/openflare-agent/etc/nginx/conf.d/openflare_routes.conf",
"access_log_path": "/var/lib/openflare-agent/var/log/openflare/access.log",
"cert_dir": "/var/lib/openflare-agent/etc/nginx/certs",
"lua_dir": "/var/lib/openflare-agent/etc/nginx/lua",
"runtime_config_dir": "/var/lib/openflare-agent/etc/openflare",
"heartbeat_interval": 10000,
"request_timeout": 10000
}
Maintenance Requirements
When the following contents change, this document must be updated in sync:
- Server command-line parameters.
- Server environment variables.
- Agent command-line parameters.
- Agent configuration fields.
- Default values, purposes, or examples of any configuration items.