在群晖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: always

4. 配置环境变量

创建或复制 .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 = 123123123

5. 上传到群晖NAS

  1. 登录群晖DSM
  2. 打开File Station
  3. 创建一个新文件夹,例如 /docker/rent8
  4. 将整个项目文件夹上传到该目录

6. 在群晖上部署

方式一:使用SSH终端

  1. 在群晖控制面板中启用SSH服务
  2. 使用SSH连接到群晖NAS
  3. 执行以下命令:
# 进入项目目录
cd /volume1/docker/rent8

# 构建并启动容器
docker-compose up -d

# 查看容器状态
docker-compose ps

方式二:使用Docker套件界面

  1. 打开Docker套件
  2. 进入"项目" → "新增" → "来自docker-compose.yml"
  3. 选择上传的docker-compose.yml文件
  4. 点击"部署"

7. 初始化数据库

容器启动后,执行数据库初始化:

# 进入项目目录
cd /volume1/docker/rent8

# 执行数据库迁移
docker-compose exec app php think migrate:run

# 填充种子数据
docker-compose exec app php think seed:run

8. 快速初始化脚本

创建 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/tempfile

2. 数据库连接问题

问题描述:系统无法连接到数据库

检查步骤

# 检查容器状态
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. 修改系统名称

需要修改以下文件:

  1. view/admin/common/layout.html - 页面标题
  2. view/admin/common/pub/header.html - 顶部导航栏
  3. 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

设置定时任务

在群晖控制面板中设置计划任务发送提醒:

  1. 控制面板 → 任务计划 → 新增 → 计划的任务 → 用户定义的脚本
  2. 设置为每天上午9点执行
  3. 运行命令:

    curl "http://localhost:8080/admin/subscribe/execute"

💡 最佳实践建议

安全性建议

  1. ✅ 部署后立即修改默认管理员密码
  2. ✅ 考虑使用HTTPS加密连接
  3. ✅ 限制对NAS的远程访问
  4. ✅ 定期更新Docker镜像

备份策略

  1. 数据库备份

    # 每日备份脚本
    docker-compose exec db mysqldump -u root -p rent8 > /backup/rent8_$(date +%Y%m%d).sql
  2. 应用数据备份

    # 备份上传的文件
    tar -czf /backup/rent8_storage_$(date +%Y%m%d).tar.gz /volume1/docker/rent8/data/public/storage

性能优化

  1. 根据NAS性能调整PHP内存限制
  2. 考虑启用OPcache加速
  3. 定期清理日志文件

🎯 Docker部署的优势

优势说明
环境隔离容器提供独立的运行环境
易于迁移轻松迁移到其他设备
版本控制精确控制组件版本
快速部署一键部署整个应用栈
资源优化按需分配系统资源

📝 注意事项

  1. 首次部署:确保数据库密码在 .envdocker-compose.yml 中保持一致
  2. 端口冲突:如果8080端口被占用,修改 docker-compose.yml 中的端口映射
  3. ARM架构:群晖NAS多为ARM架构,必须使用ARM兼容的MySQL镜像
  4. 数据持久化:数据库数据已映射到本地目录,重新构建容器不会丢失数据

🆘 故障排除

查看详细错误信息

# 查看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。

最后修改:2025 年 12 月 31 日
如果觉得我的文章对你有用,请随意赞赏