# 🔐 Ackify > **Proof of Read. Compliance made simple.** Service sĂ©curisĂ© de validation de lecture avec traçabilitĂ© cryptographique et preuves incontestables. [![Build](https://img.shields.io/badge/build-passing-brightgreen.svg)](https://github.com/btouchard/ackify-ce) [![Security](https://img.shields.io/badge/crypto-Ed25519-blue.svg)](https://en.wikipedia.org/wiki/EdDSA) [![Go](https://img.shields.io/badge/go-1.24.5-blue.svg)](https://golang.org/) [![License](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE) > 🌍 [English version available here](README.md) ### Visitez notre site : https://www.ackify.eu/fr ## 🎯 Pourquoi Ackify ? **ProblĂšme** : Comment prouver qu'un collaborateur a bien lu et compris un document important ? **Solution** : Signatures cryptographiques Ed25519 avec horodatage immutable et traçabilitĂ© complĂšte. ### Cas d'usage concrets - ✅ Validation de politiques de sĂ©curitĂ© - ✅ Attestations de formation obligatoire - ✅ Prise de connaissance RGPD - ✅ AccusĂ©s de rĂ©ception contractuels - ✅ ProcĂ©dures qualitĂ© et compliance --- ## 📾 VidĂ©os Cliquez sur les GIFs pour ouvrir les vidĂ©os WebM dans votre navigateur.
1) CrĂ©ation d’une signature
Initialisation d’une signature
2) Parcours de signature utilisateur
Parcours de signature utilisateur
## 📾 Captures d'Ă©cran
Page d'accueil
Page d'accueil
Demande de signature
Demande de signature
Signature confirmée
Signature confirmée
Liste des signatures
Liste des signatures
Intégration Outline
Intégration Outline
Intégration Google Docs
Intégration Google Docs
--- ## ⚡ DĂ©marrage Rapide ### Avec Docker (recommandĂ©) ```bash # Installation automatique curl -fsSL https://raw.githubusercontent.com/btouchard/ackify/main/install/install.sh | bash # Ou tĂ©lĂ©chargement manuel curl -O https://raw.githubusercontent.com/btouchard/ackify/main/install/compose.yml curl -O https://raw.githubusercontent.com/btouchard/ackify/main/install/.env.example # Configuration cp .env.example .env # Éditez .env avec vos paramĂštres OAuth2 # GĂ©nĂ©ration des secrets export ACKIFY_OAUTH_COOKIE_SECRET=$(openssl rand -base64 32) export ACKIFY_ED25519_PRIVATE_KEY=$(openssl rand 64 | base64 -w 0) # DĂ©marrage docker compose up -d # Test curl http://localhost:8080/health ``` ### Variables obligatoires ```bash ACKIFY_BASE_URL="https://votre-domaine.com" ACKIFY_OAUTH_CLIENT_ID="your-oauth-client-id" # Google/GitHub/GitLab ACKIFY_OAUTH_CLIENT_SECRET="your-oauth-client-secret" ACKIFY_DB_DSN="postgres://user:password@localhost/ackify?sslmode=disable" ACKIFY_OAUTH_COOKIE_SECRET="$(openssl rand -base64 32)" ``` ### Optionnel : Notifications email (SMTP) ```bash ACKIFY_MAIL_HOST="smtp.gmail.com" # Serveur SMTP ACKIFY_MAIL_PORT="587" # Port SMTP (dĂ©faut: 587) ACKIFY_MAIL_USERNAME="votre-email@gmail.com" # Identifiant SMTP ACKIFY_MAIL_PASSWORD="votre-app-password" # Mot de passe SMTP ACKIFY_MAIL_FROM="noreply@entreprise.com" # Adresse expĂ©diteur ACKIFY_MAIL_FROM_NAME="Ackify" # Nom expĂ©diteur # Si ACKIFY_MAIL_HOST n'est pas dĂ©fini, le service email est dĂ©sactivĂ© (pas d'erreur) ``` --- ## 🚀 Utilisation Simple ### 1. Demander une signature ``` https://votre-domaine.com/sign?doc=procedure_securite_2025 ``` → L'utilisateur s'authentifie via OAuth2 et valide sa lecture ### 2. VĂ©rifier les signatures ```bash # API JSON - Liste complĂšte curl "https://votre-domaine.com/status?doc=procedure_securite_2025" # Badge PNG - Statut individuel curl "https://votre-domaine.com/status.png?doc=procedure_securite_2025&user=jean.dupont@entreprise.com" ``` ### 3. IntĂ©grer dans vos pages ```html ``` --- ## 🔧 Configuration OAuth2 ### Providers supportĂ©s | Provider | Configuration | |----------|---------------| | **Google** | `ACKIFY_OAUTH_PROVIDER=google` | | **GitHub** | `ACKIFY_OAUTH_PROVIDER=github` | | **GitLab** | `ACKIFY_OAUTH_PROVIDER=gitlab` + `ACKIFY_OAUTH_GITLAB_URL` | | **Custom** | Endpoints personnalisĂ©s | ### Provider personnalisĂ© ```bash # Laissez ACKIFY_OAUTH_PROVIDER vide ACKIFY_OAUTH_AUTH_URL="https://auth.company.com/oauth/authorize" ACKIFY_OAUTH_TOKEN_URL="https://auth.company.com/oauth/token" ACKIFY_OAUTH_USERINFO_URL="https://auth.company.com/api/user" ACKIFY_OAUTH_SCOPES="read:user,user:email" ``` ### Restriction par domaine ```bash ACKIFY_OAUTH_ALLOWED_DOMAIN="@entreprise.com" # Seuls les emails @entreprise.com ``` ### Log level setup ```bash ACKIFY_LOG_LEVEL="info" # can be debug, info, warn(ing), error. default: info ``` --- ## đŸ›Ąïž SĂ©curitĂ© & Architecture ### SĂ©curitĂ© cryptographique - **Ed25519** : Signatures numĂ©riques de pointe - **SHA-256** : Hachage des payloads contre le tampering - **Horodatage immutable** : Triggers PostgreSQL - **Sessions chiffrĂ©es** : Cookies sĂ©curisĂ©s - **CSP headers** : Protection XSS ### Architecture Go ``` cmd/ackapp/ # Point d'entrĂ©e internal/ domain/ # Logique mĂ©tier models/ # EntitĂ©s repositories/ # Interfaces persistance application/ # Use cases services/ # ImplĂ©mentations mĂ©tier infrastructure/ # Adaptateurs auth/ # OAuth2 database/ # PostgreSQL email/ # Service SMTP config/ # Configuration presentation/ # HTTP handlers/ # ContrĂŽleurs + interfaces templates/ # Vues HTML pkg/ # Utilitaires partagĂ©s ``` ### Stack technique - **Go 1.24.5** : Performance et simplicitĂ© - **PostgreSQL** : Contraintes d'intĂ©gritĂ© - **OAuth2** : Multi-providers - **SMTP** : Rappels de signature par email (optionnel) - **Docker** : DĂ©ploiement simplifiĂ© - **Traefik** : Reverse proxy HTTPS --- ## 📊 Base de DonnĂ©es ```sql -- Table principale des signatures CREATE TABLE signatures ( id BIGSERIAL PRIMARY KEY, doc_id TEXT NOT NULL, -- ID document user_sub TEXT NOT NULL, -- ID OAuth utilisateur user_email TEXT NOT NULL, -- Email utilisateur signed_at TIMESTAMPTZ NOT NULL, -- Timestamp signature payload_hash TEXT NOT NULL, -- Hash cryptographique signature TEXT NOT NULL, -- Signature Ed25519 nonce TEXT NOT NULL, -- Anti-replay created_at TIMESTAMPTZ DEFAULT now(), -- Immutable referer TEXT, -- Source (optionnel) prev_hash TEXT, -- Prev Hash UNIQUE (doc_id, user_sub) -- Une signature par user/doc ); -- Table des signataires attendus (pour le suivi) CREATE TABLE expected_signers ( id BIGSERIAL PRIMARY KEY, doc_id TEXT NOT NULL, email TEXT NOT NULL, added_at TIMESTAMPTZ NOT NULL DEFAULT now(), added_by TEXT NOT NULL, -- Admin qui a ajoutĂ© notes TEXT, UNIQUE (doc_id, email) -- Une attente par email/doc ); ``` **Garanties** : - ✅ **UnicitĂ©** : Un utilisateur = une signature par document - ✅ **ImmutabilitĂ©** : `created_at` protĂ©gĂ© par trigger - ✅ **IntĂ©gritĂ©** : Hachage SHA-256 pour dĂ©tecter modifications - ✅ **Non-rĂ©pudiation** : Signature Ed25519 cryptographiquement prouvable - ✅ **Suivi** : Signataires attendus pour monitoring de complĂ©tion --- ## 🚀 DĂ©ploiement Production ### compose.yml ```yaml version: '3.8' services: ackapp: image: btouchard/ackify-ce:latest environment: ACKIFY_BASE_URL: https://ackify.company.com ACKIFY_DB_DSN: postgres://user:pass@postgres:5432/ackdb?sslmode=require ACKIFY_OAUTH_CLIENT_ID: ${ACKIFY_OAUTH_CLIENT_ID} ACKIFY_OAUTH_CLIENT_SECRET: ${ACKIFY_OAUTH_CLIENT_SECRET} ACKIFY_OAUTH_COOKIE_SECRET: ${ACKIFY_OAUTH_COOKIE_SECRET} labels: - "traefik.enable=true" - "traefik.http.routers.ackify.rule=Host(`ackify.company.com`)" - "traefik.http.routers.ackify.tls.certresolver=letsencrypt" postgres: image: postgres:15-alpine environment: POSTGRES_DB: ackdb POSTGRES_USER: ackuser POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data ``` ### Variables production ```bash # SĂ©curitĂ© renforcĂ©e ACKIFY_OAUTH_COOKIE_SECRET="$(openssl rand 64 | base64 -w 0)" ACKIFY_ED25519_PRIVATE_KEY="$(openssl rand 64 | base64 -w 0)" # HTTPS obligatoire ACKIFY_BASE_URL="https://ackify.company.com" # PostgreSQL sĂ©curisĂ© ACKIFY_DB_DSN="postgres://user:pass@postgres:5432/ackdb?sslmode=require" # Optionnel : SMTP pour rappels de signature ACKIFY_MAIL_HOST="smtp.entreprise.com" ACKIFY_MAIL_FROM="noreply@entreprise.com" ACKIFY_MAIL_USERNAME="${SMTP_USERNAME}" ACKIFY_MAIL_PASSWORD="${SMTP_PASSWORD}" ``` --- ## 📋 API ComplĂšte ### Authentification - `GET /login?next=` - Connexion OAuth2 - `GET /logout` - DĂ©connexion - `GET /oauth2/callback` - Callback OAuth2 ### Signatures - `GET /sign?doc=` - Interface de signature - `POST /sign` - CrĂ©er signature - `GET /signatures` - Mes signatures (auth requis) ### Consultation - `GET /status?doc=` - JSON toutes signatures - `GET /status.png?doc=&user=` - Badge PNG ### IntĂ©gration - `GET /oembed?url=` - MĂ©tadonnĂ©es oEmbed - `GET /embed?doc=` - Widget HTML ### Supervision - `GET /health` - Health check ### Administration - `GET /admin` - Tableau de bord (restreint) - `GET /admin/docs/{docID}` - DĂ©tails du document avec gestion des signataires attendus - `POST /admin/docs/{docID}/expected` - Ajouter des signataires attendus - `POST /admin/docs/{docID}/expected/remove` - Retirer un signataire attendu - `GET /admin/docs/{docID}/status.json` - Statut du document en JSON (AJAX) - `GET /admin/api/chain-integrity/{docID}` - VĂ©rification d'intĂ©gritĂ© de chaĂźne (JSON) ContrĂŽle d'accĂšs: dĂ©finir `ACKIFY_ADMIN_EMAILS` avec des emails admins, sĂ©parĂ©s par des virgules (correspondance exacte, insensible Ă  la casse). Exemple: ```bash ACKIFY_ADMIN_EMAILS="alice@entreprise.com,bob@entreprise.com" ``` #### FonctionnalitĂ© Signataires Attendus Les administrateurs peuvent dĂ©finir et suivre les signataires attendus pour chaque document : - **Ajouter des signataires** : Coller des emails sĂ©parĂ©s par des sauts de ligne, virgules ou point-virgules - **Suivre la complĂ©tion** : Barre de progression visuelle avec pourcentage - **Monitorer le statut** : Voir qui a signĂ© (✓) vs. qui est en attente (⏳) - **DĂ©tecter les signatures inattendues** : Identifier les utilisateurs qui ont signĂ© sans ĂȘtre attendus - **Partage facile** : Copie en un clic du lien de signature du document - **Gestion en masse** : Ajouter/retirer des signataires individuellement ou en lot --- ## 🔍 DĂ©veloppement & Tests ### Build local ```bash # DĂ©pendances go mod tidy # Build go build ./cmd/community # Linting go fmt ./... go vet ./... # Tests (TODO: ajouter des tests) go test -v ./... ``` ### Docker development ```bash # Build image docker build -t ackify-ce:dev . # Run avec base locale docker run -p 8080:8080 --env-file .env ackify:dev ``` --- ## đŸ€ Support ### Aide & Documentation - 🐛 **Issues** : [GitHub Issues](https://github.com/btouchard/ackify-ce/issues) - 💬 **Discussions** : [GitHub Discussions](https://github.com/btouchard/ackify-ce/discussions) ### Licence AGPLv3 DistribuĂ© sous la licence GNU Affero General Public License v3.0. Voir [LICENSE](LICENSE) pour plus de dĂ©tails. --- **DĂ©veloppĂ© avec ❀ par [Benjamin TOUCHARD](https://www.kolapsis.com)**