liip / LiipImagineBundle

Symfony Bundle to assist in image manipulation using the imagine library
http://liip.ch
MIT License
1.66k stars 378 forks source link

Use s3 for cached images too #1556

Open tacman opened 10 months ago

tacman commented 10 months ago

I'm deploying an application to a readonly system (dokku/heroku and others). I've moved my source images to s3, and the cached images are working as expected locally.

Usually my next step is to attach persistent storage and map /public/media/cache to a path on the persistent storage, but it got me wondering if it was possible to configure the cache itself to be remote. Perhaps this is what the cache resolver is for, is there an example that uses something beside the local filesystem for serving the thumbnail images?

In the end, since S3 charges for transfer, it might be too expensive. But when deploying a small site, it might be easier than dealing with persistent storage.

dbu commented 10 months ago

what you describe sounds totally legit and should work, but i don't know if it actually does.

i do not like the naming we have for the concepts in this bundle. i am always confused as to what does what and what can be done. i would have to dig into the code to find out.

i hope that for 3.x we can cleanup the naming and straighten the concepts so it becomes more clear which part does what.

tacman commented 10 months ago

So here's an explanation of how to use s3 for the cached images:

https://symfonycasts.com/screencast/symfony-uploads/cached-s3-filesystem

BUT it's old. It uses OneUpFlysystem, and even has lines like

If you're using version 4 of oneup/flysystem-bundle (so, flysystem v2), the league/flysystem-cached-adapter will not work - it was not updated to support flysystem v2. Someone has created a cached adapter - https://github.com/Lustmored/flysystem-v2-simple-cache-adapter - but configuring it requires extra steps.

I have a working public repo that uses s3 for the original images, but I can't follow this tutorial on how to configure s3 for the cached images.

cleanup the naming and straighten the concepts so it becomes more clear which part does what.

Indeed. I struggle with "cache" and "adapter", and recently removed an extra s3 adapter from a project and couldn't even figure out why I had it. (It didn't support Symfony 7, but evidently my project didn't need it).

I should say that all of my projects using LIIP came from following Ryan's tutorial, which is too outdated to be useful anymore. With version 3 of LIIP, it'd be great to have clearer instructions.

tacman commented 10 months ago

I dug up an old project that used s3 for both the original images and for the cache.

However, it was based on oneup, the cached_uploads_filesystem filesystem. Anyone know how to implement this using phpleague/flysystem-bundle?

# Read the documentation: https://github.com/1up-lab/OneupFlysystemBundle/tree/master/Resources/doc/index.md
oneup_flysystem:
    cache:
        psr6_app_cache:
            psr6:
                service: cache.flysystem.psr6

    adapters:
        uploads_adapter:
            awss3v3:
                client: Aws\S3\S3Client
                bucket: '%env(AWS_S3_BUCKET_NAME)%'

        local_uploads_adapter:
            local:
                directory: "%kernel.project_dir%/public/uploads"
                lazy: ~ # boolean (default "false")
                writeFlags: ~
                linkHandling: ~
                permissions: ~

    filesystems:
        uploads_filesystem:
            adapter: uploads_adapter # s'%env(UPLOADS_ADAPTER)%'

        cached_uploads_filesystem:
            adapter: uploads_adapter
            cache: psr6_app_cache