partiduo-dist

Distribution de production de Partiduo (source du paquet FreeBSD partiduo-app)

= partiduo-dist :icons: font

Distribution de production de Partiduo : le cœur (partiduo-app), l'interface Bulma (partiduo-ui-bulma) et toutes les extensions, composés en une seule application. C'est la source du paquet FreeBSD partiduo-app (dépôt de ports aloli-ports, publié sur pkg.aloli.net).

== Programmes

[cols="1,3",options="header"] |=== |Programme |Rôle

|partiduo-server |Serveur HTTP d'une instance (réglages de production de partiduo-ui-bulma). |partiduo-manage |Ligne de commande Marten : migrate, provision, collectassets… et demo (démonstration, ci-dessous). Dans le paquet, c'est un lien vers partiduo-server, qui en prend le rôle sous ce nom : l'application n'est compilée qu'une fois (D-PKG-011 de partiduo-app). En développement, la cible partiduo-manage (manage.cr) reste disponible. |partiduo-modeles-pdf |Convertisseur PDF de l'extension MODELES, lancé par le serveur (PARTIDUO_MODELES_PDF=auto : cherché à côté de partiduo-server). |partiduo |Dossiers sur le poste de leur utilisateur, sans serveur (ci-dessous). |===

Chaque extension s'active ou non par instance (PARTIDUO_MODULES).

== Dossiers locaux, sans serveur

partiduo crée et ouvre des dossiers sur le poste de leur utilisateur (macOS, FreeBSD), pour gérer ses finances ou son entreprise sans serveur (D-LOC-001 à D-LOC-006 de partiduo-app). Il faut seulement PostgreSQL sur le poste (Postgres.app ou Homebrew sur macOS ; postgresql17-server sur FreeBSD), et les programmes de cette distribution.

[source,sh]

partiduo dossier creer famille --name "Foyer Martin" --kind household --admin-email moi@exemple.fr partiduo dossier ouvrir famille partiduo dossier liste partiduo dossier fermer famille partiduo dossier supprimer famille --confirmer famille

  • creer : base partiduo_local_<dossier> dans le PostgreSQL du poste (socket PGHOST, défaut /tmp), migrations, provisionnement, puis le lien du premier accès (mot de passe ou clé d'accès), comme pour une instance de serveur. Un échec retire la base et le répertoire.
  • ouvrir : démarre le serveur du dossier, détaché du terminal, sur http://<dossier>.partiduo.localhost:<port>/ (127.0.0.1 seulement ; ports 8400 et suivants, un par dossier), et l'ouvre dans le navigateur (--sans-navigateur sinon). Le serveur tourne jusqu'à fermer.
  • Données : PARTIDUO_HOME, sinon $XDG_DATA_HOME/partiduo, sinon ~/.local/share/partiduo ; un répertoire par dossier : dossier.env (réglages du serveur, dont sa clé secrète, 0600), media/ (pièces jointes), serveur.log.
  • Le serveur tourne en MARTEN_ENV=local (config/settings/local.cr) : comme la production (pas de débogage, clé secrète, gabarits en cache), mais en HTTP sur 127.0.0.1, sans cookies Secure ni HSTS ; les navigateurs tiennent *.localhost pour un contexte sécurisé, et les clés d'accès y fonctionnent.
  • La connexion est la même que sur un serveur : un poste partagé ne donne pas accès aux comptes.
  • Sauvegardes au format des serveurs (shard partiduo-backup, ci-dessous).

=== Sauvegardes d'un dossier local

Même format que sur les serveurs (D-LOC-006, D-CHF-013 à D-CHF-025) : fichiers age post-quantiques, capsule chiffrée pour vos clés (vous tenez ici le rôle de l'exploitant), manifeste signé par la clé du poste, stockage en écriture unique. Une sauvegarde prise ici se restaure sur un serveur, et inversement.

Une seule fois, créez votre clé, gardez-la hors de ce poste (deux copies, clé USB), et déclarez sa clé publique :

[source,sh]

age-keygen -pq | age -p > ~/partiduo-cle.age age -d ~/partiduo-cle.age | age-keygen -y | partiduo cle ajouter -

Ensuite :

[source,sh]

partiduo dossier sauvegarder famille partiduo dossier restaurer famille --cle ~/partiduo-cle.age --remplacer partiduo dossier restaurer copie --source famille --cle ~/partiduo-cle.age

  • sauvegarder : relit la sauvegarde à sa prise, puis la range dans <PARTIDUO_HOME>/sauvegardes/<poste>/<dossier>/ (--vers RÉP pour une clé USB ou un NAS) ; copiez ce répertoire ailleurs, il ne contient aucune clé en clair.
  • restaurer : la plus récente (--sauvegarde backup-… pour une autre), signature du manifeste et empreintes vérifiées, capsule ouverte par votre clé (age demande sa phrase de passe), fichiers authentifiés en entier avant le premier geste. Un dossier existant n'est remplacé qu'avec --remplacer, fermé, et après une sauvegarde de sûreté (pre-restore-…). Un nom nouveau crée un dossier, modules lus dans la base restaurée.
  • Une sauvegarde d'un serveur : --depuis son répertoire copié, --source <dossier>, --signataires les lignes allowed_signers de ses clés de signature, et une clé qui ouvre sa capsule.
  • partiduo cle liste : vos clés, et la clé de signature du poste (à déclarer dans une administration où ces sauvegardes iraient).

Programmes : ceux installés à côté de partiduo ; en développement, PARTIDUO_DIST_BIN (ex. bin/ de ce dépôt), et les fichiers statiques sont alors collectés une fois dans <PARTIDUO_HOME>/assets.

[source,sh]

SKIP_MARTEN_CLI_PRECOMPILATION=1 shards build partiduo partiduo-manage partiduo-server --no-debug PARTIDUO_DIST_BIN=$PWD/bin bin/partiduo dossier creer essai --name "Essai SARL" --admin-email moi@exemple.fr

== Deux branches, deux paquets

[cols="1,1,2",options="header"] |=== |Branche de partiduo-dist |Paquet FreeBSD |Dépôts partiduo-* suivis

|development |partiduo-app-devel |branche development |production (à créer) |partiduo-app |branche production (à créer dans chaque dépôt) |===

Les shards maison (marten, pdf, authn…) suivent leur branche production dans les deux cas. La branche production de ce dépôt ne peut être créée qu'après publication des branches production des dépôts partiduo-* : shard.lock ne peut désigner que des commits publiés.

== Versions figées

Toutes les dépendances viennent de GitHub (dépôts publics aloli-crystal sur leur branche par défaut, aloli-partiduo sur development). shard.lock, versionné, fixe le commit de chacune, sans aucune dépendance path: (l'outil shards-tuples du port les refuse) : c'est ce que le port construit. Pour monter de version, publier les dépôts concernés, puis, sans override local :

[source,sh]

rm -f shard.override.yml SKIP_MARTEN_CLI_PRECOMPILATION=1 shards update SKIP_MARTEN_CLI_PRECOMPILATION=1 shards build --release

puis committer shard.lock et régénérer la liste des sources du port (aloli-ports).

Le développement se fait dans les dépôts de chaque partie, avec leurs dépendances locales ; les dossiers de démonstration sont dans partiduo-demo (voir ci-dessous).

== Démonstration

Les dossiers de démonstration (atelier, liberal, micro, foyer) sont des fichiers de données déclaratifs versionnés dans partiduo-demo (dossiers/<code>/, format décrit par doc/format-dossiers.adoc de ce dépôt-là). La distribution les charge et les vérifie :

[cols="1,3",options="header"] |=== |Commande |Rôle

|partiduo-manage demo charger --dossier=<code> --source=<répertoire> [--reset] |Lit les fichiers du dossier et le charge par le contrat Partiduo::Api et celui des extensions (aucune insertion SQL) : provisionnement (type de dossier compris), utilisateurs, référentiel, paramètres, puis opérations datées jouées au jour le jour jusqu'au jour du chargement (horloge du dossier déplacée), et opérations de fin. --reset vide d'abord le schéma. Mots de passe de test : DEMO_PASSWORDS='adresse=mot de passe,…', ceux qui manquent sont générés et affichés.

|partiduo-manage demo verifier --dossier=<code> --source=<répertoire> [--annee=AAAA] |Compare les grands totaux du dossier chargé (balance, soldes de comptes, factures, déclarations, relevés, télédéclarations…) aux résultats attendus déclarés (attendus.yml) ; code de sortie non nul en cas d'écart.

|PARTIDUO_DEMO=1 partiduo-server |Sert un dossier déjà chargé, services externes simulés ; écrit PARTIDUO_DEMO_READY_FILE quand il est prêt, s'arrête à la création de PARTIDUO_DEMO_STOP_FILE (scripts/demo de partiduo-demo). |===

Garde-fous : la commande demo et le serveur de démonstration refusent toute base dont le nom ne contient pas « demo ». Les simulateurs des services externes (plateforme agréée d'EINV, TELEDEC, Chorus Pro, URSSAF, courriel gardé en mémoire ; src/demo/simulators.cr, doubles des specs de chaque extension) ne sont branchés qu'en mode démonstration : une instance réelle n'en utilise jamais.

=== Charger et vérifier les quatre dossiers

Il n'y a pas de CI pour cette distribution : la construction du binaire complet dépasse un exécuteur GitHub gratuit. Le chargement réel se vérifie sur le poste, et à la construction des paquets FreeBSD :

[source,sh]

SKIP_MARTEN_CLI_PRECOMPILATION=1 shards build partiduo-manage --no-debug SOURCE=../partiduo-demo/dossiers for dossier in atelier liberal micro foyer; do base="partiduo_demo_${dossier}_verif" createdb --encoding=UTF8 "$base" DATABASE_URL="postgres:///$base?host=/tmp" PARTIDUO_MEDIA_ROOT="tmp/media-$dossier"
bin/partiduo-manage demo charger --dossier="$dossier" --source="$SOURCE" && DATABASE_URL="postgres:///$base?host=/tmp"
bin/partiduo-manage demo verifier --dossier="$dossier" --source="$SOURCE" dropdb "$base" done

Chaque verifier affiche ses contrôles (ok ou ÉCART) et se termine par « N contrôles conformes ». Pour essayer les dossiers dans un navigateur : scripts/demo de partiduo-demo, qui utilise les binaires de ce dépôt (bin/, ou le répertoire PARTIDUO_DIST_BIN).

Organisation :

[source]

src/demo.cr # chargeur, vérification, simulateurs, serveur de démonstration src/demo/format.cr # structures des fichiers (format 1) src/demo/dates.cr # dates relatives (N-1-03-06, M-2-04, J+4…) src/demo/loader.cr # provisionnement, utilisateurs, référentiel, agenda src/demo/loader/ # opérations : ventes, achats, comptabilité, indépendants, extensions, foyer src/demo/verifier.cr # contrôles d'attendus.yml src/demo/command.cr # partiduo-manage demo charger|verifier src/demo/server.cr # partiduo-server avec PARTIDUO_DEMO=1

== Développement local

shard.yml et shard.lock référencent les shards maison sur GitHub (aloli-crystal/* et aloli-partiduo/*), suivis par branche. Le verrou versionné ne contient aucune dépendance path: : les ports FreeBSD et la CI l'exigent.

Pour travailler sur les copies de travail voisines (../../prod-crystal/<nom> et ../partiduo-<dépôt>), lancer :

[source,sh]

scripts/override-local.sh

Le script génère un shard.override.yml local et non versionné (ignoré par git), installe les shards, puis remet shard.lock à son état versionné. Une copie de travail absente reste prise sur GitHub.

Pour régénérer le verrou versionné, supprimer d'abord l'override local :

[source,sh]

rm -f shard.override.yml SKIP_MARTEN_CLI_PRECOMPILATION=1 shards update scripts/override-local.sh # retour au mode local

== Specs

La distribution n'a pas de CI : ses specs se lancent sur le poste, avec PostgreSQL (socket /tmp) et une base de test dont le nom contient « test ». Elles composent toute l'application (cœur, interface, toutes les extensions) ; la compilation est longue (une dizaine de minutes).

[source,sh]

createdb -h /tmp partiduo_test_dist DATABASE_URL='postgres:///partiduo_test_dist?host=/tmp' crystal spec dropdb -h /tmp partiduo_test_dist

spec/translations_spec.cr contrôle les traductions de toutes les pages dans les sept langues livrées (fr, en, nl, de, es, it, pt) : chaque route du routeur de Marten servie en GET (montages des extensions compris : une nouvelle page est couverte d'office), obtenue dans chaque langue par l'administrateur de chaque dossier de démonstration (atelier, avec en plus les extensions qu'aucun dossier n'active, micro, liberal, foyer avec PERSO ; interface simplifiée et complète), plus les pages sans connexion, le formulaire public de FORM et les pages d'erreur. Une page ne doit contenir ni « missing translation », ni clé brute (ui.…), ni interpolation non résolue (%{…}) ; une route servie en GET qu'aucun lien n'atteint fait échouer la spec, sauf exclusion motivée dans la spec. Le contrôle est celui de l'interface (lib/partiduo-ui-bulma/spec/support/translations.cr). Les dossiers sont lus dans le dépôt voisin ../partiduo-demo/dossiers, ou dans PARTIDUO_DEMO_DOSSIERS ; absents, la spec est mise en attente.

Pour ne lancer que celle-ci :

[source,sh]

DATABASE_URL='postgres:///partiduo_test_dist?host=/tmp' crystal spec spec/translations_spec.cr

Repository

partiduo-dist

Owner
Statistic
  • 0
  • 0
  • 0
  • 0
  • 20
  • 8 days ago
  • September 30, 2026
License

GNU Affero General Public License v3.0

Links
Synced at

Mon, 26 Oct 2026 14:24:24 GMT

Languages