在群晖NAS上使用Docker部署rent8出租屋管理系统教程
一、系统简介
rent8是一款基于ThinkPHP8(PHP8)+TDesign(Vue3)开发的出租屋管理系统,功能包括房产管理、房间管理、账单管理、租客档案管理、合同管理等。本教程将指导您如何在群晖NAS上使用Docker方式部署该系统。

二、准备工作

  1. 硬件要求
    群晖NAS设备(任何支持Docker的型号)
    足够的存储空间(建议至少1GB)
  2. 软件要求
    群晖DSM 6.0或更高版本
    Docker套件已安装
    群晖File Station访问权限
    三、部署步骤
  3. 下载项目文件
    首先,从Gitee下载rent8项目:
    运行

    git clone -b V2-dev https://gitee.com/MarcoMaHH/rent8.git

    或者直接从Gitee网站下载ZIP压缩包,然后解压到您的电脑上。

  4. 创建Docker配置文件
    创建Dockerfile
    在项目根目录创建Dockerfile文件,内容如下:

    #dockerfile
    FROM php:8.2-apache
    
    # 设置工作目录
    WORKDIR /var/www/html
    
    # 创建并配置sources.list文件
    RUN echo "deb http://mirrors.aliyun.com/debian/ bookworm main contrib non-free" > /etc/apt/sources.list && \
     echo "deb http://mirrors.aliyun.com/debian/ bookworm-updates main contrib non-free" >> /etc/apt/sources.list && \
     echo "deb http://mirrors.aliyun.com/debian-security bookworm-security main contrib non-free" >> /etc/apt/sources.list
    
    # 安装系统依赖
    RUN apt-get clean && \
     apt-get update && \
     apt-get install -y --no-install-recommends \
     libzip-dev \
     libpng-dev \
     libonig-dev \
     libxml2-dev \
     zlib1g-dev \
     zip \
     unzip \
     git \
     && rm -rf /var/lib/apt/lists/*
    
    # 安装 PHP 扩展
    RUN docker-php-ext-install pdo_mysql mbstring zip gd
    
    # 配置 Apache
    RUN a2enmod rewrite
    ENV APACHE_DOCUMENT_ROOT /var/www/html/public
    RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
    RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
    
    # 创建必要的目录并设置权限
    RUN mkdir -p /var/www/html/runtime/session \
     && mkdir -p /var/www/html/runtime/admin/temp \
     && mkdir -p /var/www/html/tempfile \
     && mkdir -p /var/www/html/public/storage \
     && chown -R www-data:www-data /var/www/html \
     && chmod -R 777 /var/www/html/runtime \
     && chmod -R 777 /var/www/html/tempfile \
     && chmod -R 777 /var/www/html/public/storage
    
    # 设置时区
    ENV TZ=Asia/Shanghai
    
    # 暴露端口
    EXPOSE 80

创建docker-compose.yml
在项目根目录创建docker-compose.yml文件,内容如下:

version: '3.7'
services:
  app:
    build: .
    container_name: rent8
    volumes:
      - ./rent:/var/www/html
      - ./rent/runtime:/var/www/html/runtime
      - ./rent/tempfile:/var/www/html/tempfile
      - ./rent/public/storage:/var/www/html/public/storage
    ports:
      - "8080:80"
    environment:
      - TZ=Asia/Shanghai
    restart: always
  1. 配置环境变量
    将项目中的.example.env文件复制为.env,并修改数据库连接信息:
APP_DEBUG = false

[APP]
DEFAULT_TIMEZONE = Asia/Shanghai

[DATABASE]
TYPE = mysql
HOSTNAME = db
DATABASE = rent
USERNAME = rent
PASSWORD = rentpassword
HOSTPORT = 3306
CHARSET = utf8
DB_PREFIX = rent_

DEFAULT_LANG = zh-cn

COZE_BOTID = 7462019405607010343
COZE_APP_ID = 1105070413136
COZE_PUBLIC_KEY_FINGERPRINT = gzbpaE3nWClBDXmbAHMAES5wE9QB1WiK4xqQivPMzhw

WECHAT_APP_ID = 123123123
WECHAT_APP_SECRET = 123123123
WECHAT_TEMPLATE_ID = 123123123

注意:HOSTNAME设置为db,这是docker-compose中MySQL服务的名称。

  1. 上传到群晖NAS
    登录群晖DSM
    打开File Station
    创建一个新文件夹,例如rent
    将整个项目文件夹(包括rent8文件夹、Dockerfile和docker-compose.yml)上传到该文件夹
  2. 在群晖上部署Docker容器
    打开群晖Docker套件

进入"注册表",搜索并下载以下镜像:

php:8.2-apache
mysql:5.7
打开SSH终端连接到您的群晖NAS(需要先在控制面板中启用SSH服务)

导航到您上传项目的目录:

运行

cd /volume1/docker/rent8  # 根据实际路径调整

构建并启动容器:

运行

docker-compose up -d
  1. 初始化数据库
    容器启动后,需要执行数据库迁移和填充种子数据:

运行

# 进入应用容器
docker-compose exec app bash

# 在容器内执行数据库迁移
php think migrate:run

# 填充种子数据
php think seed:run

# 退出容器
exit

四、访问系统
现在,您可以通过浏览器访问系统:

http://群晖NAS的IP地址:8080

默认账号密码:

管理员账号:admin
密码:123456
五、常见问题及解决方案

  1. 权限问题
    问题描述:系统运行时出现"Permission denied"错误,通常是因为runtime目录权限不足。

解决方案: 在Dockerfile中,我们已经添加了启动脚本来确保runtime目录有正确的权限。如果仍然遇到权限问题,可以手动执行:

运行

# 进入容器
docker-compose exec app bash

# 在容器内执行
mkdir -p /var/www/html/runtime/session
mkdir -p /var/www/html/runtime/cache
mkdir -p /var/www/html/runtime/log
mkdir -p /var/www/html/runtime/temp
chmod -R 777 /var/www/html/runtime

2. 合同无法下载问题

问题描述 :合同文件无法下载,通常是因为tempfile文件夹权限不足。
解决方案 :
在Dockerfile中已经添加了 RUN chmod -R 777 /var/www/html/tempfile 来设置权限,如果仍然有问题,可以手动执行:
运行

# 进入系统docker项目路径
/volume1/docker/rent

# 在rent文件夹内执行
chmod -R 777 /rent8/tempfile

注意:合同文件路径在 public/static/wordfile/contract.docx ,确保该文件存在且有正确权限。

  1. 数据库连接问题
    问题描述:系统无法连接到数据库。
    解决方案:确认.env文件中的数据库配置正确. 确认MySQL容器正在运行. 检查数据库用户名和密码是否正确
    运行

    # 检查MySQL容器状态
    docker-compose ps
    # 查看MySQL日志
    docker-compose logs db
  2. 微信小程序配置
    问题描述:需要配置微信小程序。
    解决方案: 在.env文件中填写微信小程序的appID、appSecret和templateId。
  3. 创建数据库
    问题描述 :需要手动创建数据库。
    解决方案 :可以使用以下SQL命令创建数据库:

    CREATE DATABASE rent CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

    推荐使用utf8mb4_general_ci排序规则,以支持完整的Unicode字符集,包括表情符号。

  4. 修改系统名称
    如果您想修改系统名称,需要修改以下三个文件:
  5. 修改布局文件中的标题:

    <!-- /Users/cokan/Documents/rent/rent8/view/admin/common/layout.html -->
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>最常用出租屋管理系统</title>
      <!-- 其他代码 -->

    2.修改头部文件中的系统名称:

    <!-- /Users/cokan/Documents/rent/rent8/view/admin/common/pub/header.html -->
    <t-head-menu value="item1" height="120px">
      <template #logo>
     <a style="color: #0052d9; text-decoration: none;font-size: 150%;" href="{:url('/admin/index/index')}">最常用出租屋管理系统</a>
      </template>
      <!-- 其他代码 -->

    3.修改登录页面中的标题:

    <!-- /Users/cokan/Documents/rent/rent8/view/admin/index/login.html -->
    <!doctype html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>最常用出租屋管理系统</title>
      <!-- 其他代码 -->
      <!-- 其他代码 -->
       <div class="title-container">
         <h1 class="title margin-no">登录到</h1>
         <h1 class="title">最常用出租屋管理系统</h1>
       </div>

    如果您想修改系统名称,需要修改这个文件以及其他两个文件:

  6. /Users/cokan/Documents/rent/rent8/view/admin/common/layout.html - 修改页面标题
  7. /Users/cokan/Documents/rent/rent8/view/admin/common/pub/header.html - 修改顶部导航栏中显示的系统名称
  8. /Users/cokan/Documents/rent/rent8/view/admin/index/login.html - 修改登录页面中显示的系统名称
    您可以使用以下命令查找包含这段文本的文件:
    运行

    cd /Users/cokan/Documents/rent
    grep -r "最常用出租屋管理系统" ./rent8

    这将帮助您找到所有包含该系统名称的文件,以便进行修改。
    6.房产名长度限制问题
    问题描述 :新增房产名有长度限制,需要修改前端校验和数据库字段长度
    解决方案 :

  9. 修改前端校验:
    将 view/admin/house/property/save.html 里的

    { max: 10, message: '房产名符长度超出', trigger: 'blur' },

    中的10改成20

  10. 修改数据库迁移文件:
    修改 database/migrations/20220515051037_house_property.php 里的

    ['limit' => 8, ...]  

    将8改为32

  11. 直接修改数据库:

    ALTER TABLE rent_house_property MODIFY COLUMN name VARCHAR(32) NOT NULL DEFAULT '';
  12. 订阅消息提醒配置
    问题描述:需要设置定时任务发送订阅消息提醒。

解决方案: 在群晖的控制面板中设置计划任务:

打开控制面板 -> 任务计划 -> 新增 -> 计划的任务 -> 用户定义的脚本
设置为每天上午9点执行
在"运行命令"中输入:
运行

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

六、修改源代码后的重新部署
如果您修改了源代码,需要重新构建并启动容器:

cd /volume1/docker/rent
docker-compose down
docker-compose build
docker-compose up -d

七、注意事项
安全性考虑:

部署后请立即修改默认管理员密码
考虑使用HTTPS加密连接
限制对NAS的远程访问
备份:

定期备份MySQL数据卷
可以在docker-compose.yml中添加备份卷挂载
更新:

更新系统时,先备份数据库
拉取最新代码后重新构建容器
性能优化:

根据NAS性能,可能需要调整PHP和MySQL的配置
考虑使用Redis缓存提高性能
七、Docker部署的优势
环境隔离:Docker容器提供了隔离的运行环境,不会影响NAS上的其他服务
易于迁移:可以轻松将整个应用迁移到其他支持Docker的设备上
版本控制:可以精确控制PHP、MySQL等组件的版本
快速部署:使用docker-compose可以一键部署整个应用栈
通过以上步骤,您已经成功在群晖NAS上使用Docker部署了rent8出租屋管理系统。如有更多问题,可以参考项目的官方文档或在项目仓库中提问。

如果直接按原版安装出现错误集合


1.错误PHP版本过低>= 8.2.0
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.2.0". You are running 8.1.32. in /var/www/html/vendor/composer/platform_check.php on line 28

解决办法:修改 Dockerfile内的, FROM php:8.1-apache 改为php:8.2
2.错误目录权限问题 runtime/tempfile :确保目录存在并赋予写权限。
``mkdir(): Permission denied
ThinkPHP V8.1.2 { 十年磨一剑-为API开发设计的高性能框架 } - 官方手册
file_put_contents(/var/www/html/runtime/session/sess_4947ff8f119cd6906f1ecfb3bba8e034): Failed to open stream: No such file or directory
ThinkPHP V8.1.2 { 十年磨一剑-为API开发设计的高性能框架 } - 官方手册
Uncaught think\exception\ErrorException: file_put_contents(/var/www/html/runtime/session/sess_4947ff8f119cd6906f1ecfb3bba8e034): Failed to open stream: No such file or directory in /var/www/html/vendor/topthink/framework/src/think/session/driver/File.php:172 Stack trace: #0 [internal function]: think\initializer\Error->appError(2, 'file_put_conten...', '/var/www/html/v...', 172) #1 /var/www/html/vendor/topthink/framework/src/think/session/driver/File.php(172): file_put_contents('/var/www/html/r...', 'a:1:{s:12:"X-CS...', 2) #2 /var/www/html/vendor/topthink/framework/src/think/session/driver/File.php(220): think\session\driver\File->writeFile('/var/www/html/r...', 'a:1:{s:12:"X-CS...') #3 /var/www/html/vendor/topthink/framework/src/think/session/Store.php(249): think\session\driver\File->write('4947ff8f119cd69...', 'a:1:{s:12:"X-CS...') #4 /var/www/html/vendor/topthink/framework/src/think/Manager.php(171): think\session\Store->save() #5 /var/www/html/vendor/topthink/framework/src/think/middleware/SessionInit.php(69): think\Manager->__call('save', Array) #6 /var/www/html/vendor/topthink/framework/src/think/Middleware.php(157): think\middleware\SessionInit->end(Object(think\response\Html)) #7 /var/www/html/vendor/topthink/framework/src/think/Http.php(274): think\Middleware->end(Object(think\response\Html)) #8 /var/www/html/vendor/topthink/framework/src/think/initializer/Error.php(61): think\Http->end(Object(think\response\Html)) #9 [internal function]: think\initializer\Error->appException(Object(think\exception\ErrorException)) #10 {main} thrown``
解决办法:
1.进入容器 新建需要的文件夹

docker exec -it rent8 bash
mkdir -p runtime/session
mkdir -p runtime/cache
mkdir -p runtime/log
chown -R www-data:www-data runtime
chmod -R 775 runtime

2.在宿主机上 给文件夹赋权

sudo chown -R 1000:1000 /volume1/docker/rent8/rent/runtime
sudo chmod -R 775 /volume1/docker/rent8/rent/runtime
sudo chown -R 1000:1000 /volume1/docker/rent8/rent/tempfile
sudo chmod -R 775 /volume1/docker/rent8/rent/tempfile

(1000:1000 是 www-data 在容器内的 UID/GID,群晖上可用 ls -ln 查看)
这里编辑收缩框内容

个人定制补丁脚本
update_system.sh

#!/bin/bash

# 设置系统名称
SYSTEM_NAME="亚娣出租屋管理系统"

# 设置房产名长度限制
FRONTEND_LENGTH=20
DATABASE_LENGTH=32

# 创建系统配置文件
cat > rent/config/system.php << EOF
<?php

return [
    // 系统名称配置
    'system_name' => '${SYSTEM_NAME}',
    
    // 其他系统配置
    'property_name_length' => [
        'frontend' => ${FRONTEND_LENGTH},  // 前端校验长度
        'database' => ${DATABASE_LENGTH}   // 数据库字段长度
    ]
];
EOF

# 创建 .env 文件
echo "创建 .env 文件..."
cat > rent/.env << EOF
APP_DEBUG = false

DB_TYPE = mysql
DB_HOST = 192.168.333.333
DB_NAME = rent
DB_USER = root
DB_PASS = ADag\21
DB_PORT = 3306
DB_CHARSET = utf8
DB_PREFIX = rent_

DEFAULT_LANG = zh-cn

COZE_BOTID = 7462019405607010343
COZE_APP_ID = 1105070413136
COZE_PUBLIC_KEY_FINGERPRINT = gzbpaE3nWClBDXmbAHMAES5wE9QB1WiK4xqQivPMzhw

WECHAT_APP_ID = 123123123
WECHAT_APP_SECRET = 123123123
WECHAT_TEMPLATE_ID = 123123123
EOF

# 创建所有必要的目录
echo "创建必要的目录..."
mkdir -p rent/public/storage
mkdir -p rent/runtime/session
mkdir -p rent/runtime/admin/temp
mkdir -p rent/tempfile

# 设置目录权限
echo "设置目录权限..."
chmod -R 777 rent/public/storage
chmod -R 777 rent/runtime
chmod -R 777 rent/tempfile

# 修改房东身份证输入框
echo "修改房东身份证输入框..."
awk '{gsub(/<t-input-number v-model="formData.id_card"/, "<t-input v-model=\"formData.id_card\""); print}' rent/view/admin/house/property/save.html > temp.html && mv temp.html rent/view/admin/house/property/save.html

# 修改前端校验文件
echo "修改前端校验文件..."
sed -i "s/max: [0-9]*/max: ${FRONTEND_LENGTH}/g" rent/view/admin/house/property/save.html

# 修改数据库迁移文件
echo "修改数据库迁移文件..."
sed -i "s/\['limit' => [0-9]*\]/\['limit' => ${DATABASE_LENGTH}\]/g" rent/database/migrations/20220515051037_house_property.php

# 修改布局文件
echo "修改布局文件..."
sed -i "s/<title>.*<\/title>/<title>${SYSTEM_NAME}<\/title>/g" rent/view/admin/common/layout.html

# 修改头部文件
echo "修改头部文件..."
sed -i "s/>.*出租屋管理系统</>${SYSTEM_NAME}</g" rent/view/admin/common/pub/header.html

# 修改登录页面
echo "修改登录页面..."
sed -i "s/<title>rent8-.*<\/title>/<title>${SYSTEM_NAME}<\/title>/g" rent/view/admin/index/login.html
sed -i "s/<h1 class=\"title\">.*出租屋管理系统<\/h1>/<h1 class=\"title\">${SYSTEM_NAME}<\/h1>/g" rent/view/admin/index/login.html

# 修改 README.md
echo "修改 README.md..."
sed -i "s/rent8-最常用出租屋管理系统/${SYSTEM_NAME}/g" rent/README.md
sed -i "s/最常用出租屋管理系统/${SYSTEM_NAME}/g" rent/README.md

echo "系统配置已更新完成!"
echo "系统名称: ${SYSTEM_NAME}"
echo "房产名长度限制:"
echo "- 前端校验: ${FRONTEND_LENGTH}"
echo "- 数据库字段: ${DATABASE_LENGTH}"
echo "目录权限已设置完成!"
echo "请检查 .env 文件中的数据库配置是否正确!" 

进入目录,运行sh代码

cd /volume1/docker/rent8
chmod +x update_system.sh&./update_system.sh
最后修改:2025 年 06 月 04 日
如果觉得我的文章对你有用,请随意赞赏