shlinkio / shlink

The definitive self-hosted URL shortener
https://shlink.io
MIT License
3.23k stars 259 forks source link

Consider replacing wkhtmltoimage with something else with less errors #138

Closed acelaya closed 5 years ago

acelaya commented 6 years ago

Alternatives:

robwent commented 6 years ago

What are the usual errors with wkhtml?

I'm getting permission errors when trying to create the images but I think it might be down to my servers security?

acelaya commented 6 years ago

The images are written in the data directory, so you have to make sure the user you use to generate previews has enough permissions to write there.

However the problems I have occasionally seen are related to SSL when scrapping https pages.

robwent commented 6 years ago

User has permissions to write to the data directory.

I did originally think it might be an issue with getting https domains so added some test links for http domains but they were the same.

Is anything like exec needed which I might have disabled?

robwent commented 6 years ago

This isn't really a big issue for me so don't spend any time on it as I think it might be my server restrictions, but this is the log:


Shlinkio\Shlink\Common\Exception\PreviewGenerationException: Error generating a preview image with error: sh: 1: bin/wkhtmltoimage: Permission denied in /srv/users/user_name/apps/app_name/module/Common/src/Exception/PreviewGenerationException.php:10
Stack trace:
#0 /srv/users/user_name/apps/app_name/module/Common/src/Service/PreviewGenerator.php(56): Shlinkio\Shlink\Common\Exception\PreviewGenerationException::fromImageError('sh: 1: bin/wkht...')
#1 /srv/users/user_name/apps/app_name/module/Core/src/Action/PreviewAction.php(63): Shlinkio\Shlink\Common\Service\PreviewGenerator->generatePreview('http://www.c4c....')
#2 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Core\Action\PreviewAction->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#3 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive-router/src/Route.php(100): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#4 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive-router/src/RouteResult.php(110): Zend\Expressive\Router\Route->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#5 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive-router/src/Middleware/DispatchMiddleware.php(35): Zend\Expressive\Router\RouteResult->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#6 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\DispatchMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#7 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Next.php(52): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#8 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(91): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#9 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(78): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\MiddlewarePipe))
#10 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(47): Zend\Stratigility\MiddlewarePipe->handle(Object(Zend\Diactoros\ServerRequest))
#11 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(78): Zend\Stratigility\Middleware\PathMiddlewareDecorator->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\MiddlewarePipe))
#12 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Next.php(47): Zend\Stratigility\MiddlewarePipe->handle(Object(Zend\Diactoros\ServerRequest))
#13 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive-router/src/Middleware/RouteMiddleware.php(54): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#14 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\RouteMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#15 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Next.php(52): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#16 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(91): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#17 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(78): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\MiddlewarePipe))
#18 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(47): Zend\Stratigility\MiddlewarePipe->handle(Object(Zend\Diactoros\ServerRequest))
#19 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(78): Zend\Stratigility\Middleware\PathMiddlewareDecorator->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\MiddlewarePipe))
#20 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Next.php(47): Zend\Stratigility\MiddlewarePipe->handle(Object(Zend\Diactoros\ServerRequest))
#21 /srv/users/user_name/apps/app_name/module/Common/src/Middleware/LocaleMiddleware.php(43): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#22 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Common\Middleware\LocaleMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#23 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Next.php(52): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#24 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive-helpers/src/ContentLengthMiddleware.php(31): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#25 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Helper\ContentLengthMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#26 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Next.php(52): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#27 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Middleware/ErrorHandler.php(143): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#28 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Stratigility\Middleware\ErrorHandler->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#29 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/Next.php(52): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#30 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(91): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#31 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(78): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\MiddlewarePipe))
#32 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-httphandlerrunner/src/RequestHandlerRunner.php(95): Zend\Stratigility\MiddlewarePipe->handle(Object(Zend\Diactoros\ServerRequest))
#33 /srv/users/user_name/apps/app_name/vendor/zendframework/zend-expressive/src/Application.php(81): Zend\HttpHandlerRunner\RequestHandlerRunner->run()
#34 /srv/users/user_name/apps/app_name/public/index.php(9): Zend\Expressive\Application->run()
#35 {main} []```
acelaya commented 6 years ago

I'm not completely sure, since shlink consumes wkhtmltoimage using an intermediary library, but I would say it's very likely.

This is the library https://github.com/mikehaertl/phpwkhtmltopdf

You could also run the "previews" command with the -vvv flat, which will display information of any unhandled error.

robwent commented 6 years ago

Totally ignore that.

It was a simple permissions issue after all.

I set bin/wkhtmltoimage to 766 and it's now working.

Sorry for wasting your time!

acelaya commented 6 years ago

Yep, I see the error and it seems like it's blocking the command execution.

acelaya commented 6 years ago

Really? I would have said the binary was distributed with execution permissions. I'll need to dig into that...

robwent commented 6 years ago

Maybe the error feedback could run a check on the file permissions to let the user know that it can't execute.

Or just chmod the file (but probably ot to 766)

robwent commented 6 years ago

It was set to 666 when I checked. So I checked the execure box which made it 766 and that worked.

I think it could be 760 to remove all public permissions though.

I usually assume 644 has enough for any file to run...