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
OffreMémoireStockageConnexions de l’app (poolées)Connexions directesServeur
small256 Mo5 Go1,00010partagé
medium512 Mo10 Go2,00040partagé
large4 Go80 Go5,000100dédié
xlarge12 Go200 Go10,000200dé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 :

OffreAmsterdam (vultr:ams)Newark (vultr:ewr)
small3,88 $/mois3,88 $/mois
medium7,74 $/mois7,74 $/mois
large62,13 $/mois62,13 $/mois
xlarge229,24 $/moisnon 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
  • attach enregistre l’URL poolée sous DATABASE_URL et l’URL directe sous DATABASE_DIRECT_URL sur l’app (Redis : REDIS_URL). Les URL ne passent jamais par votre script.
  • attach ne remplace jamais une variable en silence. Si l’application a déjà DATABASE_URL (ou REDIS_URL) avec une autre valeur, rien n’est enregistré et la réponse est 409 avec conflicts et un suggested_env_key libre. Envoyez "env_key": "DATABASE_URL_2" pour enregistrer sous ce nom (l’URL directe devient DATABASE_DIRECT_URL_2), ou "overwrite": true pour 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)
PostgreSQLport 6432, PgBouncer en mode transactionport 5432
MariaDBport 6033, ProxySQLport 3306
Connexionsjusqu’à la limite poolée de l’offre ; au-delà du pool, elles attendent (jusqu’à 120 s) au lieu d’échouerla limite directe de l’offre (10 sur small)
À utiliser pourvotre app : requêtes web, workers, chaque copie de l’appmigrations, 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}
MoteurFormat de l’URL
PostgreSQLpostgresql://user:password@host:port/db?sslmode=require
MariaDBmysql://user:password@host:port/db?ssl-mode=REQUIRED
Redisrediss://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 → medium continue de tourner. large → xlarge dé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 :

PolitiqueQuand la mémoire est pleineÀ utiliser pour
allkeys-lruSupprime les clés les moins récemment utiliséescaches
noeviction (par défaut)Refuse les écritures avec une erreur ; les lectures continuent de fonctionnerfiles d’attente, sessions, données qui ne doivent pas disparaître
volatile-lru, allkeys-lfu, volatile-lfu, allkeys-random, volatile-random, volatile-ttlLes autres politiques Rediscas 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#

StatutSignification
403Vérifiez d’abord votre adresse e-mail dans la console, sinon il manque une permission au jeton.
409La 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.
422Moteur, offre ou région inconnus, aucun abonnement serveur actif, un changement d’offre impossible pour le moment, ou confirm manquant.
503Les bases de données managées sont brièvement indisponibles. Rien n’a été modifié ; réessayez.
Bloqué, ou il vous manque un endpoint ? Dites-le-nous sur app.hostwolf.net/contact ou à [email protected].