proyecto - Laravel 4 Permisos en una caja Vagrant con Puppet
permisos carpetas laravel (3)
He estado utilizando http://www.puphpet.com con éxito para generar entornos vagabundos + marionetas para una serie de proyectos. Esta semana me encargaron escribir un prototipo para un proyecto con Laravel 4. Ya que no voy a ser el que trabaje en el proyecto a tiempo completo, pensé que sería mejor crear un entorno de VM para él que el siguiente la persona puede simplemente clonar para el repositorio. Como no tengo mucha experiencia con Laravel 4, tengo todo para ejecutar en el entorno de desarrollo. Luego traté de ejecutar la primera migración y aquí los problemas comienzan con los permisos de la app/storage
archivo de app/storage
.
1. la aplicación / almacenamiento debe ser escribible por el usuario de la web
Bien, eliminó la identificación: vagabundo del aprovisionamiento de carpetas sincronizadas y configuró el propietario y el grupo en www-data de la siguiente manera:
config.vm.synced_folder "./www", "/var/www", owner: "www-data", group: "www-data"
2. Artisan solo puede ejecutarse desde el interior del vagabundo para acceder al DB
Fine, vagrant ssh
y corre artesano desde la carpeta www.
3. la aplicación / almacenamiento y la aplicación / base de datos tienen que ser escribibles por el usuario vagabundo para usar migraciones
Grrr, vale, agregó la siguiente horrible pieza de código al archivo vagabundo (nota, primero traté de hacer esto en Puppet y no fue así):
config.vm.provision :shell, :inline =>
"usermod -a -G www-data vagrant"
4. app / storage & app / database no son grabables por el grupo
Argh !!! Ok, probemos esta directiva de Marionetas:
file { "/var/www/app/storage":
source => "/var/www/app/storage/",
mode => 0775,
ensure => ''directory'',
owner => ''www-data'',
group => ''www-data'',
recurse => true
}
No, no funciona. Intenté hacer lo mismo con la directiva Puppet exec {}
sin ningún efecto. Parece que los permisos para la carpeta sincronizada vagabundo los establece el equipo host, no el invitado.
Finalmente terminó cambiando manualmente los permisos para la carpeta en la máquina host. ¿Hay alguna manera más simple de hacer esto? Realmente me gustaría poder darle al próximo desarrollador un entorno libre de preocupaciones que pueda clonar del repositorio, no tener que volver a configurar todo después de la clonación.
ACTUALIZAR
Hemos descubierto que si cambiamos el usuario de ejecución de Apache, vagabundo no lo anula al volver a cargar. Así que lo hemos hecho manualmente y funciona mejor que cambiar los permisos y el propietario de la carpeta sincronizada. Ahora solo estamos tratando de descubrir cómo hacer ese cambio manualmente en Puppet.
No estoy usando pupphet en mi configuración y se me ocurrió 2 soluciones:
(1) En mi archivo bootstrap.sh:
sudo sed -i ''s/APACHE_RUN_USER=.*/APACHE_RUN_USER=vagrant/g'' /etc/apache2/envvars
sudo sed -i ''s/APACHE_RUN_GROUP=.*/APACHE_RUN_GROUP=www-data/g'' /etc/apache2/envvars
(2) Soy mi VagrantFile:
config.vm.synced_folder "./", "/vagrant", id: "vagrant-root" , :owner => "vagrant", :group => "www-data"
config.vm.synced_folder "./app/storage", "/vagrant/app/storage", id: "vagrant-storage",
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]
config.vm.synced_folder "./public", "/vagrant/public", id: "vagrant-public",
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]
Eche un vistazo a esta sección de la documentación de Vagrant http://docs.vagrantup.com/v2/synced-folders/basic_usage.html
Después de un debate en Twitter, descubrió lo siguiente:
Hay una restricción de VirtualBox en vagabundo que no le permite establecer permisos para la carpeta sincronizada desde el sistema operativo invitado. Vea este problema en github.
Puede utilizar el siguiente código para configurar los permisos de la carpeta sincronizada desde el archivo vagabundo:
config.vm.synced_folder ".", "/vagrant", :mount_options => ["dmode=777","fmode=666"]
O puede cambiar el usuario de tiempo de ejecución de Apache a vagabundo desde el manifiesto de marionetas de la siguiente manera:
exec { "change_httpd_user":
command => "sed -i ''s/www-data/vagrant/g'' /etc/apache2/envvars",
onlyif => "/bin/grep -q ''www-data'' ''/etc/apache2/envvars''",
notify => Service[''apache2''],
require => Package[''apache2''],
}
file { "/var/lock/apache2":
ensure => "directory",
owner => "vagrant",
group => "vagrant",
require => Exec[''change_httpd_user''],
}
O cualquier combinación de los anteriores