J'utilise Symfony 5.0.7

Mon fichier de déploiement after-symlink-shared.yaml en direct:

---

- name: Set up infrastructure-related parameters
  template:
    src: '{{ playbook_dir }}/templates/.env_live.dist'
    dest: '{{ ansistrano_release_path.stdout }}/.env'


- name: Install Composer dependencies
  composer:
    command: install
    arguments: --classmap-authoritative
    no_dev: no
    optimize_autoloader: yes
    working_dir: '{{ ansistrano_release_path.stdout }}'

- name: Clear the cache
  command: 'php {{ release_console_path }} cache:clear --no-warmup --env=prod'

- name: Warm up the cache
  command: 'php {{ release_console_path }} cache:warmup --env=prod'

- name: Create DB if not exists
  command: 'php {{ release_console_path }} doctrine:database:create --if-not-exists --env=prod'
  register: create_db_output
  changed_when: create_db_output.stdout is not search('already exists. Skipped')

- name: Run migrations
  command: 'php {{ release_console_path }} doctrine:migrations:migrate --no-interaction --env=prod'
  register: run_migrations_output
  changed_when: run_migrations_output.stdout is not search('No migrations to execute')


- name: Install bundle assets
  command: 'php {{ release_console_path }} assets:install --symlink --env=prod {{ ansistrano_release_path.stdout }}/public'


- name: Copy build directory
  command: 'cp -a {{ ansistrano_release_path.stdout }}/public/build /var/www/project/public'
  tags:
    - deploy

Le déploiement fonctionne parfaitement, mais chaque fois que je déploie sur le serveur, mon environnement de production rencontre une erreur 500.

Je regarde mon fichier prod.log pour comprendre la cause de l'erreur et j'obtiens ce qui suit:

[2020-05-09 21:40:59] request.CRITICAL: Uncaught PHP Exception RuntimeException: "Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler)." at /var/www/project/symfony/releases/20200509213543Z/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php line 43 {"exception":"[object] (RuntimeException(code: 0): Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler). at /var/www/project/symfony/releases/20200509213543Z/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php:43)"} []

[2020-05-09 21:40:59] php.CRITICAL: Uncaught Exception: Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler). {"exception":"[object] (RuntimeException(code: 0): Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler). at /var/www/project/symfony/releases/20200509213543Z/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php:43)"} []

[2020-05-09 21:40:59] request.CRITICAL: Uncaught PHP Exception RuntimeException: "Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler)." at /var/www/project/symfony/releases/20200509213543Z/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php line 43 {"exception":"[object] (RuntimeException(code: 0): Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler). at /var/www/project/symfony/releases/20200509213543Z/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php:43)"} []

[2020-05-09 21:40:59] php.CRITICAL: Uncaught Exception: Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler). {"exception":"[object] (RuntimeException(code: 0): Unable to create the storage directory (/var/www/project/symfony/releases/20200509213543Z/var/cache/prod/profiler). at /var/www/project/symfony/releases/20200509213543Z/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php:43)"}

Cela ressemble à un problème d'autorisations car chaque fois que je déploie, cette erreur se produit. Est-il possible que je puisse faire quelque chose du point de vue NGINX pour garantir que cela fonctionne correctement? Ou est-ce une solution viable? J'essaie d'éviter de corriger manuellement ces erreurs à chaque déploiement.

0
Majo0od 10 mai 2020 à 00:55

3 réponses

Meilleure réponse

J'ai compris le problème.

C'était purement un problème d'autorisations que je devais d'abord accéder au dossier de plus haut niveau où se trouvait le dossier var prod et mettre à jour les autorisations à l'aide de chown, puis mettre à jour les autorisations pour tous les dossiers ci-dessous de manière récursive en utilisant chmod pour assurez-vous que tout le reste sera écrit comme le parent.

0
Majo0od 16 mai 2020 à 05:42

L'utilisateur exécutant le déploiement semble être différent de celui qui exécute php, c'est pourquoi l'utilisateur n'a pas les autorisations sur le répertoire cache après l'exécution de cache:warmup.

Vous avez plusieurs options:

  • Changez l'utilisateur sous lequel l'application s'exécute: Puisque vous dites que vous utilisez nginx, je suppose que vous utilisez php-fpm. Vous pouvez remplacer les paramètres user et group de votre php-fpm.conf par celui qui exécute le déploiement. Si vous exécutez plusieurs applications, créez un nouveau pool. (Voici un guide du fpm et des pools pour vous aider, et le Référence FPM).

  • Ajustez les groupes principaux et umask ou acl s afin que les deux utilisateurs aient accès.

  • Exécutez les tâches cache en tant qu'utilisateur php en utilisant become.

  • Corrigez les autorisations dans le cadre du processus de déploiement en exécutant une tâche ansible. Vous pouvez utiliser le module de fichiers pour cela. Vous pouvez soit utiliser les autorisations ouvertes, soit utiliser become.

Gardez à l'esprit que l'utilisation de become (les deux dernières options) nécessite de modifier le sudoers fichier afin que l'utilisateur deploy puisse agir en tant qu'utilisateur php.

Si vous avez un répertoire uploads sous public qui nécessite un accès en écriture par le processus php, vous devez également corriger ces autorisations.

0
msg 10 mai 2020 à 12:19

Le problème se produit probablement parce que ansible s'exécute sur l'utilisateur root, mais pas le serveur PHP

Essayez d'ajouter la dernière étape pour changer la propriété du répertoire dans le playbook

- name: Fix user rights
  command: 'chown -R www-data: /var/www/project/public'
  tags:
    - deploy

Dans mon exemple, la propriété est accordée à l'utilisateur www-data (par défaut), mais dans votre cas, cela peut être différent.

Pour vérifier le bon utilisateur, utilisez la commande

cd /var/www/project && ls -la
0
Grey2k 18 mai 2020 à 18:04