适用:群晖 DSM 7.x + Container Manager(原 Docker)
方案:MariaDB 双容器(推荐,多用户/长期使用)
镜像:<code>halcyonazure/lsky-pro-docker:latest</code>(社区镜像,开源版官方无 Docker 镜像)
一、前置确认(动手前必看)
| 检查项 | 怎么查 | 结论 |
|---|---|---|
| CPU 架构 | 控制面板 → 信息中心 → CPU 型号 | Intel/AMD = x86(可用本方案);Realtek/Marvell = ARM,需换 <code>daitcl/lsky-pro</code> |
| 8089 端口占用 | Container Manager 提示 / SSH <code>netstat -tlnp \| grep 8089</code> | 被占就改左侧宿主机端口,如 <code>9089:8089</code> |
| 数据目录 | File Station 新建 | 必须是空文件夹 |
镜像要点(决定你怎么填端口):
- 容器内 Apache 监听端口由 <code>WEB_PORT</code> 控制,默认 8089;
- 程序目录 <code>/var/www/html</code>;
- 端口映射右侧必须等于 <code>WEB_PORT</code>,否则页面打不开。
二、目录与权限准备(权限是 90% 故障根源)
- File Station 新建:
/volume1/docker/lsky-pro/ ├── web/ # Lsky 程序 + 上传的图片 └── db/ # MariaDB 数据(方案 B 才需要) - 设置权限(关键):右键 <code>lsky-pro</code> → 属性 → 权限 → <code>Everyone</code> 设为可读写 →
勾选「应用到这个文件夹、子文件夹及文件」。
或 SSH 执行:sudo chmod -R 777 /volume1/docker/lsky-pro

⚠️ MariaDB 容器内以 uid 999(mysql 用户) 运行。若挂载目录属主是 root/admin,
容器内无写权限 → 无法初始化系统表 → 启动失败 → 无限重启(crash loop)。
三、方案选择
方案 A:SQLite 单容器(个人自用,最省事)
version: "3"
services:
lsky-pro:
image: halcyonazure/lsky-pro-docker:latest
container_name: lsky-pro
restart: unless-stopped
ports:
- "8089:8089" # 左=群晖端口(可改);右必须等于 WEB_PORT
environment:
TZ: Asia/Shanghai
WEB_PORT: 8089
volumes:
- /volume1/docker/lsky-pro/web:/var/www/html
安装时数据库选 SQLite,数据库文件自动落在 <code>/var/www/html/database/</code>。
方案 B:MariaDB 双容器(推荐)
version: "3.8"
services:
lsky-pro:
image: halcyonazure/lsky-pro-docker:latest
container_name: lsky-pro
restart: unless-stopped
depends_on:
- mariadb # 列表形式,不带 condition
environment:
TZ: Asia/Shanghai
WEB_PORT: 8089
ports:
- "8089:8089"
volumes:
- ./app:/var/www/html
networks:
- lsky-net
mariadb:
image: mariadb:10.11
container_name: lsky-pro-db
restart: unless-stopped
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
TZ: Asia/Shanghai
MARIADB_ROOT_PASSWORD: LskyRoot@2024 # 自行修改
MARIADB_DATABASE: lskypro
MARIADB_USER: lskypro
MARIADB_PASSWORD: LskyDb@2024 # 自行修改
volumes:
- ./data:/var/lib/mysql
networks:
- lsky-net
healthcheck: # 用 condition 时必须配
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 10
start_period: 30s
networks:
lsky-net:
driver: bridge
若镜像无 <code>healthcheck.sh</code>,改用:
<code>test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u root -p$$MARIADB_ROOT_PASSWORD –silent"]</code>
(<code>$$</code> 是 Compose 转义,进容器后变 <code>$</code>)

四、Container Manager 部署步骤
- Container Manager → 左侧「项目」→ 新增
- 项目名称 <code>lsky-pro</code>;路径选 <code>/volume1/docker/lsky-pro</code>
- 源:选「创建 docker-compose.yml」,粘贴上面的 yaml
- 下一步 → 完成(自动拉镜像并构建)
- 等 <code>lsky-pro-db</code> 状态变 Up/healthy,日志出现
<code>[Note] mysqld: ready for connections.</code>(首次初始化 30~60 秒) - 浏览器打开 <code>http://群晖IP:8089</code> 进入安装向导
五、安装向导填参(最容易填错的一步)
| 字段 | 正确填法 | 说明 |
|---|---|---|
| 数据库类型 | MySQL 5.7+ | MariaDB 10.11 兼容 MySQL 协议 |
| 数据库地址 | <code>lsky-pro-db</code> | ⚠️ 填容器名!不能填 127.0.0.1 / localhost / 群晖IP |
| 数据库端口 | <code>3306</code> | 容器间走内部端口 |
| 数据库名 | <code>lskypro</code> | 对应 <code>MARIADB_DATABASE</code> |
| 用户名 | <code>lskypro</code> | 对应 <code>MARIADB_USER</code> |
| 密码 | 对应 <code>MARIADB_PASSWORD</code> | 不是 root 密码 |
| 表前缀 | 留空 | |
| 管理员邮箱/密码 | 自设 | Lsky 后台登录用,与数据库无关 |
为什么不能填 127.0.0.1:在 lsky-pro 容器里 <code>127.0.0.1</code> 指向它自己,
它只有 Apache+PHP,没有 MySQL → 必报 <code>SQLSTATE[HY000] [2002] Connection refused</code>。

六、装完必做
- 存储策略 → 默认本地策略 → 编辑 → 访问地址 改成实际访问地址
(<code>http://群晖IP:8089</code> 或反代域名),否则图片链接前缀错误 → 图片 404。 - 自用建议:用户 → 关闭「允许注册」;角色组 → 关闭「游客上传」。
我是在旁路由中使用Lucky管理反代
七、排错速查表
| 现象 | 原因 / 解决 |
|---|---|
| <code>dependency failed … has no healthcheck configured</code> | 用了 <code>condition: service_healthy</code> 但被依赖服务无 healthcheck → 补 healthcheck,或 <code>depends_on</code> 改成列表形式 <code>- mariadb</code> |
| db 容器无限重启、日志卡在引导说明 | 目录权限 → <code>sudo chown -R 999:999 /volume1/docker/lsky-pro/db</code> |
| 权限改了仍起不来 | 清空半初始化残留:<code>sudo rm -rf /volume1/docker/lsky-pro/db/*</code> 后重启 |
| <code>Connection refused</code> | 数据库地址填错(应为容器名 <code>lsky-pro-db</code>) |
| 容器反复重启 / permission denied | 目录权限不足 → Everyone 可读写 |
| 页面 404/空白 | <code>web</code> 目录不是空的 → 清空后重建项目 |
| 图片上传后打不开 | 存储策略「访问地址」未改 |
| 大图上传失败 | 容器 PHP 限制 → 调 <code>upload_max_filesize</code> / <code>post_max_size</code> |
| 反代 HTTPS 后样式异常 | 反代加 <code>X-Forwarded-Proto: https</code>;或容器内执行 <code>sed -i "32 a \\\Illuminate\\Support\\Facades\\URL::forceScheme('https');" /var/www/html/app/Providers/AppServiceProvider.php</code> |
| ARM 群晖 | 换 <code>daitcl/lsky-pro:latest</code>(支持 amd64/arm64) |
| 镜像拉不动 | 换 <code>dko0/lsky-pro</code>(卷 <code>/var/www/html</code>,容器端口 80,映射写 <code>"8089:80"</code> 并去掉 <code>WEB_PORT</code>) |
八、核心三句话
- 空目录(首次启动要初始化程序)
- 给权限(Everyone 可读写 / MariaDB 目录 <code>chown 999:999</code>)
- 端口右侧 = <code>WEB_PORT</code>,数据库地址填容器名