# 🔐 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/docker-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 # alias: /healthz ``` ### 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)" ``` --- ## 🚀 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 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 - **Docker** : DĂ©ploiement simplifiĂ© - **Traefik** : Reverse proxy HTTPS --- ## 📊 Base de DonnĂ©es ```sql 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 ); ``` **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 --- ## 🚀 DĂ©ploiement Production ### docker-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" ``` --- ## 📋 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 (alias: `/healthz`) ### Administration - `GET /admin` - Tableau de bord (restreint) - `GET /admin/docs/{docID}` - Signataires d’un document - `GET /admin/api/chain-integrity/{docID}` - 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" ``` --- ## 🔍 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)**