Непрерывная интеграция Laravel с Gitlab-runner в автономном режиме (CentOS 7)

Я разрабатываю веб-сайт в полностью автономной среде. также я использую gitlab runner для CI, а хост — CentOS 7.

проблема в том, что gitlab runner использует пользователя gitlab-runner в centos для развертывания приложения laravel, а apache использует пользователя apache для запуска laravel. Я получил ошибку Permission denied в apache, пока не сменил владельца файлов. после этого я получаю эту ошибку в журнале apache:

Uncaught UnexpectedValueException: The stream or file "storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied

кажется, что некоторые библиотеки поставщиков, такие как monolog, хотят записывать журналы ошибок или отладки в storage/logs/laravel.log, но им отказывают в разрешении. :(

.gitlab-ci.yml

stages:
  - build
  - test
  - deploy

buildBash:
  stage: build
  script:
    - bash build.sh

testBash:
  stage: test
  script:
    - bash test.sh

deployBash:
  stage: deploy
  script:
    - sudo bash deploy.sh

build.sh

#!/bin/bash

set -xe

# creating env file from production file
cp .env.production .env

# initializing laravel
php artisan key:generate
php artisan config:cache

# database migration
php artisan migrate --force

развернуть.sh

#!/bin/bash

PWD=$(pwd)'/public'
STG=$(pwd)'/storage'

ln -s $PWD /var/www/html/public
chown apache.apache -R /var/www/html/public
chmod -R 755 /var/www/html/public
chmod -R 775 $STG

Правильно ли я использую gitlab runner? как я могу исправить ошибку отказа в разрешении?


person Alireza    schedule 01.05.2017    source источник


Ответы (1)


SELinux

Я нашел проблему, и это был selinux, как всегда, это был selinux, и я сначала проигнорировал его.


В чем проблема:

вы можете увидеть контекст selinux в файлах с помощью команды ls -lZ, по умолчанию все файлы на www имеют httpd_sys_content_t, проблема в том, что selinux просто позволяет apache читать эти файлы. вы должны изменить контекст storage и bootstrap/cache, чтобы он был доступен для записи.

существует 4 типа контекста apache:

  • httpd_sys_content_t: каталоги и файлы только для чтения
  • httpd_sys_rw_content_t: доступные для чтения и записи каталоги и файлы, используемые Apache.
  • httpd_log_t: используется Apache для файлов журналов и каталогов.
  • httpd_cache_t: используется Apache для кэширования файлов и каталогов.

Что делать:

прежде всего установите policycoreutils-python для лучших команд

yum install -y policycoreutils-python

после установки policycoreutils-python доступна команда semanage, поэтому вы можете изменить контекст файла следующим образом:

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?" semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?"

не забудьте зафиксировать изменения этой командой:

restorecon -Rv /var/www/html/laravel/storage restorecon -Rv /var/www/html/laravel/bootstrap/cache

проблема решена :)

ссылка: http://www.serverlab.ca/tutorials/linux/web-servers-linux/configuring-selinux-policies-for-apache-web-servers/

person Alireza    schedule 04.05.2017