在群晖NAS上使用Docker部署rent8出租屋管理系统教程
一、系统简介
rent8是一款基于ThinkPHP8(PHP8)+TDesign(Vue3)开发的出租屋管理系统,功能包括房产管理、房间管理、账单管理、租客档案管理、合同管理等。本教程将指导您如何在群晖NAS上使用Docker方式部署该系统。
二、准备工作
- 硬件要求
群晖NAS设备(任何支持Docker的型号)
足够的存储空间(建议至少1GB) - 软件要求
群晖DSM 6.0或更高版本
Docker套件已安装
群晖File Station访问权限
三、部署步骤 下载项目文件
首先,从Gitee下载rent8项目:
运行git clone -b V2-dev https://gitee.com/MarcoMaHH/rent8.git
或者直接从Gitee网站下载ZIP压缩包,然后解压到您的电脑上。
创建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
- 配置环境变量
将项目中的.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服务的名称。
- 上传到群晖NAS
登录群晖DSM
打开File Station
创建一个新文件夹,例如rent
将整个项目文件夹(包括rent8文件夹、Dockerfile和docker-compose.yml)上传到该文件夹 - 在群晖上部署Docker容器
打开群晖Docker套件
进入"注册表",搜索并下载以下镜像:
php:8.2-apache
mysql:5.7
打开SSH终端连接到您的群晖NAS(需要先在控制面板中启用SSH服务)
导航到您上传项目的目录:
运行
cd /volume1/docker/rent8 # 根据实际路径调整
构建并启动容器:
运行
docker-compose up -d
- 初始化数据库
容器启动后,需要执行数据库迁移和填充种子数据:
运行
# 进入应用容器
docker-compose exec app bash
# 在容器内执行数据库迁移
php think migrate:run
# 填充种子数据
php think seed:run
# 退出容器
exit
四、访问系统
现在,您可以通过浏览器访问系统:
http://群晖NAS的IP地址:8080
默认账号密码:
管理员账号:admin
密码:123456
五、常见问题及解决方案
- 权限问题
问题描述:系统运行时出现"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 ,确保该文件存在且有正确权限。
数据库连接问题
问题描述:系统无法连接到数据库。
解决方案:确认.env文件中的数据库配置正确. 确认MySQL容器正在运行. 检查数据库用户名和密码是否正确
运行# 检查MySQL容器状态 docker-compose ps # 查看MySQL日志 docker-compose logs db
- 微信小程序配置
问题描述:需要配置微信小程序。
解决方案: 在.env文件中填写微信小程序的appID、appSecret和templateId。 创建数据库
问题描述 :需要手动创建数据库。
解决方案 :可以使用以下SQL命令创建数据库:CREATE DATABASE rent CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
推荐使用utf8mb4_general_ci排序规则,以支持完整的Unicode字符集,包括表情符号。
- 修改系统名称
如果您想修改系统名称,需要修改以下三个文件: 修改布局文件中的标题:
<!-- /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>
如果您想修改系统名称,需要修改这个文件以及其他两个文件:
- /Users/cokan/Documents/rent/rent8/view/admin/common/layout.html - 修改页面标题
- /Users/cokan/Documents/rent/rent8/view/admin/common/pub/header.html - 修改顶部导航栏中显示的系统名称
/Users/cokan/Documents/rent/rent8/view/admin/index/login.html - 修改登录页面中显示的系统名称
您可以使用以下命令查找包含这段文本的文件:
运行cd /Users/cokan/Documents/rent grep -r "最常用出租屋管理系统" ./rent8
这将帮助您找到所有包含该系统名称的文件,以便进行修改。
6.房产名长度限制问题
问题描述 :新增房产名有长度限制,需要修改前端校验和数据库字段长度
解决方案 :修改前端校验:
将 view/admin/house/property/save.html 里的{ max: 10, message: '房产名符长度超出', trigger: 'blur' },
中的10改成20
修改数据库迁移文件:
修改 database/migrations/20220515051037_house_property.php 里的['limit' => 8, ...]
将8改为32
直接修改数据库:
ALTER TABLE rent_house_property MODIFY COLUMN name VARCHAR(32) NOT NULL DEFAULT '';
- 订阅消息提醒配置
问题描述:需要设置定时任务发送订阅消息提醒。
解决方案: 在群晖的控制面板中设置计划任务:
打开控制面板 -> 任务计划 -> 新增 -> 计划的任务 -> 用户定义的脚本
设置为每天上午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