DéveloppeursBases de données managées
Bases de données managées
Les bases de données managées tournent sur des serveurs de bases de données Hostwolf, séparés de vos serveurs d’applications. Vos apps y accèdent en TLS, si bien que chaque copie d’une app, sur n’importe quel serveur et dans n’importe quelle ville, utilise les mêmes données. C’est ce qui permet à la couche applicative de monter en charge.
- Moteurs : PostgreSQL, MariaDB (compatible MySQL) et Redis.
- Sécurité : TLS est obligatoire, et une base de données n’accepte que les connexions provenant des serveurs de votre équipe.
- Pooling de connexions : PostgreSQL et MariaDB sont fournis avec un pooler, si bien que des milliers de connexions de l’app se partagent quelques connexions à la base de données.
- Stockage : il grandit tout seul ; le stockage au-delà de l’offre est facturé au Go.
- Sauvegardes : chaque nuit, conservées 7 jours, stockées hors site. PostgreSQL offre aussi une restauration à un instant donné sur les 7 derniers jours.
- Suppression : la facturation s’arrête immédiatement ; le support peut restaurer une base de données supprimée pendant 7 jours.
- Facturation : à l’heure (prix mensuel ÷ 730), sur votre prochaine facture de serveur. Il vous faut d’abord un abonnement serveur actif.
Offres et prix#
hw $API/managed-databases/catalog | jq
| Offre | Mémoire | Stockage | Connexions de l’app (poolées) | Connexions directes | Serveur |
|---|---|---|---|---|---|
small | 256 Mo | 5 Go | 1,000 | 10 | partagé |
medium | 512 Mo | 10 Go | 2,000 | 40 | partagé |
large | 4 Go | 80 Go | 5,000 | 100 | dédié |
xlarge | 12 Go | 200 Go | 10,000 | 200 | dédié, 8 vCPU |
Le catalogue liste les régions (par exemple vultr:ams pour Amsterdam) avec le prix mensuel et horaire de chaque offre, en USD, ainsi que les limites ci-dessus (pooled_clients, direct_connections, pool_size). Choisissez la région la plus proche de vos serveurs d’applications. Prix au 11 octobre 2026 :
| Offre | Amsterdam (vultr:ams) | Newark (vultr:ewr) |
|---|---|---|
small | 3,88 $/mois | 3,88 $/mois |
medium | 7,74 $/mois | 7,74 $/mois |
large | 62,13 $/mois | 62,13 $/mois |
xlarge | 229,24 $/mois | non vendu |
Créer et connecter#
DB=$(hw -X POST $API/managed-databases \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"engine": "postgres", "plan": "small", "region": "vultr:ams"}' | jq -r .uuid)
# A few minutes later: status goes creating → ready
hw $API/managed-databases/$DB | jq -r .status
# Save the connection URLs on an app, then redeploy it
hw -X POST $API/managed-databases/$DB/attach -d "{\"application_uuid\": \"$APP\"}"
hw -X POST $API/applications/$APP/start
attachenregistre l’URL poolée sousDATABASE_URLet l’URL directe sousDATABASE_DIRECT_URLsur l’app (Redis :REDIS_URL). Les URL ne passent jamais par votre script.attachne remplace jamais une variable en silence. Si l’application a déjàDATABASE_URL(ouREDIS_URL) avec une autre valeur, rien n’est enregistré et la réponse est409avecconflictset unsuggested_env_keylibre. Envoyez"env_key": "DATABASE_URL_2"pour enregistrer sous ce nom (l’URL directe devientDATABASE_DIRECT_URL_2), ou"overwrite": truepour les remplacer.- L’en-tête
Idempotency-Key(un UUID) permet de relancer l’appel sans risque : une même clé ne crée jamais de seconde base de données. Réutiliser une clé avec des réglages différents renvoie 409. - Les actions sur les bases de données sont limitées à 10 par minute.
URL poolées et directes#
Chaque base de données PostgreSQL et MariaDB dispose de deux URL vers les mêmes données :
Poolée (url, DATABASE_URL) | Directe (direct_url, DATABASE_DIRECT_URL) | |
|---|---|---|
| PostgreSQL | port 6432, PgBouncer en mode transaction | port 5432 |
| MariaDB | port 6033, ProxySQL | port 3306 |
| Connexions | jusqu’à la limite poolée de l’offre ; au-delà du pool, elles attendent (jusqu’à 120 s) au lieu d’échouer | la limite directe de l’offre (10 sur small) |
| À utiliser pour | votre app : requêtes web, workers, chaque copie de l’app | migrations, LISTEN/NOTIFY, réglages de session (SET), verrous consultatifs, tables temporaires et transactions longues |
Utilisez l’URL poolée dans votre app. Avec l’URL directe, gardez le pool de l’app dans la limite directe de l’offre, en comptant chaque copie de l’app. Les requêtes préparées fonctionnent à travers le pooler. Lancez les migrations avec l’URL directe, par exemple DATABASE_URL=$DATABASE_DIRECT_URL npx prisma migrate deploy comme commande de post-déploiement (réglages de l’app, Cycle de déploiement). La commande de pré-déploiement s’exécute dans la copie encore en service, avant le début du nouveau build : elle lancerait les migrations de la version précédente, et elle est ignorée au premier déploiement.
Pour lire vous-même les URL, le jeton doit avoir Lecture des données sensibles :
hw $API/managed-databases/$DB/connection | jq
# {"env_key": "DATABASE_URL", "url": "postgresql://…@db-….db.app.hostwolf.net:6432/…?sslmode=require",
# "direct_url": "postgresql://…@db-….db.app.hostwolf.net:5432/…?sslmode=require", "direct_connections": 10}
| Moteur | Format de l’URL |
|---|---|
| PostgreSQL | postgresql://user:password@host:port/db?sslmode=require |
| MariaDB | mysql://user:password@host:port/db?ssl-mode=REQUIRED |
| Redis | rediss://user:password@host:port/0 |
Le nom d’hôte (db-<id>.db.app.hostwolf.net) reste le même lors des changements d’offre et des déplacements. Les certificats sont publics (Let's Encrypt), aucun fichier d’AC n’est donc nécessaire : sslmode=verify-full et ssl-mode=VERIFY_IDENTITY fonctionnent avec le magasin de certificats de votre système, sur le port poolé comme sur le port direct. Les connexions provenant d’ailleurs que des serveurs de votre équipe, y compris de votre propre ordinateur, sont refusées. Pour consulter les données, utilisez un shell sur l’un de vos serveurs (le Terminal de la console) ou un outil qui tourne dans l’une de vos apps.
Un stockage qui grandit#
Le disque du serveur de bases de données grandit tout seul avant d’être plein, sans redémarrage. Votre offre inclut son stockage (5, 10, 80 ou 200 Go). Au-delà, chaque Go entier est facturé à l’heure : 0,13 $ par mois pour 1 Go, 1,24 $ pour 10 Go, 12,38 $ pour 100 Go. extra_storage sur la base de données indique les Go supplémentaires actuels et leur prix, et metrics indique sa taille.
Passer à une offre supérieure#
Quand une base de données est plus sollicitée que ne le permet son offre pendant 3 heures sur 4 (CPU, connexions, ou Redis plein), advice indique l’offre adaptée et les administrateurs de l’équipe reçoivent un e-mail. Rien ne change tant que vous ne changez pas d’offre. upgrades liste les offres vers lesquelles elle peut passer dès maintenant :
hw $API/managed-databases/$DB | jq '.upgrades, .advice'
# [{"plan": "medium", "how": "in_place"}, {"plan": "large", "how": "move"}]
hw -X POST $API/managed-databases/$DB/upgrade -d '{"plan": "large"}'
# 422 {"message": "The large plan costs $62.13/month (now $3.88), billed hourly from the change. … Send \"confirm\": true to go ahead.", "confirm_required": true, "quote": {…}}
hw -X POST $API/managed-databases/$DB/upgrade -d '{"plan": "large", "confirm": true}' # 202
in_place:small→mediumcontinue de tourner.large→xlargedéplace le disque vers un serveur plus grand, avec environ une minute d’interruption.move: la base de données est copiée sur un autre serveur. Elle est indisponible pendant la copie (environ 20 secondes pour 200 000 lignes), puis le nom d’hôte pointe vers le nouveau serveur.- Le nouveau prix s’applique dès le changement. Une offre ne redescend jamais.
Mémoire Redis#
Une base de données Redis contient au plus la mémoire de son offre (256 Mo, 512 Mo, 4 Go ou 12 Go). La politique d’éviction décide de ce qui se passe quand elle est pleine :
| Politique | Quand la mémoire est pleine | À utiliser pour |
|---|---|---|
allkeys-lru | Supprime les clés les moins récemment utilisées | caches |
noeviction (par défaut) | Refuse les écritures avec une erreur ; les lectures continuent de fonctionner | files d’attente, sessions, données qui ne doivent pas disparaître |
volatile-lru, allkeys-lfu, volatile-lfu, allkeys-random, volatile-random, volatile-ttl | Les autres politiques Redis | cas particuliers |
Choisissez-la à la création de la base de données ("eviction_policy": "allkeys-lru"), ou modifiez-la à tout moment ; elle s’applique immédiatement, sans redémarrage :
hw -X PATCH $API/managed-databases/$DB -d '{"eviction_policy": "allkeys-lru"}'
metrics affiche la mémoire utilisée, le maximum et le nombre de clés évincées jusqu’ici.
Sauvegardes#
hw -X POST $API/managed-databases/$DB/backups # an extra backup now (202)
Les sauvegardes nocturnes ont lieu de toute façon. Dans la console, Points de restauration sur la base de données les liste.
PostgreSQL peut être restauré à n’importe quelle minute des 7 derniers jours depuis la console : la restauration crée une nouvelle base de données telle qu’elle était à ce moment, avec sa propre URL, facturée comme toute base de données. La base de données actuelle continue de fonctionner. Pour restaurer une sauvegarde MariaDB ou Redis, écrivez au support avec l’uuid de la base de données et l’heure.
Suppression#
hw -X DELETE $API/managed-databases/$DB
La facturation s’arrête immédiatement. Les apps qui l’utilisaient gardent l’ancienne DATABASE_URL jusqu’à ce que vous la changiez.
Erreurs possibles#
| Statut | Signification |
|---|---|
| 403 | Vérifiez d’abord votre adresse e-mail dans la console, sinon il manque une permission au jeton. |
| 409 | La base de données n’est pas encore prête, ou l’Idempotency-Key a été utilisée pour une autre base de données. |
| 422 | Moteur, offre ou région inconnus, aucun abonnement serveur actif, un changement d’offre impossible pour le moment, ou confirm manquant. |
| 503 | Les bases de données managées sont brièvement indisponibles. Rien n’a été modifié ; réessayez. |