背景:
1.实现Django项目在陌生服务器通过一个程序或命令一键启动
实现方式(思路):
服务器要求:1.docker
2.sed(用于替换配置文件端口)
3.tar
启动程序我们采用Go来写
步骤:
先按照config文件内容定义结构体,如下为config文件:
### 用户MySQL数据库端口(保证该端口不被占用) UserMySQLPort:3318 ### 用户系统接口访问端口(保证该端口不被占用) UserApiPort:5005 ### 用户系统nginx访问端口(保证该端口不被占用) UserNginxPort:80981.解压压缩包:
func UnTar(conf *ConfJson) (err error) {
dirPath, errowd := os.Getwd()
if errowd != nil {
// 命令执行失败
panic(errowd)
err = errowd
}
cmd := exec.Command("/usr/bin/tar", "-zxf", filepath.Join(dirPath, "intaller.tar.gz"),"-C",dirPath)
loger.Println(cmd)
cmderr := cmd.Run()
if cmderr != nil {
// 命令执行失败
panic(cmderr)
err = cmderr
}
loger.Println("unzip file success")
return
}
2.load-docker(mysql、系统依赖镜像、rabbitmq)
如mysqldocker启动示例:
//docker pull mysql:5.7
cmdsql := exec.Command("docker", "pull", "mysql:5.7")
loger.Println(cmdsql)
cmdsqlerr := cmdsql.Run()
if cmdsqlerr != nil {
// 命令执行失败
panic(cmdsqlerr )
}
//使用压缩包中挂载数据库路径启动MySQL
cmduser := exec.Command("/usr/bin/docker", "run", "-dit", "-v", fmt.Sprintf("%s:/var/lib/mysql", UserDataPath), "-p", fmt.Sprintf("%s:3306", conf.UserMySQLPort), "--name", "mysql_user_0001", "-e", "MYSQL_ROOT_PASSWORD=2022root", "-d", "mysql:5.7")
errcmduser := cmduser.Run()
loger.Println(errcmduser)
if errcmduser != nil {
// 命令执行失败
panic(errcmduser)
}
3.替换文件端口,IP
将settings.py、nginx、gunicorn配置文件的IP、端口替换为config文件内容
示例:
cmduserport := exec.Command("sed", "-i", fmt.Sprintf("s#%s#%s#", "3306", conf.UserMySQLPort), UserDataPath)
loger.Println("cmduserport", cmduserport)
errcmduserport := cmduserport.Run()
4.run.sh启动
一行命令启动
示例:
func RunSh(conf *ConfJson) (err error) {
dirPath, errowd := os.Getwd()
if errowd != nil {
// 命令执行失败
panic(errowd)
err = errowd
}
RunSh := filepath.Join(dirPath, "intaller/run.sh")//intaller为解压压缩包
cmdrun := exec.Command("/usr/bin/docker", "run", "--restart=unless-stopped", "-dit",
"-v", fmt.Sprintf("%s:%s", dirPath, dirPath),
"-v", "/var/run/docker.sock:/var/run/docker.sock",
"-v", "/usr/bin/docker:/usr/bin/docker",
"--name", "test001", "--net", "host",
"-d", "image:1.0", "/bin/bash", RunSh)
loger.Println(cmdrun)
cmdrunerr := cmdrun.Run()
if cmdrunerr != nil {
panic(cmdrunerr)
}
return nil
}
5.启动后对Django代码进行加密:
Django加密
6.如上为整体main.go程序流程1.通过go run build main.go打包为./main程序
2.优化:可通过 go中pb.StartNew这个包实现进度条功能,如下图:
账号密码:部署产生每次都不同的6位随机码,更新到用户数据库中
总结:
如上就完成了一键启动,但是在一键启动后不要忘了删除压缩包,这样程序主体都是编译的



