Skip to content

Environment Variables

API Service (Hono)

VariableRequiredDefaultPurpose
NODE_ENVNodevelopmentdevelopment, production, or test.
POSTGRES_HOSTYesPostgres host. Combined with the vars below into the connection URL by src/lib/resolve-database-url.ts.
POSTGRES_PORTNo5432Postgres port.
POSTGRES_USERYesPostgres user.
POSTGRES_PASSWORDYesPostgres password.
POSTGRES_DBYesPostgres database name.
REDIS_HOSTYesRedis host. Combined with the vars below into the connection URL by src/lib/resolve-redis-url.ts.
REDIS_PORTNo6379Redis port.
REDIS_USERNoRedis ACL user (leave unset unless your deployment uses ACLs).
REDIS_PASSWORDNoRedis password.
REDIS_TLSNoSet to 1 or true to use rediss:// (TLS). Required for most managed Redis providers.
LIBRIS_INBOX_PATHYesDirectory watched for new book files
LIBRIS_LIBRARY_PATHYesDirectory for organized book storage
API_SECRET_KEYYesSecret for token encryption (min 32 chars)
PORTNo3000Port the API server listens on
COOKIE_DOMAINNoParent domain for auth cookie (e.g., .example.com). Leave empty when on a single domain.
MIGRATIONS_PATHNo./migrationsPath to database migration files. Used by runMigrations() in bootstrap.ts to auto-apply migrations on startup.
TRUST_PROXY_HEADERSNo0Set to 1 only when all requests pass through a trusted reverse proxy and its client IP headers should drive auth logging and rate limiting.
LOG_LEVELNoinfoMinimum log level: trace, debug, info, warn, error, fatal. Applies to both stdout Pino output and the OpenTelemetry log pipeline.

DATABASE_URL and REDIS_URL are no longer read from the environment — the app assembles them from the split vars above. This gives docker-compose and the app a single source of truth; see docker-compose.dev.yml for the corresponding ${POSTGRES_USER:-libris} interpolation.

In development, Redis and cache use in-memory KV stores (no Redis connection needed).

OpenTelemetry

Libris supports exporting logs and traces via OpenTelemetry. The OTel SDK activates when OTEL_EXPORTER_OTLP_ENDPOINT is set. All configuration uses standard OTel environment variables — no custom Libris-specific vars are needed.

VariableRequiredDefaultPurpose
OTEL_EXPORTER_OTLP_ENDPOINTNoOTLP collector URL (e.g., http://alloy:4318). Enables OTel.
OTEL_SERVICE_NAMENolibrisService name in telemetry data
OTEL_EXPORTER_OTLP_PROTOCOLNohttp/protobufProtocol: http/protobuf, http/json, or grpc
OTEL_TRACES_EXPORTERNootlpTrace exporter. Set to none to disable traces.
OTEL_LOGS_EXPORTERNootlpLog exporter. Set to none to disable log export.
OTEL_METRICS_EXPORTERNootlpMetrics exporter. Set to none to disable metrics.

When OTEL_EXPORTER_OTLP_ENDPOINT is not set, the OTel SDK does not initialize and adds zero overhead. Logs still flow to stdout via Pino regardless of OTel configuration.

Frontend (Vue SPA)

In production, the SPA is served by the Hono backend from the same origin — no frontend-specific configuration is needed. API requests use relative URLs (/api/*).

In development, the Vite dev server runs on port 3100 and proxies /api/* requests to the backend on port 3000 via its built-in proxy.

Metadata Sources

The Hardcover API token for metadata enrichment is stored in the database via Settings > Connections, not as an env var. It is optional — if not configured, external metadata enrichment is skipped during ingestion.

SourceKey typeWhere to get it
HardcoverBearer tokenhardcover.app/account/api

Test Environment

VariableValuePurpose
POSTGRES_HOSTlocalhostIsolated test DB
POSTGRES_PORT5433Test Postgres port (non-standard to avoid clashing with dev)
POSTGRES_USERlibris_test
POSTGRES_PASSWORDlibris_test
POSTGRES_DBlibris_test
REDIS_HOSTlocalhostIsolated test Redis
REDIS_PORT6380Test Redis port (non-standard)
LIBRIS_INBOX_PATH/tmp/test-inboxEphemeral inbox
LIBRIS_LIBRARY_PATH/tmp/test-libraryEphemeral library
E2E_TEST1Set to "1" to enable. Disables rate limiting, allows __test/ routes, and relaxes auth checks. Cannot be used with NODE_ENV=production.
E2E_API_KEY(auto-generated)Auto-generated by global-setup.ts (not user-provided). Seeds an API key via /api/auth/setup before tests run.

See .env.test.example for a complete template. Note that NUXT_SESSION_PASSWORD in that file is unused by any service code and can be safely omitted.