群辉NAS上利用Docker快速部署兰空图床Lsky Pro
1. 为什么选择在群辉NAS上部署兰空图床
作为一个长期使用群辉NAS的玩家,我发现用它来搭建个人图床简直是绝配。你可能要问:为什么非要折腾这个?直接用现成的云存储不香吗?让我告诉你几个真实的使用场景。
上周我写技术博客时,需要插入30多张截图。如果每张都手动上传到第三方图床,光是来回切换页面就够烦人的。更别提有些平台还会压缩图片质量,或者突然限制外链。而用自己搭建的兰空图床,可以直接拖拽上传,自动生成Markdown链接,整个过程行云流水。
数据自主权是另一个关键因素。去年某知名图床服务突然关闭,导致大量技术博客出现图片失效的问题。把图片存在自己的NAS上,配合定期备份策略,完全不用担心这类风险。实测下来,我的DS220+在同时处理图床请求和常规文件服务时,CPU占用率基本没超过30%。
说到性能表现,这里有个对比数据:同样上传10张2MB的图片,通过公网图床平均耗时12秒,而本地NAS图床仅需3秒。特别是在内网环境下,几乎感觉不到延迟。对于经常需要处理大量图片的自媒体创作者来说,这个效率提升非常可观。
2. 部署前的准备工作
2.1 硬件与系统要求
我的DS220+配备的是双核J4025处理器和6GB内存(官方标配2GB,我自己升级了)。实测运行Lsky Pro图床加上MySQL数据库,日常内存占用约1.2GB。建议至少预留2GB内存给这个服务,特别是如果你打算同时运行其他Docker应用。
存储空间方面要特别注意:图片文件会直接占用NAS容量。我的方案是在docker目录下单独挂载一个4TB的存储池,专门用于存放图床数据。这样即使图床文件增长,也不会影响系统盘的空间使用。
2.2 权限配置实战技巧
很多新手容易在权限设置上栽跟头。我刚开始部署时就遇到过容器启动失败的问题,后来发现是子文件夹权限没继承。正确的做法是:
# 通过SSH登录NAS后执行
chmod -R 777 /volume1/docker/图床
chown -R 1026:100 /volume1/docker/图床
这个命令中的1026是容器内www-data用户的UID,100是users组的GID。不同型号的群辉可能略有差异,可以通过以下命令查看具体值:
docker exec -it Lsky-por id www-data
3. 两种部署方案详解
3.1 Docker Compose方案全流程
先来看我的标准部署流程。在群辉的File Station中创建好目录结构后,打开Container Manager(旧版叫Docker),切换到"项目"标签页。点击新增,选择"从docker-compose.yml创建"。
这里有个小技巧:我习惯先用记事本写好配置文件,然后通过"上传"按钮导入。这样可以避免在网页编辑器里手打出错。下面是我优化过的compose文件,增加了健康检查和资源限制:
version: '3.8'
services:
lsky-pro:
image: halcyonazure/lsky-pro-docker:latest
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8089"]
interval: 30s
timeout: 10s
retries: 3
deploy:
resources:
limits:
memory: 1G
volumes:
- /volume1/docker/图床/Lsky-por:/var/www/html
ports:
- "8000:8089"
depends_on:
mysql-lsky:
condition: service_healthy
mysql-lsky:
image: mysql:5.7.22
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 20s
timeout: 5s
retries: 5
environment:
MYSQL_ROOT_PASSWORD: your_strong_password
MYSQL_DATABASE: lsky_pro
volumes:
- /volume1/docker/图床/mysql/data:/var/lib/mysql
- /volume1/docker/图床/mysql/conf:/etc/mysql/conf.d
这个配置有几个改进点:
- 增加了内存限制,防止单个容器占用过多资源
- 设置了健康检查,确保服务完全就绪才会启动依赖项
- 使用了更新的Compose语法版本(3.8)
3.2 数据库配置的坑与解决方案
MySQL容器启动后,经常遇到字符集问题导致图床报错。我的解决方法是提前在/volume1/docker/图床/mysql/conf下创建my.cnf文件:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
这样能确保数据库默认使用utf8mb4编码,完美支持emoji等特殊字符。曾经有用户反馈上传包含emoji文件名的图片失败,就是这个原因。
4. 初始化配置与优化
4.1 网页安装向导实操
当容器启动完成后,在浏览器访问http://你的NAS_IP:8000会看到安装界面。在数据库配置环节,有几个关键参数容易填错:
- 数据库地址:应该填容器名
mysql-lsky,而不是localhost - 数据库名:填写compose文件中定义的
lsky_pro - 端口保持默认3306不变
这里有个细节:群辉的防火墙可能会阻止8000端口访问。需要到"控制面板 > 安全性 > 防火墙"里添加规则。我建议直接创建一个应用规则,选择"Docker"应用,这样后续新增的容器端口都会自动放行。
4.2 性能调优实战
安装完成后,默认配置可能无法满足高并发需求。我通过修改/volume1/docker/图床/Lsky-por/.env文件提升了性能:
APP_ENV=production
APP_DEBUG=false
CACHE_DRIVER=redis
QUEUE_CONNECTION=redis
SESSION_DRIVER=redis
SESSION_LIFETIME=120
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
要实现这个配置,需要额外部署Redis容器。考虑到篇幅限制,这里不展开说明,有兴趣的可以参考官方文档。改用Redis后,我的图床响应时间从平均800ms降到了300ms左右。
5. 日常使用与维护
5.1 备份策略设计
图床数据安全至关重要。我设置了双重备份方案:
- 使用群辉自带的Hyper Backup,每天凌晨2点增量备份整个/volume1/docker/图床目录到外接硬盘
- 每周日通过Cloud Sync将图片文件夹同步到加密的云存储
这里特别提醒:MySQL的备份不能简单复制数据文件。正确做法是使用mysqldump:
docker exec Lsky-por-mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" lsky_pro' > /volume1/backup/lsky_pro_$(date +%Y%m%d).sql
5.2 常见故障排查
遇到最多的问题是上传图片失败,通常有以下几种情况:
- 权限问题:检查/volume1/docker/图床/Lsky-por/storage目录是否有写入权限
- 大小限制:默认只允许10MB以下文件,修改php.ini中的配置:
upload_max_filesize = 50M post_max_size = 55M - 内存不足:在Container Manager中调整容器的内存限制
最近遇到一个棘手案例:用户上传大量图片后,图床变得异常缓慢。最后发现是没清理临时文件导致的。现在我会定期执行维护脚本:
docker exec Lsky-por php artisan cache:clear
docker exec Lsky-por php artisan view:clear
6. 进阶玩法与扩展
6.1 域名与HTTPS配置
要让外网安全访问图床,建议配置反向代理。群辉自带的Application Portal就很好用:
- 控制面板 > 应用程序门户 > 反向代理
- 添加规则,将你的域名(如pic.yourdomain.com)指向localhost:8000
- 在证书页面申请Let's Encrypt免费证书
记得修改Lsky Pro的配置,在AppServiceProvider.php中添加:
public function boot()
{
if(config('app.env') === 'production') {
\URL::forceScheme('https');
}
}
6.2 插件与主题定制
兰空图床支持插件扩展。我安装了几个实用插件:
- 水印插件:自动为上传图片添加版权信息
- WebP转换插件:自动将PNG/JPG转为更小的WebP格式
- 防盗链插件:限制非授权网站引用图片
修改主题也很简单,只需替换resources/views下的模板文件。我把自己博客的配色方案移植过来,前后只花了半小时。
更多推荐
所有评论(0)