Skip to main content

Enhanced Database Classification Free

Recognize 50+ additional database images automatically, with explicit classification controls and wire-compatible backup support.

Overview​

Coolify classifies each service container as either a database or an application. This classification determines what features are available: TCP proxy ("Make Publicly Available"), scheduled backups, database import, and the backup UI.

By default, Coolify only recognizes a small set of mainstream database images. Enhanced Database Classification solves this gap through multiple complementary mechanisms:

  1. Expanded image list — 50+ additional database images recognized automatically
  2. Explicit labels — classify any custom image via Docker labels
  3. Template headers — classify entire templates via comment metadata
  4. Wire-compatible backups — standard dump tools for compatible databases
  5. Multi-port proxy — per-port proxy configuration for multi-port databases
  6. Expanded port mapping — correct default ports for all recognized databases

Supported Database Categories​

The expanded recognition list covers databases across all major categories:

CategoryExamples
GraphNeo4j, Memgraph, Apache AGE, ArangoDB, JanusGraph
VectorMilvus, Qdrant, Weaviate, ChromaDB, Pinecone
Time-SeriesTimescaleDB, QuestDB, InfluxDB, VictoriaMetrics
DocumentFerretDB, CouchDB, RethinkDB, SurrealDB
SearchElasticsearch, OpenSearch, Manticore, Typesense, Meilisearch, Zinc
Key-ValueKeyDB, DragonflyDB, Valkey, Garnet
Column-FamilyApache Cassandra, ScyllaDB, HBase
NewSQLYugabyteDB, TiDB, CockroachDB, Vitess
OLAPClickHouse, Apache Doris, DuckDB, StarRocks

Explicit Classification​

Per-Service: coolify.database Label​

For custom or unrecognized database images, add the coolify.database Docker label:

services:
my-custom-db:
image: myorg/custom-database:latest
labels:
coolify.database: "true"

This works with both Docker Compose label formats:

# Map format
labels:
coolify.database: "true"

# Array format
labels:
- coolify.database=true

The label accepts true/false, 1/0, yes/no, on/off (case-insensitive).

Template-Level: # type: database​

For service templates, add the # type: metadata header to classify all services in the template:

# documentation: https://memgraph.com/docs
# slogan: Real-time graph database
# tags: graph,database,cypher
# type: database

services:
memgraph:
image: memgraph/memgraph:latest
volumes:
- memgraph-data:/var/lib/memgraph

For mixed-type templates (database + admin UI), combine both:

# type: database

services:
memgraph:
image: memgraph/memgraph:latest
# Gets coolify.database=true from the header

memgraph-lab:
image: memgraph/lab:latest
labels:
coolify.database: "false" # Override: web UI, not a database

Per-service labels always take precedence over the template-level header.

When do you need explicit classification?

You don't need to specify labels if your database image is already in the expanded recognition list. You should specify coolify.database: "true" when using a custom or private image, or a non-standard tag that doesn't contain the database name.

Wire-Compatible Backups​

Some databases are wire-compatible with mainstream databases, meaning standard dump tools produce correct backups:

DatabaseCompatible WithDump Tool
YugabyteDBPostgreSQLpg_dump
Apache AGEPostgreSQLpg_dump
TiDBMySQLmysqldump
Percona ServerMySQLmysqldump
FerretDBMongoDBmongodump

When these databases are deployed as services, the backup UI, scheduled backups, and import functionality automatically use the correct dump tool.

Conservative Mapping

Only databases where standard dump tools produce reliable backups are mapped. CockroachDB (pg_dump fails on system catalog), Vitess (mysqldump unreliable for sharded setups), and ScyllaDB are intentionally not mapped.

Multi-Port Database Proxy​

Some databases expose multiple ports (e.g., Memgraph has Bolt on 7687 and a log viewer on 7444). The coolify.proxyPorts label enables per-port proxy configuration:

services:
memgraph:
image: memgraph/memgraph:latest
labels:
coolify.database: "true"
coolify.proxyPorts: "7687:bolt,7444:log-viewer"

Label format: "internalPort:label,internalPort:label,..."

When this label is present, the "Make Publicly Available" section shows a per-port table:

PortLabelEnabledPublic Port
7687boltYes17687
7444log-viewerNo—

Each port can be independently enabled/disabled with its own public port number. All ports share a single proxy container.

Example: Neo4j with multiple ports:

services:
neo4j:
image: neo4j:5
labels:
coolify.database: "true"
coolify.proxyPorts: "7687:bolt,7474:browser,7473:browser-ssl"
Backward Compatible

If the coolify.proxyPorts label is absent, the standard single-port proxy UI is shown — no behavior change for existing databases.

Expanded Port Mapping​

All recognized databases have correct default port mappings for the TCP proxy. When you toggle "Make Publicly Available" on any recognized database, the correct internal port is automatically detected through a multi-level fallback:

  1. Built-in match (Coolify's original list)
  2. Extended port map lookup by base image name
  3. Partial string match against known database patterns
  4. Docker Compose port extraction
  5. Helpful error message guiding you to set a custom type