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:
- Expanded image list — 50+ additional database images recognized automatically
- Explicit labels — classify any custom image via Docker labels
- Template headers — classify entire templates via comment metadata
- Wire-compatible backups — standard dump tools for compatible databases
- Multi-port proxy — per-port proxy configuration for multi-port databases
- Expanded port mapping — correct default ports for all recognized databases
Supported Database Categories
The expanded recognition list covers databases across all major categories:
| Category | Examples |
|---|---|
| Graph | Neo4j, Memgraph, Apache AGE, ArangoDB, JanusGraph |
| Vector | Milvus, Qdrant, Weaviate, ChromaDB, Pinecone |
| Time-Series | TimescaleDB, QuestDB, InfluxDB, VictoriaMetrics |
| Document | FerretDB, CouchDB, RethinkDB, SurrealDB |
| Search | Elasticsearch, OpenSearch, Manticore, Typesense, Meilisearch, Zinc |
| Key-Value | KeyDB, DragonflyDB, Valkey, Garnet |
| Column-Family | Apache Cassandra, ScyllaDB, HBase |
| NewSQL | YugabyteDB, TiDB, CockroachDB, Vitess |
| OLAP | ClickHouse, 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.
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:
| Database | Compatible With | Dump Tool |
|---|---|---|
| YugabyteDB | PostgreSQL | pg_dump |
| Apache AGE | PostgreSQL | pg_dump |
| TiDB | MySQL | mysqldump |
| Percona Server | MySQL | mysqldump |
| FerretDB | MongoDB | mongodump |
When these databases are deployed as services, the backup UI, scheduled backups, and import functionality automatically use the correct dump tool.
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:
| Port | Label | Enabled | Public Port |
|---|---|---|---|
| 7687 | bolt | Yes | 17687 |
| 7444 | log-viewer | No | — |
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"
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:
- Built-in match (Coolify's original list)
- Extended port map lookup by base image name
- Partial string match against known database patterns
- Docker Compose port extraction
- Helpful error message guiding you to set a custom type