涉及到的系统包括:
API
H5
涉及到的数据库:
大致步骤
API
:迁移到华为云,搭建环境并迁移,修改配置API
:迁移到华为云,修改配置SSL
,再修改配置--Navicat连接阿里MySQL
--阿里云数据库创建新数据库:
报错:当前用户无法创建数据库
登录阿里云修,创建数据库,并授权给用户
--生成新数据库加密连接字符串:mId+I96JxaFog5Phi/KN+bWPGh4wnClNBzD5EvaEI5Z2vlYYeEYT9qGaRHz3y8Z+EXIzZiUWbl0gLmgoOJ+EZgzvikJpTpSfcf0UadGq/FW3MIjY1AZviTJ0lxOq0g3MSJwkEXx1wxn6xvpMoqyz1h0FdhJtbgCHJqSw1hV8b9Y31ibL+LSChtrd3h/FzlDL
--确认数据库上下文:HdContext
--修改DD.HD.API中的连接字符串
--尝试生成数据库:dotnet ef database update -c HdContext
--种子化数据
超级管理员
创建总部
创建项目版本
--修改生成环境的连接字符串
--重启生产环境网站
--管理员登录
登录失败
确认登录接口:api/auth/token
Postman登录,确认可以
打开局域网防火墙:控制面板,系统和安全,启用或关闭,测试,跑通
更新云端组件,还是有问题
案例云数据库,设置白名单,允许总部运营应用程序所在服务器的IP,成功
--创建总部销售员:13811111111
--创建总部管理员:13822222222
--创建总部财务:13833333333
--创建总部CEO:13844444444
以下可以作为运维操作指导
--销售员登录:13811111111
--点击左侧"销售报批管理"
--点击右上角+按钮
--输入项目名称,并点击确认按钮
--点击"申请"按钮,在弹出窗口中点击确定按钮
--财务登录:13833333333
--点击左侧"财务审核管理"
--点击右侧通过按钮,在弹出窗口中点击确定按钮
--CEO登录:13844444444
--点击左侧"CEO审核管理"
--点击右侧通过按钮,在弹出窗口中点击确定按钮
--管理员登录:13822222222
--点击左侧"权限管理"--"组织管理",点击编辑按钮,填写如下字段,点击确定按钮
拼音名称:xunfei
缓存命名空间:OpenAPI_Office
--数据库运维人员为该项目创建新数据库:office_demo
--数据库运维人员生成office_demo的连接字符串:mId+I96JxaFog5Phi/KN+bWPGh4wnClNBzD5EvaEI5Z2vlYYeEYT9qGaRHz3y8Z+EXIzZiUWbl0gLmgoOJ+EZrCunEKimFlbeg+VD25AlNyLqV5z9kmRLuHs+oTS7mXR77uDQkUkjBEL4FJm3ThP5yCk8OU6SDuhNtGZIQQD2AdipFCTROYOcKtCqWy2i9y5
--打开DD.OfficeBuilding.Web项目
--替换appsettings.json中的连接字符串
用新的加密连接字符串替换ConnectionStrings和ProjectsSetting中的office_demo对应的连接字符串
替换ConnectionStrings中hd_new对应的连接字符串
--生成项目
--确认上下文名称:DDOfficeContext
--尝试迁移:dotnet ef database update -c DDOfficeContext
--管理员登录:13822222222
--点击左侧"项目管理",点击"项目数据库",填写如下,点击确定
关系数据库IP: rm-bp1a298l904sfi196no.mysql.rds.aliyuncs.com
关系数据库端口:3306
关系数据库名称: office_demo
关系数据库用户名:
关系数据库密码:
关系数据库连接主键:office_demo
时序数据库IP:无
时序数据库名称:无
时序数据库用户名:无
时序数据库密码:无
--点击左侧"配置管理",点击"模块管理",点击右上角+按钮
--添加如下模块,点击确定按钮
187ED5311111 HTTP
187ED5322222 HTTP
187ED5333333 HTTP
187ED5344444 HTTP
187ED5355555 HTTP
187ED5366666 HTTP
187ED53338C4 HTTP
98CC4D213004 UDP 绑定到第三方大成
--点击绑定按钮,在弹出窗口中选择绑定项目,点击确定
--点击左侧"项目管理",点击"项目Banner管理"
--点击左侧"权限管理",点击"人员管理管理",准备添加电工(15613914966)
--点击右上角+,输入如下信息,点击确定按钮
--点击左侧"配置管理",点击"电工管理",点击绑定按钮
--选择绑定项目,点击确定按钮
--点击左侧"权限管理",点击"人员管理管理",准备添加办公楼版大楼游客(15762085260)
--点击左侧"权限管理",点击"人员管理管理",准备添加办公楼版大楼管理员(13811191763)
总部添加第三方合作方运维操作指导
--点击左侧"权限管理",点击"组织管理"
--点击右上角+,输入如下信息,点击确定
层级:子
子位置:鼎鼎总部
组织名称:
拼音名称:
是否是总部:否
是否是第三方开发者:是
是否是项目:否
缓存命名空间:咨询数据库管理员
授权Key:咨询数据库管理员
关系数据库部分
--阿里云创建开放平台数据库:open_new
--确认开放平台的加密连接字符串:mId+I96JxaFog5Phi/KN+bWPGh4wnClNBzD5EvaEI5Z2vlYYeEYT9qGaRHz3y8Z+EXIzZiUWbl0gLmgoOJ+EZo5E9sbjV8zcVJLJ66xqZoFZ4piQd5Q6TaKIfVzmgJuafJFayudZD32ViHNbxCxg3PYa/Fl+JeIA+m6Ec5aWWyWsY/rqC18brJXXhrb4X4w9
--替换开发环境和生成环境中的appsetting部分
--关闭生产环境网站
--把原先open数据库导出
--把原先open数据库导入到新的open_new数据库
--开启生产环境网站
测试模块查询电量等
--确认新的时序数据Restful接口是否可用:http://116.63.236.99:6041/rest/sql
--确认开放平台老接口是否可用:
--更换开放平台相关接口使用新的时序数据库
--重新发布网站
--确认开放平台新接口是否可用
请求power/random/byaddr失败
确认新的时序数据库是否有OpenPower数据库,有这个数据,但没有相关模块的表数据
发现账号密码写错,重新上传,调通
几个网站
--一个写字楼版手机端接口网站
--一个写字楼版H5静态网站
--一个项目运营后台接口网站
--一个项目运营后台Web静态网站
大致思路
--搭建环境
--拷贝网站
--配置网站
搭建环境
--确定新服务器并登录
--确定服务器版本:cat /etc/version
--更新软件apt: sudo apt-get update
--安装nano: sudo apt-get install nano
--安装: sudo apt-get install apt-transport-https
--创建目录:mkdir downloads
--进入目录:cd downloads
--下载微软Product key:wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
--安装:sudo dpkg -i packages-microsoft-prod.deb
--更新软件:sudo apt-get update
--安装.NET Core 3.0的SDK: sudo apt-get install dotnet-sdk-3.0
--确认是否安装:dotnet --list-sdks
--更新软件:sudo apt-get update
--安装Nginx:sudo apt-get install nginx
--查看状态:sudo systemctl status nginx
--查看Nginx网站是否正常:curl localhost
--由于写字楼版需要请求阿里数据库,所以需要把华为服务器IP加入阿里数据库的白名单
云端创建quartz
数据库
--登录案例云数据库管理后天
--添加数据库:ddquartz
--Navicat登录:
--运行语句
# By: Ron Cordell - roncordell
# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.
# make sure you have UTF-8 collaction for best .NET interoperability
# CREATE DATABASE quartznet CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
CREATE TABLE QRTZ_JOB_DETAILS(
SCHED_NAME VARCHAR(60) NOT NULL,
JOB_NAME VARCHAR(60) NOT NULL,
JOB_GROUP VARCHAR(60) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE BOOLEAN NOT NULL,
IS_NONCONCURRENT BOOLEAN NOT NULL,
IS_UPDATE_DATA BOOLEAN NOT NULL,
REQUESTS_RECOVERY BOOLEAN NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;
CREATE TABLE QRTZ_TRIGGERS (
SCHED_NAME VARCHAR(60) NOT NULL,
TRIGGER_NAME VARCHAR(60) NOT NULL,
TRIGGER_GROUP VARCHAR(60) NOT NULL,
JOB_NAME VARCHAR(60) NOT NULL,
JOB_GROUP VARCHAR(60) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(19) NULL,
PREV_FIRE_TIME BIGINT(19) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(19) NOT NULL,
END_TIME BIGINT(19) NULL,
CALENDAR_NAME VARCHAR(60) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;
CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
SCHED_NAME VARCHAR(60) NOT NULL,
TRIGGER_NAME VARCHAR(60) NOT NULL,
TRIGGER_GROUP VARCHAR(60) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
CREATE TABLE QRTZ_CRON_TRIGGERS (
SCHED_NAME VARCHAR(60) NOT NULL,
TRIGGER_NAME VARCHAR(60) NOT NULL,
TRIGGER_GROUP VARCHAR(60) NOT NULL,
CRON_EXPRESSION VARCHAR(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME VARCHAR(60) NOT NULL,
TRIGGER_NAME VARCHAR(60) NOT NULL,
TRIGGER_GROUP VARCHAR(60) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13,4) NULL,
DEC_PROP_2 NUMERIC(13,4) NULL,
BOOL_PROP_1 BOOLEAN NULL,
BOOL_PROP_2 BOOLEAN NULL,
TIME_ZONE_ID VARCHAR(80) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
CREATE TABLE QRTZ_BLOB_TRIGGERS (
SCHED_NAME VARCHAR(60) NOT NULL,
TRIGGER_NAME VARCHAR(60) NOT NULL,
TRIGGER_GROUP VARCHAR(60) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
CREATE TABLE QRTZ_CALENDARS (
SCHED_NAME VARCHAR(60) NOT NULL,
CALENDAR_NAME VARCHAR(60) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
ENGINE=InnoDB;
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
SCHED_NAME VARCHAR(60) NOT NULL,
TRIGGER_GROUP VARCHAR(60) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
CREATE TABLE QRTZ_FIRED_TRIGGERS (
SCHED_NAME VARCHAR(60) NOT NULL,
ENTRY_ID VARCHAR(140) NOT NULL,
TRIGGER_NAME VARCHAR(60) NOT NULL,
TRIGGER_GROUP VARCHAR(60) NOT NULL,
INSTANCE_NAME VARCHAR(60) NOT NULL,
FIRED_TIME BIGINT(19) NOT NULL,
SCHED_TIME BIGINT(19) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(60) NULL,
JOB_GROUP VARCHAR(60) NULL,
IS_NONCONCURRENT BOOLEAN NULL,
REQUESTS_RECOVERY BOOLEAN NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID))
ENGINE=InnoDB;
CREATE TABLE QRTZ_SCHEDULER_STATE (
SCHED_NAME VARCHAR(60) NOT NULL,
INSTANCE_NAME VARCHAR(60) NOT NULL,
LAST_CHECKIN_TIME BIGINT(19) NOT NULL,
CHECKIN_INTERVAL BIGINT(19) NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
ENGINE=InnoDB;
CREATE TABLE QRTZ_LOCKS (
SCHED_NAME VARCHAR(60) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME))
ENGINE=InnoDB;
CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
commit;
--确定连接字符串
网站上传
--创建目录
sudo mkdir /var/www/publishapplication
sudo mkdir /var/www/publishapplication/office_api
sudo mkdir /var/www/publishapplication/office_client
sudo mkdir /var/www/publishapplication/project_api
sudo mkdir /var/www/publishapplication/project_client
--拷贝网站文件
拷贝office_api: 5000
拷贝office_client: 5011
拷贝project_api:5001
拷贝project_client: 5017
--开放5000-5020接口
把写字楼版手机端二级域名(不包含Manager的那个)指向到:123.60.21.158:5011
把项目管理后台二级域名(包含Manager的那个)指向到:123.60.21.158:5017
--确认Nginx的配置文件是否存在:ls /etc/nginx/sites-available
--编辑配置文件:nano /etc/nginx/sites-available/default
开始配置
--查看sites-available目录:ls -l /etc/nginx/sites-available
--查看sites-enabled目录:ls -l /etc/nginx/sites-enabled
/etc/nginx/sites-enabled/default与/etc/nginx/sites-available/default存在链接
如果解除链接:unlink default
如果添加链接:ln -t
--编辑:sudo nano /etc/nginx/sites-available/default
--创建写字楼版接口服务:sudo nano /etc/systemd/system/office.service
[Unit]
Description=Office Version
[Service]
WorkingDirectory=/var/www/publishapplication/office_api
ExecStart=/usr/bin/dotnet /var/www/publishapplication/office_api/DD.OfficeBuilding.Web.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
--启用写字楼版接口服务:sudo systemctl enable office.service
--启动写字楼版接口服务:sudo systemctl start office.service
--查看写字楼版接口服务:sudo systemctl status office.service
--创建项目服务:sudo nano /etc/systemd/system/project.service
[Unit]
Description=Project Version
[Service]
WorkingDirectory=/var/www/publishapplication/project_api
ExecStart=/usr/bin/dotnet /var/www/publishapplication/project_api/DD.Project.Web.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example-project
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
--启用写字楼版接口服务:sudo systemctl enable project.service
--启动写字楼版接口服务:sudo systemctl start project.service
--查看写字楼版接口服务:sudo systemctl status project.service
--确定Nginx的根目录:/var/www/html
--查看目录: ls -l /var/www/html
--创建默认目录:mkdir /var/www/html/default
--创建文件: sudo nano /var/www/html/default/index.html
--编辑:sudo nano /etc/nginx/sites-available/default
--测试配置是否有问题:nginx -t
--重启:sudo systemctl restart nginx 或者 nginx -s reload
--最终:
拷贝office_api: 5001
拷贝office_client: 5011
拷贝project_api:5002
拷贝project_client: 5017
写字楼版手机端接口:http://moffice.ddingsafe.com/
写字楼版H5页面:http://moffice.ddingsafe.com/app
项目管理后台接口:http://officemaster.ddingsafe.com
项目管理后台Web页面: http://officemaster.ddingsafe.com/xunfei
--电工账号:15613914966
API
应用迁移和数据迁移--Startup中配置反向代理
--修改appsettings中的配置
--发布网站
API
应用迁移和数据迁移--Startup中配置反向代理
--修改appsettings中的配置
--发布网站
--总部运营后台:http://47.103.61.198:5016/
--电工登录报错:
DD.OfficeBuilding.Web.Controllers.MainController.Banners (DD.OfficeBuilding.Web):Object reference not set to an instance of an object.
DD.OfficeBuilding.Web.Controllers.MineController.UploadAvatar (DD.OfficeBuilding.Web):The type initializer for 'Gdip' threw an exception.
--确定云端请求地址,在Postman修改:http://moffice.ddingsafe.com/
--获取短信验证码:api/auth/shortCode
--获取token:api/auth/token
验证码已失效,请重新申请
本地测试阿里云白名单运行本地IP通过就可以了
postman再测试云端,提示Nginx报错,502 Bad Gateway
上游服务器和网关/代理使用不一致的协议交换数据
sudo nano /etc/nginx/sites-available/default
查看总配置文件:cat /etc/nginx/nginx.conf
确认错误日志: /var/log/nginx/error.log
查看日志: cat /var/log/nginx/error.log
2021/04/30 15:58:59 [error] 560#560: *433 connect() failed (111: Connection refused) while connecting to upstream, client: 119.4.174.231, server: local_host, request: "POST /api/auth/token HTTP/1.1", upstream: "http://127.0.0.1:5000/api/auth/token", host: "moffice.ddingsafe.com"
proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;
无效
upstream office_server {
server 127.0.0.1:5000;
}
upstream project_server {
server 127.0.0.1:5001;
}
无效
server_name 127.0.0.1无效
云端swagger测试,有时NGinx报错,有时报验证码已失效,请重新申请
把接口地址改成api/auth/token1 Nginx不报错,5.1过后还是报错,改回来
先给关闭服务:sudo systemctl stop office
上传后重启服务:sudo systemctl start office
报错:502 Bad Gateway
确认错误日志:cat /var/log/nginx/error.log 详情: connect() failed (111: Connection refused) while connecting to upstream,这里的问题是其它接口没问题,就这个接口有问题。应该和这个接口的代码有关系。其中涉及到了缓存,是否nginx还没允许缓存?发现其它接口也是有问题的。感觉和路由有关系。配上一个路由后api/auth/token可以走通,但是api/auth/token还是走不通。新发现:第一次请求502,以后的请求验证码失效。
查看配置文件:sudo nano /etc/nginx/sites-available/default
确认是否有错:nginx -t
重新加载:nginx -s reload
似乎日志文件无法创建。确认office.service的用户:www-data
查看所有用户:compgen -u
赋给www-data用户权限:sudo chown -R www-data:www-data /var/www/publishapplication/office_api(非常关键!!!只有设置了这个才可以创建日志目录和文件)
查看日志已创建:cat /var/www/publishapplication/office_api/Logs/Test/test-20210506.log
最终解决,就是因为服务用户没有权限的问题。因为用到了IWebHostEnvironment
同理赋给www-data用户权限:
sudo chown -R www-data:www-data /var/www/publishapplication/project_api
sudo chown -R www-data:www-data /var/www/publishapplication/office_client
sudo chown -R www-data:www-data /var/www/publishapplication/project_client
--电工账号:15613914966
--项目管理后台: http://officemaster.ddingsafe.com/xunfei
--大楼游客:15762085260 (密码:888888)
--大楼管理员:13811191763(密码:888888)
--项目位置管理出错:
总部地址:http://47.103.61.198:5016/#/setup/position
原来接口:http://47.103.61.198:5015/api/Locations/getLocations
现在接口:http://officemaster.ddingsafe.com/api/Locations/getLocations
ip接口: http://123.60.21.158:5002/api/Locations/getLocations
不允许跨域,配置了跨域,是否Nginx是否允许跨域
sudo nano /etc/nginx/sites-available/default
报错:Access-Control-Allow-Origin header contains multiple values, but only one is allowed
报错:no access-control-allow-origin header is present on the requested resource
报错:response to preflight request doesn't pass access control check
报错:The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*'
报错:Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
最终解决:程序内加上,Nginx没有加上
--一个不该出现的模块出现了
在开放平台里刚好这个模块的ProjectId和测试项目的ProjectId对上了
--保存头像出错
cat /var/www/publishapplication/office_api/App_Data/DDTraceLog/DDTrace-20210510.log
MineController.UploadAvatar (DD.OfficeBuilding.Web):The type initializer for 'Gdip' threw an exception
Mine\Commands\UploadAvatar.cs:line 106
本地调试,阿里云数据库是有白名单
System.Drawing.Common 组件提供对GDI+图形功能的访问。它是依赖于GDI+的,那么在Linux上它如何使用GDI+,因为Linux上是没有GDI+的。Mono 团队使用C语言实现了GDI+接口,提供对非Windows系统的GDI+接口访问能力(个人认为是模拟GDI+,与系统图像接口对接),这个就是 libgdiplus。进而可以推测 System.Drawing.Common 这个组件实现时,对于非Windows系统肯定依赖了 ligdiplus 这个组件。如果我们当前系统不存在这个组件,那么自然会报错,找不到它,安装它即可解决。
sudo apt-get update
apt-get install libgdiplus -y
ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
问题解决
--模块列表无法展示开关数量
会根据APIKey获取命名空间,正确的key是bde2d876-993d-440d-aba1-3a06007a25a3,命名空间是OpenAPI_Office
从开放平台}api/breaker/data接口,可以获取到数据
在DDOpenSetting下的Key不对
--头像显示上传成功,但是不显示
在项目的wwwroot/imgs/avatar中有2143.png,
在数据库中的用户,15613914966用户对应的Avator是2143.png没错
查看日志:cat /var/www/publishapplication/office_api/App_Data/DDTraceLog/DDTrace-20210511.log
输入网址:http://moffice.ddingsafe.com/imgs/avatar/2143.png 也无法查看
nginx应该允许图片
UploadAvatarCommandHandler
报错:cat /var/www/publishapplication/office_api/App_Data/DDTraceLog/DDTrace-20210511.log
路径拼接问题
--显示二维码图片
cat /var/www/publishapplication/office_api/App_Data/DDTraceLog/DDTrace-20210511.log
Parameter is not valid, System.Drawing.SafeNativeMethods.Gdip.CheckStatus
GetQRCodeService.cs:line 74
路径拼接问题
--项目运营后台网页无法打开
确定网址:http://officemaster.ddingsafe.com/xunfei
确认project服务是否开启,已开启
确认nginx配置
配置有遗漏
--项目运营后台无法登录
确定网址:http://officemaster.ddingsafe.com/xunfei
先查看nginx配置
查看项目源代码
办公楼版大楼游客(15762085260)
办公楼版大楼管理员(13811191763)
'http://officemaster.ddingsafe.com/auth/login' from origin 'http://moffice.ddingsafe.com:5002'
vue客户端更改域名指向:http://officemaster.ddingsafe.com/api,重新发布
http://moffice.ddingsafe.com:5002/api
--操作员的权限选择没有
--修改Ubuntu服务器日期格式
错误原因:如果程序中的时区与系统不一样会造成错误
查看日期的格式:date (Wed May 12 09:32:24 CST 2021)
查看日期格式另外一种:date -R (Wed, 12 May 2021 09:38:13 +0800)
运行命令:tzselect
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
date -s "2007-08-03 14:15:00"
sudo hwclock --systohc
timedatectl
https://phoenixnap.com/kb/how-to-set-or-change-timezone-date-time-ubuntu
重新:timedatectl
timedatectl set-ntp yes
timedatectl set-ntp no
timedatectl set-time 10:23:
timedatectl set-time 2021-05-12
timedatectl set-ntp yes
timedatectl
timedatectl list-timezones
让硬件和Local Timezone保持一致:timedatectl set-local-rtc 1
sudo reboot
时间格式依然不对,需要的时间格式:1990-01-02 12:00:00
查看时间格式:timedatectl status
原理:Windows上使用的是Windows time zone IDs, Linux使用的是IANA时区。
解决办法:添加NodaTime
--非电工项目列表报警统计没有,负荷没有
RealWarning中没有CompanyId
BreakerData中A_WP没有值
管理员:12311111111
操作员:12322222222
--电工登录无法查看刚刚创建的公司
公司名称:5-12...01, 5-12...02
电工账号:15613914966
接口:api/mine/projects
电工的总部User主键是6,而在项目数据库的CompanyUser中并不存在UserId=6的情况。因为电工从来不会加入某个公司,所以写字楼版不会把电工加入到CompanyUser中
解决
--修改开关名称的权限似乎弄反了
接口:api/main/changeBreakerName
需求:如果是管理员,可以修改名称;如果是操作员,要看projectsettings中有无设置
1b3a10c7-efa0-43f9-95f8-dd8034166de6 修改开关名称
var OperationId = _operationsRepo.GetOperationIdByName("修改名称");没有对应上
--电量报表,天周月
开放平台接口:http://47.103.61.198:5008/api/breaker/power/random/by
报错:GetElectrictyService.cs:line 516
时序数据库按天的数据没有加
解决
--项目运营后台添加场景计划有问题
项目运营后台appsetting中DDOpenSetting的Url_Job改成写字楼版的url
目前:http://47.103.61.198:5005/api/scene/addSceneShedules
改成:http://moffice.ddingsafe.com/api/scene/addSceneShedules
--首页最近60分钟负荷报表
接口api/main/projectPower
开放平台接口:http://47.103.61.198:5008/api/breaker/fuhe/byaddr
开放平台数据是否正确:select count(*) from breakerdatas
管理员:12311111111
向开放平台请求:187ED53338C4_2,1,187ED5311111_1,3,2
开放平台请求负荷的数据库弄错了
解决
--首页最近60分钟负荷公司列表重复
前端问题
--首页最近60分钟开关负荷一直变,是否是随机数?
--超级管理员在创建公司时 勾选 “分配给后台管理员”选项,在公司管理列表中不应该显示当前公司
先确定那个字段:IsAdmin=1
确定接口:api/mine/projects 和 api/main/projects
解决
--超级管理员新建公司后,让管理员扫描当前公司邀请码,返回超级管理员账号并未收到‘新朋友’通知
管理员:12311111111 UserId=10
超级管理员:15613914966
扫描公司:5-13测试-02 CompanyId=9
在CompanyUser中,CompanyId=9, UserId=10m RoleId=空 RoleName=空, IsAllowed=0, HasRole=0
接收新朋友接口:
展示新朋友列表接口:api/mine/newFriends
--办公楼版服务端无法运行
Failed to bind to address http://127.0.0.1:5000: address already in use.
查看端口占用情况:lsof -i:5000
kill进程:kill 686
查看nginx配置:sudo nano /etc/nginx/sites-available/default
查看端口:ps -aux | grep 5000
查看进程详情:ps -fp 1178
sudo systemctl disable office 在开机时禁用服务
sudo systemctl enable office 在开机时启用服务
nginx -s stop
端口被哪个程序占用:netstat -tunlp | grep 5000
kill 778
一会就被启动起来
试着关闭nginx是否可以再次启动起来:nginx -s stop
还是这样,kill之后马上又启动起来
记住当前服务的位置:/etc/systemd/system/office.service
记录当前服务的内容:
[Unit]
Description=Office Version
[Service]
WorkingDirectory=/var/www/publishapplication/office_api
ExecStart=/usr/bin/dotnet /var/www/publishapplication/office_api/DD.OfficeBuilding.Web.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
开始删除服务
sudo systemctl stop office
sudo systemctl disable office
rm /etc/systemd/system/office.service
sudo systemctl daemon-reload
重新进入程序所在目录:cd /var/www/publishapplication/office_api
dotnet DD.OfficeBuilding.Web.dll
提示5000端口被占用
尝试关闭nginx: sudo systemctl status nginx 没有在启用状态
重启再观察5000端口是否在启用,依然在启用,即使在nginx关闭的情况下
写字楼版换成5003端口: sudo nano /etc/nginx/sites-available/default
sudo systemctl start nginx
cd /var/www/publishapplication/office_api
dotnet DD.OfficeBuilding.Web.dll
依然在报5000占用
Program加UseUrl解决
重新创建服务:/etc/systemd/system/office.service
开机启用: sudo systemctl enable office
开始服务: sudo systemctl start office
查看服务状态: sudo systemctl status office
重启Nginx: nginx -s reload
--项目管理后台,请求http://moffice.ddingsafe.com:5002/api/auth/login 502 Bad Gateway
外部端口5002对应的本地上游服务器的端口是:127.0.0.1:5001
确认project服务是否运行:正在运行,并且监听的端口是5000,这里感觉错了,应该监听,应该是Program中错了,应该监听5001
上传程序并重启网站:sudo systemctl start project
查看状态:sudo systemctl status project, 上游服务器的端口是:127.0.0.1:5001
打开网站:http://moffice.ddingsafe.com:5002
nginx -s reload
问题解决。重要教训:项目Program.cs中的UseUrls("http://0.0.0.0:5001")一定要和Nginx的上游服务器中的端口对应一致!!!
--开关列表
开关列表中显示的图标,分为三个状态(分别显示不同颜色):
未设置定时、已设置定时、还有十分钟自动分断
(当前状态未发生改变)
--延时断电
开关还有十分钟自动分断,可对开关进行延时断电操作
(当前不可进行设置延时)
--通知推送
还有十分钟自动分断显示推送,点击推送跳转到通知页
(当前跳转到通知页看不到该推送)
--确认新时序数据库的账户信息
--确认模拟数据项目:DD.Mock.Web
--确认包含哪些接口:
插入多天的实时数据:real/insert/days
按天插入小时电量:power/insert/oneday
插入一个月的小时电量:power/insert/onemonth
插入一个月的天电量:power/insert/day/onemonth
插入某个月的月电量:power/insert/month/onemonth
插入历史报警记录:InsertWarningOneMonth
--选择数据库的原理:通过TUrl, TUsername, TPassword
--查看新时序数据库目前数据:test_power, test_real
登录:./taos.exe -h 116.63.236.99 -u -p
C:\Windows\System32\drivers\etc\hosts 文件中添加 116.63.236.99 ecs-dingding
C:\TDengine\cfg\taos.cfg 中添加 firstEp 116.63.236.99:6030
select ts, aa from super_real where mac='187ed5311111' and addr=1 limit 10;
最新的数据是3.30日
--插入实时数据
api/sx/real/insert/days
报错:ShiXu\Commands\InsertRealByDaysNotification.cs:line 121,New\Services\ManageSuperReal.cs:line 177
select ts, aa from super_real where mac='187ed53338c4' and addr=1 limit 50;
select last(ts1,aa) from super_real where mac='187ed53338c4' and addr=1;
select count(*) from super_real;
--插入电量数据
按小时:api/sx/power/insert/onemonth
按天:api/sx/power/insert/day/onemonth
--确认所有的模块
187ED53338C4 187ed53338c4
187ED5311111 187ed5311111
187ED5322222 187ed5322222
187ED5333333 187ed5333333
187ED5344444 187ed5344444
187ED5355555 187ed5355555
187ED5366666 187ed5366666