前言
1、Sonic介绍
- Sonic是一款开源、支持分布式部署、在线自动化测试的私有云真机平台,Sonic官网地址
功能特性:
Sonic架构:
2、准备工作
①准备两台设备,并安装Centos7系统,设备简称:设备1(Sonic Server)和设备2(Sonic Agent)
系统版本(命令:cat /etc/centos-release):CentOS Linux release 7.7.1908 (Core)
②准备一台Android设备,并开启USB调试
③准备一台操作电脑,并安装FinalShell工具
一、Sonic Server 部署
1、部署Server端
①通过FinalShell远程连接设备1,并进入/home目录
②新建SonicServer.sh文件
③并添加以下内容,保存
需要修改的地方:
- sonicversion=“v2.6.1” # 软件版本,通过官网获取最新版本
- ip=“192.168.100.235” # sonic-server服务器地址
- new_passwd=“sonicwan654” # MySQL密码,可自行修改
- db=“sonic” # sonic-server库名
#!/bin/bash
# 封装需要修改的变量
initialize_variables(){
#软件版本,新版本可去github获取,https://github.com/SonicCloudOrg/sonic-server/releases
sonicversion="v2.6.1"
#sonic-server服务器地址
ip="192.168.100.235"
#MySQL新密码,默认密码sonicwan654,用户可自定义修改
new_passwd="sonicwan654"
#sonic-server库名
db="sonic"
}
# 安装Docker
InstallDocker(){
#1.向系统添加Docker CE软件仓库的源地址,如该源无法使用可以替换阿里云Docker CE软件仓库地址
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#2.生成并更新系统中的软件包缓存
yum makecache fast
#3.安装docker
yum install -y docker-ce
#4.启动docker
systemctl start docker.service
#5.设置Docker开机自启
systemctl enable docker.service
#6.验证Docker是否安装成功
if docker version &> /dev/null; then
echo "Docker安装成功"
else
echo "Docker安装失败,请检查配置是否有误"
exit 1
fi
}
#安装docker-compose
InstallDockercompose(){
#1.安装所需软件包
yum install -y curl
#2.下载并安装Docker Compose, 加速器无法使用时,请去掉https://ghproxy.com/部分,直接在github下载
sudo curl -L "https://ghproxy.com/https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#3.赋予执行权限
chmod +x /usr/local/bin/docker-compose
#4.验证docker-compose是否安装成功
if docker-compose -v &> /dev/null; then
echo "docker-compose安装成功"
else
echo "docker-compose安装失败,请检查配置是否有误"
exit 1
fi
}
#安装mysql服务端
InstallMysql(){
#查询是否已经安装Mariadb,如果已经安装,则执行单独卸载有关软件包
mariadb=$(rpm -qa | grep mariadb)
if [ $mariadb ]; then
rpm -e $mariadb --nodeps
fi
#安装wget工具和所需的库文件,以确保 MySQL 能够正常运行
yum -y install wget
yum -y install libaio
#创建文件夹并下载 MySQL 8 的 RPM 包文件
mkdir -p ./mysql
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.17-1.el7.x86_64.rpm-bundle.tar -O ./mysql/mysql.tar
#进入目录,解压文件
cd mysql
tar -xvf mysql.tar
#查询压缩包中相应的RPM软件包文件名
common=`find . -name "mysql-community-common*"`
libs=`find . -name "mysql-community-libs-8*"`
client=`find . -name "mysql-community-client*"`
server=`find . -name "mysql-community-server*"`
#以顺序安装MySQL相应的共享库、客户端、服务组件,其中--force --nodeps命令行选项可确保成功安装MySQL
rpm -ivh $common
rpm -ivh $libs
rpm -ivh $client
rpm -ivh $server --force --nodeps
#初始化 MySQL 数据库
mysqld --initialize
#修改MySQL数据库文件夹权限为mysql用户
chown mysql:mysql /var/lib/mysql -R
#启动 MySQL 服务
systemctl start mysqld.service
#将 MySQL 服务设置为开机启动状态
systemctl enable mysqld
#返回上级目录,结束安装过程
cd ../
}
#安装Iptables,并配置防火墙规则
InstallIptables(){
#停止、禁用并屏蔽 firewalld 服务
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
#安装 iptables-services 程序包
yum -y install iptables-services
systemctl enable iptables
systemctl start iptables
#删除阻塞预设端口的规则
iptables="/etc/sysconfig/iptables"
sed -i '/COMMIT/d' "$iptables"
sed -i '/--dport 80 -j/d' "$iptables"
sed -i '/--dport 3306/d' "$iptables"
sed -i '/--dport 443/d' "$iptables"
sed -i '/--dport 3000/d' "$iptables"
sed -i '/--dport 9090/d' "$iptables"
sed -i '/--dport 10389/d' "$iptables"
sed -i '/--dport 8094/d' "$iptables"
sed -i '/--dport 8095/d' "$iptables"
sed -i '/--dport 7777/d' "$iptables"
sed -i '/INPUT -j REJECT/d' "$iptables"
sed -i '/FORWARD -j REJECT/d' "$iptables"
#增加需要放行的端口规则
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 9090 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 10389 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 8094 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 8095 -j ACCEPT">>$iptables
echo "-A INPUT -m state --state NEW -m tcp -p tcp --dport 7777 -j ACCEPT">>$iptables
echo "-A INPUT -j REJECT --reject-with icmp-host-prohibited">>$iptables
echo "-A FORWARD -j REJECT --reject-with icmp-host-prohibited">>$iptables
echo "COMMIT">>$iptables
#重新启动 iptables 服务,并将其注册到系统初始化服务列表中
systemctl restart iptables.service
systemctl enable iptables.service
}
#配置MySQL数据库
Configure_mysql(){
#获取默认密码
initial_passwd=$(cat /var/log/mysqld.log | grep password)
obtain_passwd=${initial_passwd#*localhost: } #冒号后面有个空格,需要注意
#连接数据库并修改密码
mysql -uroot -p$obtain_passwd --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$new_passwd';"
#设置远程连接
mysql -uroot -p$new_passwd --connect-expired-password -e "create user 'root'@'%' identified with mysql_native_password by '$new_passwd';grant all privileges on *.* to 'root'@'%' with grant option;ALTER USER 'root'@'localhost' IDENTIFIED BY '$new_passwd' PASSWORD EXPIRE NEVER;flush privileges;"
#新建数据库
mysql -uroot -p$new_passwd --connect-expired-password -e "create database $db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
}
#部署前后端
InstallServer(){
#1.创建sonicserver文件夹
mkdir sonicserver
#2.进入sonicserver文件夹
cd sonicserver
#3.下载sonic服务端包,加速器无法使用时,请去掉https://ghproxy.com/部分,直接在github下载
wget https://ghproxy.com/https://github.com/SonicCloudOrg/sonic-server/releases/download/$sonicversion/sonic-server-$sonicversion.zip
#4.安装解压工具,并解压文件
yum install -y unzip
unzip sonic-server-$sonicversion.zip
#5.更改.env 中的信息,以下信息官网中有详细说明。如需修改其他信息,请查看官网文档。
#Service Config
sed -i "s/SONIC_SERVER_HOST=.*/SONIC_SERVER_HOST=$ip/" .env
sed -i "s/SONIC_SERVER_PORT=.*/SONIC_SERVER_PORT=3000/" .env
sed -i "s/SONIC_EUREKA_USERNAME=.*/SONIC_EUREKA_USERNAME=sonicadmin/" .env
sed -i "s/SONIC_EUREKA_PASSWORD=.*/SONIC_EUREKA_PASSWORD=sonicwan987/" .env
#MySQL Config
sed -i "s/MYSQL_HOST=.*/MYSQL_HOST=$ip/" .env
sed -i "s/MYSQL_DATABASE=.*/MYSQL_DATABASE=$db/" .env
sed -i "s/MYSQL_PASSWORD=.*/MYSQL_PASSWORD=$new_passwd/" .env
#User Config
sed -i "s/SECRET_KEY=.*/SECRET_KEY=sonickeys/" .env
sed -i "s#LDAP_URL=.*#LDAP_URL=ldap://$ip:10389#" .env
#6.重启docker,保证服务正常
service docker restart
#7.部署
docker-compose up -d
}
#判断网络状态
if ! ping -c3 www.baidu.com &>/dev/null; then
echo "无法连接互联网,请检查网络!"
exit 1
fi
initialize_variables
InstallDocker
InstallDockercompose
InstallMysql
InstallIptables
Configure_mysql
InstallServer
④赋777权限,并执行脚本
chmod 777 SonicServer.sh
./SonicServer.sh
脚本执行完成后,前后端部署就完成了(因 Eureka 心跳机制,刚启动完毕微服务间互相访问需要 3~5 分钟,请耐心等候)打开浏览器访问 http://服务器IP地址/:3000)
2、获取Sonic Agent key
①注册账号
②新增Agent
- 注册成功后,点击设备中心-Agent中心,点击新增Agent
- 填写名称,确定
③复制Agent Key
- 点击复制
二、Sonic Agent部署
1、部署Agent端
①通过FinalShell远程连接设备2,并进入/home目录
②新建SonicAgent.sh文件
③并添加以下内容,保存
需要修改的地方:
- jdk=“amazon-corretto-17-x64-linux-jdk.tar.gz” # 按照官方要求安装指定版本
- AgentVersion=“v2.6.1” # Agent版本,通过官网获取新版本
- AgentHost=“192.168.100.120” # AgentIP地址
- AgentKey=“asdcvdfvfd-vdavds-25488-555” # AgentKey,SonicServer服务端获取
- SonicServerHost=“192.168.100.235” # SonicServer地址
- SonicServerPort=“3000” # SonicServer端口
#!/bin/bash
# 封装需要修改的变量
initialize_variables(){
#JDK安装包版本,按照SONIC官方要求下载指定版本,官方地址:https://sonic-cloud.cn/deploy/agent-deploy.html
jdk="amazon-corretto-17-x64-linux-jdk.tar.gz"
#Agent版本,官方地址:https://sonic-cloud.cn/deploy/agent-deploy.html 获取新的版本号
AgentVersion="v2.6.1"
#AgentIP地址
AgentHost="192.168.100.120"
#AgentKey,SonicServer服务端获取
AgentKey="asdcvdfvfd-vdavds-25488-555"
# SonicServer地址
SonicServerHost="192.168.100.235"
# SonicServer端口
SonicServerPort="3000"
}
# 安装JDK并配置环境变量
InstallJDK(){
#1.进入目录
cd /usr/local/
#2.下载JDK
wget https://corretto.aws/downloads/latest/$jdk
#3.解压文件
tar -zxvf $jdk
#4.获取完整文件夹名称,并修改名称
amazon=$(find . -maxdepth 1 -type d -name "amazon-corretto*")
mv $amazon java
#5.配置jdk环境变量
echo "" >> /etc/profile
echo "#JAVA_HOME" >> /etc/profile
echo "export JAVA_HOME=/usr/local/java" >> /etc/profile
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
#6.source生效
source /etc/profile
#7.验证JDK是否安装成功
if java -version &> /dev/null; then
echo "JDK安装成功"
else
echo "JDK安装失败,请检查配置是否有误"
exit 1
fi
}
#下载Agent端
InstallAgent(){
#1.新建文件夹,并进入该目录下下载
mkdir /home/sonicagent
cd /home/sonicagent
#加速链接,如果失效,请去官网下载新的包https://sonic-cloud.cn/deploy/agent-deploy.html
wget https://ghproxy.com/https://github.com/SonicCloudOrg/sonic-agent/releases/download/$AgentVersion/sonic-agent-$AgentVersion-linux_x86_64.zip
#2.解压文件
yum install -y unzip
unzip sonic-agent-$AgentVersion-linux_x86_64.zip
#3.配置文件修改
path="/home/sonicagent/config/application-sonic-agent.yml"
sed -i "/^\s*agent:/,/^ server:/s/host: .*/host: $AgentHost/" $path
sed -i "s/key: .*/key: $AgentKey/" $path
sed -i "/^\s*server:/,/^ agent:/s/host: .*/host: $SonicServerHost/" $path
sed -i "/^\s*server:/,/^ agent:/s/port: .*/port: $SonicServerPort/" $path
}
#关闭firewalld防火墙
firewalld(){
#1.停止服务、禁用开机自启、屏蔽服务
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl mask firewalld.service
#2.解除服务屏蔽、启用开机自启、启动服务
#systemctl unmask firewalld.service
#systemctl enable firewalld.service
#systemctl start firewalld.service
reboot
}
#判断网络状态
if ! ping -c3 www.baidu.com &>/dev/null; then
echo "无法连接互联网,请检查网络!"
exit 1
fi
initialize_variables
InstallJDK
InstallAgent
firewalld
④赋777权限,并执行脚本
chmod 777 SonicServer.sh
./SonicAgent.sh
三、启动服务
1、Sonic Server服务启动
- 重启服务器后,web端登录页面提示"系统出错了!“或"后台准备中…请稍后…”,该问题是Sonic Server相关容器未自启动,需要手动启动(如运行失败,重启服务器再运行即可)
- ①先查看本地所有容器,包含未启动的
docker ps -a
- ②启动容器
docker start 2ee56951d25a
③等待3分钟后,刷新web端,即可恢复正常。
2、Sonic Agent服务启动
cd /home/sonicAgent
java -Dfile.encoding=utf-8 -jar sonic-agent-linux-x86_64.jar
四、连接手机
1、连接手机
-
手机通过USB线连接Sonic Agent(手机需要开启USB调试)
-
登录Sonic Server后台,点击设备中心-Agent中心,查看Agent是否在线
进入设备中心,查看设备
五、常见问题(Q&A)
Q1: 需要开放哪些端口?
A1: Sonic Server端:3306、3000、9090、10389、8094、8095 / Sonic Agent端:7777
Q2: Sonic Agent端离线?
A2: 检查服务是否有启动,如未启动,者启动服务(启动方法查看:Sonic Agent服务启动)
Q3: Sonic Server端和Sonic Agent端是否可以部署到同一台设备上?
A3: 可以
Q4: Sonic Server端和Sonic Agent端是否必须在同一个局域网中?
A4: 不一定,也可以在不同局域网中,但前提Sonic Agent端必须能ping通Sonic Server端