FreeNAS / TrueNAS / FreeBSD 安装 Lychee 荔枝相册保姆级教程,一站式备份、管理、浏览照片(可能是全网首发)

可能是全网第一篇 FreeNAS / TureNAS / FreeBSD 安装Lychee 荔枝相册的教程,保姆级手把手教你安装!

 

Lychee 荔枝相册介绍

官网:https://lycheeorg.github.io/

Lychee 荔枝相册是一个开源的、可以安装在任何系统中(只要这个系统可以安装 mysql、nginx 或 apache、php)的相册管理软件,瀑布流式的前端布局非常漂亮,运行速度也是相当之快,还拥有账户管理、照片共享、EXIF 信息查看、敏感相册、密码保护、照片地理位置、标签管理等功能,也支持视频格式,可以作为群晖 Photos 的代餐。

把 Lychee 安装在 NAS 中,配合其他备份软件,可以直接代替各大手机厂商提供的收费的照片云备份功能,而且数据还都在自己的 NAS 中,这无疑也是更安全的。

Tips: 写完后才发现 danb35 写过一键安装的脚本,无独有偶,当初我花了两天好不容易手动安装上的 plex(这篇文章还在鸽着呢......),这位大神也写过脚本。你可以直接访问 https://github.com/danb35/freenas-iocage-lychee 来尝试使用其脚本一键安装。

 

前言

1. 本文写的比较啰嗦,毕竟是自己一点点摸索爬坑过来的,把过程中遇到的问题、思考过程都写了进来。需要特别注意的点我都会加粗提示,其他文字可以一带而过。事实上,顺利的话,整体安装时间不超过10分钟。请放心食用。

2. 如果你不是很在意过程,可以查看这篇纯操作版本:,除了新建 Jail、挂载目录等操作以外,其他操作一气呵成完成安装。

 

一、创建 Jail,创建并挂载数据库目录

1. 创建数据库目录

我们需要创建两个目录,一个用来存放 Lychee 的数据库文件,一个用来存放照片,如果你之前在 NAS 中已经存储了不少照片,那么可以直接使用之前存储的路径。

点击存储、池、添加数据集:

 

 输入数据集名称,其他均保持默认,点击保存即可:

 

 在新建的数据集上,点击编辑权限:

 

 把用户和群组都改为 mysql 用户,并且勾选 Apply User 和 Apply Group,点击保存:

(如果你的系统里还没有 mysql 用户,去账户、用户中添加即可)

 

然后再在这个数据集上创建子数据集,命名为 lychee,同样授予 mysql 权限。

而存放照片的路径的创建,操作方法与上相同,如果你之前已经有了存放照片的数据集,则可以直接使用,不需要再创建。

需要注意的是,你需要保证 www 用户可以读写你存放照片的数据集。我的建议是直接和上图一样,把存放照片数据集的用户和群组都修改为 www。

 

2. 创建 Jail

请参考本博客 FreeNAS / TrueNAS 创建 Jails 及 Jails 初始优化教程 创建 Jail,注意要手动设置 IP 地址。

 

3. 挂载数据库目录

点击 Jail,点击停止,等待关机完成后,点击挂载点:

 

 右上角点击动作、添加:

 

 源处选择刚才我们创建的数据库的子数据集 lychee 的路径,目标处我们直接输入 /var/db/mysql

 

 

同样的方法,把存储照片的数据集挂载到 /usr/local/www/lychee/public/uploads/import 中。请记住这个路径,之后安装 Lychee 时请和这个路径保持一致。

这一步操作的原因如下:

  • Lychee 数据库的保存位置在:/var/db/mysql 中。我们把这个路径挂载到外部数据集,就可以做到即便删除 Jail,数据库也还在,方便备份、恢复、重装 Jail;

  • Lychee 照片保存位置在:/usr/local/www/public/uploads/big 中,但 Lychee 并不会自动扫描你路径中已有的照片。为了解决这个问题,Lychee 提供了导入功能,将照片放在 /usr/local/www/public/uploads/import 中,点击 “从服务器导入” 即可导入之前的照片。这个路径不是必须的,如果你想从其他地方导入也可以,只是需要多输入一步导入路径,而 import 目录为默认导入目录;

  • 请务必注意:Lychee 会把上传或导入的照片原始文件重命名为乱码,而 Lychee 中则还会显示照片原文件名。关于这一点的考虑以及应对措施,请见本文最后的使用章节。

  - 鉴于第一点已解决,这里解决方案为:

  - 把 upload、dist 目录整体移动到外部目录中;

  - 在 public 目录下,创建 upload、dist 软连接:ln -sfn /mnt/xxx/lychee/dist dist

  - 直接把所有照片存在外部目录的 upload/import 内

  - 重启 php、nginx 服务,点击从服务器导入,勾选 symbolic links ,等待完成即可。

  - 在外部目录创建一个/db/mysql/lychee 路径,并挂载到 /var/db/mysql ,来解决数据库存在外部的问题。

  - uploads 目录也可以通过这个方式解决,直接把外部存放照片的目录挂载到 /uploads/import 中,再点击导入即可。

这个方案同时解决了以下问题:

  - 数据库、照片均存储在外部;

  - 日后可以自动识别 import 中的新照片(目前已知手动点击导入,勾选 skip duplicates 即可,自动扫描的方案待探索);

  - 避免了 Lychee 会把照片重命名为乱码的问题,你的原照片仍然是以原文件名存放在 import 目录中。

这个方案存在的问题是:

  - 由于是链接导入的方式,在 Lychee 中删除照片并不会实际删除照片本身,而只是删除掉链接、缩略图、以及数据库中的一些记录。

  - 这个问题可以通过导入时不勾选 symbolic links,并且勾选 “删除原始图像” 解决。这样就是直接把原照片以乱码形式存储在了 Lychee 中。我个人认为,如果日后想使用 Lychee 来管理照片的话,就选择这种方案,毕竟你上传进去的照片始终都会乱码,不可能永远使用导入功能,那也太麻烦了。如果你只是想使用 Lychee 来作为照片浏览和展示,那么你可以不用管原始照片是否被删除了这回事,你想删除的时候,直接去删除原始照片即可,Lychee 中会自然的因为链接源丢失,看不到这张照片。

 

 

二、安装

1. 安装 nginx、mysql 数据库、ffmpeg、git

打开 Jail,打开 MobaXterm,远程登录至 Jail。


pkg install nginx ca_root_nss mariadb104-server ffmpeg git # 注:本文未配置 HTTPS,安装 ca_root_nss 是为日后上 HTTPS 做准备,你也可以不安装。
# 设置 nginx、mysql 开机启动
sysrc nginx_enable=yes
sysrc mysql_enable=yes

 

2. 安装 php

Lychee V4 要求 PHP 8.0 以上版本,且需要诸多扩展,详见官方 Wiki:https://lycheeorg.github.io/docs/#server-requirements 。鉴于 PHP 8.1 尚未支持部分扩展,我们选择 PHP 8.0 安装。

请注意此处有个巨坑,官方 Wiki 列出的扩展不全[1],如果只安装这些扩展,会在后续遇到一连串难以解决的问题,我在这里花了两天的时间趟坑,才算是终于摸清楚所有需要安装的扩展。例如:

1. 官方 Wiki 并未要求 simplexml、dom、zlib 扩展,但若不安装,会导致 composer (后续会用到的一个程序)无法正常运行。

2. 未被列出的 session,会导致你反反复复的遇到 404、403 错误,而一般来说这俩错误我们只会怀疑自己的网页代理程序配置错了,于是不断的修改 nginx.conf,怎么改都无法解决问题。在这里我花了整整一天,最终确认是未安装 session 导致。

3. Wiki 虽然声称你在内置 sqlite3、mysql 等数据库中选择其一即可,但事实上 sqlite3 是必须安装的,否则主程序的安装就会失败;而如果你选择了 mysql,那么恭喜你,还有 mysqli、pdo_mysql 这两项未列出的扩展需要安装,否则你就会跟我一样遇到一个极其迷惑的问题:安装页面(共5页)永远停留在第 4 页,每当点击下一页,又会回到第 1 页。


pkg install php80 php80-bcmath php80-ctype php80-exif php80-fileinfo php80-gd php80-mbstring php80-openssl php80-pdo php80-tokenizer php80-xml php80-zip php80-pecl-imagick php80-phar php80-filter php80-zlib php80-simplexml php80-dom php80-session php80-sqlite3 php80-mysqli php80-pdo_mysql
# 设置 php 开机启动
sysrc php_fpm_enable=yes

 

3. 安装 composer


cd ~
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer

 

4. 获取 Lychee 文件

我真的万万没想到,获取一个开源项目文件,这么简单的一步也能有坑[2]。我大概花了几个小时的时间吧,一直在怀疑自己命令错了,还研究了很久 composer 官方文档,始终不解。

原来,是我惯性思维了,上来就从 release 中下载 zip 文件,然后解压,使用 composer 安装。一开始 composer 有报错信息,还是坑 1 导致的,补齐扩展后没有报错了,但就是进不去网页,甚至访问 index.php 是直接下载下来的。我甚至在怀疑 composer 最后的那一句 “74 packages you are using are looking for funding” 是在说我有74个包还没 “fund” 好,需要重新 “fund”,然后运行 “composer fund” 陷入漫长的等待......(事实上这句话是在说这些插件开通了捐赠通道,你可以去捐赠支持)

就在我百思不得其解的时候,无意间瞥见了我一直选择性忽略的两句报错:”./git path doesn't exist“、”./hook path doesn't exist“,我始终觉得这不是个事儿,仔细一琢磨吧,害!我应该用 git clone 克隆下来整个仓库源码,而不是使用 release 中的压缩包![2]


cd /usr/local/www/lychee
git clone https://hub.fastgit.xyz/LycheeOrg/Lychee.git tmp
# 注1:git clone 我使用了日本源,国内直连速度较快,若你访问 github 无阻,可直接使用原版源:https://github.com/LycheeOrg/Lychee.git
# 注2:以上网站目录可以自己修改,一般来说是放在 /usr/local/www/下面。请尽量不要放在 nginx 根目录下。
mv -f tmp/* .
mv -f tmp/.* .
mv -f tmp/public/* public/
mv -f tmp/public/.* public/
mv -f tmp/public/uploads/* public/uploads/
mv -f tmp/public/uploads/import/* public/uploads/import/
rm -R tmp

 

5. 调整 nginx.conf

这也是坑巨多的一步,我差不多花了一下午的时间来解决。最开始,我完全信任并按照 Wiki 中给出的 nginx 配置模板来配置:https://lycheeorg.github.io/docs/installation.html#nginx ,稍微修改一些适合自己系统实际情况的选项,但无奈始终在 403、404、file not found、拒绝连接这四个报错页面中徘徊。

其中,有 session 扩展未安装的坑,填了这个坑以后还是会有这三个问题,于是我又完全按照自己的理解来写配置文件,仍然是在这四个报错页面中徘徊。期间不断用 /var/log/nginx 中的日志来排错,一点点对照自己的配置和官方的配置,一行一行控制变量的来改,最终确认了两个巨坑:

1. index 项必须指定。一开始我就很疑惑,官方配置文档中没有写 index 项,我还以为是什么新特性,可以不用写了,但事实证明还是必须的。[3]

2. DocumentRoot 变量须替换成实际的绝对路径。[4]

以下是我摸索出来的正确配置文件,里面注释较多,直接复制会出现乱码,如需直接复制,请看后面一份无注释版。


cd /usr/local/etc/nginx
cp nginx.conf nginx.conf.backup # 以免万一,备份一份默认配置文件
nano nginx.conf # 改动 server 即可,下面没列出的项目可以直接注释掉或删掉。你可以直接复制我的配置文件,但请注意含有注释的项目,可能需要修改。
 server {
    listen        80; # 端口可以自己修改
    server_name  localhost; # 如果你有域名的话,可以改成你的域名
    root         /usr/local/www/lychee/public/;
    index        index.php;
    if (!-e $request_filename) # 必须开启 rewrite,否则会遇到 找不到 ../public/install 的报错,再次陷入 403、404 循环。[5]
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }
    location = /index.php {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param HTTP_PROXY ""; # 建议开启,用于缓解 https://httpoxy.org/ 漏洞
        fastcgi_pass 127.0.0.1:9000; # 这一项默认为此,若你需要修改为 ../php-fpm.sock,则请在 php 的 www.conf 中修改对应配置。
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/www/lychee/public$fastcgi_script_name; # 请务必将此处绝对路径替换为第四步你 clone 到的路径,如果你使用了跟我一样的 clone 命令,这里可以不用修改。
        fastcgi_param PHP_VALUE "post_max_size=10240M # 以下这些限制请根据自己服务器的实际情况修改
            max_execution_time=200
            upload_max_filesize=10240M
            memory_limit=1024M";
        fastcgi_param PATH /usr/local/bin:/usr/bin:/bin;
        include fastcgi_params;
    }
    error_log  /var/log/nginx/lychee.error.log;
    access_log /var/log/nginx/lychee.access.log;
    rewrite ^/(.+)/$ /$1 permanent;
    location ~ [^/]\.php(/|$) {
        return 403;
    }
}

 

无注释版:

 

server {
    listen       80;
    server_name  localhost;
    root         /usr/local/www/lychee/public/;
    index        index.php;
    if (!-e $request_filename)
    {
        rewrite ^/(.*)$ /index.php?/$1 last;
        break;
    }
    location = /index.php {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_param HTTP_PROXY "";
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/www/lychee/public$fastcgi_script_name;
        fastcgi_param PHP_VALUE "post_max_size=10240M
            max_execution_time=200
            upload_max_filesize=10240M
            memory_limit=1024M";
        fastcgi_param PATH /usr/local/bin:/usr/bin:/bin;
        include fastcgi_params;
    }
    error_log  /var/log/nginx/lychee.error.log;
    access_log /var/log/nginx/lychee.access.log;
    rewrite ^/(.+)/$ /$1 permanent;
    location ~ [^/]\.php(/|$) {
        return 403;
    }
}

 

  

 

 

6. 使用 composer 安装依赖文件

这里的坑在第四点讲过了,不废话,开始安装。


cd /usr/local/www/lychee # 同上,请确保进入你 clone 到的路径
composer install --no-dev # 你也可以不选择 --no-dev 参数——如果你打算二次开发的话。这样还需要补充一些 php 扩展,相信需要二次开发的你不需要我多说了。
# 上面这一步会等待较久,全部结束后应没有红色报错(error)信息。

 

7. 调整 php 配置文件

这一步算是最神清气爽的一步,经历了 nginx.conf 折磨的几小时后,php 的配置文件居然没有坑!

我们需要修改两个文件,均在下方列出:


cd /usr/local/etc
cp php.ini-production php.ini # 复制一份生产环境的配置文件
nano php.ini # 推荐使用 MobaXterm 或其他带有文件管理的远程 SSH 软件来修改,因为这个文件实在是太长了。
# 取消以下条目开头的 ; 注释,并修改数值如下:
cgi.fix_pathinfo=1
date.timezone ="Asia/Shanghai"
memory_limit = 1024M # 根据自己服务器实际情况修改
post_max_size = 10240M # 同上
upload_max_filesize = 10240M # 同上
cd /usr/local/etc/php-fpm.d
nano www.conf 
# 取消注释:
clear_env = no
# 可选:据说使用 xxx.sock 来监听,比默认的 9000 端口监听速度快。如果你需要的话,可以按如下修改。
listen = /tmp/php-fpm.sock # 请注意,这里修改以后,还需要修改第五步 nginx.conf 中的 fastcgi_pass 为 unix:/tmp/php-fpm.sock
listen.mode=0666 # 用于确保生成的 sock 文件可被 www 用户访问,否则会导致整个 php 服务失效。

 

8. 设置权限

官方给出的建议很谨慎:https://lycheeorg.github.io/docs/installation.html#directory-permissions ,只建议修改个别目录,但我觉得对于自己的私人服务器,直接把整个目录所有者变更为 www 即可。www 用户是 nginx、php-fpm 主进程的执行用户。如果你觉得不安全,也可以按照上述链接手动修改个别目录的权限。


cd /usr/local/www # 确保进入你 clone 到的路径的上一层
chown -R www:www lychee

 

9. 设置数据库

注意记住自己创建的数据库名、用户名即可。要注意的是:

1. 需要修改 sock 文件路径,否则会初始化失败,这个我目前也没研究原因,初步推测是路径权限问题。[6]

2. 数据库密码按照网上的教程来说是要设置的,但我没有遇到,系统提示我已经给 root 用户设置过密码了,无需再设置。虽然我认为这里的密码理应不是 FreeBSD 系统的 root 账号密码,而是数据库管理员的密码,但经过后续的验证确认,还真就是同一个密码。这个无碍,如果你遇到了需要设置密码,设置,然后记住即可,后面会用到。


nano /usr/local/etc/mysql/my.cnf
socket = /tmp/mysql.sock
# 修改完成后保存退出
service mysql-server start
mysql_secure_installation --socket=/tmp/mysql.sock
# 提示全部输 y ,一定要记住自己设置的密码
mysql -u root
CREATE DATABASE lychee; #可以自己修改数据库名,只要自己能记住就行
CREATE USER 'lychee_admin'@'localhost' IDENTIFIED BY '改成刚刚设置的密码';
GRANT ALL ON lychee.* TO 'lychee_admin'@'localhost'; # 这一步是必须的,否则后面的安装引导页面会无法跳转到第五页。[7]
FLUSH PRIVILEGES;
exit

 

10. 安装 Lychee,配置时区、语言、防泄漏信息等环境


cd /usr/local/www/lychee # 确保进入你 clone 到的路径
cp .env.example .env # 复制一份环境配置文件
nano .env # 修改下面列出的项目即可
# DB_OLD_LYCHEE_PREFIX= # 把这一行注释掉
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lychee # 务必注意去掉这里的注释,否则又会遇到坑[7]
DB_USERNAME=lychee_admin # 你刚才设置的用户名是啥,这里就填啥
DB_PASSWORD=11111111111 # 你刚才设置的密码是啥,这里就填啥
TIMEZONE=Asia/Shanghai # 修改完成后保存退出 cd config nano app.php # 修改下面列出的项目即可 'timezone' => env('TIMEZONE', 'Asia/Shanghai'), 'locale' => 'zh-CN', # 拉到最后,中括号内的逗号后,另起一行,然后把下面的配置粘贴进去 /* | When an exception is uncaught and the APP_DEBUG environment variable | is true, the debug page will show all environment variables and their | contents. In some cases you may want to obscure certain variables. You | may do this by updating the debug_blacklist option in your config/app> | configuration file. | Some variables are available in both the environment variables and the | server / request data. Therefore, you may need to blacklist them for > | $_ENV and $_SERVER. */ 'debug_blacklist' => [ '_ENV' => [ 'APP_KEY', 'DB_PASSWORD', ], '_SERVER' => [ 'APP_KEY', 'DB_PASSWORD', ], '_POST' => [ 'password', ], ], # 修改完成后保存退出 cd ..
php artisan key:generate
# 为确保权限无误。最好在这时候检查一遍权限,应当所有文件均为 www 用户和群组拥有。
ll -a

 

11. 安装引导,修复视频缩略图不显示,速度优化

避开了以上 7 个坑以后,这里你应当可以顺利进入安装引导界面了。在此之前让我们启动 nginx 和 php-fpm 服务:


service php-fpm start
service nginx start
# 若你之前已经启动以上服务(按理说不应该启动),则在这里重启
service php-fpm restart
service nginx restart

若在启动服务时有报错信息,则请按照提示检查自己的配置文件,以及查看 /var/log/nginx 中的报错日志来排查问题。启动成功后,打开浏览器访问 http://你的 Jail 的 IP 地址/ 即可进入引导页面。按照页面提示一步步完成校验、安装即可。

如果你在安装完毕后发现视频缩略图无法正常显示,那么需要按照本博客的这篇文章:https://www.cnblogs.com/dabai0030/articles/16067595.html 来修复。

安装完毕后,如果你想进一步提高 Lychee 的响应速度,可调整以下几项:

1.  让 php-fpm 程序使用 sock 文件来监听,而非本地端口。同时修改 www.conf、nginx.conf 中相关参数即可,上文已多次提及。

2.  你还可以适当提高 php 和 nginx 允许使用的内存大小,上文也有提及。

3.  在你确保所有配置均已完毕,无需修改后,可以在 Lychee 项目路径下,使用如下命令加速:

php artisan config:cache

请一定一定要在所有配置都确认配好,满足了自己所有需求,不再折腾以后,再执行,不要在部署过程中执行。这里加速的原理是,把所有相关的配置文件全部都读取出来,然后打包到一个文件里,系统读取时不再去各个地方读取各个文件,而只读取这一个文件,以此来加速程序的加载。

因此,如果你执行了这条命令以后又修改了配置,那么这个配置是不会生效的。当然如果你还是这样做了,可以通过重建缓存来处理:

php artisan config:clear

 

  

三、使用

待补充,我决定全部重新安装一遍,确保教程无问题后,补充截图,然后再来写使用章节。

 

四、一些仍待填的坑

 

期间再次补充安装 php80-xmlwriter 扩展(不确定是否必须)

 

 

四、参考资料

感谢 Lychee 的作者以及所有贡献者们。我已根据本文中因官方 Wiki 有误或不完整导致的坑,修改 Wiki 并提交了 pull request。

感谢以下作者的原创内容,为我的此次趟坑之旅提供了无数次绝望中的希望,同样也希望阅读本文的你在安装 Lychee 时遇到了本文未提到的问题,可以通过以下链接解决:

原创内容 

坑位

作者

备注

https://github.com/LycheeOrg/Lychee

NA

https://github.com/LycheeOrg

Lychee 4 项目开发者

https://github.com/LycheeOrg/Lychee/issues/760

[5]

https://github.com/pa810p

感谢提问者!好的提问(不重复、描述清楚、及时回复)也是优秀的产出

https://www.cnblogs.com/php48/p/8763550.html 

NA

https://home.cnblogs.com/u/php48/

虽然没有解决坑位,但在排查 nginx.conf 时,提供了非常大的帮助。

https://ywnz.com/linuxysjk/4467.html

[7]

戴均益

 

https://blog.csdn.net/hao_ds/article/details/85319377

[7]

https://blog.csdn.net/hao_ds

 

https://stackoverflow.com/a/19302688 

[3]

https://stackoverflow.com/users/470749/ryan

 

https://stackoverflow.com/a/38814605 

[1]

https://stackoverflow.com/users/6688048/shirinkin-denis

 

https://post.smzdm.com/p/a3g7vmlr/

[6]

https://zhiyou.smzdm.com/member/6001038624/

 

https://blog.csdn.net/ichen820/article/details/117520360 

[4]

https://blog.csdn.net/ichen820

 

https://github.com/LycheeOrg/Lychee/issues/866

https://lycheeorg.github.io/docs/faq.html#why-dont-my-videos-have-thumbnails

 

 

共同解决了视频缩略图问题

posted @ 2022-03-26 20:49  大白0030  阅读(9908)  评论(1编辑  收藏  举报