- Rust 89.7%
- CSS 7.9%
- Jinja 2%
- HTML 0.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
- binaire statique aarch64-unknown-linux-musl lié par rust-lld - playbook : compte de service, versions dans /opt/genealogio/releases, service systemd durci, commande « sudo genealogio invite … », site nginx du domaine nu (délégation Matrix conservée, ancienne configuration sauvegardée et restaurée si nginx -t échoue) - CI sur toutes les branches du dépôt, déploiement sur main seulement - le serveur démarre sans GEDCOM et le charge dès qu'il apparaît Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
| .cargo | ||
| .forgejo/workflows | ||
| crates | ||
| data | ||
| deploy/ansible | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
| rustfmt.toml | ||
Genealogio
Site familial en lecture seule construit à partir d'un fichier GEDCOM. Le serveur est en Rust (axum), le client en Rust compilé en WebAssembly (Leptos). L'accès se fait uniquement par lien d'invitation.
Le graphe sablier est centré sur une personne : ses ascendants au-dessus, ses descendants en dessous, sa fratrie et ses conjoints sur sa ligne. Un clic sur une carte la place au centre. La disposition est calculée dans core::layout, ce qui permet de la tester en natif.
crates/core modèle, parseur GEDCOM, règles de confidentialité, formats français (natif + wasm)
crates/server API, invitations, service des fichiers du client
crates/web interface (Leptos, compilée avec trunk)
data/ exemple.ged (fictif) ; vos vrais fichiers y sont ignorés par git
Développement
cargo test -p genealogio-core # tests du cœur
cargo run -p genealogio-server -- check data/famille.ged # bilan d'un GEDCOM réel, sans rien publier
cd crates/web && trunk watch # recompile le client dans crates/web/dist
GENEALOGIO_GEDCOM=data/exemple.ged GENEALOGIO_ROOT=I14 GENEALOGIO_COOKIE_SECURE=0 \
cargo run -p genealogio-server # http://localhost:3000
cargo run -p genealogio-server -- invite "Moi" # affiche le lien à ouvrir
Confidentialité
- Une personne sans décès ni inhumation est masquée si elle a pu naître il y a moins de 100 ans. Quand elle n'a pas de date, l'estimation se fait à partir de ses parents, de ses enfants, de son conjoint et de son mariage. Si rien ne permet de conclure, elle est masquée.
RESN privacyouRESN confidentialmasque toujours la fiche.- Pour une fiche masquée, seuls le nom, l'année et le lieu de naissance quittent le serveur. Les types de
core::apine prévoient aucun autre champ, et la recherche n'indexe que ce qui est publié. - Le site envoie
noindexaux moteurs de recherche etReferrer-Policy: no-referrer. Le cookie de session estHttpOnly,SameSite=LaxetSecure.
Mise à jour
Le serveur relit le GEDCOM et invites.txt dans les 30 secondes qui suivent leur modification. Pour révoquer un accès, supprimez sa ligne dans invites.txt.
Déploiement
Chaque commit arrivé sur main (après le rebase d'une pull request) est testé, puis déployé sur la Raspberry Pi par .forgejo/workflows/ci.yml. Le job compile le serveur en binaire statique aarch64 et le site en wasm, puis lance deploy/ansible/site.yml. Le site est servi sur https://lapôtre.eu, derrière le nginx de la RPi (port local 3100).
Sur la RPi :
| Chemin | Contenu |
|---|---|
/var/lib/genealogio/famille.ged |
le GEDCOM, relu automatiquement dans les 30 s après une modification |
/var/lib/genealogio/invites.txt |
les invitations |
/etc/genealogio/env |
la configuration du service (générée par Ansible, voir group_vars/all.yml) |
/opt/genealogio/current |
la version en service ; les 3 dernières sont gardées dans releases/ |
scp famille.ged pi-local:/var/lib/genealogio/famille.ged # mettre à jour l'arbre
ssh pi-local sudo genealogio invite "Tante Marie" # créer un lien d'invitation
ssh pi-local sudo genealogio check # bilan du fichier en service
Pour déployer à la main depuis le poste : compiler (cargo build --release -p genealogio-server --target aarch64-unknown-linux-musl et trunk build --release dans crates/web), puis lancer ansible-playbook site.yml dans deploy/ansible.