在群晖NAS上使用Docker部署Rent8出租屋管理系统
📋 系统简介
Rent8是一款基于ThinkPHP8(PHP8)+TDesign(Vue3)开发的现代化出租屋管理系统,功能包括:
- 🏠 房产管理
- 🚪 房间管理
- 💰 账单管理
- 👥 租客档案管理
- 📄 合同管理
本教程将指导您在群晖NAS上使用Docker方式快速部署该系统。
🛠️ 准备工作
硬件要求
- 群晖NAS设备(任何支持Docker的型号)
- 足够的存储空间(建议至少1GB)
软件要求
- 群晖DSM 6.0或更高版本
- Docker套件已安装
- 群晖File Station访问权限
🚀 部署步骤
1. 下载项目文件
方式一:Git克隆
git clone -b V2-dev https://gitee.com/MarcoMaHH/rent8.git方式二:手动下载
从Gitee网站下载ZIP压缩包,然后解压到您的电脑上。
2. 准备项目结构
在本地创建项目目录结构:
# 创建必要的目录
mkdir -p rent8/data/{public/storage,runtime/{session,admin/temp},tempfile,conf}3. 创建Docker配置文件
3.1 创建 Dockerfile
在项目根目录创建 Dockerfile:
# 二开推荐阅读[如何提高项目构建效率](https://developers.weixin.qq.com/miniprogram/dev/wxcloudrun/src/scene/build/speed.html)
# 选择构建用基础镜像(选择原则:在包含所有用到的依赖前提下尽可能体积小)。如需更换,请到[dockerhub官方仓库](https://hub.docker.com/_/php?tab=tags)自行选择后替换。
FROM alpine:3.20
# 容器默认时区为UTC,如需使用上海时间请启用以下时区设置命令
RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
# 使用 HTTPS 协议访问容器云调用证书安装
RUN apk add ca-certificates
# 安装依赖包,如需其他依赖包,请到alpine依赖包管理(https://pkgs.alpinelinux.org/packages?name=php8*imagick*&branch=v3.13)查找。
# 选用国内镜像源以提高下载速度
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tencent.com/g' /etc/apk/repositories \
&& apk add --update --no-cache \
bash \
php82 \
php82-json \
php82-ctype \
php82-exif \
php82-pdo \
php82-zip \
php82-pdo_mysql \
php82-fpm \
php82-xml \
php82-xmlwriter \
php82-curl \
php82-session \
apache2 \
php82-apache2 \
cronie \
curl \
&& rm -f /var/cache/apk/*
# 创建PHP软链接,使php命令直接可用
RUN ln -s /usr/bin/php82 /usr/bin/php \
&& ln -s /usr/sbin/php-fpm82 /usr/sbin/php-fpm
# 设定工作目录
WORKDIR /app
# 将当前目录下所有文件拷贝到/app(.dockerignore中文件除外)
COPY ./data/ /app
# 复制入口脚本到镜像中
COPY ./data/entrypoint.sh /entrypoint.sh
# 修改文件目录权限
# 替换apache配置文件
RUN chown -R apache:apache /app \
&& chmod -R 755 /app \
&& chmod -R 777 /app/runtime \
&& cp /app/conf/httpd.conf /etc/apache2/httpd.conf \
&& cp /app/conf/php.ini /etc/php82/php.ini \
&& mv /usr/sbin/php-fpm82 /usr/sbin/php-fpm
# 设置入口脚本权限
RUN chmod +x /entrypoint.sh
# 暴露端口
# 此处端口必须与「服务设置」-「流水线」以及「手动上传代码包」部署时填写的端口一致,否则会部署失败。
EXPOSE 80
# 设置容器启动时执行的命令为入口脚本
ENTRYPOINT ["/entrypoint.sh"]
# 由于入口脚本将负责启动 cron 和 Apache,因此不需要 CMD 指令
# CMD ["httpd", "-DFOREGROUND"]3.2 创建 docker-compose.yml
在项目根目录创建 docker-compose.yml:
version: '3.7'
services:
# 应用服务
app:
build: .
container_name: rent8
ports:
- "8080:80"
volumes:
- ./data:/app
- ./data/runtime:/app/runtime
- ./data/tempfile:/app/tempfile
- ./data/public/storage:/app/public/storage
environment:
- TZ=Asia/Shanghai
depends_on:
- db
restart: always
# 数据库服务(ARM兼容版本)
db:
image: biarms/mysql:5.7
container_name: mysql
ports:
- "3306:3306"
volumes:
- /volume1/docker/mysql/data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=your_password_here
- MYSQL_DATABASE=rent8
restart: always4. 配置环境变量
创建或复制 .env 文件到 data/ 目录:
APP_DEBUG = false
DB_TYPE = mysql
DB_HOST = db # 使用Docker服务名
DB_NAME = rent8
DB_USER = root
DB_PASS = your_password_here # 与docker-compose.yml中的密码一致
DB_PORT = 3306
DB_CHARSET = utf8mb4
DB_PREFIX = rent_
DEFAULT_LANG = zh-cn
# 微信配置(按需填写)
WECHAT_APP_ID = 123123123
WECHAT_APP_SECRET = 123123123
WECHAT_RENT_TEMPLATE = 123123123
WECHAT_RENEWAL_TEMPLATE = 1231231235. 上传到群晖NAS
- 登录群晖DSM
- 打开File Station
- 创建一个新文件夹,例如
/docker/rent8 - 将整个项目文件夹上传到该目录
6. 在群晖上部署
方式一:使用SSH终端
- 在群晖控制面板中启用SSH服务
- 使用SSH连接到群晖NAS
- 执行以下命令:
# 进入项目目录
cd /volume1/docker/rent8
# 构建并启动容器
docker-compose up -d
# 查看容器状态
docker-compose ps方式二:使用Docker套件界面
- 打开Docker套件
- 进入"项目" → "新增" → "来自docker-compose.yml"
- 选择上传的docker-compose.yml文件
- 点击"部署"
7. 初始化数据库
容器启动后,执行数据库初始化:
# 进入项目目录
cd /volume1/docker/rent8
# 执行数据库迁移
docker-compose exec app php think migrate:run
# 填充种子数据
docker-compose exec app php think seed:run8. 快速初始化脚本
创建 init.sh 脚本简化操作:
#!/bin/bash
cd /volume1/docker/rent8
echo "启动服务..."
docker-compose up -d
sleep 10
echo "初始化数据库..."
docker-compose exec app php think migrate:run
docker-compose exec app php think seed:run
echo "部署完成!"
echo "访问地址:http://你的群晖IP:8080"
echo "默认账号:admin"
echo "默认密码:123456"给脚本执行权限:
chmod +x init.sh
./init.sh🌐 访问系统
部署完成后,通过浏览器访问:
http://你的群晖NAS的IP地址:8080默认登录信息:
- 管理员账号:
admin - 密码:
123456
⚡ 常用管理命令
服务管理
# 查看服务状态
docker-compose ps
# 查看应用日志
docker-compose logs app -f
# 查看数据库日志
docker-compose logs db -f
# 重启服务
docker-compose restart
# 停止服务
docker-compose down
# 重新构建
docker-compose down && docker-compose build && docker-compose up -d容器操作
# 进入应用容器
docker-compose exec app bash
# 进入数据库容器
docker-compose exec db mysql -u root -p
# 备份数据库
docker-compose exec db mysqldump -u root -p rent8 > backup_$(date +%Y%m%d).sql🔧 常见问题及解决方案
1. 权限问题
问题描述:系统运行时出现"Permission denied"错误
解决方案:
# 进入容器设置权限
docker-compose exec app chmod -R 777 /app/runtime /app/tempfile
# 或者在宿主机设置
chmod -R 777 /volume1/docker/rent8/data/runtime
chmod -R 777 /volume1/docker/rent8/data/tempfile2. 数据库连接问题
问题描述:系统无法连接到数据库
检查步骤:
# 检查容器状态
docker-compose ps
# 检查数据库日志
docker-compose logs db
# 测试数据库连接
docker-compose exec app php -r "
try {
\$pdo = new PDO('mysql:host=db;port=3306', 'root', 'your_password');
echo '数据库连接成功';
} catch (Exception \$e) {
echo '连接失败: ' . \$e->getMessage();
}
"3. 合同无法下载
问题描述:合同文件无法下载
解决方案:
# 确保tempfile目录权限
docker-compose exec app chmod -R 777 /app/tempfile
# 检查合同文件是否存在
ls -la /volume1/docker/rent8/data/public/static/wordfile/4. 修改系统名称
需要修改以下文件:
view/admin/common/layout.html- 页面标题view/admin/common/pub/header.html- 顶部导航栏view/admin/index/login.html- 登录页面
使用批量替换:
cd /volume1/docker/rent8/data
find . -type f -name "*.html" -exec sed -i 's/最常用出租屋管理系统/你的系统名称/g' {} \;5. 房产名长度限制
需要修改三处:
前端校验(view/admin/house/property/save.html):
{ max: 20, message: '房产名符长度超出', trigger: 'blur' },数据库迁移文件(database/migrations/20220515051037_house_property.php):
['limit' => 32, ...]或直接修改数据库:
ALTER TABLE rent_house_property MODIFY COLUMN name VARCHAR(32) NOT NULL DEFAULT '';📊 数据库表结构说明
| 表名 | 说明 |
|---|---|
rent_admin_menu | 系统菜单 |
rent_admin_parameter | 系统参数(账单分类等) |
rent_bill_sum | 整楼账单汇总 |
rent_house_bill | 房间账单 |
rent_house_fee | 其他费用 |
rent_house_number | 房租账单 |
rent_house_property | 房产信息 |
rent_house_receipt | 账单明细 |
rent_tenant_contract | 租赁合同 |
rent_tenant_message | 租客信息 |
账单分类说明:
bill_type A:房租+其他账单bill_type B:房租账单bill_type C:其他账单bill_type D:逾期账单bill_type E:退房账单
🔄 更新与维护
更新源代码
cd /volume1/docker/rent8
# 备份数据库
docker-compose exec db mysqldump -u root -p rent8 > backup_before_update.sql
# 停止服务
docker-compose down
# 更新代码
git pull origin V2-dev
# 重新构建
docker-compose build --no-cache
docker-compose up -d设置定时任务
在群晖控制面板中设置计划任务发送提醒:
- 控制面板 → 任务计划 → 新增 → 计划的任务 → 用户定义的脚本
- 设置为每天上午9点执行
运行命令:
curl "http://localhost:8080/admin/subscribe/execute"
💡 最佳实践建议
安全性建议
- ✅ 部署后立即修改默认管理员密码
- ✅ 考虑使用HTTPS加密连接
- ✅ 限制对NAS的远程访问
- ✅ 定期更新Docker镜像
备份策略
数据库备份:
# 每日备份脚本 docker-compose exec db mysqldump -u root -p rent8 > /backup/rent8_$(date +%Y%m%d).sql应用数据备份:
# 备份上传的文件 tar -czf /backup/rent8_storage_$(date +%Y%m%d).tar.gz /volume1/docker/rent8/data/public/storage
性能优化
- 根据NAS性能调整PHP内存限制
- 考虑启用OPcache加速
- 定期清理日志文件
🎯 Docker部署的优势
| 优势 | 说明 |
|---|---|
| 环境隔离 | 容器提供独立的运行环境 |
| 易于迁移 | 轻松迁移到其他设备 |
| 版本控制 | 精确控制组件版本 |
| 快速部署 | 一键部署整个应用栈 |
| 资源优化 | 按需分配系统资源 |
📝 注意事项
- 首次部署:确保数据库密码在
.env和docker-compose.yml中保持一致 - 端口冲突:如果8080端口被占用,修改
docker-compose.yml中的端口映射 - ARM架构:群晖NAS多为ARM架构,必须使用ARM兼容的MySQL镜像
- 数据持久化:数据库数据已映射到本地目录,重新构建容器不会丢失数据
🆘 故障排除
查看详细错误信息
# 查看PHP错误日志
docker-compose exec app cat /app/runtime/log/error.log
# 查看Apache错误日志
docker-compose exec app cat /var/log/apache2/error.log
# 查看容器完整日志
docker-compose logs --tail=100 app重置服务
# 完全重置(会删除数据)
docker-compose down -v
docker-compose up -d
# 重新初始化数据库
docker-compose exec app php think migrate:run
docker-compose exec app php think seed:run通过以上步骤,您已经成功在群晖NAS上部署了Rent8出租屋管理系统。系统已配置为生产环境可用状态,建议根据实际需求进行适当的定制和优化。
如有问题,请参考项目官方文档或在项目仓库中提交Issue。