一直是通过手动安装nginx、php以及gd、mbstring、fileinfo等php扩展来搭建Files Gallery,搭建完成后往往容易存在文件无法访问、写入等一系列权限问题,而且在群晖上php也不方便安装扩展,会导致图片缩略图无法生成,索性将源码打包进docker容器并且上传到docker hub,部署更方便,在不同平台也能部署,记录一下过程与教程,方便后人。

Ⅰ.Files Gallery介绍

官方地址:https://www.files.gallery/
官方demo:https://demo.files.gallery/
Files Gallery 是一款单文件PHP应用,可以直接放入任意文件夹,立即创建一个文件和文件夹画廊。
其支持文件改名、移动、删除、上传、搜索、缩略图生成、设置访问密码等一系列功能,用来做画廊展示图片集,非常好用。

Ⅱ.镜像构建与发布

1.下载源码

下载源码[开心版]到本地
git clone https://github.com/ershiyi21/myprogram
定位到文件夹
cd ./myprogram/filegallery
安装docker
wget -qO- get.docker.com | bash
本地构建镜像
docker build -t filesgallerysss:latest .

2.登录docker hub

在浏览器登录docker hub,创建仓库,然后vps上运行docker login,浏览器访问 https://login.docker.com/activate ,输入 vps 上的设备码,即可完成登录

3.准备编译环境

准备跨框架环境,如amd机器模拟arm环境,可支持编译arm镜像,但CPU性能会下降 5~20倍
开启 QEMU
docker run --privileged --rm tonistiigi/binfmt --install all
创建 builder
docker buildx create --name multi --use
初始化
docker buildx inspect --bootstrap
检查
docker buildx ls

4.构建镜像与发布

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t ershiyi21/filesgallerysss:latest \
  --push .

Ⅲ.部署Files Gallery

上面属于自己的镜像打包发布过程,如果仅为了使用,直接使用博主发布的镜像即可

1.容器部署

创建相关文件夹
mkdir filegallery
定位到文件夹
cd filegallery
运行程序

docker run -d \
  --name filesgallery \
  -p 8080:80 \
  -v $(pwd)/data:/var/www/data \
  -v $(pwd)/cache:/var/www/cache \
  -v $(pwd)/config:/var/www/html \
  ershiyi21/filesgallerysss:260426

2.配置文件

原始图片等文件放在 data 文件夹下,需要有读取权限,容器与宿主机必须映射设置

生成的缩略图等放在 cache 文件夹下,需要有读取与写入权限,可以不映射设置

index.php 等配置文件放置在 config 文件夹下,后续可通过修改 config 下的index.php等文件来修改程序的配置,如增加访问密码、是否开启文件改名删除等,具体参数参考官方文档或者某中文汉化文档

3.无效目录、拒绝访问等权限问题

更新:260425镜像uid为33、gid为33,最新的260426镜像中,已将uid、gid指定为1026与100,即群晖7.2的首次安装时创建的默认管理员用户,只需要在文件夹属性-权限增加对应id用户的读写权限即可,或者控制面板-共享文件夹-文件夹右键-编辑-权限-勾选对应用户可读写-保存即可。以下旧方法思路保留,有问题时可以参考。

以下是群晖等docker内挂载文件夹时,docker容器内部程序无法写入或读取的一些解决办法。

部分docker容器可以添加docker运行参数PGID、PUID,指定程序运行的uid、gid实现容器内外uid、gid相同而同权;但filesgallerysss容器内Apache默认强制使用www-data用户运行,而ww-data默认用户uid为33,gid为33【最新镜像已修改为1026、100了】,并且添加docker运行参数PGID、PUID无效

  • 简单办法,对于群晖等权限复杂的系统,在宿主机中将映射文件夹改为 "Everyone可读写" 即可,文件夹右键属性-权限-新增;
  • 复杂办法1,也可以在宿主机上新增加一个uid、gid都为33的用户,再授予该用户对文件的读写权限,保持容器内与宿主机uid、gid相同即可。
    #添加用户与组
    synogroup --add customgroup 33
    synouser --add dockeruser password123 "My Test User" 0 "" 0
    #修改uid gid都为33,为了系统稳定性,只能修改我们自己新增加的用户
    cp /etc/passwd /etc/passwd.bak
    vi /ect/passwd
    用户名:x:1026:100::/var/services/homes/用户名:/sbin/nologin
    第 3 个字段是 UID(上例中是 1026)
    第 4 个字段是 GID(上例中是 100)
    #修改宿主机文件夹权限,注意,在无33用户与33组时,实测以下命令无效
    chown -R 33:33 /volume1/picture
  • 复杂办法2,重新编译镜像,在dockerfile构建docker镜像时,指定www-data的uid、gid
    FROM php:8.2-apache
    # ✅ 0. 修改 UID + 加入已有组(如不存在则为新增加,看系统而言)
    RUN usermod -u 1026 www-data && \
    usermod -aG 100 www-data

对于mount挂载的文件,建议参考以下挂载设置,增加uid、gid设置项,以声明挂载后文件夹/media/qunhui/share的权限所属,确保程序有访问和写入权限
sudo mount -t cifs //192.168.1.1/share /media/qunhui/share -o username=smb,password=123,uid=33,gid=33

4.关闭360度全景图

该程序是通过图片的尺寸来判断全景图的,很容易错误判断,把不是全景图的图片判断成全景图,关闭方法如下,本人打包的镜像已经默认关闭

创建高级自定义配置js文件: ./config/_files/js/custom.js

_c.config = {
  panorama: {
    is_pano: (item, tests) => {

        // panorama width
        var w = item.dimensions[0];

        // return panorama path if width >= 2048, width is supported and ratio (w/h) === 2
        return w >= 2048 && tests.max_texture_size >= w && w/item.dimensions[1] === 211 ? file_path(item) : false;
    }
}
}

5.部分图片无法生成预览缩略图

程序对文件的读写没问题,但是部分图片可以生成预览缩略图,部分图片不可以生成缩略图,只能以文件图标预览显示,可以通过增大“缩略图处理的原始图片最大像素”来解决。修改index.php文件下面选项:

缩略图处理的原始图片最大像素,图片高x宽,此处为6000万像素
'image_resize_max_pixels' => 60000000

像素设置过大会导致php占用过多内存,建议同步设置php内存大小为256、512或者1024MB
'image_resize_memory_limit' => 1024


“一花一世界,一叶一天堂。君掌盛无边,刹那成永恒。”