Skip to main content

Database Providers

Database is an integral part of any application. DOM Cloud provides a free, opt-in OS-Wide MariaDB 10.11, PostgreSQL 17.4 and Valkey 8.0 databases available for every website in every tier.

Initializing the Database

Databases is opt-in, disabled by default. To enable it, go to deploy tab and execute one of these:

features:
- mysql
features:
- postgresql
features:
- redis

See the section in MariaDB or PostgreSQL or Valkey for more information.

To view and edit the database using online tools, use PhpMyAdmin, PhpPgAdmin or PhpRdAdmin. All of them are available from the manage tab.

info

You can't create or drop database from PhpMyAdmin, PhpPgAdmin or any external database client. You have to do that from Webmin UI or deployment script.

Our valkey instance is shared across the server with ACL and managed outside webmin interface. Read more below.

Using the Database

After activating the database, you can provide the database credentials to your app. This is one for RDBMS (MariaDB/PostgreSQL):

  • Hostname: localhost (because the database always live in the same server)
  • Port: 3306 for MariaDB, 5432 for PostgreSQL
  • Username: Same username with server (see from manage tab)
  • Password: Same password with server (see from manage tab)
  • Database name: Usually username with suffix + _db unless you've created another DB
    • For example with username hello-world then database name will be hello_world_db
    • Check the correct database name from PhpMyAdmin or PhpPgAdmin

While this one is for connecting to Valkey:

  • Hostname: localhost (because the database always live in the same server)
  • Port: 6379 for Valkey or 6479 for the ACL Proxy
  • Username: The ACL username coming from the database tab.
  • Password: The ACL password coming from the database tab.
caution

Username and password is always different from the default. Don't assume root username with empty password will work for you.

Remote Access

Remote Access is used to manage databases using your local software -- such as DBeaver, HeidiSQL or TablePlus.

PostgreSQL and MariaDB permits remote access by default, while Valkey don't.

info

When connecting with Remote Access, the hostname is your website domain or the server's IP address, not localhost.

Valkey ACL Rules

The Valkey instance set up at port 6379 is shared across the server. To protect user data, we set up an ACL authentication to each "database" instance. Given a "database" name is user_db, the ACL rules applied are:

user_db on >${password} ~user_db:* &user_db:* sanitize-payload
-@all +@connection +@read +@write +@scripting +@keyspace -KEYS
+@transaction +@geo +@hash +@set +@sortedset +@bitmap +@pubsub
+config|get +info +acl|whoami +acl|cat +acl|genpass

Most software or framework should work with this ACL rules, however not application would support key prefixing as implied in ~user_db:* &user_db:*. To avoid code changes we recommend you to use port 6479 which is another daemon that can aid with automatic key prefixing to the master valkey instance.

ACL Proxy for Valkey

DOM Cloud set up an ACL proxy for valkey that listening on port 6479. It's mirrorring connections to 6379 with these enhancements:

  • Automatically prefixes keys or read/write operations such as SCAN, GET, SET and so much more, to allow access any keys without having to prefix it with user_db: (where user_db is the ACL username).
  • Automatically removes prefix of user_db: with results from SCAN so the clients doesn't need to adjust with automatic key prefixing.
  • Support old requirepass login model with username:::password syntax in the password. This is meant for frameworks that doesn't handle Redis 6.0 ACL yet.

Note that the proxy is experimental. Some modern features (like HELLO 3) won't work and some Lua scripting may not work if it written badly. See the repository for details.

To connect to this proxy with redis-cli, use redis-cli -u username_db:::password -p 6479. PhpRedisAdmin is also configured to work on 6479 rather than directly with the master valkey instance at 6379. Note that the redis-cli is a symlink to valkey-cli.

Timestamp

Our server always sets the clock in UTC.

A good idea to handle timezone is done by client processing (Javascript), both after getting the data from database/AJAX and before sending data/Posts to server.

If you don't care about timezone and you think it's safe to assume that your website is only accessed in one timezone, you can set the timezone in the backend using date_default_timezone_set for PHP or TZ env for non-PHP (set it to passenger's env_var_list).

Supported PostgreSQL Extensions

These optional PostgreSQL extensions can be activated using CREATE EXTENSION clause on a given database:

Extension NameDescriptionLink
btree_ginProvides support for GIN (Generalized Inverted Index) indexing for B-tree data types.Documentation
btree_gistProvides support for GiST (Generalized Search Tree) indexing for B-tree data types.Documentation
citextA case-insensitive text data type extension.Documentation
cubeProvides data types and functions to support multidimensional cubes.Documentation
dict_intProvides an example dictionary template for integers.Documentation
earthdistanceProvides functions for calculating great-circle distances between points on the Earth's surface.Documentation
fuzzystrmatchProvides functions to perform "fuzzy" string matching, including soundex and levenshtein distance.Documentation
hstoreA key-value store within PostgreSQL, allowing you to store sets of key/value pairs within a single PostgreSQL value.Documentation
intarrayProvides support for indexed arrays of integers.Documentation
isnProvides data types for various international standard numbers, such as ISBN, ISMN, and ISSN.Documentation
loProvides support for large objects within PostgreSQL.Documentation
ltreeProvides a data type for representing labels of data stored in a hierarchical tree-like structure.Documentation
pgcryptoProvides cryptographic functions for PostgreSQL, including encryption, decryption, hashing, and more.Documentation
pg_trgmProvides functions and operators for determining the similarity of text based on trigram matching.Documentation
plpgsqlPostgreSQL's procedural language for SQL, allowing for control structures, complex calculations, and error handling in SQL scripts.Documentation
segProvides a "seg" data type for representing line segments in two-dimensional space.Documentation
tablefuncProvides functions for manipulating tables, such as crosstab functions.Documentation
tcnProvides support for Triggered Change Notification, allowing for notification of changes in the database.Documentation
tsm_system_rowsA table sampling method that returns a specified number of rows.Documentation
tsm_system_timeA table sampling method that returns rows from a table based on the system time.Documentation
unaccentProvides a dictionary and function to remove accents (diacritics) from strings.Documentation
uuid-osspProvides functions to generate universally unique identifiers (UUIDs).Documentation
pg_uuidv7Provides support for UUID version 7, a new type of universally unique identifier.Documentation
postgisA spatial database extender for PostgreSQL, providing support for geographic objects.Documentation
postgis_rasterExtends PostGIS with raster data support, allowing the storage, query, and analysis of raster data types.Documentation
postgis_sfcgalExtends PostGIS with advanced 3D capabilities provided by the SFCGAL library.Documentation
postgis_tiger_geocodersProvides geocoding functions using the U.S. Census TIGER/Line data.Documentation
postgis_topologyExtends PostGIS with topology support, allowing the representation of topological structures.Documentation
address_standardizerStandardizes address data for geocoding purposes.Documentation
address_standardizer_data_usProvides US address data for the address standardizer extension.Documentation
pgroutingExtends PostGIS with geospatial routing functionality.Documentation
timescaledbAn extension that provides scalable time-series data management built on PostgreSQL.Documentation
vectorA vector data type extension, useful for implementing machine learning models and similar functionalities.Documentation

Other Database System

Only four database system is supported: MariaDB, PostgreSQL, Valkey, SQLite. For caching we recommend you to leverage Valkey or the filesystem.

You can also use third party databases that's also cheap (or even free) such as Firebase Firestore or MongoDB Atlas, just make sure the cluster is close enough within our server.

If you wish to spin up a custom database server, you might be better deploy your website using docker.