config

package
v2.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 2, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

Package config is the one place the process reads its environment. Every setting has an CARTOGRAPH_ variable, a flag that overrides it, and a default that works on a laptop, in that order of precedence: flag, environment, default. Nothing else in the server calls os.Getenv for configuration.

This is the twelve-factor "config" factor: a deployment differs from another by environment alone, and the same binary runs in both.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func IsPostgresURL

func IsPostgresURL(s string) bool

IsPostgresURL reports whether s names a Postgres database rather than a vault directory or a SQLite file.

func Redact

func Redact(s string) string

Redact hides the password in a database URL, so it can be logged or put in an error.

Types

type Config

type Config struct {
	// Addr is the listen address. CARTOGRAPH_ADDR, default ":8080". A bare
	// port ("8080", what PORT-style platforms hand out) is accepted, and
	// "unix:///path/to.sock" listens on a UNIX domain socket instead.
	Addr string

	// Vault is the directory of manifests to serve, or a SQLite file.
	// CARTOGRAPH_VAULT, default ".". A positional argument on the command line
	// wins over both.
	Vault string

	// Store, when set, is a postgres:// (or postgresql://) URL, and the
	// manifests, project state, bundles and shared drafts live in that
	// database instead of a vault: what a stateless deployment of many
	// replicas needs. CARTOGRAPH_STORE, default empty: serve Vault.
	Store string

	// Fanout carries "this document changed" and presence between
	// replicas: "memory" (one replica) or "postgres" (LISTEN/NOTIFY on
	// the Store database). CARTOGRAPH_FANOUT, default empty, which means
	// postgres when Store is set and memory otherwise; FanoutAdapter
	// resolves it.
	Fanout string

	// FanoutURL, when set, is the Postgres URL the fan-out's listening
	// connection uses instead of Store. LISTEN needs a session of its own,
	// so when Store goes through a pooler in transaction mode (PgBouncer's
	// usual setting), this must reach Postgres directly.
	// CARTOGRAPH_FANOUT_URL, default empty: the Store URL.
	FanoutURL string

	// MetricsAddr, when set, serves Prometheus metrics at /metrics on a
	// listener of its own, kept off the address users reach.
	// CARTOGRAPH_METRICS_ADDR, default empty: no metrics listener.
	MetricsAddr string

	// SyncPing is how often the sync socket pings an idle peer, so a load
	// balancer or proxy does not close a quiet connection (nginx and AWS
	// ALB close one after 60 s by default). CARTOGRAPH_SYNC_PING, default
	// 20s; 0 turns pings off.
	SyncPing time.Duration

	// DocCache bounds how many shared documents a replica keeps in
	// memory; the least recently used are dropped first, and a dropped
	// one is loaded again from the store when next needed.
	// CARTOGRAPH_DOC_CACHE, default 1000.
	DocCache int

	// CompactAfter is how old a version must be, beside not being its
	// manifest's latest, before a Postgres store keeps it as a patch
	// instead of whole (docs/adr/0013). It is the time a rolling upgrade
	// from 2.2 has to finish: a 2.2 replica cannot read a compacted
	// version. CARTOGRAPH_COMPACT_AFTER, default 24h; 0 turns it off.
	CompactAfter time.Duration

	// Reports is the reporting adapter (docs/adr/0014): "computed" from
	// the engine's reads on any store, "postgres" as views beside a
	// Postgres store, or "off" for a deployment that reports elsewhere.
	// CARTOGRAPH_REPORTS, default computed.
	Reports string

	// DrainDelay is how long, after SIGTERM, the server keeps serving
	// while /readyz answers 503, so load balancers stop sending it work
	// before it stops accepting any. CARTOGRAPH_DRAIN_DELAY, default 0.
	DrainDelay time.Duration

	// Watch reloads manifests when their files change on disk.
	// CARTOGRAPH_WATCH, default true.
	Watch bool

	// Chromium is the browser to print PDFs with. CARTOGRAPH_CHROMIUM, default
	// empty: the printer then tries the vault's settings, CHROMIUM, then
	// the PATH.
	Chromium string

	// LogFormat is "text" or "json". CARTOGRAPH_LOG_FORMAT, default "text".
	// Logs always go to stdout; the environment decides where they end up.
	LogFormat string

	// LogLevel is debug, info, warn or error. CARTOGRAPH_LOG_LEVEL, default
	// "info".
	LogLevel string

	// ShutdownTimeout is how long in-flight requests get after SIGTERM.
	// CARTOGRAPH_SHUTDOWN_TIMEOUT, default 10s.
	ShutdownTimeout time.Duration

	// Auth selects the authenticator: "none" (every request is the
	// vault's operator) or "proxy" (the identity is the value of
	// AuthProxyHeader, set by an authenticating reverse proxy that is the
	// only way to reach the server). CARTOGRAPH_AUTH, default "none".
	Auth string

	// AuthProxyHeader is the header the proxy authenticator reads.
	// CARTOGRAPH_AUTH_PROXY_HEADER, default "X-Forwarded-User".
	AuthProxyHeader string

	// Authz selects the authorizer: "allow" (every principal may do
	// everything), "roles" (ReadRoles and WriteRoles decide; an anonymous
	// principal is refused, so pair it with an authenticator), or
	// "access" (an access list of people, four roles and teams, with
	// AccessFile mapping directory groups onto them; docs/adr/0011).
	// CARTOGRAPH_AUTHZ, default "allow".
	Authz string

	// AccessFile is the mapping from directory groups to roles and teams
	// for the access authorizer. CARTOGRAPH_ACCESS_FILE, default empty:
	// no group grants anything, and only people an administrator lists
	// may sign in.
	AccessFile string

	// ReadRoles and WriteRoles are comma-separated role names for the
	// roles authorizer. CARTOGRAPH_READ_ROLES (empty: any authenticated
	// principal may read), CARTOGRAPH_WRITE_ROLES (empty: nobody may write).
	ReadRoles  string
	WriteRoles string

	// Codec is the manifest syntax, "yaml" or "json". CARTOGRAPH_CODEC,
	// default "yaml". A vault is written in one codec; changing it is a
	// migration, not a restart.
	Codec string

	// ImportDir, when set, is imported on startup before serving.
	// CARTOGRAPH_IMPORT, default empty.
	ImportDir string
}

Config is everything `cartograph serve` can be told from outside.

func Defaults

func Defaults() Config

Defaults is the configuration a laptop needs: serve the current directory on :8080, text logs, no authentication.

func FromEnv

func FromEnv(getenv Getenv) (Config, error)

FromEnv returns Defaults overridden by every CARTOGRAPH_ variable getenv knows. A variable with an unparseable value is an error that names it.

func (Config) FanoutAdapter

func (c Config) FanoutAdapter() string

FanoutAdapter is the fan-out adapter to use: Fanout when set, else postgres for a Postgres store and memory for a vault.

func (*Config) Flags

func (c *Config) Flags(fs *flag.FlagSet)

Flags binds every setting to fs, with the current values as defaults, so a flag overrides the environment and the environment overrides the default.

func (Config) IsUnix

func (c Config) IsUnix() bool

IsUnix reports whether Addr names a UNIX domain socket (unix:///path).

func (Config) ListenAddr

func (c Config) ListenAddr() string

ListenAddr normalises Addr: a bare port becomes ":port", which is what a platform that hands out PORT expects to work.

func (Config) Validate

func (c Config) Validate() error

Validate refuses a value no adapter can act on.

type Getenv

type Getenv func(key string) string

Getenv is the shape of os.Getenv, so a test can supply its own.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL