不用Docker也能玩转Tduck填鸭表单:CentOS7手动部署全流程实录
不用Docker也能玩转Tduck填鸭表单:CentOS7手动部署全流程实录
对于许多技术实践者而言,Docker固然方便,但有时却像一层“魔法”面纱,遮蔽了应用运行的真实环境与底层细节。如果你渴望对部署过程拥有绝对的控制权,希望深入理解一个开源项目从代码到服务的完整生命周期,或者你的生产环境对资源调度和网络配置有特殊要求,那么一次彻底的手动部署之旅,其价值远超一个简单的docker-compose up命令。今天,我们就以Tduck填鸭表单——这款功能丰富的开源表单与问卷系统为例,在纯净的CentOS 7环境中,从零开始,一步步搭建起一个完全由你掌控的、前后端分离的在线表单平台。
这次部署不仅是一次安装操作,更是一次对现代Web应用架构的深度探索。我们将亲手配置Java后端运行环境、构建Node.js前端资源、架设Nginx作为反向代理与静态服务器,并初始化MySQL数据库。整个过程适合那些希望深度定制、学习完整运维流程的技术爱好者、系统管理员,或是需要在内网隔离环境中部署应用的企业开发者。让我们暂时放下容器化的便利,回归本源,体验一次“硬核”的部署实践。
1. 系统基础环境:打造坚实的部署地基
在开始部署Tduck之前,我们必须为它准备一个稳定、兼容的运行环境。CentOS 7作为一个经典且广泛使用的企业级Linux发行版,是我们的理想选择。但默认的最小化安装往往缺少必要的开发工具和运行时。因此,第一步就是系统地构建这个基础平台。
一个常见的误区是试图寻找一个“万能脚本”一键安装所有依赖。虽然快捷,但一旦脚本执行出错或与特定系统环境不兼容,排查将异常困难。我们选择分步手动安装,这能让你清晰地了解每一个组件的作用,并在未来进行升级或迁移时心中有数。
1.1 核心依赖安装:Java、MySQL与Redis
Tduck后端基于Java 8开发,使用Spring Boot框架,数据存储依赖于MySQL,并利用Redis进行缓存和会话管理。因此,这三者是我们的核心依赖。
首先,更新系统并安装必要的工具链:
sudo yum update -y
sudo yum install -y wget curl vim git
安装Java 8: CentOS 7的默认仓库可能包含OpenJDK 8。我们直接安装即可。
sudo yum install -y java-1.8.0-openjdk-devel
安装完成后,验证版本:
java -version
你应该能看到类似 openjdk version "1.8.0_382" 的输出。
安装MySQL 5.7: 虽然MySQL 8.0已普及,但为确保与Tduck源码的最佳兼容性(尤其涉及某些特定SQL语法或驱动),我们选择安装MySQL 5.7。
# 下载并安装MySQL官方的Yum仓库
sudo wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
sudo rpm -ivh mysql57-community-release-el7-11.noarch.rpm
# 安装MySQL服务器
sudo yum install -y mysql-community-server
# 启动MySQL服务并设置开机自启
sudo systemctl start mysqld
sudo systemctl enable mysqld
MySQL 5.7在首次启动时会为root用户生成一个临时密码,我们需要找到它:
sudo grep 'temporary password' /var/log/mysqld.log
记下输出的密码,形如 A temporary password is generated for root@localhost: xxxxxxxx。
安装Redis: Redis可以从EPEL(Extra Packages for Enterprise Linux)仓库安装。
# 启用EPEL仓库
sudo yum install -y epel-release
sudo yum install -y redis
# 启动Redis服务并设置开机自启
sudo systemctl start redis
sudo systemctl enable redis
1.2 构建工具与Web服务器:Maven与Nginx
后端代码需要Maven进行构建,而前端构建产物和最终的访问入口则需要Nginx来承载。
安装Maven: 我们将从Apache官网直接下载指定版本的Maven。
cd /opt
sudo wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
sudo tar -xzf apache-maven-3.8.8-bin.tar.gz
sudo mv apache-maven-3.8.8 /usr/local/maven
接下来,需要配置环境变量,让系统可以找到mvn命令。编辑 /etc/profile 文件:
sudo vim /etc/profile
在文件末尾添加:
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
保存退出后,使配置立即生效:
source /etc/profile
验证安装:mvn -v 应显示Maven版本信息。
安装与配置Nginx: Nginx将扮演两个角色:托管前端静态文件(HTML、CSS、JS),以及将API请求反向代理到后端Java服务。
# 安装Nginx
sudo yum install -y nginx
# 启动Nginx并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
安装完成后,你可以通过服务器的IP地址访问,应该能看到Nginx的欢迎页面。这证明Web服务器已正常运行。
至此,所有系统级的基础环境已经就绪。我们拥有了代码运行(Java)、数据存储(MySQL)、缓存(Redis)、代码构建(Maven)和网络服务(Nginx)的全套能力。接下来,就是让Tduck的代码在这个环境中“活”起来。
2. 源码获取与前端工程构建
现代Web应用普遍采用前后端分离架构,Tduck也不例外。这意味着我们需要分别处理前端(用户界面)和后端(业务逻辑与数据接口)两部分代码。我们将在一个统一的目录下管理它们,保持结构清晰。
2.1 克隆项目源码
首先,创建一个工作目录,例如 /www,并在此目录下克隆前后端代码仓库。
sudo mkdir -p /www
cd /www
# 克隆后端平台代码
sudo git clone https://gitee.com/TDuckApp/tduck-platform.git
# 克隆前端界面代码
sudo git clone https://gitee.com/TDuckApp/tduck-front.git
注意:使用
sudo是为了保证有足够的权限在系统目录下创建文件和后续操作。你也可以选择在用户主目录下操作,然后通过权限配置来让Nginx访问。
现在,/www目录下应该有两个文件夹:tduck-platform 和 tduck-front。
2.2 构建前端静态资源
前端项目通常使用Node.js生态下的工具(如npm、yarn)进行依赖管理和构建。我们需要先安装Node.js。
安装Node.js与Yarn: 我们将使用NodeSource仓库安装一个长期支持版本(LTS)的Node.js。
# 安装NodeSource仓库脚本
curl -fsSL https://rpm.nodesource.com/setup_18.x | sudo bash -
# 安装Node.js
sudo yum install -y nodejs
# 验证安装
node -v
npm -v
接下来安装Yarn(一个更快速、可靠的依赖管理工具):
sudo npm install -g yarn
构建前端项目: 进入前端目录,安装依赖并执行构建命令。构建过程会将Vue或React等框架的源代码编译、打包、压缩成浏览器可以直接运行的HTML、CSS和JavaScript文件。
cd /www/tduck-front
# 安装项目依赖(此过程可能需要一些时间,取决于网络速度)
sudo yarn install
# 执行构建,生成dist目录
sudo yarn run build
提示:
yarn install可能会遇到网络问题,可以考虑配置国内镜像源(如淘宝NPM镜像)来加速。构建命令(yarn run build)通常在项目package.json的scripts中定义。
构建成功后,会在当前目录下生成一个 dist 文件夹。这个文件夹里就是最终的前端静态资源。我们需要将它放置到Nginx能够服务的位置。
# 将构建产物复制到我们计划让Nginx提供服务的目录
sudo cp -r dist /www/
现在,前端部分已经准备完毕。这些静态文件本身无法提供动态功能,它们需要后端的API支持。接下来,我们把目光转向后端服务。
3. 后端服务配置与启动
后端是Tduck的大脑,负责处理表单逻辑、数据存储和用户认证。它是一个标准的Spring Boot应用,我们需要配置其数据库连接,然后将其打包成可执行的JAR文件。
3.1 数据库初始化与安全配置
在启动后端之前,必须确保数据库已经就绪。我们需要登录MySQL,修改默认密码,创建专属数据库,并导入初始数据表结构。
首先,使用之前记录的临时密码登录MySQL:
mysql -u root -p
输入临时密码后进入MySQL命令行。
修改root密码并调整密码策略: 初始密码复杂且不便记忆,我们将其修改为简单密码(仅用于实验环境,生产环境务必使用强密码)。MySQL 5.7默认有密码强度策略,需要先放宽限制。
-- 设置密码策略为低(只检查长度)
SET GLOBAL validate_password_policy = 0;
-- 设置密码最小长度为1
SET GLOBAL validate_password_length = 1;
-- 修改root用户密码为‘123456’
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
-- 刷新权限
FLUSH PRIVILEGES;
创建Tduck数据库并导入SQL:
退出MySQL命令行(输入exit),然后重新用新密码登录,开始创建数据库。
mysql -u root -p123456
在MySQL命令行中执行:
-- 创建一个名为tduck的数据库
CREATE DATABASE tduck CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用这个数据库
USE tduck;
-- 导入后端项目docs目录下的SQL文件,创建数据表
-- 请确保路径正确
SOURCE /www/tduck-platform/doc/tduck.sql;
SOURCE /www/tduck-platform/doc/pr_project_template.sql;
导入成功后,可以查看一下有哪些表:
SHOW TABLES;
你应该能看到一系列以t_开头的表,例如t_user, t_project等。至此,数据库层已准备完成。
3.2 后端应用配置与打包
接下来,我们需要配置后端应用,使其能够连接到我们刚设置好的数据库。
修改配置文件:
Tduck后端的配置文件是YAML格式的,位于 tduck-platform/tduck-api/src/main/resources/ 目录下。我们主要修改连接开发环境的配置文件 application-dev.yml。
cd /www/tduck-platform
sudo vim tduck-api/src/main/resources/application-dev.yml
找到关于数据源(datasource)配置的部分,关键参数如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/tduck?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: 123456 # 确保此处密码与你设置的MySQL root密码一致
请仔细核对url中的数据库名(tduck)、username和password。如果Redis未运行在默认的localhost:6379,也需要相应调整redis配置项。
使用Maven打包项目:
配置保存后,使用Maven进行项目清理和打包。这个过程会下载项目依赖(存储在本地Maven仓库~/.m2中),编译Java代码,并最终生成一个可执行的“fat jar”(包含所有依赖的JAR包)。
# 在项目根目录下,清理并安装依赖(跳过测试)
sudo mvn clean install -DskipTests
# 进入后端API模块目录,进行打包
cd tduck-api
sudo mvn clean package -DskipTests
注意:第一次运行
mvn命令会下载大量依赖,耗时较长,请耐心等待。确保网络通畅。
打包成功后,在 tduck-api/target/ 目录下会生成一个名为 tduck-api.jar 的文件(可能带有版本号)。这就是我们即将运行的后端服务。
4. 系统整合与网络访问配置
现在,我们有了可运行的后端JAR包、前端静态资源、以及数据库。最后一步是将它们通过Nginx整合起来,形成一个用户可以通过浏览器访问的统一入口,并处理一些系统级别的配置。
4.1 配置Nginx反向代理
Nginx的默认配置文件在 /etc/nginx/nginx.conf,它通常会包含 include /etc/nginx/conf.d/*.conf; 这行指令,这意味着我们可以将自定义配置放在 /etc/nginx/conf.d/ 目录下,这样管理起来更清晰。
为Tduck创建一个新的配置文件:
sudo vim /etc/nginx/conf.d/tduck.conf
将以下配置粘贴进去。请仔细阅读注释并根据你的实际情况修改(特别是server_name和proxy_pass中的端口)。
server {
listen 80;
# 将localhost替换为你的服务器公网IP地址或已绑定的域名
server_name localhost;
# 前端静态文件服务
location / {
# 指向我们之前复制的前端dist目录
root /www/dist;
# 尝试按顺序寻找文件,对于Vue/React等单页应用,最终回退到index.html
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
# 后端API代理
# 所有以 /tduck-api/ 开头的请求,都转发给后端Java服务
location /tduck-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 代理到后端Spring Boot应用,默认端口是8999
proxy_pass http://127.0.0.1:8999/tduck-api/;
# 如果后端服务响应较慢,可以适当调整超时时间
# proxy_connect_timeout 60s;
# proxy_read_timeout 60s;
}
# 错误页面配置(可选)
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
配置完成后,检查Nginx配置语法是否正确:
sudo nginx -t
如果显示 syntax is ok 和 test is successful,就可以重新加载Nginx配置使其生效:
sudo nginx -s reload
# 或者使用systemctl
sudo systemctl reload nginx
4.2 系统防火墙与SELinux调整
为了让外部能够访问到Nginx服务的80端口,需要配置系统防火墙(如果启用的话)。CentOS 7默认使用firewalld。
配置Firewalld开放HTTP端口:
# 查看当前开放的端口
sudo firewall-cmd --list-all
# 永久开放80端口(HTTP)
sudo firewall-cmd --permanent --add-service=http
# 永久开放443端口(HTTPS,如果未来需要)
# sudo firewall-cmd --permanent --add-service=https
# 重新加载防火墙规则
sudo firewall-cmd --reload
禁用SELinux(针对本次部署简化处理): SELinux是增强Linux安全性的模块,但在某些应用部署中,严格的策略可能导致权限问题。对于学习环境,我们可以暂时将其设置为宽容模式或禁用。
# 临时设置为宽容模式(重启后失效)
sudo setenforce 0
# 永久禁用,需要修改配置文件
sudo vim /etc/selinux/config
找到 SELINUX=enforcing 这一行,将其修改为:
SELINUX=disabled
保存退出。这个修改需要重启服务器才能完全生效。如果不想立即重启,setenforce 0 命令在本次会话中有效。
4.3 启动后端服务与验证
所有配置都已就绪,现在是启动后端Spring Boot应用的时刻。
启动后端应用: 我们进入JAR包所在目录,以后台运行的方式启动它,并将日志输出到文件,方便排查问题。
cd /www/tduck-platform/tduck-api/target
# 使用nohup在后台运行,并将日志输出到tduck.log文件
sudo nohup java -Dfile.encoding=UTF-8 -jar tduck-api.jar > tduck.log 2>&1 &
nohup:确保命令在用户退出登录后仍能继续运行。> tduck.log:将标准输出重定向到tduck.log文件。2>&1:将标准错误也重定向到标准输出,即同样写入日志文件。&:在后台运行。
你可以通过以下命令查看应用是否启动成功,以及实时日志:
# 查看进程
ps aux | grep tduck-api.jar
# 查看日志尾部
tail -f tduck.log
当在日志中看到类似 Started TduckApiApplication in X.XXX seconds (JVM running for X.XXX) 的消息时,说明后端服务已成功启动在8999端口。
最终访问验证: 打开你的浏览器,输入服务器的IP地址(或配置的域名)。你应该能看到Tduck填鸭表单的登录界面。使用系统默认的账号进行登录测试:
- 账号:
test@tduckapp.com - 密码:
12345678
如果能够成功登录并进入管理后台,恭喜你!一个完全手动部署的、前后端分离的Tduck填鸭表单系统已经成功运行在你的CentOS 7服务器上。
部署后的一些思考与建议:
手动部署的过程就像完成了一次精密的机械组装,你对每个零件的功能和连接方式都了然于胸。与Docker部署相比,你获得了:
- 极致的透明性:清楚每一个服务(Java, MySQL, Redis, Nginx)的版本、配置文件和运行状态。
- 灵活的定制能力:可以轻松调整任何组件的配置,例如优化MySQL的
my.cnf、调整JVM启动参数(-Xmx等)、定制Nginx的负载均衡或缓存规则。 - 资源控制的精确性:每个进程独立管理,资源占用清晰可见,便于监控和调优。
当然,这也带来了更高的维护复杂度。对于生产环境,建议考虑以下增强措施:
- 服务进程管理:使用
systemd为tduck-api.jar创建自定义服务单元文件,实现开机自启、自动重启、日志轮转等标准化管理,远比简单的nohup可靠。 - 数据库安全:为Tduck应用创建独立的数据库用户,并赋予最小必要权限,而非直接使用root账户。
- 前端资源优化:配置Nginx对静态资源(如图片、JS、CSS)开启Gzip压缩和浏览器缓存,提升访问速度。
- HTTPS加密:使用Let‘s Encrypt等工具为域名申请免费SSL证书,并在Nginx中配置HTTPS,保障数据传输安全。
这次从零开始的手动部署,其意义不仅在于成功运行了Tduck,更在于为你打通了理解一个完整Web应用技术栈的任督二脉。下次面对任何一个新的开源项目,你都能更有信心地去拆解和部署它。
更多推荐
所有评论(0)