跳到主要内容

Ubuntu平台部署

说明

我们主要以Ubuntu 22.4 / 24.04 服务器环境为例介绍 YFIOs 物联网平台标准落地部署流程。

准备工作

注意:Ubuntu 24.04 与 22.04 的源配置格式存在显著差异(前者默认使用 DEB822 格式,后者为传统格式),请根据实际情况选择。

在开始部署前,请先在 Ubuntu 22.04 服务器中配置国内APT源。

Ubuntu 22.04 版本更新源

# Ubuntu 22.04 更新源

# 备份原sources.list
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 一键替换为阿里云源
sudo tee /etc/apt/sources.list <<'EOF'
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
EOF

# 刷新软件源索引并升级软件包
sudo apt update && sudo apt upgrade -y

Ubuntu 24.04 版本更新源

# Ubuntu 24.04 更新源(DEB822 格式,ubuntu.sources)

# 备份原 ubuntu.sources(如果存在)
if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
fi

# 一键写入阿里云源(noble)
sudo tee /etc/apt/sources.list.d/ubuntu.sources <<'EOF'
Types: deb deb-src
URIs: https://mirrors.aliyun.com/ubuntu/
Suites: noble noble-security noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF

# 刷新软件源索引并升级软件包
sudo apt update && sudo apt upgrade -y

1 安装 MySQL 8.0

安装

直接装最新稳定版

sudo apt install -y mysql-server

生产环境安全初始化

提示:以下交互流程基于 Ubuntu 22.04。若你在 Ubuntu 24.04 下执行,因默认认证方式改为 auth_socket,脚本会跳过“设置 root 密码”步骤,这属于正常现象。

root@yfubuntu:/# sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): //初次运行直接回车
OK, successfully used password, moving on…
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] //是否设置root用户密码,输入Y并回车或直接回车

New password: //设置root用户的密码 (默认可设置为:yfsoft1018#mysql)

Re-enter new password: //再次输入你设置的密码
Password updated successfully!
Reloading privilege tables..
… Success!

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] //是否删除匿名用户,生产环境建议删除,所以直接回车
… Success!

Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] //是否禁止root远程登录,根据自己的需求选择Y/n并回车,建议禁止
… Success!

By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] //是否删除test数据库,直接回车
- Dropping test database…
… Success!
- Removing privileges on test database…
… Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] //是否重新加载权限表,直接回车
… Success!
Cleaning up…
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!

测试登录(可选)

sudo mysql -u root -p

初始化数据库

创建文件夹

# 创建初始化脚本文件夹
sudo mkdir -p ~/init-sql && cd ~/init-sql

把00-init-db.sql 和 所有的 yf_xxx.sql(建表、数据)全部复制到 init-sql/ 目录下

init-sql/
├── 00-init-db.sql # 必须第一个执行
├── yf_user.sql
├── yf_role.sql
├── yf_device.sql
└── ... ...

: 以上配置文件及业务表结构文件,请从如下地址下载: https://www.yfios.net/download/deploy/mysql_config_files.rar

创建执行脚本

sudo nano ~/init-sql/run-all-sql.sh

粘贴以下内容(如果密码不同,请替换密码):

#!/bin/bash

# =============== 密码如果不是默认,请请修改这里 =========
#!/bin/bash

# ===================== 配置 =====================
MYSQL_USER="root"
MYSQL_PASSWORD="yfsoft1018#mysql"
# =================================================

# ===== 自动获取脚本所在目录(核心!支持相对路径)=====
SCRIPT_PATH=$(readlink -f "$0")
SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
SQL_DIR="$SCRIPT_DIR"
# =================================================

echo "============================================="
echo " 自动识别脚本目录:$SQL_DIR"
echo " 开始按顺序执行 SQL 文件"
echo "============================================="

# 检查是否有 sql 文件
sql_count=$(ls -1 "$SQL_DIR"/*.sql 2>/dev/null | wc -l)
if [ "$sql_count" -eq 0 ]; then
echo "✗ 错误:当前目录没有找到 .sql 文件!"
exit 1
fi

# 按文件名排序执行(00开头最先执行)
for sql_file in $(ls -1 "$SQL_DIR"/*.sql | sort); do
echo ""
echo "→ 执行:$sql_file"

mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" --default-character-set=utf8mb4 < "$sql_file"

if [ $? -ne 0 ]; then
echo "✗ 执行失败:$sql_file"
exit 1
fi
done

echo ""
echo "所有 SQL 文件执行完成!"

赋予权限并执行

# 修改权限
sudo chmod +x ~/init-sql/run-all-sql.sh

# 执行!
sudo ~/init-sql/run-all-sql.sh

确保开机自启(系统默认已开启)

# 查看是否开启自启 返回 enabled 就是开机自启成功
systemctl is-enabled mysql

# 开机自启
sudo systemctl enable mysql
sudo systemctl start mysql

# 查看状态
sudo systemctl status mysql

# 查看日志(可选)
sudo tail -f /var/log/mysql/error.log

MySQL定时备份

创建文件夹

sudo mkdir -p /var/backups/mysql
sudo mkdir -p /var/log/mysql

编写备份脚本

sudo nano /usr/local/bin/mysql_backup.sh

粘贴以下内容(如果密码不同,请替换密码):

#!/bin/bash
set -Eeuo pipefail

# 配置
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +"%Y%m%d_%H%M%S")
LOG_FILE="/var/log/mysql/backup_${DATE}.log"
MYSQL_USER="root"
MYSQL_PASS="yfsoft1018#mysql"
KEEP_DAYS=7 # 保留7天备份

# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

log "=== 开始 MySQL 全量备份 ==="

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 备份文件名
BACKUP_FILE="${BACKUP_DIR}/mysql_full_${DATE}.sql.gz"

# 执行备份(InnoDB 无锁,兼容所有库)
if mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" \
--all-databases \
--single-transaction \
--routines \
--triggers \
--default-character-set=utf8mb4 \
| gzip > "$BACKUP_FILE"; then
log "备份成功:$BACKUP_FILE"
else
log "备份失败!"
exit 1
fi

# 清理过期备份(保留7天)
log "清理 ${KEEP_DAYS} 天前的备份..."
find "$BACKUP_DIR" -type f -name "*.sql.gz" -mtime +"$KEEP_DAYS" -delete

log "=== 备份任务完成 ==="

赋予执行权限

sudo chmod +x /usr/local/bin/mysql_backup.sh

# 可手动测试,查看 /var/backups/mysql 生成 .sql.gz 文件即成功。
sudo /usr/local/bin/mysql_backup.sh

配置定时任务

打开定时任务编辑器

sudo crontab -e

在文件 最后一行 粘贴下面的内容,保存并退出

# 示例每天 2:00 执行 MySQL 全量备份
0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql/cron_backup.log 2>&1

查看定时任务

sudo crontab -l

恢复备份

# 1. 切换到备份目录
cd /var/backups/mysql
# 2. 解压(示例:20260331_020000.sql.gz)
sudo gunzip mysql_full_20260331_020000.sql.gz

# 恢复
sudo mysql -u root -p < mysql_full_20260331_020000.sql

补充

如果允许mysql被远程访问,还需要做如下操作

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 bind-address = 127.0.0.1 修改为 bind-address = 0.0.0.0
保存并退出,然后重启mysql。

sudo systemctl restart mysql

2 安装 TDengine 3.3.6

下载安装

sudo mkdir -p ~/tdengine  && cd ~/tdengine

# 下载 3.3.6.13 版本
sudo wget https://www.taosdata.com/assets-download/3.0/TDengine-server-3.3.6.13-Linux-x64.tar.gz
# 以上官方地址如果下载失败,可以从如下地址下载
sudo wget https://www.yfios.net/download/deploy/TDengine-server-3.3.6.13-Linux-x64.tar.gz

# 解压
tar -zxvf TDengine-server-3.3.6.13-Linux-x64.tar.gz
cd TDengine-server-3.3.6.13

# 安装
sudo ./install.sh

安装完成后,TDengine 会自动注册为系统服务。

设置开机自启

# 查看是否开启自启 返回 enabled 就是开机自启成功
systemctl is-enabled taosd
# 没返回enabled 就设置开机自启
sudo systemctl enable taosd

# 启动服务
sudo systemctl start taosd

# 查看状态 看到 active (running) 就是成功。
sudo systemctl status taosd

# -------------------------------
# 启动 REST API 网关服务
sudo systemctl start taosadapter

# 设置开机自启,确保重启服务器后它能跟着 taosd 一起起来
sudo systemctl enable taosadapter

# 检查一下状态,看到 active (running) 就说明 6041 端口通了
sudo systemctl status taosadapter

创建数据库 yfios_iot_db

sudo taos -s "CREATE DATABASE IF NOT EXISTS yfios_iot_db;"

修改root密码

sudo taos -s "ALTER USER root PASS 'yfsoft1018#taos';"
# 重启服务
sudo systemctl restart taosd

# 验证密码 返回结果包含 yfios_iot_db 即成功。
curl -u root:yfsoft1018#taos -d "show databases;" http://127.0.0.1:6041/rest/sql

3 安装Redis 6.x

安装

Ubuntu 22.04 官方源就是 6.x

sudo apt update
sudo apt install -y redis-server
# 查看版本
sudo redis-server -v

# 查看是否开启自启 返回 enabled 就是开机自启成功
sudo systemctl is-enabled redis-server

# 开机自启(默认已经开启)
sudo systemctl enable redis-server
sudo systemctl start redis-server

#确保 Redis 数据目录权限正确(防止写入失败)
sudo chown -R redis:redis /var/lib/redis
sudo chmod -R 775 /var/lib/redis

#验证 Redis 服务正常响应(返回 PONG 即成功)
redis-cli ping

# 查看状态
sudo systemctl status redis-server

💡 避坑指南:

如果发现Redis 的工作目录被设置成了根目录 /,没有权限写文件!

# 打开redis.conf文件
sudo nano /etc/redis/redis.conf

# 在文件末尾添加如下内容
dir /var/lib/redis
stop-writes-on-bgsave-error no

保存:Ctrl+O → 回车 → Ctrl+X
重启 Redis服务即恢复正常。

sudo systemctl start redis-server
sudo systemctl status redis-server

后续会拷贝配置文件redis.conf到/etc/redis/目录,增加用户密码等信息。

4 安装 EMQX v5.8.6

安装

sudo curl -fL https://www.emqx.com/zh/downloads/broker/v5.8.6/emqx-5.8.6-ubuntu22.04-amd64.deb -o emqx.deb
sudo dpkg -i emqx.deb && rm -f emqx.deb

# 查看是否开启自启 返回 enabled 就是开机自启成功
sudo systemctl is-enabled emqx

# 开机自启(已设置开机自启)
sudo systemctl enable emqx
sudo systemctl start emqx

# 查看状态
sudo systemctl status emqx

# 也可查看日志,出现 EMQX 5.8.6 is running now! 就是运行成功了
journalctl -u emqx -f --no-pager

默认配置的添加说明

后续emqx.conf、default_api_key.conf和cluster.hocon相关配置文件会被更新,然后重启emqx服务即可。

5 安装 nginx

安装

sudo apt install -y nginx

# 查看是否开启自启 返回 enabled 就是开机自启成功
sudo systemctl is-enabled nginx

# 设置开机自启(默认已经开启)
sudo systemctl enable nginx
sudo systemctl start nginx

#查看状态
sudo systemctl status nginx

常用指令

# 重启
sudo systemctl restart nginx

# 重新加载配置(不中断服务)
sudo systemctl reload nginx

# 停止
sudo systemctl stop nginx

# 查看配置是否有错
sudo nginx -t

6 安装Node.js 20.x

# 1. 添加 NodeSource 官方源(Node.js 20.x)
sudo curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -

# 2. 安装 Node.js 20.x(自带 npm)
sudo apt install -y nodejs

# 3. 验证版本
node -v
npm -v

7 安装 PM2 和 pnpm

# 1. 全局安装 pm2
sudo npm install pm2 -g

# 2. 启用 corepack(需要写系统目录,所以单独 sudo)
sudo corepack enable

# 3. 激活 pnpm
corepack prepare pnpm@latest --activate

# 配置 npm & pnpm国内源
sudo npm config set registry https://registry.npmmirror.com
sudo pnpm config set registry https://registry.npmmirror.com

# 查看版本
pnpm -v

8 部署YFIOs项目文件

创建 YFIOs 项目目录

sudo mkdir -p /app/yfios-platform && cd /app/yfios-platform

安装项目依赖

方式一:命令安装项目依赖(推荐)

# 进入当前目录,并清空
cd /app/yfios-platform
sudo rm -rf *

# 从指定网址下载 YFIOS 2.0.0 的 RAR 压缩包到当前目录
sudo wget https://www.yfios.net/download/deploy/yfios_2.0.0.rar -O yfios_2.0.0.rar
# 安装 rar 和 unrar 工具,用于处理 RAR 压缩文件
sudo apt install -y rar unrar
# 将 RAR 包解压到当前目录,如果有同名文件则直接覆盖
sudo unrar x -o+ yfios_2.0.0.rar .

# 安装依赖
# 将 /app/yfios-platform 目录及其子文件的所有权递归更改为 root 用户和组
sudo chown -R root:root /app/yfios-platform
# 进入后端项目目录
cd /app/yfios-platform/backend
# 根据 lockfile 安装生产环境依赖(不安装开发依赖),并锁定版本防止自动更新
pnpm install --prod --frozen-lockfile
# 清理 pnpm 全局存储中未被任何项目引用的过期缓存包,释放磁盘空间
sudo pnpm store prune
# 强制删除 root 用户的缓存以及系统临时目录下的所有文件,清理环境
sudo rm -rf /root/.cache /tmp/* /var/tmp/*

方式二:手动下载项目文件包(可选,建议使用命令下载)

下载 YFIOs2.0.0 项目文件包,解压到 /app/yfios-platform 目录下,然后进入到 /app/yfios-platform 目录下安装依赖。

配置文件注入

# 修正换行符(防止 Windows 拷贝过来的文件常带 \r,会导致 Linux 启动失败)
sudo apt install -y dos2unix
sudo find /app/yfios-platform/config -type f -exec dos2unix {} +

# 进入项目目录
cd /app/yfios-platform

# 停止 emqx 服务,拷贝的配置才能真正更新
sudo systemctl stop emqx

# 复制配置文件
sudo cp -f config/nginx.conf /etc/nginx/nginx.conf
sudo cp -f config/redis.conf /etc/redis/redis.conf
sudo cp -f config/emqx.conf /etc/emqx/emqx.conf
sudo cp -f config/default_api_key.conf /etc/emqx/default_api_key.conf

# 确保 EMQX 动态配置目录存在(使用物理机标准路径 /var/lib/emqx)
sudo mkdir -p /var/lib/emqx/configs
# 如果不为空,需要清空一下
sudo rm -rf /var/lib/emqx/configs/*
sudo cp -f config/cluster.hocon /var/lib/emqx/configs/cluster.hocon

# 权限修正与目录准备
sudo mkdir -p /app/logs /app/data /app/data/upload/firmware /app/data/download/image/user /app/data/download/image/company

sudo mkdir -p /var/lib/emqx /var/log/emqx

# 赋权应用数据目录
sudo chmod -R 777 /app/logs /app/data

# 清理 EMQX 旧数据防止节点冲突
sudo rm -rf /var/lib/emqx/mnesia/*

# 核心:将配置目录、数据目录、日志目录全部交给 emqx 用户 (非常关键,否则 API Key 读取失败启动崩溃)
sudo chown -R emqx:emqx /etc/emqx /var/lib/emqx /var/log/emqx

# 锁定关键配置文件权限
sudo chmod 644 /etc/redis/redis.conf /etc/emqx/default_api_key.conf

重启系统所有服务

sudo systemctl daemon-reload

sudo systemctl restart redis-server
sudo systemctl restart emqx
sudo systemctl restart nginx
sudo systemctl restart mysql
sudo systemctl restart taosd taosadapter

环境变量配置

配置文件为:/app/yfios-platform/backend/packages/.env 假如本地IP地址为:192.168.1.197

# 进入项目目录
cd /app/yfios-platform/backend/packages

nano .env

内容如下(请根据实际进行配置):

  # ======================
# 文件路径环境变量
# ======================
BASE_OTA_UPLOAD_PATH="/app/data/upload/firmware"
BASE_USER_IMAGE_PATH="/app/data/download/image/user"
BASE_COMPANY_IMAGE_PATH="/app/data/download/image/company"

# ======================
# Redis 环境变量
# ======================
REDIS_HOST="127.0.0.1"
REDIS_PORT="6379"
REDIS_PASSWORD="YFRedis1018"
REDIS_DB="1"

# ======================
# MySQL 环境变量
# ======================
RDB_MYSQL_IOT_HOST="127.0.0.1"
RDB_MYSQL_IOT_PORT="3306"
RDB_MYSQL_IOT_USERNAME="yfios"
RDB_MYSQL_IOT_PASSWORD="yfsoft1018#mysql"
RDB_MYSQL_IOT_DATABASE="yfios-platform-db"

# ======================
# TDengine 环境变量
# ======================
RTB_TDENGINE_HOST="127.0.0.1"
RTB_TDENGINE_PORT="6041"
RTB_TDENGINE_USER="root"
RTB_TDENGINE_PASSWD="yfsoft1018#taos"
RTB_TDENGINE_DATABASENAME="yfios_iot_db"

# ======================
# MQTT 外部地址环境变量
# ======================
MQTT_MQTT_TCP="mqtt://192.168.1.197:1883"
MQTT_MQTT_TLS="mqtts:/192.168.1.197:8883"
MQTT_MQTT_WS="ws://192.168.1.197:1888"
MQTT_EMQX_MQTT_WS="ws://192.168.1.197:8083"
MQTT_MQTT_WSS="wss://192.168.1.197:8888"

使用PM2管理YFIOs后端服务

启动项目

cd /app/yfios-platform/backend
pm2 start ecosystem.config.js

设置PM2开机自启

pm2 startup
pm2 save

PM2 常用管理命令

# 查看状态
pm2 status

# 重启服务
pm2 restart all

# 停止服务
pm2 stop all

# 查看日志
pm2 logs

# 保存开机自启
pm2 save

9 YFIOs 平台访问

http://192.168.1.197/ 若正常展示系统登录界面,即代表 YFIOs 平台部署完成。 YFIOs

  • 默认登录账号: admin
  • 默认登录密码:yf123456

10 EMQX 管理控制服务访问

http://192.168.1.197:18083/
若可正常进入控制台登录页面,即代表 EMQX 服务部署正常。 EMQX

  • 默认管理账号:admin
  • 默认管理密码:public