搭建图床 切换本站图片至自建服务

家宽环境搭建兰空图床实践过程记录分享; 结合ffmpeg抽帧和Synology Photos分享特定照片库

有什么用/怎么用

  • 自建图床,自用的情况下暂时是够用的
  • 群晖 Synology Photos, 备份各个手机中的照片
  • ffmpeg抽帧实践

访问:Carl Notes 图床

登录后台管理图床中的图片内容等操作

相关内容

实现方法

Docker搭建Lsky Pro图床应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker pull dko0/lsky-pro

docker run --name lsky-pro --restart always -p 8091:80 -d -v /volume2/KingchuxingSSD512G/MacBookPro_Skitch:/var/www/html dko0/lsky-pro

#转化为docker-compose
version: '3.9'
services:
lsky-pro:
image: dko0/lsky-pro
volumes:
- '/volume2/KingchuxingSSD512G/MacBookPro_Skitch:/var/www/html'
ports:
- '8091:80'
restart: always
container_name: lsky-pro

配置PicGO

下载并安装PicGo,Mac OS X:[PicGo-2.4.0-beta.6-x64.dmg](https://github.com/Molunerfinn/PicGo/releases
https://picgo-release.molunerfinn.com/2.4.0-beta.6/PicGo-2.4.0-beta.6-x64.dmg)

打开主界面/窗口,插件设置,搜索并安装插件名:lankong (我下载的版本是:lankong 1.1.3)

图床配置 》 lankong

1
2
3
Lsky Pro Version: V2
Server: https://img.carlzeng.com:3
Auth token: Bearer 1|ZRZcNz1E6hAuyV4LytmCqmGx5yST0g9OyhdptXXX

获取 Lsky Pro 兰空图床的Auth Token的方式,推荐(Terminal 运行命令):

1
2
3
curl --location --request POST 'https://img.testimgserver.com:3/api/v1/tokens' \
--form 'email="email@email.com"' \
--form 'password="password"'

请修改一下URL地址为访问自建兰空图床的URL地址,email和密码为登录图传所使用的用户名和密码

本章节参见:https://github.com/hellodk34/picgo-plugin-lankong

测试:将文件拖拽到此处,或 点击上传,然后到兰空图床的URL后台,确认图片已上传至系统中

20241031 更新token, 设置, 上传成功. 但获取的url地址仍然是旧的域名, 导致图片不可浏览

image-20241031090820585

配置Typora

设置 偏好设置

  1. 切换Typora到中文语言版(因为目前只有中文版有PicGo的选项)

  2. 偏好设置 》 图像 〉上传服务设定。 选择:PicGo.app

  3. 然后点击:验证图片上传选项

    我的设置第一次显示失败了,按提示的信息查看日志:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ------Error Stack Begin------
    Error: You must be logged in to use.
    at Object.We [as handle] (/Applications/PicGo.app/Contents/Resources/app.asar/node_modules/picgo/dist/index.cjs.js:1:21399)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async je.doUpload (/Applications/PicGo.app/Contents/Resources/app.asar/node_modules/picgo/dist/index.cjs.js:1:19834)
    at async je.start (/Applications/PicGo.app/Contents/Resources/app.asar/node_modules/picgo/dist/index.cjs.js:1:18605)
    at async $t.upload (/Applications/PicGo.app/Contents/Resources/app.asar/node_modules/picgo/dist/index.cjs.js:1:74902)
    at async Object.upload (/Applications/PicGo.app/Contents/Resources/app.asar/index.js:2:686906)
    at async hr (/Applications/PicGo.app/Contents/Resources/app.asar/index.js:2:689655)
    at async /Applications/PicGo.app/Contents/Resources/app.asar/index.js:2:690736
    -------Error Stack End-------
    2024-02-21 13:37:13 [PicGo INFO] [PicGo Server] upload result
    2024-02-21 13:37:13 [PicGo WARN] [PicGo Server] upload failed, see picgo.log for more detail ↑
  4. 复制一张图片到剪贴板,在某个文章的内容中,粘贴图片;鼠标右键选中图片,上传图片

  5. 这时PicGo会显示待上传的图片,以及上传进度,直到图片被自动上传到图床中

  6. 全流程结束

本章节可以参见:Upload Images

关联Alist的目录

这是根据个人自身的使用情况做的拓展,分享出图床中的所有图片

修改docker-compose.yml, 添加映射:

  • /volume2/KingchuxingSSD512G/MacBookPro_Skitch:/home/share10

docker exec -it alist /bin/bash

1
2
mkdir share7 && mkdir share8 && mkdir share9 && mkdir share10 && mkdir shar
e11 && mkdir share12

重启docker-compose

1
2
3
4
5
#这是不会成功的,需要使用docker-compose down 和 up
docker-compose restart

docker-compose down
docker-compose up -d

进入Alist的后台管理,新增 “本机存储”

映射/home/share10 至外观目录:/图床MacBookPro_Skitch

效果如:https://file.carlzeng.com:3/%E5%9B%BE%E5%BA%8AMacBookPro_Skitch/storage/app/uploads/2024/02/21

NPM反代后带端口访问

1、修改/config/app.php (大约在57-60行的地方,修改以下2行内容)

1
2
3
4
5
//原先:
'url' => env('APP_URL', 'http://localhost'),

//新:
'url' => env('APP_URL', 'https://xxxxx.com:4443'),
1
2
3
4
5
//原先:
'asset_url' => env('ASSET_URL', null),

//新:
'asset_url' => env('ASSET_URL', 'https://xxxxx.com:4443'),

请根据自身情况修改https://xxxxx.com:4443为自己的域名和端口。

2、修改 /app/Providers/ApServiceProvider.php 第 32 行下面追加一行:

1
\Illuminate\Support\Facades\URL::forceScheme('https');

如何让游客可以直接查看照片?

用了这么长时间(大半年) 终于发现它的一些弊端:

  • 无法让游客直接浏览到游客组或游客用户的照片, 设计思路是先登录开始的(这一点不够人性化)
  • 无法直接自动加载目录上的照片到图片库里面; 这样就是一直需要有‘上传’的动作
  • 我的图片目录都存放在这个文文件夹下, 根据月份份分割开子文件夹/KingchuxingSSD512G/MacBookPro_Skitch/storage/app/uploads/2024

我需要一个自动读取目录下所有的照片, 然后不管是幻灯片展示,还是如何一张张下拉HTML展示也行的. 类似于图片展示

Synology Photos

发现了以上的那些图床的弊端以后,

查资料翻到photoprism, Lychee, immich, 很喜欢这个风格; 然后想到了群晖NAS也有Photo!

也是超级喜欢的风格, Synology Photos:

登录路径 https://nas.carlzeng.com:4443/?launchApp=SYNO.Foto.Sharing.AppInstance&app_name=SYNO.Foto.Sharing.AppInstance&action=external_login#/signin

设置了一个用户: 13261977480 (去除了NAS的访问权限, 是的, 取消非photo资源的访问)

密码: 1carlzeng.com

设置下个, 获取 /homes 目录的绝对路径:

1
/volume2/homes/13261977480/Photos

然后把ffmpeg抽帧生成的照片放到这个目录, 这样自动就会往这个相册里面增加照片

后台运行(视频流抽帧)命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#每小时1张
nohup ffmpeg -i "rtsp://a:a@192.168.6.126:554" -y -f image2 -r 1/3600 /volume2/homes/13261977480/Photos/camc%03d.jpg 1>/dev/null 2>&1 &

#每半小时1张
nohup ffmpeg -i "rtsp://a:a@192.168.6.126:554" -y -f image2 -r 1/1800 /volume2/homes/13261977480/Photos/camc%03d.jpg 1>/dev/null 2>&1 &

#每15分钟1张
nohup ffmpeg -i "rtsp://a:a@192.168.6.126:554" -y -f image2 -r 1/900 /volume2/homes/13261977480/Photos/camc%03d.jpg 1>/dev/null 2>&1 &

#每10分钟1张
nohup ffmpeg -i "rtsp://a:a@192.168.6.126:554" -y -f image2 -r 1/600 /volume2/homes/13261977480/Photos/camc%03d.jpg 1>/dev/null 2>&1 &

#每5分钟1张
nohup ffmpeg -i "rtsp://a:a@192.168.6.126:554" -y -f image2 -r 1/300 /volume2/homes/13261977480/Photos/camc%03d.jpg 1>/dev/null 2>&1 &

#每3分钟1张, 命名手动修改日期,和第几次启动抽帧,这二者数字相连
nohup ffmpeg -i "rtsp://a:a@192.168.6.211:554" -y -f image2 -r 1/180 /volume2/homes/13261977480/Photos/202409241%03d.jpg 1>/dev/null 2>&1 &

如何退出 nohup 进程

以上的进程运行后, 又是SSH终端会断开(由于长时间不在电脑前 自动断开).

这时无法使用PS命令来查看ffmpeg的进程pid, 从而导致无法kill 掉ffmpeg的 nohup进程.

方法:

打开群晖的web管理界面, 右上角搜索: 任务管理器

点击 ‘进程’ 查看进程明细, 这时(比ps更详细)可以看到后台nohup的ffmpeg的进程pid

在回到SSH的终端, kill 看到的nohup ffmeg进程pid即可.

image-20240926135930307

ffmpeg对视频抽帧时让结果图片文件名带上时间戳

文件名的部分, 目前是 %03d 意思是: 三位数字, 三位递增的数字, 001, 002, 003….

output%Y-%m-%d-%H-%M-%S.jpg 意思是: output年-月-日-时-分-秒

nohup ffmpeg -i “rtsp://a:a@192.168.6.126:554” -y -f image2 -r 1/180 /volume2/homes/13261977480/Photos/camc%Y-%m-%d-%H-%M-%S.jpg 1>/dev/null 2>&1 &

1
2
[image2 @ 0x55bcf2b2d900] The specified filename '/volume2/homes/13261977480/Photos/camc%Y%m%d%H%M%S.png' does
not contain an image sequence pattern or a pattern is invalid.

以上这个方法给文件名添加时间戳, 都是失败了.

FFMPEG输出帧名称问题

FFMPEG是一款开源的跨平台音视频处理工具,可以用于处理音视频文件的编码、解码、转码、剪辑等操作。在使用FFMPEG进行音视频处理时,输出帧名称问题可能是指输出的音视频帧的命名规则或命名方式的问题。

在FFMPEG中,输出帧的命名可以通过设置参数来进行控制。常见的参数包括:

  1. -vf-filter_complex:用于设置视频滤镜,可以通过滤镜参数来修改输出帧的命名方式。
  2. -frames:v:用于设置输出视频的帧数,可以通过设置帧数来控制输出帧的数量。
  3. -ss-t:用于设置视频的起始时间和持续时间,可以通过设置起始时间和持续时间来控制输出帧的时间范围。

转场抽帧

为了更好的生成封面图我们可以通过抽取转场帧来随机一个

1
$ ffmpeg -i input.mp4 -filter:v "select='gt(scene,0.25)'" -vsync vfr -y ./frames/thumbnail_%04d.png
  • select='gt(scene,0.25)': 通过 select 滤镜来筛选场景变化。gt(scene,0.25) 表示筛选出场景变化程度大于0.25的帧。scene是一种场景检测器,它会计算帧与帧之间的差异,当差异超过指定的阈值时,认为发生了场景变化

由于ffmpeg抽取帧并无法按照时间戳来命名,需要手动将ffprobe提取出来的帧时间与抽取帧的图片进行对应重命名。关键帧具体的定义和用途可以参考:
Https://en.wikipedia.org/wiki/Key_frame

下一步:

  1. 设置定时, 仅在特定的时间段开放视频流抽帧
    1. 或者手动输入命令后, 按命令中的特定频率抽帧, 比如每分钟1帧
  2. 上峰顶(时间封顶, 或者数量封顶)
    1. 设置参数, 仅运行到特定的时间点, 就退出(不要无限循环下去)
    2. 设置参数, 仅抽到指定张数的图片, 就退出(不要无限循环下去)
  3. 点击按钮, 自动提交photo的登录form;
    1. 可以吗? 这样避免用户输入的繁琐/冗余动作
  4. 避免 覆盖的机制?
    1. 不重要, 不要覆盖, 最好要一直保留下去
    2. 目前是每次运行都从0开始编号, 这样就覆盖了上一次的文件截图
    3. 手动输上日期就好了, 这样不会被覆盖
    4. 如何让文件名包含动态的时间戳? 目前是动态的递增序号.
      1. [ffmpeg不支持]让文件名包含动态的时间戳
  5. 权限: 去除上传功能
    1. 设置了新的用户组, 设置了配额可仿佛不生效, 依旧可以上传

灵感来源

写了一个适配兰空图床 Lsky Pro 的 PicGo 图片上传插件 picgo-plugin-lankong

静态资源加载失败 #317

https+域名+端口的访问问题,NginxProxyManager反代 #607

树莓派通过Docker部署兰空图床

切换至新域名

navicat16/17 mac版无限重置试用期脚本

1
2
3
4
5
6
7
8

#!/bin/bash
#/usr/libexec/PlistBuddy -c "print" ~/Library/Preferences/com.navicat.NavicatPremium.plist
/usr/libexec/PlistBuddy -c "Delete :014BF4EC24C114BEF46E1587042B3619" ~/Library/Preferences/com.navicat.NavicatPremium.plist
/usr/libexec/PlistBuddy -c "Delete :91F6C435D172C8163E0689D3DAD3F3E9" ~/Library/Preferences/com.navicat.NavicatPremium.plist
/usr/libexec/PlistBuddy -c "Delete :B966DBD409B87EF577C9BBF3363E9614" ~/Library/Preferences/com.navicat.NavicatPremium.plist

rm -rf ~/Library/Application\ Support/PremiumSoft\ CyberTech/Navicat\ CC/Navicat\ Premium/.*

feat: 支持navicat 17

  1. 用navicat打开数据库文件(先备份)然后修改里面的域名所在表: (users 和 strategies策略组)
  2. docker-compose down
  3. 替换新的database.sqlite
  4. docker-compose up -d
  5. 问题依旧: 访问 http://192.168.6.203:8091/login 页面的内部还是链接(CSS, JS)到旧的域名, 导致无法登录, 无法使用UI; (API的访问方式正常)

尝试 删除 installed.lock

失败, 连install页面也是 无法正常执行的…

重新安装docker(已备份数据库 和 上传的所有文件); 更新Docker容器镜像

放弃; 先目前半可用状态

个性化需求沟通 扫客服加V加群: