diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 7b60560..d710e64 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,8 +5,9 @@ - + + diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 98357f4..169183f 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -1,4 +1,4 @@ -# Déploiement Ferme (recette) +# Déploiement Ferme (release Gitea) ## 1) Premier déploiement @@ -17,19 +17,7 @@ php8.4-mbstring php8.4-xml php8.4-curl php8.4-intl \ php8.4-zip php8.4-gd php8.4-pgsql php8.4-opcache ``` -3. Installer Composer - ```bash - php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" - sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer - rm composer-setup.php - ``` -4. Installer Node via NVM - ```bash - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash - source ~/.bashrc - nvm install --lts - ``` -5. Installer PostgreSQL (si la DB est locale) +3. Installer PostgreSQL (si la DB est locale) ```bash sudo apt install -y postgresql postgresql-contrib sudo -u postgres psql @@ -41,15 +29,14 @@ \q ``` -### Déploiement applicatif -1. Cloner le repo +### Dossier de déploiement +1. Créer le dossier de déploiement ```bash - sudo mkdir -p /var/www - sudo git clone /var/www/ferme + sudo mkdir -p /var/www/ferme sudo chown -R malio:malio /var/www/ferme ``` -2. Variables d’environnement - - Backend : `/var/www/ferme/.env.local` +2. Créer le fichier d’environnement + - Backend : `/var/www/ferme/.env` - `APP_ENV=prod` - `APP_DEBUG=0` - `APP_SECRET=...` @@ -59,45 +46,34 @@ - `JWT_PASSPHRASE=...` - `COOKIE_SECURE=1` - `PONT_BASCULE_BYPASS=false` - - Frontend : `/var/www/ferme/frontend/.env` - - `NUXT_PUBLIC_APP_BASE=/` - - `NUXT_PUBLIC_API_BASE=/api` 3. Générer les clés JWT ```bash cd /var/www/ferme mkdir -p config/jwt php bin/console lexik:jwt:generate-keypair ``` -4. Config Nginx (sous-domaine) +4. Config Nginx (sous-domaine)
+ Copier le fichier de conf /deploy/nginx/ferme.conf dans /etc/nginx/sites-available/ferme.conf ```bash - sudo cp /var/www/ferme/deploy/nginx/ferme.conf /etc/nginx/sites-available/ferme.conf sudo ln -s /etc/nginx/sites-available/ferme.conf /etc/nginx/sites-enabled/ferme.conf sudo nginx -t && sudo systemctl reload nginx ``` -6. Déployer l’app +5. Installer le script de déploiement (disponible /scripts/deploy-release.sh) ```bash - cd /var/www/ferme - ./scripts/deploy-native.sh + sudo nano /usr/local/bin/deploy-ferme + sudo chmod +x /usr/local/bin/deploy-ferme ``` -7. Vérifications - - Front : `http://ferme.malio-dev.fr/` - - API : `http://ferme.malio-dev.fr/api/users` - - Login : `POST http://ferme.malio-dev.fr/api/login_check` -## 2) Déployer une nouvelle version (app déjà en place) +## 2) Déployer une release -1. Mettre à jour le code + build + migrations +1. Créer un tag sur `develop` (auto-tag `v0.0.X`) +2. Attendre que la release Gitea soit publiée +3. Déployer la release ```bash - cd /var/www/ferme - ./scripts/deploy-native.sh - ``` -2. Si changement de conf Nginx - ```bash - sudo cp /var/www/ferme/deploy/nginx/ferme.conf /etc/nginx/sites-available/ferme.conf - sudo nginx -t && sudo systemctl reload nginx - ``` -3. Si besoin, purger le cache Symfony - ```bash - php /var/www/ferme/bin/console cache:clear --env=prod - php /var/www/ferme/bin/console cache:warmup --env=prod + sudo DEPLOY_OWNER=malio /usr/local/bin/deploy-ferme v0.0.X ``` + +### Vérifications +- Front : `http://ferme.malio-dev.fr/` +- API : `http://ferme.malio-dev.fr/api/users` +- Login : `POST http://ferme.malio-dev.fr/api/login_check` diff --git a/README.md b/README.md index 670678a..0ab3b4b 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,20 @@ Le frontend ne lit jamais directement le token, le navigateur envoie automatique - Le cookie est automatiquement envoyé pour les futures requêtes. - La déconnexion utilise `POST /api/logout` et redirige vers `/login`. + +## Livraison en recette +### Préparatifs +Avant de déployer, il faut penser à ajouter les variables d'env s'il y a des changements/modifications. +Le .env se trouve /var/www/ferme/.env + +Le script de livraison est version dans le repo dans script/deploy-release.sh
+Sur la machine, il est disponible dans /usr/local/bin/deploy-ferme
+Pour le modifier, il faut copier le contenu du deploy-release.sh dans le deploy-ferme +### Livraison +Sur le serveur de recette, il suffit d'utiliser cette commande pour livrer +```bash +sudo DEPLOY_OWNER=malio /usr/local/bin/deploy-ferme vX.X.X +``` ## Commandes utiles Pour restart le container ```bash diff --git a/scripts/deploy-release.sh b/scripts/deploy-release.sh new file mode 100644 index 0000000..e5fba38 --- /dev/null +++ b/scripts/deploy-release.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Usage: ./scripts/deploy-release.sh v0.0.1 +# Requires: curl, tar, (optional) rsync +# +# Auth token: set RELEASE_TOKEN env var or create /etc/ferme-release-token + +TAG="${1:-}" +if [ -z "$TAG" ]; then + echo "Usage: $0 v0.0.1" >&2 + exit 1 +fi + +REPO_OWNER="MALIO-DEV" +REPO_NAME="Ferme" +GITEA_API="https://gitea.malio.fr/api/v1" +DEPLOY_DIR="/var/www/ferme" + +if [ -f /etc/ferme-release-token ] && [ -z "${RELEASE_TOKEN:-}" ]; then + RELEASE_TOKEN="$(cat /etc/ferme-release-token)" +fi + +tmp_dir="$(mktemp -d)" +cleanup() { + rm -rf "$tmp_dir" +} +trap cleanup EXIT + +release_json="$tmp_dir/release.json" +curl_opts=(-sS) +if [ -n "${RELEASE_TOKEN:-}" ]; then + curl_opts+=(-H "Authorization: token ${RELEASE_TOKEN}") +fi +curl "${curl_opts[@]}" \ + "${GITEA_API}/repos/${REPO_OWNER}/${REPO_NAME}/releases/tags/${TAG}" \ + -o "$release_json" + +asset_url="$(python3 - "$release_json" <<'PY' +import json, sys +data = json.load(open(sys.argv[1], 'r')) +assets = data.get("assets", []) +for a in assets: + name = a.get("name", "") + if name.startswith("ferme-") and name.endswith(".tar.gz"): + print(a.get("browser_download_url", "")) + break +PY +)" + +if [ -z "$asset_url" ]; then + echo "Release asset not found for tag ${TAG}" >&2 + exit 1 +fi + +archive="$tmp_dir/artefact.tar.gz" +curl "${curl_opts[@]}" -L "$asset_url" -o "$archive" + +tar -xzf "$archive" -C "$tmp_dir" + +if command -v rsync >/dev/null 2>&1; then + rsync -a --delete \ + --exclude ".env" \ + --exclude ".env.local" \ + --exclude "config/jwt" \ + --exclude "var" \ + "$tmp_dir"/ "$DEPLOY_DIR"/ +else + cp -a "$tmp_dir"/. "$DEPLOY_DIR"/ +fi + +echo "Release ${TAG} deployed to ${DEPLOY_DIR}" + +if [ -n "${DEPLOY_OWNER:-}" ]; then + DEPLOY_GROUP="${DEPLOY_GROUP:-www-data}" + chown -R "${DEPLOY_OWNER}:${DEPLOY_GROUP}" "$DEPLOY_DIR" + chmod -R g+rx,o+rx "$DEPLOY_DIR" +fi + +if [ -f "${DEPLOY_DIR}/.env.local" ]; then + echo "Running migrations (if any)..." + php "${DEPLOY_DIR}/bin/console" doctrine:migrations:migrate --no-interaction --env=prod +else + echo "Skip migrations: ${DEPLOY_DIR}/.env.local not found" >&2 +fi