# ECS多语言应用手动部署实践
在弹性云服务器上部署并运行多种编程语言的代码产物时，可参考本文设置环境、部署代码，确保应用程序能够顺利运行。
#### 背景概览
在持续集成与持续部署（CI/CD）流程高度自动化的背景下，手动部署并未完全退出舞台，它在开发运维（DevOps）实践中仍具有多重意义：
- 衡量自动化成效的基准：通过人工执行部署，能够直观发现流程中的效率瓶颈与质量风险，为优化自动化脚本提供明确方向。
- 迈向自动化的实践桥梁：团队可以先将复杂的部署步骤以手动方式跑通，再逐步将其固化为自动化脚本，降低直接上自动化工具的门槛。
- 应对突发状况的备用方案：当自动化流水线因故障或变更中断时，手动部署可作为紧急手段恢复服务，确保业务连续性。
- 高风险操作的安全屏障：对于数据库变更、权限调整等敏感操作，保留人工审核与手动执行环节，可有效避免因自动化误操作导致的事故。
- 深化团队理解的培训工具：让新成员或开发人员亲自动手部署，有助于他们快速理解服务器环境、依赖关系等底层知识，弥补自动化"黑盒"带来的认知盲区。
需要注意的是，手动部署同样存在明显不足：操作效率低、易引入人为错误、缺乏可追溯的版本记录，且在多人协作时容易形成信息孤岛。
因此，建议仅在项目初期、自动化失效或高危操作等场景下有限使用，生产环境的常态化部署仍应优先采用成熟的自动化工具。
#### 部署构建
构建前，需要将开发完成的代码或构建好的产物传到弹性云服务器中，传输文件的方式参考[上传文件到云服务器方式概览](https://support.huaweicloud.com/ecs_faq/ecs_faq_0049.html)。
以下构建实践仅供示例参考。
| 编程语言                                      | 构建实践                                                                                                                                |
|:---|:---|
| [Java] | 以开源项目[spring-boot-demo](https://github.com/xkcoding/spring-boot-demo)中的demo-template-thymeleaf模块作为案例。                              |
| [Go]       | 以开源的[go-admin](https://github.com/go-admin-team/go-admin)，一个基于Gin + Vue + Element UI、Arco Design和Ant Design 的前后端分离权限管理系统脚手架项目作为案例。 |
| [C++]  | 创建一个简单的Hello World程序。                                                                                                              |
| [Python] | 以开源的[DashGo](https://gitee.com/luojiaaoo/DashGo)项目，一个开箱即用的低代码WEB框架，基于Plotly Dash框架和Fac开源组件库开发。                                      |
| [Node] | 以开源项目[MultiMind](https://gitee.com/cnt-code/multi-mind)为例，一个基于Node.js开发的项目，能创建并对话一个独立AI 角色的 Web 应用。                                 |
   
 #### Java
1. 检查Java环境 
   ```
   java -version
   ```
   若正确输出了Java版本信息，说明已安装环境。若未安装，可执行以下命令安装。
   1. 更新包管理工具。 使用dnf工具的系统（如CentOS 8等）
      ```
      sudo dnf update
      ```
      使用yum工具的系统（如CentOS 7等）
      ```
      sudo yum update
      ```
      使用apt工具的系统（如Ubuntu、Debian等）
      ```
      sudo apt update
      ```
      
   
   2. 搜索当前系统支持的OpenJDK安装包。 使用dnf工具的系统（如CentOS 8等）
      ```
      sudo dnf search openjdk
      ```
      使用yum工具的系统（如CentOS 7等）
      ```
      sudo yum search openjdk
      ```
      使用apt工具的系统（如Ubuntu、Debian等）
      ```
      sudo apt search openjdk
      ```
      
   
   3. 安装Java。 使用dnf工具的系统（如CentOS 8等）
      ```
      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
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      - 若只需运行Java程序，安装java-1.8.0-openjdk即可。
      
      - 若需开发Java 程序（编译、打包等），必须安装java-1.8.0-openjdk-devel，它通常会自动依赖并安装基础包。
        
   
   4. 验证Java安装情况，安装成功会显示版本信息。
      ```
      java -version
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526292130.png "点击放大")
      
   
   
   
   
2. 安装构建工具，一般使用Maven或Gradle。 
   - 访问[Maven官网](https://maven.apache.org/download.cgi)，下载Maven安装包，并完成解压与环境配置，具体操作请参见[Maven配置文档](https://maven.apache.org/guides/getting-started/index.html)。
   
   - 访问[Gradle官网](https://gradle.org/releases/)，下载Gradle安装包，并完成Gradle配置与测试，具体操作请参见[Gradle快速开始](https://gradle.org/guides/#getting_started)。
   
   
   
   
3. 使用Git克隆项目。 
   ```
   git clone https://github.com/xkcoding/spring-boot-demo.git
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   若无Git，可以执行**sudo yum install -y git**进行安装。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557501613.png "点击放大")
   
   
4. 使用Maven构建项目，需要根据自己克隆项目的所在路径进入项目，示例中的项目在/root/spring-boot-demo/demo-template-thymeleaf中。 
   ```
   sudo cd /root/spring-boot-demo/demo-template-thymeleaf
   mvn clean package
   ```
   回显如下，说明构建完成。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557503207.png "点击放大")
   
   
5. 使用nohup在后台启动项目。 
   ```
   sudo nohup java -jar target/demo-template-thymeleaf.jar > app.log 2>&1 &
   ```
   - nohup：避免进程在退出时收到挂起信号。
   
   - \> app.log：将标准输出定向到app.log文件。
   
   - 2\>\&1：将错误输出重定向到app.log文件。
   
   - \&：后台运行进程。
   
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526303538.png "点击放大")
   
   
6. 查看日志情况。 
   ```
   sudo tail -f app.log
   ```
   回显如下，表示服务启动成功。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557544729.png "点击放大")
   
   
7. 在浏览器输入地址*http://\<弹性云服务器的IP地址\>:8080/demo* ，访问项目。
   
   跳转至登录界面，则说明环境部署完成。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526562134.png "点击放大")
   
   
 
 #### Go
1. 执行命令安装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
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   若wget下载报错可以考虑使用Go语言中文网镜像。
   ```
   sudo wget https://golang.google.cn/dl/go1.23.6.linux-amd64.tar.gz
   ```
   
   
2. 验证Go版本。 
   ```
   go version
   ```
   回显如下，表示Go配置完成。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557508357.png)
   
   
3. 创建开发目录。 
   ```
   mkdir goadmin && cd goadmin
   ```
   
   
4. 获取项目源码，放到**同一个目录路径** 下，此处以/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
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   若无Git，可以执行**sudo yum install -y git**进行安装。
   
   
5. 启动服务端。 
   1. 更新项目依赖并构建项目。
      ```
      # 进入 go-admin 后端项目
      sudo cd ./go-admin
      # 更新整理依赖
      go mod tidy 
      # 编译项目
      go build
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      执行超时时可以尝试执行如下命令进行配置：
      ```
      # 设置代理为 goproxy.cn
      export GOPROXY=https://goproxy.cn,direct  
      # 设置校验和数据库为国内可访问的地址 
      export GOSUMDB=sum.golang.google.cn  
      # 验证是否设置成功 
      go env | grep -E 'GOPROXY|GOSUMDB'
      ```
      设置成功后可以再次执行原有编译命令即可。
      
   
   2. 部署MySQL数据库，详情可参考[Linux系统中部署MySQL数据库](https://support.huaweicloud.com/bestpractice-ecs/ecs_bp_0502.html)。
   
   3. 进入数据库。
      ```
      sudo mysql -uroot -p
      ```
      回车后输入密码。
      
   
   4. 新建名为go_admin的数据库，创建成功后退出数据库。
      ```
      create database go_admin;
      ```
      
   
   5. 修改配置文件，文件路径/root/goadmin/go-admin/config/settings.yml。
      ```
      sudo vim ./config/settings.yml
      ```
      如下图所示，可根据实际情况修改端口号、数据库等参数，此处示例中，需要修改数据库部分user、password、dbname为之前步骤中配置的数据库的用户名、密码以及数据库名go_admin。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557627791.png "点击放大")
      
   
   6. 初始化数据库，在go-admin路径下执行该命令，本文中为/root/goadmin/go-admin路径。
      ```
      sudo ./go-admin migrate -c config/settings.yml
      ```
      回显中显示**数据库基础数据初始化成功**，表示数据初始化完成。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526711496.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526711678.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526711788.png "点击放大")
      
   
   7. 启动go-admin服务。
      ```
      sudo ./go-admin server -c config/settings.yml -a true
      ```
      控制台回显如下，可见访问地址，表示服务启动成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526716388.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526552946.png "点击放大")
      
   
   
   
   
6. 启动客户端。 
   1. 进入前端项目路径。
      ```
      sudo cd ./go-admin-ui
      ```
      
   
   2. 安装依赖。
      ```
      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
      ```
      
   
   3. 启动前端服务。
      ```
      npm run dev
      ```
      回显如下，表示服务启动成功。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526560636.png)
      ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
      若提示报错Error：error:0308010C:digital envelope routines::unsupported，可执行以下命令兼容旧算法。
      ```
      export NODE_OPTIONS=--openssl-legacy-provider
      ```
      
   
   4. 在浏览器访问*http://\<弹性云服务器公网IP\>:9527* 。回显如下，表示服务部署成功，根据指引配置系统后即可使用。
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557721941.png "点击放大")
      
   
   
   
   
 
 #### C++
1. 安装C++相关的构建工具。 
   ```
   sudo yum install -y gcc gcc-c++ make
   ```
   使用以下命令检查是否安装成功。
   ```
   g++ --version
   ```
   回显如下表示安装成功。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557518359.png "点击放大")
   
   
2. 使用文本编辑器创建C++文件。 
   ```
   // hello.cpp
   #include <iostream> 
   int main() {
        std::cout << "Hello, World!" << std::endl;
        return 0; 
   }
   ```
   
   
3. 编译程序。 
   ```
   sudo g++ hello.cpp -o hello
   ```
   
   
4. 运行编译好的程序。 
   ```
   sudo ./hello
   ```
   回显如下，表示运行成功
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002526318712.png)
   
   
5. （可选）项目较大时，可考虑使用Makefile和CMake等构建系统管理编译，以Makefile为例。 
   创建一个名为Makefile的文件，写入如下内容。
   ```
   all: hello
   hello: hello.cpp
       g++ hello.cpp -o hello
   clean:
       rm -f hello
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/caution_3.0-zh-cn.png)
   - Makefile文件中的格式中需要使用Tab键，如以上内容中，第四行、第七行命令前需要使用Tab键。
   
   - Makefile文件的目录树如下：
   
   
   ```
   my_cpp_project/ 
   ├── Makefile 
   └── hello.cpp
   ```
   
   
 
 #### Python
此处以CentOS 8.0为例。
1. 执行以下命令查看python版本，要求安装3.10以上版本。 
   ```
   python --version
   ```
   回显如下表示已具备python环境，若报错，需要配置Python环境，参考[搭建Python环境](https://support.huaweicloud.com/bestpractice-ecs/ecs_bp_6008.html)。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002557783813.png)
   若环境中已经有了其他版本的Python，可以考虑使用pyenv管理安装多版本Python。
   1. 安装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
      ```
      
   
   2. 配置环境变量，将其配置到启动配置文件中即可长期生效。
      ```
      export PATH="$HOME/.pyenv/bin:$PATH" 
      eval "$(pyenv init --path)" 
      eval "$(pyenv init -)"
      ```
      
   
   3. 使环境变量生效。
      ```
      source ~/.bashrc
      ```
      
   
   4. 查看可安装的Python版本。
      ```
      pyenv install -l | grep -E '^[^a-zA-Z]+$'
      ```
      
   
   5. 安装Python，以3.12.1为例。
      ```
      pyenv install 3.12.1
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002558335513.png "点击放大")
      
   
   6. 查看当前版本。
      ```
      pyenv version
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002527335632.png)
      
   
   7. 使用特定版本的python后再次查看。
      ```
      pyenv local 3.12.1
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002527335756.png)
      
   
   8. （可选）如需将使用的python固定到shell命令中，并同步固定同版本的pip时，可使用如下命令：
      ```
      find / -name python
      find / -name pip
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002527335782.png "点击放大")
      如上图所示，将找到的/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
      ```
      ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002558335817.png)
      
   
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   若没有Development Tools组包，可以执行以下命令直接安装：
   ```
   sudo yum install gcc gcc-c++ make
   ```
   
   
2. 获取DashGo源码。 
   ```
   git clone https://gitee.com/luojiaaoo/DashGo.git
   ```
   
   
3. 进入DashGo目录，安装项目所需依赖，Linux操作系统使用requirements_linux.txt文件。 
   ```
   cd DashGo/
   python -m pip install -r requirements_linux.txt
   ```
   
   
4. 部署MySQL数据库，详情可参考[Linux系统中部署MySQL数据库](https://support.huaweicloud.com/bestpractice-ecs/ecs_bp_0502.html)。
5. 在进入项目目录下的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()"
   ```
   
   
6. 安装Gunicorn，并启动服务。 
   ```
   pip install gunicorn
   gunicorn --capture-output -w 4 -b 0.0.0.0:8090 app:server
   ```
   回显如下，表示处于监听中。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002527177500.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   若安装成功后提示没有gunicorn命令，可以使用以下命令刷新缓存后再次执行。
   ```
   hash -r
   ```
   
   
7. 弹性云服务器安全组放通8090端口，详情可参考[添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
8. 浏览器中访问*http://\<弹性云服务器公网IP\>:8090* ，回显如下表示部署成功。
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002527177598.png "点击放大")
   
   
 
 #### Node
以CentOS 8.0为例。
1. 配置NodeJS环境，要求部署Node.js 18.x或更高版本，npm 9.x或更高版本。 
   参考[手工部署Node.js](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_topic_0151248730.html)，推荐使用nvm配置部署，本次安装的是v22.5.0的版本。
   
   
2. 获取源码。 
   ```
   git clone https://gitee.com/cnt-code/multi-mind.git
   ```
   
   
3. 进入项目目录。 
   ```
   cd multi-mind
   ```
   
   
4. 安装依赖。 
   ```
   npm install
   ```
   
   
5. 启动服务。 
   ```
   npm start
   ```
   
   
6. 浏览器中访问*http://\<弹性云服务器公网IP\>:3002* ，回显如下表示服务部署成功。
   
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002527123038.png "点击放大")
   
   
 
