Un éditeur, pas un pipeline
Quatre onglets par fonction : script, package.json, triggers, secrets. Run exécute ce que le serveur détient ; Save and run n'apparaît que lorsque votre écran en diffère.
Auto-hébergé · Open source
Écrivez vos fonctions dans le navigateur, puis appelez-les en HTTP ou planifiez-les en cron. Se déploie en un seul conteneur Docker : un binaire Go, un fichier SQLite, rien d'autre à installer.
Fonctionnement
Tout ce qu'il faut à une fonction tient sur un seul écran — aucune chaîne d'outils locale, aucune étape de déploiement.
const { team } = await Bun.stdin.json();
const res = await fetch(`https://api.internal/teams/${team}`);
const members = await res.json();
console.log(JSON.stringify({ sent: members.length }));
Deux façons de lancer une exécution, et une fonction peut porter les deux à la fois.
POST /invoke/{nom} avec une clé d'API. Le corps de la requête devient le stdin de la fonction, et la réponse porte son résultat et sa durée.Chaque exécution enregistre son déclencheur, son statut, sa durée, stdout, stderr, le payload de la requête et le code de sortie. Y compris celles qui n'ont jamais eu lieu : une planification due pendant un arrêt du serveur est journalisée en missed, avec le nombre d'occurrences et la période.
Stockage
Du SQLite. Fonctions, planifications, secrets, clés et logs y vivent tous. Aucun serveur de base à provisionner, et sauvegarder l'instance revient à copier un fichier.
remplacé à chaque déploiement
Litestream · optionnel
survit au conteneur
Le disque en dessous n'est pas permanent. Un conteneur est remplacé à chaque déploiement et emporte son système de fichiers. Litestream remet le fichier en place avant que le serveur ne démarre : le conteneur reste jetable, vos données non.
Ou simplement comme sauvegarde. Même sur un serveur dont le disque survit, cette même réplication est une copie hors site toujours à jour — aucun dump à planifier, aucune fenêtre pendant laquelle la dernière heure manque.
Laissez-le désactivé et rien d'autre ne change : FaaSBox tourne sur le seul fichier local, ce qu'on veut sur sa propre machine.
Dans la boîte
Quatre onglets par fonction : script, package.json, triggers, secrets. Run exécute ce que le serveur détient ; Save and run n'apparaît que lorsque votre écran en diffère.
Un appel HTTP et un tic cron empruntent le même chemin : un subprocess Bun, le même environnement, les mêmes plafonds, la même ligne de log. Ce qui diffère, c'est ce qui se passe quand la boîte est occupée — HTTP refuse avec un 429, une exécution cron attend son tour.
AES-256-GCM. Éditez-les en paires clé/valeur dans l'onglet Environment, masquées jusqu'à ce que vous les révéliez, et injectées dans l'environnement du subprocess. La sauvegarde remplace l'ensemble — raison pour laquelle vous le voyez.
Hachées à la création, révélées une fois, restreintes au besoin à des fonctions nommées et assorties d'une date d'expiration. Une expiration que le serveur ne sait pas lire est refusée à la création plutôt qu'ignorée en silence.
Déclencheur, statut, durée, les deux flux, payload de la requête, code de sortie, et un drapeau quand quelque chose a été tronqué pour tenir. La rétention se compte en lignes, purgées toutes les heures.
Rien ne tourne sans borne : 30 secondes par exécution, 1 Mo de corps de requête, 1 Mo capturé par flux de sortie, quatre exécutions simultanées. Les tailles et la concurrence sont des défauts que vous changez par variable d'environnement ; les deux délais, eux, sont fixes.
Par conception
Chaque décision ci-dessous retire une pièce mobile. Ce qui reste se comporte pareil à chaque fois, et tient dans un seul raisonnement.
Démarrer
docker run -d -p 8080:8080 \
-e SUPERUSER_EMAIL=admin@example.com \
-e SUPERUSER_PASSWORD='…' \
-e FAASBOX_ENCRYPTION_KEY=$(openssl rand -hex 32) \
-v faasbox-data:/app/data/pb_data \
faasbox
localhost:8080/ — l'éditeur. Connectez-vous avec l'adresse et le mot de passe de la commande ci-dessus ; le compte est créé au premier démarrage.
localhost:8080/_/ — l'admin PocketBase en dessous, si vous voulez les collections brutes.
Go 1.24+, Bun et Node.js, puis bash infra/dev/dev.sh construit l'éditeur et démarre le serveur.