📍 Article principal : Supabase 2026 : guide pratique.
Une heure pour installer Supabase complet sur Hetzner CCX13. Méthode validée chez startups francophones d’Afrique de l’Ouest.
Prérequis
- Hetzner CCX13 minimum (8 Go RAM, Postgres + 8 services).
- Docker + Docker Compose plugin.
- Domaine :
api.votre-app.cometstudio.votre-app.com. - Niveau : avancé.
- Temps : 60-90 min.
Étape 1 — Cloner Supabase
git clone --depth 1 https://github.com/supabase/supabase
cd supabase/docker
cp .env.example .env
Étape 2 — Variables critiques .env
POSTGRES_PASSWORD=générer-32-octets-fort
JWT_SECRET=générer-32-octets-aleatoire
ANON_KEY=signer-jwt-avec-secret
SERVICE_ROLE_KEY=signer-jwt-avec-secret
SITE_URL=https://votre-app.com
SUPABASE_PUBLIC_URL=https://api.votre-app.com
DASHBOARD_USERNAME=admin
DASHBOARD_PASSWORD=fort
# SMTP pour Auth emails
SMTP_HOST=smtp-relay.brevo.com
SMTP_PORT=587
SMTP_USER=login
SMTP_PASS=key
SMTP_ADMIN_EMAIL=admin@votre-app.com
SMTP_SENDER_NAME=Votre App
# Storage
GLOBAL_S3_BUCKET=supabase-storage
STORAGE_BACKEND=file
Étape 3 — Générer JWT keys
Outil officiel : supabase.com/docs/guides/self-hosting/docker. Utiliser JWT_SECRET pour signer ANON et SERVICE_ROLE.
Étape 4 — Caddy reverse proxy
api.votre-app.com {
reverse_proxy localhost:8000
}
studio.votre-app.com {
reverse_proxy localhost:3000
}
Étape 5 — Lancer stack
docker compose up -d
docker compose ps # Tous services Up
Étape 6 — Accéder Studio
Ouvrir https://studio.votre-app.com. Login avec DASHBOARD_USERNAME/PASSWORD. Dashboard charge.
Étape 7 — Test API
curl https://api.votre-app.com/rest/v1/ -H "apikey: $ANON_KEY"
# Doit retourner liste tables (vide initial)
Étape 8 — Premier projet
Studio → SQL editor → CREATE TABLE products :
CREATE TABLE products (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
name text NOT NULL,
price integer NOT NULL,
created_at timestamptz DEFAULT now()
);
ALTER TABLE products ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Public read" ON products FOR SELECT USING (true);
Étape 9 — Test depuis client
// JavaScript
import { createClient } from '@supabase/supabase-js';
const supabase = createClient('https://api.votre-app.com', 'ANON_KEY');
const { data } = await supabase.from('products').select('*');
Étape 10 — Sauvegardes
# Cron quotidien
docker exec supabase-db pg_dump -U postgres postgres | gzip > /tmp/sb.gz
restic backup /tmp/sb.gz /var/lib/docker/volumes/supabase_storage
rm /tmp/sb.gz
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| Studio 502 | Postgres pas prêt | Wait 60s + restart Studio |
| JWT invalid | ANON_KEY mal signée | Régénérer avec JWT_SECRET correct |
| Auth email non reçu | SMTP pas testé | GoTrue logs : docker logs supabase-auth |
| RLS bloque tout | Pas de policy | Créer policy pour role anon |
| Storage upload 403 | Bucket policy manquante | INSERT policy authenticated |
| OOM | RAM insuffisante | CCX13 minimum, CCX23 production sérieuse |
Adaptation au contexte ouest-africain
Trois précisions. Hetzner Falkenstein : 95-130 ms vers Afrique Ouest acceptable. SDK mobile : Supabase iOS/Android natifs, optimisés cellular. Backup obligatoire : pg_dump 6h fréquence + restic vers B2.
Tutoriels frères
FAQ
CCX13 vs CCX23 ? CCX13 dev/staging. CCX23 production sérieuse.
Mises à jour ? docker compose pull && docker compose up -d. Migrations auto.
Multi-projets ? Une instance = un projet. Plusieurs Supabase pour multi-tenancy.
Coolify template ? Pas officiel. docker-compose.yml direct recommandé.
Storage S3 externe ? Oui. STORAGE_BACKEND=s3 + AWS_* vars.
Pour aller plus loin
- 🔝 guide général : guide pratique Supabase 2026
- Documentation : supabase.com/docs/self-hosting/docker