diff --git a/.dockerignore b/.dockerignore index daf40bf..7738166 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,5 @@ Dockerfile +Dockerfile.android .dockerignore node_modules npm-debug.log @@ -12,4 +13,9 @@ README.md *.md .vscode .idea +android +ios +dist +*.log +.DS_Store diff --git a/BUILD_APK.md b/BUILD_APK.md new file mode 100644 index 0000000..b1128e3 --- /dev/null +++ b/BUILD_APK.md @@ -0,0 +1,154 @@ +# Guide de build APK avec Docker + +Ce guide explique comment générer un APK Android pour l'application Compagnon Admin en utilisant Docker. + +## Prérequis + +- Docker installé +- docker-compose installé +- Au moins 10 Go d'espace disque libre (pour le SDK Android) + +## Étapes de build + +### 1. Build initial (première fois) + +Cette étape construit l'image Docker, installe Capacitor, et prépare le projet Android : + +```bash +./scripts/build-apk.sh +``` + +Cette commande va : +- Construire l'image Docker avec Android SDK +- Installer les dépendances Capacitor +- Build l'application Next.js en production +- Initialiser Capacitor (si nécessaire) +- Ajouter la plateforme Android +- Synchroniser les fichiers + +**Durée estimée :** 15-30 minutes (première fois, à cause du téléchargement du SDK Android) + +### 2. Générer l'APK + +Une fois le build initial terminé, générez l'APK : + +```bash +./scripts/generate-apk.sh +``` + +L'APK sera généré dans `dist/compagnon-admin-debug.apk` + +**Durée estimée :** 5-10 minutes + +## Utilisation manuelle + +Si vous préférez exécuter les commandes manuellement : + +### Entrer dans le conteneur Docker + +```bash +docker-compose -f docker-compose.build.yml run --rm android-builder /bin/bash +``` + +### Commandes dans le conteneur + +```bash +# Installer Capacitor (si pas déjà fait) +npm install @capacitor/core @capacitor/cli @capacitor/android + +# Build Next.js +npm run build + +# Initialiser Capacitor (première fois seulement) +npx cap init 'Compagnon Admin' com.pensionmarama.admin --web-dir=.next + +# Ajouter Android +npx cap add android + +# Synchroniser +npx cap sync android + +# Générer l'APK +cd android +./gradlew assembleDebug +``` + +L'APK sera dans : `android/app/build/outputs/apk/debug/app-debug.apk` + +## Structure des fichiers + +- `Dockerfile.android` : Image Docker avec Android SDK +- `docker-compose.build.yml` : Configuration Docker Compose pour le build +- `scripts/build-apk.sh` : Script automatisé pour le build initial +- `scripts/generate-apk.sh` : Script automatisé pour générer l'APK +- `capacitor.config.ts` : Configuration Capacitor + +## Volumes Docker + +Les volumes suivants sont créés pour optimiser les builds suivants : +- `android-sdk-cache` : Cache du SDK Android +- `gradle-cache` : Cache Gradle +- `node-modules` : Modules Node.js + +## Dépannage + +### Erreur : "SDK not found" + +Vérifiez que les licences Android sont acceptées dans le conteneur : +```bash +docker-compose -f docker-compose.build.yml run --rm android-builder sdkmanager --licenses +``` + +### Erreur : "Gradle build failed" + +Vérifiez les logs dans le conteneur : +```bash +docker-compose -f docker-compose.build.yml run --rm android-builder /bin/bash +cd android +./gradlew assembleDebug --stacktrace +``` + +### Nettoyer et recommencer + +```bash +# Supprimer les volumes +docker-compose -f docker-compose.build.yml down -v + +# Reconstruire l'image +docker-compose -f docker-compose.build.yml build --no-cache +``` + +## Distribution de l'APK + +L'APK généré (`dist/compagnon-admin-debug.apk`) peut être distribué directement à vos bêta-testeurs. + +**Note importante :** C'est un APK de debug. Pour une version de production, vous devrez : +1. Créer un keystore +2. Configurer la signature dans `capacitor.config.ts` +3. Générer un APK release avec `./gradlew assembleRelease` + +## Limitations avec les API Routes + +⚠️ **Attention :** Avec `output: 'export'` dans Next.js, les API routes (`/api/*`) ne fonctionneront pas car elles nécessitent un serveur Node.js. + +Pour que l'application admin fonctionne complètement dans l'APK, vous avez deux options : + +### Option 1 : Héberger les API routes séparément + +Déployez les API routes sur un serveur (Vercel, Railway, etc.) et modifiez les appels API dans l'application pour pointer vers cette URL. + +### Option 2 : Utiliser un serveur embarqué (avancé) + +Intégrer un serveur Node.js dans l'APK (plus complexe, nécessite des modifications supplémentaires). + +### Option 3 : Version statique sans API routes + +Créer une version simplifiée de l'admin qui utilise uniquement le localStorage (limité aux fonctionnalités de base). + +## Support + +En cas de problème, vérifiez : +- Les logs Docker : `docker-compose -f docker-compose.build.yml logs` +- L'espace disque disponible +- La version de Docker (minimum 20.10) + diff --git a/Dockerfile.android b/Dockerfile.android new file mode 100644 index 0000000..a53de8a --- /dev/null +++ b/Dockerfile.android @@ -0,0 +1,48 @@ +FROM node:20-slim + +# Installer les dépendances système nécessaires +RUN apt-get update && apt-get install -y \ + openjdk-17-jdk \ + wget \ + unzip \ + git \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Variables d'environnement Android +ENV ANDROID_HOME=/opt/android-sdk +ENV PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/cmdline-tools/latest/bin + +# Installer Android SDK +RUN mkdir -p ${ANDROID_HOME}/cmdline-tools && \ + cd ${ANDROID_HOME}/cmdline-tools && \ + wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip && \ + unzip commandlinetools-linux-9477386_latest.zip && \ + mv cmdline-tools latest && \ + rm commandlinetools-linux-9477386_latest.zip + +# Accepter les licences et installer les composants nécessaires +RUN yes | sdkmanager --licenses || true && \ + sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" "cmdline-tools;latest" + +# Installer Capacitor CLI globalement +RUN npm install -g @capacitor/cli + +# Définir le répertoire de travail +WORKDIR /app + +# Copier les fichiers de dépendances +COPY package*.json ./ + +# Installer les dépendances Node.js +RUN npm install + +# Copier le reste du code +COPY . . + +# Exposer le port pour le serveur de dev (optionnel) +EXPOSE 3000 + +# Commande par défaut +CMD ["/bin/bash"] + diff --git a/capacitor.config.ts b/capacitor.config.ts new file mode 100644 index 0000000..08b07a2 --- /dev/null +++ b/capacitor.config.ts @@ -0,0 +1,24 @@ +import { CapacitorConfig } from '@capacitor/cli'; + +const config: CapacitorConfig = { + appId: 'com.pensionmarama.admin', + appName: 'Compagnon Admin', + webDir: 'out', + server: { + androidScheme: 'https', + // Pour le développement, vous pouvez utiliser localhost + // url: 'http://localhost:3000', + // cleartext: true + }, + android: { + buildOptions: { + keystorePath: undefined, + keystorePassword: undefined, + keystoreAlias: undefined, + keystoreAliasPassword: undefined + } + } +}; + +export default config; + diff --git a/docker-compose.build.yml b/docker-compose.build.yml new file mode 100644 index 0000000..4bca3af --- /dev/null +++ b/docker-compose.build.yml @@ -0,0 +1,30 @@ +version: '3.8' + +services: + android-builder: + build: + context: . + dockerfile: Dockerfile.android + volumes: + - .:/app + - android-sdk-cache:/opt/android-sdk + - gradle-cache:/root/.gradle + - node-modules:/app/node_modules + environment: + - NODE_ENV=production + working_dir: /app + command: /bin/bash + stdin_open: true + tty: true + networks: + - build-network + +volumes: + android-sdk-cache: + gradle-cache: + node-modules: + +networks: + build-network: + driver: bridge + diff --git a/scripts/build-apk.sh b/scripts/build-apk.sh new file mode 100755 index 0000000..b443171 --- /dev/null +++ b/scripts/build-apk.sh @@ -0,0 +1,67 @@ +#!/bin/bash + +set -e + +echo "🚀 Démarrage du build APK..." + +# Vérifier que Docker est installé +if ! command -v docker &> /dev/null; then + echo "❌ Docker n'est pas installé. Veuillez l'installer d'abord." + exit 1 +fi + +# Vérifier que docker-compose est installé +if ! command -v docker-compose &> /dev/null; then + echo "❌ docker-compose n'est pas installé. Veuillez l'installer d'abord." + exit 1 +fi + +# Construire l'image Docker +echo "📦 Construction de l'image Docker..." +docker-compose -f docker-compose.build.yml build + +# Démarrer le conteneur et exécuter les commandes de build +echo "🔨 Build de l'application Next.js..." +docker-compose -f docker-compose.build.yml run --rm android-builder sh -c " + echo '📦 Installation des dépendances Capacitor...' && + npm install @capacitor/core @capacitor/cli @capacitor/android && + + echo '⚙️ Sauvegarde de la configuration Next.js...' && + cp next.config.js next.config.js.backup && + + echo '⚙️ Configuration Next.js pour export statique...' && + if grep -q '\"output\": \"standalone\"' next.config.js; then + sed -i 's/\"output\": \"standalone\"/\"output\": \"export\"/' next.config.js + echo '✅ Configuration modifiée pour export statique' + fi && + + echo '🏗️ Build de production Next.js...' && + npm run build && + + echo '⚙️ Restauration de la configuration Next.js...' && + mv next.config.js.backup next.config.js && + + echo '⚙️ Initialisation Capacitor (si nécessaire)...' && + if [ ! -f capacitor.config.ts ]; then + npx cap init 'Compagnon Admin' com.pensionmarama.admin --web-dir=out + fi && + + echo '📱 Ajout de la plateforme Android...' && + npx cap add android || true && + + echo '🔄 Synchronisation Capacitor...' && + npx cap sync android && + + echo '✅ Build terminé !' +" + +echo "📱 Ouverture du projet Android dans le conteneur..." +echo "Pour générer l'APK, exécutez dans le conteneur :" +echo " cd android && ./gradlew assembleDebug" +echo "" +echo "Ou utilisez Android Studio :" +echo " npx cap open android" +echo "" +echo "Pour entrer dans le conteneur :" +echo " docker-compose -f docker-compose.build.yml run --rm android-builder /bin/bash" + diff --git a/scripts/generate-apk.sh b/scripts/generate-apk.sh new file mode 100755 index 0000000..f69e111 --- /dev/null +++ b/scripts/generate-apk.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +set -e + +echo "🚀 Génération de l'APK..." + +# Vérifier que le build Android existe +if [ ! -d "android" ]; then + echo "❌ Le répertoire android n'existe pas. Exécutez d'abord ./scripts/build-apk.sh" + exit 1 +fi + +# Générer l'APK dans le conteneur +docker-compose -f docker-compose.build.yml run --rm android-builder sh -c " + cd android && + ./gradlew assembleDebug +" + +# Copier l'APK généré +if [ -f "android/app/build/outputs/apk/debug/app-debug.apk" ]; then + mkdir -p dist + cp android/app/build/outputs/apk/debug/app-debug.apk dist/compagnon-admin-debug.apk + echo "✅ APK généré : dist/compagnon-admin-debug.apk" +else + echo "❌ L'APK n'a pas été généré. Vérifiez les erreurs ci-dessus." + exit 1 +fi +