The README now covers what keepalive is, a quick start, the adapter table,
and links. Reference material moves to docs/: configuration (every option,
per-adapter keys, validation), deployment (Compose, Coolify, Docker, source),
how it works (writes, retries, timeouts, logging), known issues (PostgreSQL
public-schema permissions and Aiven's ACL key-pattern tilde, by log line),
and adding an adapter (now including ConfigKeys registration).
.gitignore also excludes config.yaml, matching .dockerignore.
- Generated service names come only from a URL host, a key=value DSN's
host=, or a MySQL tcp() address, so a password in a key=value DSN can no
longer end up in the name printed on every log line.
- connect_timeout is added only to postgres:// and postgresql:// URLs
(parsed, so it never lands after a fragment) or as a key=value token, never
glued onto a key=value value containing "://".
- Driver parse errors that quote password fragments (mongo escape errors,
lib/pq's missing "=" error) are replaced with generic hints.
- MongoDB keeps its client only after a successful connect, so a failed
connect is not disconnected twice.
- Couchbase gets ready_timeout plus 1 minute to connect, so raising
ready_timeout takes effect.
- Shutdown waits at most 7 seconds, inside Docker's 10-second grace period.
- Each adapter declares its config keys; unknown keys anywhere in the file,
including under config, log a warning without blocking start.
go-redis 9.19.0 to 9.23.0, mongo-driver 2.6.0 to 2.9.2, gocb 2.12.3 to
2.13.0, go-sql-driver/mysql 1.10.0 to 1.10.1, and their transitive modules.
The update raises the module's go directive to 1.26, so the builder image
moves from golang:1.25-alpine to the moving major tag golang:1-alpine.
- Each connect attempt, including initialization, times out after 1 minute,
and PostgreSQL DSNs without connect_timeout get connect_timeout=30, since
lib/pq honours the context only while dialing.
- A service increments right after connecting, so a restart writes even
when the interval outlasts the process.
- A config path that is a directory (Docker's stand-in for a missing
bind-mount source) fails with a clear message.
- Generated service names take the first free suffix, and suffixed names
are reserved so an explicit name cannot silently collide with them.
- counter_key inside a service's config map is rejected instead of being
overwritten.
- Unknown keys in the config file log a warning without blocking start.
- A .dockerignore keeps local configs and .env out of the build context.
A failed connect or tick now closes the connection and reconnects after one
minute, re-running initialization so a dropped table or row is recreated.
Before, a failing tick logged every interval forever and connect retries
logged every 10 seconds.
Connection URLs that fail to parse no longer appear in logs, since their
error repeats the password.
An unknown adapter or a missing required config key now stops keepalive at
startup instead of silently idling one service.
Increment read the counter and wrote it back, ignoring the tick context, and
treated any read error as a missing document, so a timeout reset the counter
to 1. A single binary increment is atomic, honours the context, and surfaces
real errors. The cluster is also assigned only after a successful connect so
a failed connect is not closed twice.
Valkey speaks the Redis protocol, so the redis adapter (go-redis) already
serves it. Dropping valkey-go removes a dependency and shrinks the stripped
binary by about 9 MB.
The redis adapter now also closes a client that failed to connect only once.
BREAKING CHANGE: `adapter: valkey` is no longer accepted. Use
`adapter: redis` with a redis:// or rediss:// URL instead of valkey:// or
valkeys://. The namespace option now applies to these services.
Drop container_name and the local image tag, which conflict with Coolify's own container and image naming, and expose the configured app port without publishing it. Document the Coolify file storage for config.yml.
Their full histories remain under redis/, valkey/, postgresql/, mysql/, mongodb/,
and couchbase/ in earlier commits; keepalive itself implements all of them.
Consolidates the *-keepalive family (redis, valkey, postgresql, mysql,
mongodb, couchbase) into a single binary with a runtime DB_TYPE dispatch
and an Adapter interface. Original repos archived with a pointer here.