手动部署基础
在弹性云服务器上部署并运行多种编程语言的代码产物时,可参考本文设置环境、部署代码,确保应用程序能够顺利运行。
背景概览
在持续集成与持续部署(CI/CD)流程高度自动化的背景下,手动部署并未完全退出舞台,它在开发运维(DevOps)实践中仍具有多重意义:
- 衡量自动化成效的基准:通过人工执行部署,能够直观发现流程中的效率瓶颈与质量风险,为优化自动化脚本提供明确方向。
- 迈向自动化的实践桥梁:团队可以先将复杂的部署步骤以手动方式跑通,再逐步将其固化为自动化脚本,降低直接上自动化工具的门槛。
- 应对突发状况的备用方案:当自动化流水线因故障或变更中断时,手动部署可作为紧急手段恢复服务,确保业务连续性。
- 高风险操作的安全屏障:对于数据库变更、权限调整等敏感操作,保留人工审核与手动执行环节,可有效避免因自动化误操作导致的事故。
- 深化团队理解的培训工具:让新成员或开发人员亲自动手部署,有助于他们快速理解服务器环境、依赖关系等底层知识,弥补自动化“黑盒”带来的认知盲区。
需要注意的是,手动部署同样存在明显不足:操作效率低、易引入人为错误、缺乏可追溯的版本记录,且在多人协作时容易形成信息孤岛。
因此,建议仅在项目初期、自动化失效或高危操作等场景下有限使用,生产环境的常态化部署仍应优先采用成熟的自动化工具。
部署构建
构建前,需要将开发完成的代码或构建好的产物传到弹性云服务器中,传输文件的方式参考上传文件到云服务器方式概览。
以下构建实践仅供示例参考。
| 编程语言 | 构建实践 |
|---|---|
| 以开源项目spring-boot-demo中的demo-template-thymeleaf模块作为案例。 | |
| 以开源的go-admin,一个基于Gin + Vue + Element UI、Arco Design和Ant Design 的前后端分离权限管理系统脚手架项目作为案例。 | |
| 创建一个简单的Hello World程序。 | |
| 以开源的DashGo项目,一个开箱即用的低代码WEB框架,基于Plotly Dash框架和Fac开源组件库开发。 | |
| 以开源项目MultiMind为例,一个基于Node.js开发的项目,能创建并对话一个独立AI 角色的 Web 应用。 |
Java
- 检查Java环境
java -version
回显如下,说明已安装了环境。若未安装,可执行以下命令安装。
- 更新包管理工具。
sudo dnf update
使用yum工具的系统(如CentOS 7等)
sudo yum update
使用apt工具的系统(如Ubuntu、Debian等)
sudo apt update
- 搜索当前系统支持的OpenJDK安装包。
sudo dnf search openjdk
使用yum工具的系统(如CentOS 7等)
sudo yum search openjdk
使用apt工具的系统(如Ubuntu、Debian等)
sudo apt search openjdk
- 安装Java。
sudo dnf install -y java-1.8.0-openjdk-devel
使用yum工具的系统(如CentOS 7等)
sudo yum install -y java-1.8.0-openjdk-devel
使用apt工具的系统(如Ubuntu、Debian等)
sudo apt-get install -y openjdk-8-jdk
- 若只需运行Java程序,安装java-1.8.0-openjdk 即可。
- 若需开发Java 程序(编译、打包等),必须安装java-1.8.0-openjdk-devel,它通常会自动依赖并安装基础包。
- 验证Java安装情况,安装成功会显示版本信息。
java -version

- 更新包管理工具。
- 安装构建工具,一般使用Maven或Gradle。
- 访问Maven官网,下载Maven安装包,并完成解压与环境配置,具体操作请参见Maven配置文档。
- 访问Gradle官网,下载Gradle安装包,并完成Gradle配置与测试,具体操作请参见Gradle快速开始。
- 使用Git克隆项目。
git clone https://github.com/xkcoding/spring-boot-demo.git
若无Git,可以执行sudo yum install -y git进行安装。

- 使用Maven构建项目,需要根据自己克隆项目的所在路径进入项目,示例中的项目在/root/spring-boot-demo/demo-template-thymeleaf中。
sudo cd /root/spring-boot-demo/demo-template-thymeleaf mvn clean package
回显如下,说明构建完成。

- 使用nohup在后台启动项目。
sudo nohup java -jar target/demo-template-thymeleaf.jar > app.log 2>&1 &
- nohup:避免进程在退出时收到挂起信号。
- > app.log:将标准输出定向到app.log文件。
- 2>&1:将错误输出重定向到app.log文件。
- &:后台运行进程。

- 查看日志情况。
sudo tail -f app.log
回显如下,表示服务启动成功。

- 输入地址http://<弹性云服务器的IP地址>:8080/demo,访问项目。

Go
- 执行命令安装Go编辑器。以Go 1.23.6为例,下载go安装包。
sudo wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz sudo tar -zxvf go1.23.6.linux-amd64.tar.gz -C /usr/local/ # 配置环境变量 sudo echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bash_profile && source ~/.bash_profile
若wget下载报错可以考虑使用Go语言中文网镜像。
sudo wget https://golang.google.cn/dl/go1.23.6.linux-amd64.tar.gz
- 验证Go版本。
go version
回显如下,表示Go配置完成。

- 创建开发目录。
mkdir goadmin && cd goadmin
- 获取项目源码,放到同一个目录路径下,此处以/root/goadmin路径为例。
# 获取后端代码 git clone https://github.com/go-admin-team/go-admin.git # 获取前端代码 git clone https://github.com/go-admin-team/go-admin-ui.git
若无Git,可以执行sudo yum install -y git进行安装。
- 启动服务端。
- 更新项目依赖并构建项目。
# 进入 go-admin 后端项目 sudo cd ./go-admin # 更新整理依赖 go mod tidy # 编译项目 go build
执行超时时可以尝试执行如下命令进行配置:
# 设置代理为 goproxy.cn export GOPROXY=https://goproxy.cn,direct # 设置校验和数据库为国内可访问的地址 export GOSUMDB=sum.golang.google.cn # 验证是否设置成功 go env | grep -E 'GOPROXY|GOSUMDB'
设置成功后可以再次执行原有编译命令即可。
- 部署MySQL数据库,详情可参考Linux系统中部署MySQL数据库。
- 进入数据库。
sudo mysql -uroot -p
回车后输入密码。
- 新建名为go_admin的数据库,创建成功后退出数据库。
create database go_admin;
- 修改配置文件,文件路径/root/goadmin/go-admin/config/settings.yml。
sudo vim ./config/settings.yml
如下图所示,可根据实际情况修改端口号、数据库等参数,此处示例中,需要修改数据库部分user、password、dbname为之前步骤中配置的数据库的用户名、密码以及数据库名go_admin。

- 初始化数据库,在go-admin路径下执行该命令,本文中为/root/goadmin/go-admin路径。
sudo ./go-admin migrate -c config/settings.yml
回显中显示 数据库基础数据初始化成功,表示数据初始化完成。



- 启动go-admin服务。
sudo ./go-admin server -c config/settings.yml -a true
控制台回显如下,可见访问地址,表示服务启动成功。


- 更新项目依赖并构建项目。
- 启动客户端。
- 进入前端项目路径。
sudo cd ./go-admin-ui
- 安装依赖。
npm install --registry=https://registry.npmmirror.com --legacy-peer-deps
若提示无npm包,可参考如下命令安装。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install --lts
- 启动前端服务。
npm run dev
回显如下,表示服务启动成功。

若提示报错Error:error:0308010C:digital envelope routines::unsupported,可执行以下命令兼容旧算法。
export NODE_OPTIONS=--openssl-legacy-provider
- 在浏览器访问http://<弹性云服务器公网IP>:9527。回显如下,表示服务部署成功,根据指引配置系统后即可使用。

- 进入前端项目路径。
C++
- 安装C++相关的构建工具。
sudo yum install -y gcc gcc-c++ make
使用以下命令检查是否安装成功。
g++ --version
回显如下表示安装成功。

- 使用文本编辑器创建C++文件。
// hello.cpp #include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; } - 编译程序。
sudo g++ hello.cpp -o hello
- 运行编译好的程序。
sudo ./hello
回显如下,表示运行成功

- (可选)项目较大时,可考虑使用Makefile和CMake等构建系统管理编译,以Makefile为例。 创建一个名为Makefile的文件,写入如下内容。
all: hello hello: hello.cpp g++ hello.cpp -o hello clean: rm -f hello
- Makefile文件中的格式中需要使用Tab键,如以上内容中,第四行、第七行命令前需要使用Tab键。
- Makefile文件的目录树如下:
my_cpp_project/ ├── Makefile └── hello.cpp
Python
此处以CentOS 8.0为例。
- 执行以下命令查看python版本,要求安装3.10以上版本。
python --version
回显如下表示已具备python环境,若报错,需要配置Python环境,参考搭建Python环境。

若环境中已经有了其他版本的Python,可以考虑使用pyenv管理安装多版本Python。
- 安装pyenv。
sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel libffi-devel xz-devel git clone https://gitee.com/mirrors/pyenv.git ~/.pyenv
- 配置环境变量,将其配置到启动配置文件中即可长期生效。
export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init --path)" eval "$(pyenv init -)"
- 使环境变量生效。
source ~/.bashrc
- 查看可安装的Python版本。
pyenv install -l | grep -E '^[^a-zA-Z]+$'
- 安装Python,以3.12.1为例。
pyenv install 3.12.1

- 查看当前版本。
pyenv version

- 使用特定版本的python后再次查看。
pyenv local 3.12.1

- (可选)如需将使用的python固定到shell命令中,并同步固定同版本的pip时,可使用如下命令:
find / -name python find / -name pip

如上图所示,将找到的/bin/python、/bin/pip文件创建软链接指向/usr/local/bin中。
ln -s /root/.pyenv/versions/3.12.1/bin/python /usr/local/bin/python ln -s /root/.pyenv/versions/3.12.1/bin/pip /usr/local/bin/pip
查看并确定已经配置好快捷命令。
which python which pip

若没有Development Tools组包,可以执行以下命令直接安装:sudo yum install gcc gcc-c++ make
- 安装pyenv。
- 获取DashGo源码。
git clone https://gitee.com/luojiaaoo/DashGo.git
- 进入DashGo目录,安装项目所需依赖,Linux操作系统使用requirements_linux.txt文件。
cd DashGo/ python -m pip install -r requirements_linux.txt
- 部署MySQL数据库,详情可参考Linux系统中部署MySQL数据库。
- 在进入项目目录下的src目录,初始化数据库表结构和admin管理员数据。
cd src/ python -c "from database.sql_db.conn import create_rds_table; create_rds_table()" python -c "from database.sql_db.conn import init_rds_data; init_rds_data()"
- 安装Gunicorn,并启动服务。
pip install gunicorn gunicorn --capture-output -w 4 -b 0.0.0.0:8090 app:server
回显如下,表示处于监听中。

若安装成功后提示没有gunicorn命令,可以使用以下命令刷新缓存后再次执行。
hash -r
- 弹性云服务器安全组放通8090端口,详情可参考添加安全组规则。
- 浏览器中访问http://<弹性云服务器公网IP>:8090,回显如下表示部署成功。

Node
以CentOS 8.0为例。
- 配置NodeJS环境,要求部署Node.js 18.x或更高版本,npm 9.x或更高版本。
参考手工部署Node.js,推荐使用nvm配置部署,本次安装的是v22.5.0的版本。
- 获取源码。
git clone https://gitee.com/cnt-code/multi-mind.git
- 进入项目目录。
cd multi-mind
- 安装依赖
npm install
- 启动服务
npm start
- 浏览器中访问http://<弹性云服务器公网IP>:3002,回显如下表示服务部署成功。
