diff --git a/.env.example b/.env.example index 931c944..cd0895c 100644 --- a/.env.example +++ b/.env.example @@ -7,4 +7,10 @@ GIT_TOKEN= MYSQL_ROOT_PASSWORD= MYSQL_DATABASE= -TYPESENSE_API_KEY= \ No newline at end of file +TYPESENSE_API_KEY= + +#A mettre quand vous êtes en développement pas en production +#DEV=1 + +USER_ID=1000 +GROUP_ID=1000 \ No newline at end of file diff --git a/.gitignore b/.gitignore index fecc461..2bbdd5b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea .env -backups/ \ No newline at end of file +backups/ +app-code/ \ No newline at end of file diff --git a/README.md b/README.md index 128b7c0..0365af8 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,13 @@ ## Initialisation Afin d'initialiser le projet il est requis de : -- Créer un fichier ``.env`` à la racine -- Copier coller le contenu du fichier ``.env.example`` -- Remplir les variables du fichier .env -- Pour la variable ``GIT_TOKEN`` il est nécessaire de chercher/générer son token sur gitlab dans l'onglet : ``Préférences/User settings/Personal access tokens`` -- Répéter l'opération pour le ``docker/php/.env`` et le ``docker/frontend/.env`` +- Créer un fichier ``.env`` à la racine du projet +- Copier coller le contenu du fichier ``.env.example`` dans ce ``.env`` +- Remplir les variables du fichier ``.env`` : + - ``GIT_TOKEN`` : chercher/générer son token sur gitlab dans l'onglet : ``Préférences/User settings/Personal access tokens`` (si vous devez le générer, ne pas oublier de cocher la case ``read_repository``) + - ``BACKEND_GIT_REPO`` et ``FRONTEND_GIT_REPO`` : récupérer l'adresse https des dépôts et enlever au début des liens ``https://`` +- Répéter l'opération pour le ``docker/php/.env`` avec le ``docker/php/.env.example`` +- Faire de même pour le ``docker/frontend/.env`` avec le ``docker/php/.env.example`` ## Installation Il suffit ensuite d'ouvrir un terminal, de ce placer à la racine de ce projet et d'exécuter les commandes suivantes : @@ -17,3 +19,8 @@ docker compose down -v ```bash docker compose up --build -d ``` + + +> [!NOTE] +> Si vous êtes sur Windows, changer vos caractères de contrôles de ``CRLF`` à ``LF`` (pour chaque fichier ``.sh`` du projet) + diff --git a/docker-compose.yml b/docker-compose.yml index 589633d..52467c3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,16 +15,20 @@ services: build: context: ./docker/php dockerfile: Dockerfile + args: + USER_ID: ${USER_ID:-1000} + GROUP_ID: ${GROUP_ID:-1000} container_name: app-php extra_hosts: - "host.docker.internal:host-gateway" volumes: - - app-code:/var/www/app + - ./app-code:/var/www/app${DEV:+:delegated} - ./docker/php/.env:/tmp/app.env:ro environment: - GIT_TOKEN=${GIT_TOKEN} - BACKEND_GIT_REPO=${BACKEND_GIT_REPO} - BACKEND_GIT_BRANCH=${BACKEND_GIT_BRANCH} + - DEV=${DEV} depends_on: - mariadb restart: unless-stopped @@ -45,7 +49,7 @@ services: - FRONTEND_GIT_REPO=${FRONTEND_GIT_REPO} - FRONTEND_GIT_BRANCH=${FRONTEND_GIT_BRANCH} volumes: - - app-code:/var/www/app + - ./app-code:/var/www/app${DEV:+:delegated} - ./docker/frontend/.env:/tmp/app.env:ro depends_on: php: @@ -56,7 +60,7 @@ services: image: nginx:alpine container_name: app-nginx volumes: - - app-code:/var/www/app + - ./app-code:/var/www/app${DEV:+:delegated} - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf ports: - "80:80" @@ -69,14 +73,9 @@ services: typesense: image: typesense/typesense:29.0 - container_name: app-typesense restart: unless-stopped - ports: - - "8108:8108" volumes: - typesense-data:/data - environment: - - TYPESENSE_API_KEY=${TYPESENSE_API_KEY} command: '--data-dir /data --api-key=${TYPESENSE_API_KEY} --enable-cors' backup: @@ -103,7 +102,7 @@ services: entrypoint: [] command: php artisan reverb:start --host=0.0.0.0 --port=8080 volumes: - - app-code:/var/www/app + - ./app-code:/var/www/app${DEV:+:delegated} ports: - "8080:8080" depends_on: @@ -112,7 +111,6 @@ services: restart: unless-stopped volumes: - app-code: dbdata: typesense-data: diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 9d8f13a..dcb9907 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -1,9 +1,18 @@ FROM php:8.4-fpm +ARG USER_ID=1000 +ARG GROUP_ID=1000 + RUN apt-get update && apt-get install -y \ - git unzip libzip-dev libpng-dev libonig-dev \ + git unzip libzip-dev libpng-dev libonig-dev gosu \ && docker-php-ext-install pdo_mysql zip pcntl +RUN if [ ${USER_ID:-0} -ne 0 ] && [ ${GROUP_ID:-0} -ne 0 ]; then \ + groupmod -g ${GROUP_ID} www-data && \ + usermod -u ${USER_ID} -g ${GROUP_ID} www-data \ +;fi + + COPY --from=composer:2 /usr/bin/composer /usr/bin/composer COPY entrypoint.sh /usr/local/bin/entrypoint.sh diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh index fc08e43..456de00 100644 --- a/docker/php/entrypoint.sh +++ b/docker/php/entrypoint.sh @@ -4,30 +4,38 @@ set -e APP_DIR=/var/www/app GIT_URL="https://oauth2:${GIT_TOKEN}@${BACKEND_GIT_REPO}" +# Si le dossier app-code est vide ou n'existe pas, on le prépare if [ ! -d "$APP_DIR/.git" ]; then + # Créer le dossier avec les bonnes permissions si nécessaire + mkdir -p "$APP_DIR" + + # Cloner en tant que root d'abord git clone -b "${BACKEND_GIT_BRANCH:-main}" "$GIT_URL" "$APP_DIR" + + # Puis changer TOUS les propriétaires vers www-data + chown -R www-data:www-data "$APP_DIR" else cd "$APP_DIR" - git fetch origin - git reset --hard origin/"${BACKEND_GIT_BRANCH:-main}" + # S'assurer que www-data possède le dossier avant fetch + chown -R www-data:www-data "$APP_DIR" + gosu www-data git fetch origin + gosu www-data git reset --hard origin/"${BACKEND_GIT_BRANCH:-main}" fi cd "$APP_DIR" if [ -f composer.json ]; then - composer update --no-interaction --prefer-dist --optimize-autoloader + gosu www-data composer update --no-interaction --prefer-dist --optimize-autoloader fi cp /tmp/app.env .env +chown www-data:www-data .env -php artisan key:generate --force +gosu www-data php artisan key:generate --force +gosu www-data php artisan config:clear +gosu www-data php artisan cache:clear +gosu www-data php artisan migrate --force -php artisan config:clear -php artisan cache:clear - -php artisan migrate --force - -chown -R www-data:www-data public/ storage bootstrap/cache public vendor chmod -R 775 storage bootstrap/cache chmod -R 755 public