Resolvendo os principais erros de permissão no Laravel

Evite estes tipos de erros nos logs do Laravel:

erros de permissão no Laravel
the stream or file “/var/www/html/storage/logs/laravel.log” could not be opened in append mode: failed to open stream: permission denied

Erros de permissão no Laravel

O Laravel é um popular framework PHP usado por muitos desenvolvedores para criar aplicativos web. Um problema comum que pode ocorrer ao trabalhar com o Laravel é o erro:

The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: permission denied

Esse erro ocorre quando o Laravel não consegue gravar em seu arquivo de log porque não tem permissão para acessar a pasta de armazenamento.

Outro erro muito comum, que pode acontecer quanto não temos as permissões definidas corretamente no Laravel, é o erro abaixo:

Error in exception handler: The stream or file "/var/www/laravel/app/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /var/www/laravel/bootstrap/compiled.php:8423

Solução paliativa

Uma solução que é indicada em muitos fóruns e blogs, é aplicarmos a permissão chmod 777, que acaba deixando nosso servidor muito exposto.

Em alguns casos são sugeridos outros chmod, chgrp, que até podem não deixar o servidor com a segurança menor, mas não trazem uma solução definitiva para erros de permissão no Laravel.

Solução definitiva

Felizmente, há uma solução relativamente fácil para esse problema. Você pode aplicar permissões e herança nas permissões da pasta /var/www/html/storage/logs no servidor.

Para fazer isso, você precisará acessar o servidor onde o Laravel está hospedado e executar alguns comandos na pasta do projeto(neste exemplo estamos usando a /var/www/html/).

Outro ponto importante é que eu procuro adicionar os usuários que trabalham com o Laravel ao grupo www-data, para que após aplicada a solução eles consigam manipular os arquivos sem trazer problemas e novos erros de permissão no Laravel.

Segue o script que devemos utilizar:

## laravel log permission
cd /var/www/html/
sudo chgrp -R www-data bootstrap/ storage/ storage/logs/
sudo chmod -R g+w bootstrap/ storage/ storage/logs/
cd bootstrap/
sudo find -type d -exec chmod g+s {} +
cd ..
cd storage/
sudo find -type d -exec chmod g+s {} +
cd ..
cd storage/logs/
sudo find -type d -exec chmod g+s {} +

Um pouco mais sobre os comandos utilizados no script

Esse script em Bash é usado para conceder permissões corretas para os diretórios bootstrap/, storage/ e storage/logs/ de um projeto Laravel que está localizado em /var/www/html/. Especificamente, o script define o grupo proprietário desses diretórios como www-data, que é o usuário e grupo padrão do servidor da web no Ubuntu. Além disso, o script garante que esses diretórios tenham permissões de gravação para o grupo www-data.

A parte do script que se refere a herança de permissões é a seguinte linha:

sudo find -type d -exec chmod g+s {} +

Essa linha define o bit SGID em todos os diretórios dentro dos diretórios bootstrap/, storage/ e storage/logs/. Quando o bit SGID é definido em um diretório, ele garante que todos os novos arquivos criados dentro desse diretório herdem o grupo proprietário do diretório pai. Isso é útil para garantir que todos os arquivos criados dentro dos diretórios bootstrap/, storage/ e storage/logs/ tenham o mesmo grupo proprietário (www-data) e, portanto, possam ser lidos e gravados pelo servidor da web.

Em resumo, o script executa as seguintes ações:

  1. Navega até a pasta do projeto Laravel em /var/www/html/.
  2. Define o grupo proprietário dos diretórios bootstrap/, storage/ e storage/logs/ como www-data.
  3. Concede permissões de gravação para o grupo www-data nos diretórios bootstrap/, storage/ e storage/logs/.
  4. Define o bit SGID em todos os diretórios dentro dos diretórios bootstrap/, storage/ e storage/logs/, para garantir a herança de permissões de grupo em novos arquivos criados nesses diretórios.
laravel log

Detalhando cada opção dos comandos

sudo chgrp -R

sudo : o comando sudo é usado para executar comandos com privilégios de super usuário (root) no sistema operacional Linux ou Unix.

chgrp: o comando chgrp é usado para alterar o grupo proprietário de um arquivo ou diretório.

-R: é uma opção para o comando chgrp que significa “recursivamente”. Ela faz com que o comando seja executado em todos os diretórios e subdiretórios abaixo do diretório atual.

Em resumo, o comando sudo chgrp -R altera recursivamente o grupo proprietário de todos os arquivos e diretórios abaixo do diretório atual.

sudo chmod -R g+w

sudo: igual ao anterior

chmod: é um comando que é usado para alterar as permissões de acesso de um arquivo ou diretório.

-R: igual ao anterior

g+w: é uma opção para o comando chmod que significa “adicionar permissão de escrita para o grupo”. “g” é o grupo proprietário do arquivo ou diretório.

Em resumo, o comando sudo chmod -R g+w adiciona a permissão de escrita para o grupo proprietário em todos os arquivos e diretórios abaixo do diretório atual.

sudo find -type d -exec chmod g+s {} +

sudo: igual ao anterior

find: é um comando usado para encontrar arquivos e diretórios com base em critérios específicos.

-type d: é uma opção para o comando find que significa “encontrar apenas diretórios”.

-exec: é uma opção para o comando find que executa um comando em cada arquivo ou diretório encontrado.

chmod g+s: é o comando que será executado em cada diretório encontrado pelo find. “g” é o grupo proprietário do diretório e “s” é uma opção que significa “definir o bit setgid”. Isso faz com que todos os arquivos criados dentro do diretório herdem o grupo proprietário do diretório.

{}: é um espaço reservado para o nome do arquivo ou diretório encontrado pelo find.

+: indica que o comando chmod g+s deve ser executado uma vez para cada grupo de arquivos ou diretórios encontrados.

Em resumo, o comando sudo find -type d -exec chmod g+s {} + encontra todos os diretórios abaixo do diretório atual e executa o comando chmod g+s em cada um deles, garantindo que todos os arquivos criados dentro desses diretórios tenham o mesmo grupo proprietário.

Extra

Vou estar disponibilizando o script no meu Github, caso precisem:

https://github.com/fernandomullerjr/laravel-tools-and-tips/blob/main/permissions/adjusting-laravel-permissions.sh

Com as permissões corretas aplicadas na pasta de logs, o Laravel deve agora ser capaz de gravar em seu arquivo de log sem erros de permissão no Laravel.

Mais dicas sobre solução de problemas? Acesse:

https://devopsmind.com.br/category/troubleshooting

Fernando Müller Junior
Fernando Müller Junior

Eu sou o Fernando Müller, um Tech Lead SRE com 16 anos de experiência em TI, atualmente eu trabalho na Appmax, uma fintech localizada no Brasil. Apaixonado por trabalhar com arquiteturas e aplicações Cloud Native, ferramentas Open Source e tudo que existe no mundo SRE, sempre procurando se desenvolver e aprender constantemente(Lifelong learning), atuando em projetos inovadores!

Artigos: 28

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *