commit 366964345262b6f94526ae522c05814241cdbfed Author: greg Date: Mon Apr 14 21:31:26 2025 +0200 push diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..991c08c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y --no-install-recommends \ + gnupg \ + dpkg-dev \ + curl \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /workspace + +COPY app/. . + +RUN pip install --no-cache-dir gunicorn flask + +RUN chmod +x entrypoint.sh + +EXPOSE 8000 + +CMD ["./entrypoint.sh"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cbca380 --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +# APT DEPOT + +Créer un dépôt Debian sécurisé via clé GPG pour héberger des paquets + +## CONFIGURATION + +- Editer le fichier `app/entrypoint.sh` +```sh +GPG_KEY_NAME="example" +... +EMAIL="test@exemple.com" +``` + +- Changer le port `- 8000:` dans le `compose.yml` si besoin + +- Metre les paquets dans le dossier `depot/` + +## UTILISATION + +- Démarrer le conteneur +```bash +docker compose up -d +``` + +Note: La première fois, il génère les clés GPG + +:bulb: **A chaque ajout de paquet, redémarrer le conteneur pour qu'il resigne les paquets avec la clé GPG** + +#### Utiliser le dépôt pour installer des paquets + +- Ajouter la clé du dépôt ainsi que l'adresse dans les sources: +```bash +sudo wget -O /etc/apt/trusted.gpg.d/gn-depot.asc https://deb.legaragenumerique.fr/pgp-key.public + +echo 'deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/gn-depot.asc] https://deb.legaragenumerique.fr stable main' \ + | sudo tee /etc/apt/sources.list.d/gn-depot.list +``` + +- Mettre à jour les dépôts: +```bash +sudo apt update +``` + +- Installer un paquet: +```bash +sudo apt install geo -y +``` + +#### Création d'un paquet + +- Structure d'un paquet Debian: +``` +paquet/ + ├── DEBIAN + │ ├── control -> description du paquet + │ ├── postinst -> script s'éxécutant après l'installation du paquet + │ └── prerm -> script s'éxécutant avant la désinstallation du paquet + └── usr + ├── bin + │ └── mon-binaire + └── share + └── applications + └── application.desktop +``` + +- Builder le paquet: +```bash +dpkg-deb --build paquet +``` + +> Output: paquet.deb + +#### Ajout d'un paquet au dépôt + +- Renommer le paquet: +```bash +mv geo.deb geo_amd64.deb +``` + +- Placer le paquet dans le dossier `depot/`: +```bash +mv geo_amd64.deb depot/ +``` + +- Redémarrer le conteneur: +```bash +docker compose down -v && docker compose up -d +``` \ No newline at end of file diff --git a/app/entrypoint.sh b/app/entrypoint.sh new file mode 100644 index 0000000..7c60901 --- /dev/null +++ b/app/entrypoint.sh @@ -0,0 +1,68 @@ +#!/bin/bash +set -e + +# Configuration +GPG_KEY_NAME="example" +KEY_PUBLIC="/workspace/apt-repo/pgp-key.public" +KEY_PRIVATE="/workspace/secret/pgp-key.private" +EMAIL="test@exemple.com" + +echo "📦 Création du dépôt APT" +mkdir -p ./apt-repo/pool/main/binary-amd64 +mkdir -p ./apt-repo/dists/stable/main/binary-amd64 + +# Génération des clés seulement si elles n'existent pas +make_keys() { + echo "🔐 Génération des clés GPG" + cat > example-pgp-key.batch < "$KEY_PUBLIC" + gpg --armor --export-secret-keys "$GPG_KEY_NAME" > "$KEY_PRIVATE" + chmod 600 $KEY_PRIVATE + cp "$KEY_PUBLIC" ./apt-repo/pgp-key.public +} + +sign_packages() { + cd ./apt-repo + dpkg-scanpackages --arch amd64 pool/ > dists/stable/main/binary-amd64/Packages + gzip -9 < dists/stable/main/binary-amd64/Packages > dists/stable/main/binary-amd64/Packages.gz + + cd dists/stable + gpg --import /workspace/secret/pgp-key.private + + echo "⚙️ Génération de Release" + /workspace/generate-release.sh > Release + + echo "🔏 Signature du Release" + gpg --default-key "$GPG_KEY_NAME" -abs < Release > Release.gpg + gpg --default-key "$GPG_KEY_NAME" --clearsign < Release > InRelease +} + +if [ ! -f "$KEY_PUBLIC" ]; then + make_keys +else + echo "✅ Clés GPG déjà présentes, génération ignorée" +fi + +echo "🚚 Copie des paquets" +cp ./depot/* ./apt-repo/pool/main/binary-amd64/ || true + +sign_packages + +# Lancement serveur +echo "🚀 Lancement du serveur Gunicorn" +cd /workspace +cp index.html logo.png apt-repo/ +gunicorn -b 0.0.0.0:8000 server:app +echo "📡 Dépôt APT disponible sur https://votre-domaine.tld" +echo "🔑 Clé publique disponible sur https://votre-domaine.tld/pgp-key.public" diff --git a/app/generate-release.sh b/app/generate-release.sh new file mode 100755 index 0000000..a1936e8 --- /dev/null +++ b/app/generate-release.sh @@ -0,0 +1,31 @@ +#!/bin/sh +set -e + +do_hash() { + HASH_NAME=$1 + HASH_CMD=$2 + echo "${HASH_NAME}:" + for f in $(find -type f); do + f=$(echo $f | cut -c3-) # remove ./ prefix + if [ "$f" = "Release" ]; then + continue + fi + echo " $(${HASH_CMD} ${f} | cut -d" " -f1) $(wc -c $f)" + done +} + +cat << EOF +Origin: Example Repository +Label: Example +Suite: stable +Codename: stable +Version: 1.0 +Architectures: amd64 arm64 arm7 +Components: main +Description: An example software repository +Date: $(date -Ru) +EOF +do_hash "MD5Sum" "md5sum" +do_hash "SHA1" "sha1sum" +do_hash "SHA256" "sha256sum" + diff --git a/app/index.html b/app/index.html new file mode 100644 index 0000000..b1b1c49 --- /dev/null +++ b/app/index.html @@ -0,0 +1,63 @@ + + + + + + Dépôt APT - Le Garage Numérique + + + +
+ + +

Bienvenue sur le dépôt APT du Garage Numérique

+

Ce dépôt vous permet d’installer facilement les paquets maintenus par Le Garage Numérique sur les distributions basées sur Debian.

+ +

Instructions d'utilisation :

+

1. Ajouter la clé publique du dépôt :

+
sudo wget -O /etc/apt/trusted.gpg.d/gn-depot.asc https://deb.legaragenumerique.fr/pgp-key.public
+ +

2. Ajouter la source du dépôt :

+
echo 'deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/gn-depot.asc] https://deb.legaragenumerique.fr stable main' \
+| sudo tee /etc/apt/sources.list.d/gn-depot.list
+ +

3. Mettre à jour les paquets :

+
sudo apt update
+ +

4. Installer le paquet souhaité (ex. geo) :

+
sudo apt install geo
+ +

Et voilà 🎉 Vous êtes prêt à utiliser notre dépôt !

+
+ + diff --git a/app/logo.png b/app/logo.png new file mode 100644 index 0000000..f9bba13 Binary files /dev/null and b/app/logo.png differ diff --git a/app/server.py b/app/server.py new file mode 100644 index 0000000..747e78c --- /dev/null +++ b/app/server.py @@ -0,0 +1,17 @@ +from flask import Flask, send_from_directory +import os + +app = Flask(__name__) +REPO_DIR = "/workspace/apt-repo" + +@app.route('/') +def serve_file(path): + return send_from_directory(REPO_DIR, path) + +@app.route('/') +def index(): + return send_from_directory(REPO_DIR, 'index.html') if os.path.exists(os.path.join(REPO_DIR, 'index.html')) else 'APT Repo server is running!' + +@app.route('/pgp-key.public') +def serve_public_key(): + return send_from_directory('/workspace/depot', 'pgp-key.public') diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..9f154df --- /dev/null +++ b/compose.yml @@ -0,0 +1,10 @@ +services: + depot-apt: + container_name: depot-apt + build: . + restart: always + volumes: + - ./depot:/workspace/depot + - ./secret:/workspace/secret + ports: + - "8000:8000"