Install from these repository.
Here is example of usage for Humhub,
- Catfs caches any files you accessed through goofys, up to (Your_storage_size - 1) GB. (
-free:1G
option below.) - Assumes your php runs as uid=33 & gid=33 (
-uid 33 --gid 33
option below).
$ sudo goofys -o allow_other --file-mode 0666 --dir-mode 0777 --uid 33 --gid 33 --cache=-o:allow_other:--free:1G:/PATH/TO/MY/CATFS_CACHE MY_S3_BUCKET:MY_S3_DIRECTORY_FOR_UPLOAD /PATH/TO/MY/S3_BUCKET_MOUNTPOINT
goofys#MY_S3_BUCKET:MY_S3_DIRECTORY_FOR_UPLOAD /PATH/TO/MY/S3_BUCKET_MOUNTPOINT fuse allow_other,--file-mode=0666,--dir-mode=0777,--uid=33,--gid=33,--cache=-o:allow_other:--free:1G:/PATH/TO/MY/CATFS_CACHE 0 0
Then check /etc/fstab
with sudo mount -a
and mount | grep fuse
.
- Copy all
/PATH/TO/MY/HUMHUB/uploads
files into/PATH/TO/MY/S3_BUCKET_MOUNTPOINT
- Rename
/PATH/TO/MY/HUMHUB/uploads
to/PATH/TO/MY/HUMHUB/uploads_bak
- Make symbolic link
sudo ln -s /PATH/TO/MY/S3_BUCKET_MOUNTPOINT /PATH/TO/MY/HUMHUB/uploads
- All media traffic still delivered from your Server, not CDN (CloudFront)
- Need to output proper CF distribution URL.
- Override
/protected/humhub/modules/file/models/File.php
'sgetUrl()
.
- CloudFront has "Restrict viewer access" feature, can identify access from Guest or Humhub user, with
Signed cookie
.- Limit lifetime of the signed cookie with
DateLessThan
policy - You can also limit with
IpAddress
policy, but site will broken with iOS 15's "Private relay" feature.
- Limit lifetime of the signed cookie with
- But CloudFront itself can't check whether the access (from the Humhub user) has proper privilege for private post or community.
- Concept to solve: We may be able to use CloudFront functions or Lambda@Edge to validate access.
- Add JSON Web Token on all
/file/file/download
URLs and CF func / Lambda@Edge validate them. - Users are given short-time JWT string for every valid (privileged) user access. JWT is issued from your code on Humhub, So only their access are allowed on CloudFront distribution.
- Minor cons: If even as the post was move into private, JWT & the URL still Valid until JWT expires.
More cool concepts are welcome.
OK, I've made them somehow useful, I'll write what I did someday. Draft are below:
Part A: Get unlimited storage
Strategy: disk usage matters
current pros & cons
Part B: Get unlimited bandwidth
Strategy: security matters
B-1. Create CloudFront distribution
B-2. Redirect the request to upload content
B-3. Pass original filename using Cloud function