diff --git a/.gitignore b/.gitignore index 3bf780b..fecc461 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .idea -.env \ No newline at end of file +.env +backups/ \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 39fa2be..7f689a5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,16 @@ services: + mariadb: + image: mariadb:latest + container_name: app-mariadb + environment: + - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + - MYSQL_DATABASE=${MYSQL_DATABASE} + ports: + - "3306:3306" + volumes: + - dbdata:/var/lib/mysql + restart: unless-stopped + php: build: context: ./docker/php @@ -8,13 +20,19 @@ services: - "host.docker.internal:host-gateway" volumes: - app-code:/var/www/app - - frontend-public:/var/www/app/public environment: - GIT_TOKEN=${GIT_TOKEN} - BACKEND_GIT_REPO=${BACKEND_GIT_REPO} - BACKEND_GIT_BRANCH=${BACKEND_GIT_BRANCH} depends_on: - mariadb + restart: unless-stopped + healthcheck: + test: [ "CMD-SHELL", "test -d /var/www/app/vendor && pidof php-fpm || exit 1" ] + interval: 5s + timeout: 3s + retries: 20 + start_period: 120s frontend: build: @@ -26,14 +44,13 @@ services: - FRONTEND_GIT_REPO=${FRONTEND_GIT_REPO} - FRONTEND_GIT_BRANCH=${FRONTEND_GIT_BRANCH} volumes: - - frontend-public:/public + - app-code:/var/www/app depends_on: - php - command: [ "build" ] - + restart: "no" nginx: - image: nginx + image: nginx:alpine container_name: app-nginx volumes: - app-code:/var/www/app @@ -41,21 +58,16 @@ services: ports: - "80:80" depends_on: - - php - - mariadb: - image: mariadb:latest - environment: - - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} - - MYSQL_DATABASE=${MYSQL_DATABASE} - ports: - - "3306:3306" - volumes: - - dbdata:/var/lib/mysql + php: + condition: service_healthy + frontend: + condition: service_completed_successfully + restart: unless-stopped typesense: image: typesense/typesense:29.0 - restart: on-failure + container_name: app-typesense + restart: unless-stopped ports: - "8108:8108" volumes: @@ -69,10 +81,11 @@ services: context: ./docker/backup dockerfile: Dockerfile container_name: app-backup + environment: + - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} + - MYSQL_DATABASE=${MYSQL_DATABASE} volumes: - ./backups:/backups - depends_on: - - mariadb restart: unless-stopped reverb: @@ -80,7 +93,11 @@ services: context: ./docker/php dockerfile: Dockerfile container_name: app-reverb - entrypoint: /usr/local/bin/entrypoint.sh + environment: + - GIT_TOKEN=${GIT_TOKEN} + - BACKEND_GIT_REPO=${BACKEND_GIT_REPO} + - BACKEND_GIT_BRANCH=${BACKEND_GIT_BRANCH} + entrypoint: [] command: php artisan reverb:start --host=0.0.0.0 --port=8080 volumes: - app-code:/var/www/app @@ -89,11 +106,10 @@ services: depends_on: - php - mariadb - + restart: unless-stopped volumes: app-code: - frontend-public: dbdata: typesense-data: diff --git a/docker/backup/Dockerfile b/docker/backup/Dockerfile index f1eb474..3567702 100644 --- a/docker/backup/Dockerfile +++ b/docker/backup/Dockerfile @@ -5,10 +5,10 @@ RUN apk add --no-cache mariadb-client bash dcron RUN mkdir -p /backups RUN mkdir -p /etc/periodic/15min -COPY backup_db.sh /etc/periodic/15min/backup_db +COPY backup_db.sh /etc/periodic/daily/backup_db COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /etc/periodic/15min/backup_db +RUN chmod +x /etc/periodic/daily/backup_db RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/backup/backup_db.sh b/docker/backup/backup_db.sh index 8536db9..793c35d 100755 --- a/docker/backup/backup_db.sh +++ b/docker/backup/backup_db.sh @@ -7,9 +7,13 @@ BACKUP_DIR="/backups" mkdir -p "$BACKUP_DIR" -DAY=$(date +%d) +DAY=$(date +%d) FILE="$BACKUP_DIR/$DAY.sql" -mysqldump -h mariadb -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$FILE" +mysqldump -h mariadb -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$FILE" 2>/dev/null -echo "[$(date)] Backup $DB_NAME sauvegardé dans $FILE" >> "$BACKUP_DIR/backup.log" \ No newline at end of file +if [ $? -eq 0 ]; then + echo "[$(date)] Backup $DB_NAME sauvegardé dans $FILE" >> "$BACKUP_DIR/backup.log" +else + echo "[$(date)] ERREUR lors du backup de $DB_NAME" >> "$BACKUP_DIR/backup.log" +fi \ No newline at end of file diff --git a/docker/frontend/entrypoint.sh b/docker/frontend/entrypoint.sh index 1c33033..1efd768 100644 --- a/docker/frontend/entrypoint.sh +++ b/docker/frontend/entrypoint.sh @@ -2,14 +2,18 @@ set -e FRONTEND_DIR=/app -PUBLIC_DIR=/public APP_DIR=/var/www/app +PUBLIC_DIR="$APP_DIR/public" +GIT_URL="https://oauth2:${GIT_TOKEN}@${FRONTEND_GIT_REPO}" -GIT_URL="https://${GIT_TOKEN}@${FRONTEND_GIT_REPO}" - - -while [ ! -f "$APP_DIR/composer.json" ]; do - sleep 2 +MAX_WAIT=300 +WAITED=0 +while [ ! -f "$APP_DIR/composer.json" ] || [ ! -d "$APP_DIR/vendor" ] || [ ! -d "$APP_DIR/public" ]; do + if [ $WAITED -ge $MAX_WAIT ]; then + exit 1 + fi + sleep 3 + WAITED=$((WAITED + 3)) done @@ -17,18 +21,23 @@ if [ ! -d "$FRONTEND_DIR/.git" ]; then git clone -b "${FRONTEND_GIT_BRANCH:-main}" "$GIT_URL" "$FRONTEND_DIR" else cd "$FRONTEND_DIR" - git pull "$GIT_URL" "${FRONTEND_GIT_BRANCH:-main}" + git fetch origin + git reset --hard origin/"${FRONTEND_GIT_BRANCH:-main}" fi cd "$FRONTEND_DIR" if [ -f package.json ]; then - npm ci + npm ci --prefer-offline --no-audit fi npm run build -rm -rf "$PUBLIC_DIR/*" +if [ ! -d "dist" ]; then + exit 1 +fi + +find "$PUBLIC_DIR" -mindepth 1 ! -name '.gitkeep' ! -name 'index.php' ! -name '.htaccess' -delete cp -r dist/* "$PUBLIC_DIR/" -exec "$@" +exit 0 \ No newline at end of file diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 8e52f19..9d8f13a 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -11,5 +11,5 @@ RUN chmod +x /usr/local/bin/entrypoint.sh WORKDIR /var/www/app -ENTRYPOINT ["entrypoint.sh"] -CMD ["php-fpm"] +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["php-fpm"] \ No newline at end of file diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh index 31dce9d..eb3c64c 100644 --- a/docker/php/entrypoint.sh +++ b/docker/php/entrypoint.sh @@ -2,29 +2,36 @@ set -e APP_DIR=/var/www/app -GIT_URL="https://${GIT_TOKEN}@${BACKEND_GIT_REPO}" +GIT_URL="https://oauth2:${GIT_TOKEN}@${BACKEND_GIT_REPO}" if [ ! -d "$APP_DIR/.git" ]; then - GIT_URL="https://${GIT_TOKEN}@${BACKEND_GIT_REPO}" + git clone -b "${BACKEND_GIT_BRANCH:-main}" "$GIT_URL" "$APP_DIR" else cd "$APP_DIR" - git pull "$GIT_URL" "${BACKEND_GIT_BRANCH:-main}" + git fetch origin + git reset --hard origin/"${BACKEND_GIT_BRANCH:-main}" fi cd "$APP_DIR" if [ -f composer.json ]; then - composer install --no-interaction --prefer-dist --optimize-autoloader + composer update --no-interaction --prefer-dist --optimize-autoloader fi -if [ -d storage ] && [ -d bootstrap/cache ]; then - chown -R www-data:www-data storage bootstrap/cache +if [ ! -f .env ] && [ -f .env.example ]; then + cp .env.example .env fi -if [ -f .env ]; then - php artisan key:generate --no-interaction +if [ -f artisan ]; then + if ! grep -q "APP_KEY=base64:" .env 2>/dev/null; then + php artisan key:generate --ansi --force + fi fi php artisan migrate --force -exec "$@" +chown -R www-data:www-data storage bootstrap/cache public +chmod -R 775 storage bootstrap/cache +chmod -R 755 public + +exec "$@" \ No newline at end of file