Skip to main content

容器部署

该部分将介绍通过docker镜像方式部署项目(非k8s模式,k8s模式需要自行搭建配置)。

项目需要使用mysql、redis等组件需要客户自行提供,或者自行构建docker-compose.yml配置。

前置说明

1、确保服务器上已安装docker环境
2、mysql、redis服务的账密
3、准备好一个项目部署目录 /www/h5ds
/www/h5ds
|- config 项目配置文件目录
- .env 容器内server项目配置文件,参考下方配置模板
- h5ds.conf 容器内项目nginx配置文件,参考下方配置模板
|- data 项目数据映射目录
4、已经有一个可以远端拉取的镜像仓库

部署

首次部署

1、拉取远端镜像

$ docker pull registry.cn-hangzhou.aliyuncs.com/h5ds/h5ds-v7

2、配置文件准备(分别设置server和前端需要的相关配置项)

$ cd /www/h5ds/config
$ vim .env #server需要要的配置
$ vim prodConfig.js #前端需要的配置

3、【仅在首次部署服务时执行】初始化操作(数据库表结构、默认数据)

$ docker run --rm \
-v $PWD/config/.env:/var/www/h5ds/server/.env \
registry.cn-hangzhou.aliyuncs.com/h5ds/h5ds-v7 \
yarn init-server

初始化后将自动创建如下账户:

前台用户
super_user/123456 (信任用户(发布无需审核)、vip用户)
test_user2/123456 (信任用户(发布无需审核))
test_user3/123456 (vip用户)
test_user4/123456 (普通用户(发布需审核、且无法使用vip功能))
后台管理员
super_admin / 123456

4、测试运行(-it 交互方式测试docker)

$ docker run -it --name h5ds -p 8080:80 \
-v $PWD/config/.env:/var/www/h5ds/server/.env \
-v $PWD/config/h5ds.conf:/etc/nginx/conf.d/h5ds.conf \
-v $PWD/data/:/var/www/h5ds/server/app/public/ \
registry.cn-hangzhou.aliyuncs.com/h5ds/h5ds-v7

通过访问 http://{ip}:8080 测试网站运行情况

5、正式运行(-d 直接后台启动容器)

先删除旧的容器h5ds

$ docker stop h5ds & docker rm h5ds

后台方式启动容器

$ docker run -d --name h5ds -p 8080:80 \
-v $PWD/config/.env:/var/www/h5ds/server/.env \
-v $PWD/config/h5ds.conf:/etc/nginx/conf.d/h5ds.conf \
-v $PWD/data/:/var/www/h5ds/server/app/public/ \
registry.cn-hangzhou.aliyuncs.com/h5ds/h5ds-v7

说明

-v $PWD/config/.env:/var/www/h5ds/server/.env          server 配置文件
-v $PWD/config/h5ds.conf:/etc/nginx/conf.d/h5ds.conf 项目nginx配置文件【可选配置,当.evn文件中multipart.disk=local且multipart.prefix_path!=/h5ds时,必须使用此映射且需要同步修改h5ds.conf中 location ~ ^/(api|pay|h5ds) 这句话里面的h5ds替换为修改后的值】
-v $PWD/data/:/var/www/h5ds/server/app/public/ 服务端上传资源路径

更新部署

当项目由升级更新,且已经重新打包推送新镜像后,需要重新拉取新镜像并运行。

可以做成一个shell脚本

1、更新镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/h5ds/h5ds-v7

2、清理TAG<none>镜像
$ docker image prune -f

3、停止&删除容器
$ docker stop h5ds & docker rm h5ds

4、启动新的容器
$ docker run -it --name h5ds -p 8080:80 \
-v $PWD/config/.env:/var/www/h5ds/server/.env \
-v $PWD/config/h5ds.conf:/etc/nginx/conf.d/h5ds.conf \
-v $PWD/data/:/var/www/h5ds/server/app/public/ \
registry.cn-hangzhou.aliyuncs.com/h5ds/h5ds-v7

启动说明

启动容器后,会监听主机 http://0.0.0.0:8080 端口,直接访问该链接可以访问到首页

启动容器后输出的  egg started on http://0.0.0.0:8080 表示容器内 server服务监听的端口,不是外部要访问的端口

默认账号信息

前台:http://***.***.***
super_user/123456 (信任用户(发布无需审核)、vip用户)
test_user2/123456 (信任用户(发布无需审核))
test_user3/123456 (vip用户)
test_user4/123456 (普通用户(发布需审核、且无法使用vip功能))
管理端后台:http://***.***.***/admin
超级管理员:super_admin / 123456

配置模板

主域名nginx代理

如果需要通过域名直接访问项目,则需要宿主机中配置nginx,将请求代理到容器服务中。

server {
listen 80;
server_name www.www.com;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}

#https配置
server {
listen 443;
server_name www.www.com;

ssl on;
ssl_certificate /etc/letsencrypt/live/www.www.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.www.com/privkey.pem; # managed by Certbot
ssl_trusted_certificate /etc/letsencrypt/live/www.www.com/chain.pem;
ssl_session_timeout 5m;

location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_connect_timeout 1200;
proxy_read_timeout 1200;
proxy_send_timeout 1200;
proxy_pass http://localhost:8080;
}

# gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
}

容器内nginx服务配置

/www/h5ds/config/h5ds.conf

server {
listen 80;
server_name localhost;
client_max_body_size 1000M;

#生成Let's Encrypt 证书时验证使用
location = /.well-known {
allow all;
}

#前端页面目录
root "/var/www/h5ds/web";

#前端web
location / {
index index.html;
}
#前端app预览
location ^~ /apps {
try_files /apps.html =404;
}

#mobil端资源目录
location ~ ^/(mobile$|mobile/) {
try_files /mobile.html =404;
}

#editor目录
location ~ ^/(editor$|editor/) {
try_files /editor.html =404;
}
#admin管理端
location ~ ^/(admin$|admin/) {
try_files /admin.html =404;
}

#其中h5ds必须与server/.env中的multipart.prefix_path值保持一致
location ~ ^/(api|pay|h5ds) {
#大文件上传限制
client_max_body_size 1000M;
# define buffers, necessary for proper communication to prevent 502s
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_connect_timeout 1200;
proxy_read_timeout 1200;
proxy_send_timeout 1200;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#下方代理到server启动时监听的ip和端口号上,注意proxy_pass的值最后一定不能要/
proxy_pass http://localhost:8080;
}

# 定义错误页面码,如果出现相应的错误页面码,转发到那里。
error_page 404 /404.html;
# 承接上面的location。
location = /404.html {
# 放错误页面的目录路径。
try_files /index.html =404;
}
}

容器内server项目配置

/www/h5ds/config/.env

#############YAML格式##########
#具体配置说明请参考 config.default.js / config.local.js /config.prod.js 文件对应的引用之处

#初始化锁定标识文件路径,相对于项目更目录,如果不存在则会自动初始化,且最后自动生成改文件
#init_lock_file=../init_lock

#服务配置(设置服务监听端口)
cluster.listen.hostname=0.0.0.0
#cluster.listen.port=8080

#本站域名相关配置(域名带协议),用于下载离线app
host.site=https://www.h5ds.com
host.resource=https://cdn.h5ds.com


#文件存储系统 (oss-阿里云OSS 或者 local-本地存储 ),默认oss
multipart.disk=local
#上传资源路径前缀,默认取值于package.json的name字段,如果有改动且multipart.disk=local时,必须修改h5ds.conf
#multipart.prefix_path =/h5ds

#Debug相关配置
#debug.enable=true
#debug.debug_token="Bearer 123456"
debug.debug_user_id=1
debug.debug_admin_id=1

#ucenter模式
#ucenter.enable=true
#ucenter.options.target=https://www.h5ds.com

#数据库配置
sequelize.host=127.0.0.1
sequelize.port=3306
sequelize.username=root
sequelize.password=”“
sequelize.database=h5ds_v7
sequelize.schema=h5ds

#redis配置
redis.client.host=127.0.0.1
redis.client.port=6379
redis.client.password=”“
redis.client.db=0

#bull队列配置
bull.default.redis.host=127.0.0.1
bull.default.redis.port=6379
redis.client.password=”“
bull.default.redis.db=1

#邮件配置
mailer.host=smtp.exmail.qq.com
mailer.port=465
mailer.auth.user=service@h5ds.com
mailer.auth.pass=”“


#阿里云配置(sms/tts等产品)
aliyun.access_key=LTAI4G4Stgq3WU~
aliyun.access_key_secret=bs9hMMw5rLcmw9yRH0i7~
#短信
aliyun.sms.TemplateCode=SMS_89590046
aliyun.sms.SignName=四川爱趣五科技
aliyun.sms.RegionId=cn-hangzhou
#TTS语音服务
aliyun.tts.app_key=M17NV82hwYL~
#函数计算
aliyun.account_id.account_id=197889261~
aliyun.account_id.region=cn-beijing
aliyun.account_id.bucket=h5ds-cdn

#阿里云OSS配置,当multipart.disk=oss时配置
oss.default.accessKeyId=LTAI1i16AB~
oss.default.accessKeySecret=KZW1AqsC4f9uO85iXR3I~
oss.default.role_ran="acs:ram::1978892615987450:role/test-open"
#公共读存储桶配置
oss.clients.public.bucket=h5ds-cdn
oss.clients.public.cname=true
oss.clients.public.endpoint=https://cdn.h5ds.com

#微信公众号配置(扫码登录、网页授权等)
wechatAll.appid=wx806a23769d~
wechatAll.appsecret=61ed2eab9e1e5fef90acac~
wechatAll.token=wxdc
wechatAll.encodingAESKey=”“

#微信支付配置
tenpay.client.appid=wx08e21c1fb~
tenpay.client.mchid=160038~
tenpay.client.partnerKey=gguguguggj6868787ggkj~
tenpay.client.notify_url=https://node.h5ds.com/pay/wechat/notify

#支付宝支付配置
alipay.appId=20210011~
alipay.notifyUrl=https://node.h5ds.com/pay/alipay/notify
alipay.rsaPrivate="./config/cert/alipay/live/应用私钥2048.txt"
alipay.rsaPublic="./config/cert/alipay/live/支付宝公钥.txt"

#nacos服务注册与发现配置
nacos.serverList=nacos.h5ds.com
nacos.client.namespace=dev
nacos.client.serviceName=h5ds-v7
nacos.client.groupName=DEFAULT_GROUP
nacos.client.username=
nacos.client.password=

QA

1、容器部署运行时,发现super_admin账号登录管理端后台,左侧没有菜单(数据库中h5ds_permissions表也没有数据)

由于未完成系统数据的初始化,是否执行此初始化动作依赖于项目更目录下的server/init_lock标识文件,没有的时候才会执行初始化动作
删除容器内的init_lock文件重启容器服务即可