BookStack: Permission denied ".../storage/logs/laravel.log could not be opened"
Project Maintainer Edit - For Laravel Developers
Gaining an understanding of Unix permissions, rather than blindly setting them. Please see the comment here: https://github.com/BookStackApp/BookStack/issues/436#issuecomment-395964366
Original Issue
Hi all,
Having a permissions problem with the install. I’ll try to provide all the necessary info if some one could please help.
For Bug Reports
- BookStack Version: v0.17.1
- PHP Version: 7.0.20
- MySQL Version: 14.14 Distrib 5.6.36
Expected Behaviour
Redirected after login
Actual Behaviour
HTTP Error 500
[root@core]# tail /var/log/httpd/error_log
PHP Fatal error: Uncaught UnexpectedValueException: The stream or file "/home/bookstack/bookstack/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /home/bookstack/bookstack/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107\nStack trace:\n#0 /home/bookstack/bookstack/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37): Monolog\\Handler\\StreamHandler->write(Array)\n#1 /home/bookstack/bookstack/vendor/monolog/monolog/src/Monolog/Logger.php(337): Monolog\\Handler\\AbstractProcessingHandler->handle(Array)\n#2 /home/bookstack/bookstack/vendor/monolog/monolog/src/Monolog/Logger.php(616): Monolog\\Logger->addRecord(400, Object(Symfony\\Component\\Debug\\Exception\\FatalErrorException), Array)\n#3 /home/bookstack/bookstack/vendor/laravel/framework/src/Illuminate/Log/Writer.php(203): Monolog\\Logger->error(Object(Symfony\\Component\\Debug\\Exception\\FatalErrorException), Array)\n#4 /home/bookstack/bookstack/vendor/laravel/framework/src/Illuminate/Log/Writer.php(114): Illum in /home/bookstack/bookstack/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php on line 107, referer: http://docs.someurl.co/login
I go to docs.someurl.co and I am shown the login page. Great. I put in admin@admin.com and password and I get a HTTP Error 500.
[root@core bookstack]# pwd
/home/bookstack/bookstack
[root@core bookstack]# ls -all | grep storage
drwxr-xr-x 7 bookstack bookstack 69 Jul 13 17:01 storage
[root@core bookstack]# cd storage
/home/bookstack/bookstack/storage
[root@core storage]# ls -all
total 4
drwxr-xr-x 7 bookstack bookstack 69 Jul 13 17:01 .
drwxr-xr-x 14 bookstack bookstack 4096 Jul 13 17:27 ..
drwxr-xr-x 2 bookstack bookstack 23 Jul 13 17:01 app
drwxr-xr-x 2 bookstack bookstack 23 Jul 13 17:01 fonts
drwxr-xr-x 5 bookstack bookstack 62 Jul 13 17:01 framework
drwxr-xr-x 2 bookstack bookstack 23 Jul 14 09:55 logs
drwxr-xr-x 3 bookstack bookstack 18 Jul 13 17:01 uploads
About this issue
- Original URL
- State: closed
- Created 7 years ago
- Comments: 19 (8 by maintainers)
chmod -R 777 storageworked for meLol, This is the most popular page of all BookStack GitHub pages.
Hello fellow Laravel developers who have googled their writable storage issues. It’s important to be aware of what permissions you are setting so I thought I’d provide a little overview. Better, more detailed guides are available via more googling.
Unix-Style Permissions
Files and folders have 3 main permissions:
read,write&execute. Files and folders are also assigned anownerandgroup.Reading Permissions
You can run
ls -alhin the terminal to show the files and folders with their permissions:The permissions are on the left, in the first column. The starting
dis shown if it’s a directory. Then there are three sets ofrwx.rwxis the permissions for the owner.rwxis the permissions for the group.rwxis the permissions for everyone else.Each of these characters represents read, write or execute. A hyphen (
-) is shown instead if the permission is not granted. Note that execute permissions are required on folders to enter them.The owner assigned to a file/folder can be seen in the third column. The group can be seen in the fourth. In the example above the file
favicon.icois assigned to the groupdanand is owned bywww-data. The ownerwww-datahas permission to read and write the file. The groupdanhas permission to read, write, or execute the file. Everyone else can only read the file.Octal Format
Permissions may also be shown as numbers in an octal format. In the octal format each permission has a number:
These numbers are summed together into a single digit. For example, Having all permissions will be shown as a
7or only having Read+Execute permissions will be shown as a5. These totals are often used in a set of 3 to represent the permissions for the group, owner & everyone else.In the example command output above, the permissions for
favicon.icocould be shown as674. The.htaccessfile permissions could be shown as644. All permissions granted to everyone would show as777.Setting Permissions
There are two main commands for controlling permissions:
chmod(Change mode), Used to set permissions.chown(Change ownership), Used to change the owner and group.For both of these commands using
-Rwill set permissions recursively upon all child files and directories.chmod usage
chown usage
Common use
For things such as file uploads, you’d generally want these to be both readable and writable by the webserver. The user and group your web server runs as will depend on your system and config. On ubuntu it’s common for apache and nginx to run as
www-data, both as the owner and group. In this case, If i wanted to give the webserver permission to upload and serve files within the./storagedirectory I might do the following:Just to reiterate, There’s better and more in-depth guide elsewhere, Just have a google, but the above may help you understand what’s going on when you’re setting permission on your server.
Not sure what was going on - restarted httpd and that problem is solved.
This is with Apache on Centos 7.
I had previously done
chmod 777 -R storage bootstrap/cache public/uploadsbut I might have made a typo.Thanks for the quick reply and help.
Fixed my problem with this command in centos 7.6 Server
I don’t remember ever seeing such a nice, concise yet in-depth overview of Unix permissions management on the net anywhere. Funny it’s hidden in an obscure post on the BookStack forum. Thanks 😃
@vikasrinvi That is a subtly different issue. This has been answered above already.
Another culprit behind this error could also be selinux.
See https://linuxhint.com/how-to-disable-selinux-on-centos-7/
@ssddanbrown as far as I know, you made two minor mistakes in your explanation. The first rwx is for the user and the second for the group. Same goes for the chown command (user:group instead of group:user which you correctly used in the last code block).
But basically UNIX permissions is a must for every web developer and one of the most common errors! There is no “golden rule” since there are too many possible scenarios (OS, setup, sticky bits, …). You need to know some facts about your hosting environment. Hosting panels will often handle user rights differently to basic manually installed webserver, some distributions use different service names (e.g. in CentOS there is no www-data user, apache is used instead, but the service is not called apache, it’s httpd there). The better you know your hosting environment, the easier it is for you to track down issues (or for us to help).
Setting wrong permissions (and 777 is a wrong permission in most cases) leads to lowered security. In some cases this might lead to full disclosure of sensitive data (Log may contain mysql user and password if the mysql server is not accessible for a short time and with 777 be exposed to the web, luckily Laravel does not write user and password to the log).
An easy way to find out what user is delivering your site to the browser is to place a simple php file in your webroot and use it to create a file like:
After calling it once in your browser, with
ls -l /tmpyou will see user and group the webserver needs for reading/writing files.