CLI

Déployez depuis votre terminal.

La CLI Canner crée une archive de votre projet, l'envoie au Québec et diffuse le journal de compilation dans votre console. Fonctionne partout où Node 20 s'exécute — macOS, Linux, Windows et le terminal intégré de Cursor. Aucun git requis.

$npm install -g @canner-ca/cli

Démarrage rapide

Trois commandes. canner login enregistre un jeton API depuis canner.ca/dashboard/identity/api-keys. canner init crée un projet et écrit canner.json dans le répertoire courant. canner deploy --follow expédie le projet et diffuse le journal de compilation.

canner login
cd my-site
canner init
canner deploy --follow

Commandes

canner loginDemande un jeton API et l'enregistre dans ~/.canner/credentials (mode 0600).canner logoutSupprime ~/.canner/credentials de cette machine. Le jeton reste valide jusqu'à sa révocation.canner whoamiAffiche le courriel et le forfait du compte connecté.canner projectsListe vos projets.canner initCrée un nouveau projet Canner et écrit canner.json dans le répertoire courant.canner statusAffiche l'état d'un projet — URL, statut, source, dernière requête.canner openOuvre l'URL du locataire (ou, avec --dashboard, la page du tableau de bord) dans votre navigateur.canner deployArchive le répertoire et le téléverse. --follow diffuse le journal de compilation et termine avec le code de retour de la compilation, ce qui convient à la dernière étape d'un pipeline CI.canner redeployRelance une compilation depuis le HEAD du dépôt GitHub sans téléverser. Projets reliés à GitHub seulement.canner deploymentsListe les déploiements récents, ou avec un id, affiche le journal de compilation d'un déploiement (ajoutez --follow pour diffuser si encore en cours).canner cancelInterrompt la compilation en cours (ou une compilation précise par son id).canner logsDiffuse les journaux d'exécution du locataire. --lines N pour l'historique, --follow pour continuer à diffuser.canner tokenListe, crée ou révoque les jetons API cnr_ qui authentifient la CLI et l'API.canner envListe, définit ou supprime les variables d'environnement d'un projet (env set KEY=VALEUR, --sensitive pour masquer).canner domainsListe, ajoute, vérifie ou supprime les domaines personnalisés d'un projet.canner dbListe les bases de données d'un projet, ou en initialise/ajoute une. Le forfait Démarrage a une base par projet; les forfaits payants peuvent en ajouter. `db init --dedicated [--pitr-days N]` crée la base principale sur sa propre instance dédiée avec récupération à un instant précis; si le projet n'a aucune unité d'instance dédiée, une est ajoutée (9 $/mois), donc la commande affiche le prix et exige `--yes`.canner billingLecture seule. `billing addons` liste les options que possède votre organisation, leur prix et les projets auxquels elles sont attribuées. `billing preview <option> <quantité>` montre la variation mensuelle qu'entraînerait une quantité (par exemple `dedicated_instance 3`). Rien n'est facturé ni modifié.canner db export / importTélécharge un pg_dump d'une base (tous les forfaits), ou en restaure un dans une base (tous les forfaits).canner db migrate-in / migrate-out / copyTransfère une base depuis (ou vers) n'importe quel serveur Postgres public, ou copie une base Canner dans une autre (la copie exige un forfait payant).canner db rm / pg-version / opsSupprime une base supplémentaire, la déplace vers une autre version de Postgres, ou vérifie une opération en cours.canner db external / rotateActive/désactive l'accès externe avec une liste d'adresses autorisées, ou fait pivoter le mot de passe d'une base. Tous les forfaits.canner db backup-policy / backup / backupsDéfinit l'intervalle et la conservation des sauvegardes planifiées d'une base, lance une sauvegarde manuelle, ou liste/télécharge/restaure/supprime des sauvegardes. Démarrage : au plus une sauvegarde par jour, et restauration sur place plutôt que dans une nouvelle base.canner db diff / inspect / backups --verify / alertsRestaure dans une base temporaire à examiner et la compare à la base actuelle, la conserve ou la prolonge, teste la restauration d'une sauvegarde et gère les alertes par courriel/webhook. Tous les forfaits.canner db resourcesAffiche et modifie le budget de mémoire que votre application partage avec son instance dédiée, et l'applique (redémarre brièvement l'instance). Tous les forfaits.canner db extensions / tuning / restartInstalle pgvector, PostGIS, pg_trgm, pg_cron et d'autres extensions sur l'instance dédiée; choisit un préréglage de charge, des délais d'expiration et une fenêtre de maintenance; redémarre l'instance tout de suite. Option payante.canner db replicationActive la réplication logique (redémarre l'instance), crée des publications, surveille les slots de réplication et leur limite de WAL, et donne un accès de réplication à un destinataire avec `canner db roles <nom> create <n> --replication`. Option payante.canner db subscriptionsSuit en direct un serveur Postgres externe : ajoute un abonnement à partir d'une URL de connexion (lue depuis une variable d'environnement ou l'entrée standard, jamais affichée) et de noms de publications, puis l'actualise, le suspend, le reprend ou le retire. Les changements sont appliqués avec les droits du propriétaire de vos tables. Option payante.canner db metrics / monitoring / insights / logsMétriques d'une base et, sur l'instance dédiée : active les requêtes lentes et les journaux (redémarre brièvement l'instance), liste les requêtes les plus lentes et lit le journal Postgres. Tous les forfaits.canner db roles / offsiteCrée des rôles en lecture seule ou en lecture et écriture avec leurs propres chaînes de connexion, et gère jusqu'à cinq destinations hors site compatibles S3 (ajout, modification, test, retrait) qui reçoivent des copies de vos sauvegardes. Le registre de migrations d'un rôle en lecture et écriture (schema_migrations et similaires) reste en lecture seule automatiquement; `canner db roles <nom> write-exclusions <rôle> <table>` protège toute autre table de la même façon, en direct, sans nouvelle chaîne de connexion. Tous les forfaits.canner db roles (groups, logins, audit) / injectAppliquez votre propre modèle de privilèges sur l'instance dédiée. Créez un groupe (un rôle avec lequel personne ne se connecte, nommé par vous, auquel vos migrations accordent des privilèges et rattachent des politiques de sécurité au niveau des lignes; `--adopt` reprend un rôle NOLOGIN existant portant ce nom) et une connexion membre de vos groupes qui ne détient rien d'autre, sans accès général en lecture. `canner db roles <nom> member-of` modifie les groupes d'une connexion en direct, `canner db inject <nom> <connexion>` choisit la connexion que l'application reçoit comme DATABASE_URL (le propriétaire par défaut; s'applique dès le prochain déploiement), et `canner db roles <nom> audit` indique ce que chaque rôle peut réellement faire (tables, sécurité au niveau des lignes, politiques) et ce qui semble anormal; `--strict` fait échouer une exécution CI au moindre avertissement. Il n'est pas encore possible de déplacer une base ou de changer sa version de Postgres tant qu'elle comporte des groupes ou des connexions. Tous les forfaits.canner db checkUne vérification en lecture seule de la sécurité et de la performance de n'importe quelle base de données, sur tous les forfaits. Elle lit le catalogue (jamais vos données) et énumère : les politiques de sécurité au niveau des lignes qui autorisent toutes les lignes, plusieurs politiques permissives combinées par OU, les fonctions que tout le monde peut exécuter avec les droits de leur propriétaire (SECURITY DEFINER) ou sans search_path fixe, les vues qui contournent la sécurité au niveau des lignes, les schémas où tous les rôles peuvent créer des objets, les tables sans clé primaire, les clés étrangères sans index, les index en double et les tables dont l'autovacuum est désactivé. Sur une instance dédiée, elle rapporte aussi les rôles : l'application qui se connecte avec le propriétaire, l'accès général en lecture et un registre de migrations modifiable. `--category security|performance` filtre, `--strict` termine avec le code 1 au moindre avertissement (pour l'IC) et `--json` affiche tout le résultat. La même vérification est offerte dans le tableau de bord, sur chaque base de données.canner db least-privilegeExécute l'application avec un rôle limité en une étape (instance dédiée). Crée un rôle en lecture-écriture (`--label` pour le nommer, `app` par défaut) qui peut tout lire et écrire les données mais pas modifier le schéma, garde en lecture seule tout registre de migrations connu (Prisma, Rails, Django, Flyway et autres), même celui que crée votre première migration, et l'injecte comme `DATABASE_URL`. Le propriétaire, qui peut modifier le schéma, est fourni à la commande de mise en production seulement sous `DATABASE_URL_MIGRATE` (jamais au build ni à l'application en marche) : lancez-y vos migrations. Peut être relancée sans risque. S'applique dès le prochain déploiement. `canner db roles audit` montre le résultat.canner db instance upgradeMet à niveau une instance dédiée vers une version majeure de Postgres plus récente, sur place. `canner db instance upgrade` indique ce qui l'en empêcherait; `upgrade run --yes` l'effectue (`--pg 18` précise la version). Les bases de données, rôles, privilèges, politiques et extensions sont tous conservés et les chaînes de connexion ne changent pas : rien de ce que vous avez créé avec votre propre SQL n'est à refaire. Toutes les bases de l'instance sont hors ligne quelques minutes; si la mise à niveau échoue, l'instance reste telle qu'elle était. La récupération à un instant précis repart ensuite d'une nouvelle fenêtre. La version précédente est conservée 7 jours : `upgrade rollback --yes` y revient (et perd ce qui a été écrit depuis), `upgrade finish --yes` l'abandonne.canner db instance / pitr / pitr-restore / moveCrée une instance Postgres dédiée, gère la récupération à un instant précis, récupère une base à un moment donné dans une nouvelle base, copie l'archive de récupération hors site (`canner db pitr --offsite <destination>`), ou déplace une base vers/depuis l'instance. Option payante.

Sortie JSON

Ajoutez --json à n'importe quelle commande pour une sortie lisible par machine — tableaux et progression supprimés, une seule valeur JSON imprimée, qui se branche directement dans jq ou un agent IA. Chaque commande enrobe un point de terminaison de l'API REST documentée.

canner projects --json | jq -r '.[].slug'

Lire la référence de l'API →

Ce qui est téléversé

La CLI archive le répertoire courant, exclut les fichiers de « bruit de compilation » par défaut, et envoie l'archive au même point de terminaison que le glisser-déposer du tableau de bord. La chaîne de compilation côté serveur détecte le cadre logiciel et exécute install / build / deploy, exactement comme pour un git push.

Toujours exclus : node_modules, .git, .next, .nuxt, .turbo, .vercel, .svelte-kit, .DS_Store, Thumbs.db. Ajoutez un fichier .cannerignore pour des exclusions supplémentaires.

CI / GitHub Actions

--follow termine avec le code de retour de la compilation, donc un échec de compilation fait échouer le workflow.

- uses: actions/setup-node@v4
  with: { node-version: 22 }
- run: npx @canner-ca/cli@latest deploy --follow
  env:
    CANNER_TOKEN: ${{ secrets.CANNER_TOKEN }}

Cursor / agents IA

Fonctionne dans le terminal intégré de Cursor sans extension ni serveur MCP. Les agents peuvent l'invoquer comme un outil shell :

canner deploy --follow

Limites de taille par forfait

Même plafond d'archive compressée par forfait que le téléversement du tableau de bord : Démarrage 100 Mo, Live 500 Mo. Ce qui dépasse habituellement la limite est un dossier public/ rempli de médias — déposez-le dans .cannerignore et servez-le depuis un stockage externe au besoin.

Ce qu'elle enregistre et transmet

La CLI écrit deux fichiers et rien d'autre : ~/.canner/credentials (votre jeton API, mode 0600, écrit par canner login) et canner.json dans le répertoire de votre projet (l'identifiant du projet, écrit par canner init). Elle ne modifie aucun paramètre système, profil de shell ni variable PATH. Les requêtes réseau vont uniquement vers api.canner.ca. Il n'y a aucune télémétrie, aucune analytique et aucun rapport d'erreur — la CLI n'émet aucune requête que vous n'avez pas demandée en lançant une commande.

La désinstaller

canner logout supprime le jeton enregistré sur cette machine; npm uninstall -g @canner-ca/cli retire le paquet. La déconnexion est locale seulement — le jeton reste valide, car le même jeton peut servir en CI ou sur une autre machine. Pour le révoquer partout, lancez canner token revoke, ou utilisez la page des jetons API de votre tableau de bord.

canner logout
npm uninstall -g @canner-ca/cli

L'utilisation de la CLI et du service Canner est régie par nos conditions d'utilisation et notre politique de confidentialité.

Documentation complète et code source : voir le README dans tools/cli/ du dépôt canner sur GitHub.