如果使用docker的方式拉取镜像的,可能对文件目录不会有过多的了解,如果是使用windows的安装或者Linux的systemd的方式安装,则下载解压后有以下几个文件比较特殊
wwwroot:管理端文件夹,如果你需要前后端分离的,可以使用nginx把这个分离出去
appsettings.json:配置文件
logs:日志文件存放在此
data:数据库文件,比如操作日志,比如sqlite类型的数据文件
config:一些用到的配置信息
template:一些配置用到的模板文件,所以你可以自定义nginx的模板了,就是改这里!
backup:系统内置的默认信息,比如菜单,比如动态表单(IIS的编辑表单字段信息就是这个)
在PasteSpider的文件中,我们可以看到一个appsettings.json文件,这个文件就是PasteSpider系统的配置文件,大致内容如下:
{
"App": {
"CorsOrigins": "http://localhost:51695"
},
"ConnectionStrings": {
"MainConnectionString": "User id=postgres;Password=123456;Host=192.168.1.168;Port=8765;Database=spiderdb;Pooling=true;MaxPoolSize=10;MinPoolSize=0;Connection Lifetime=0;",
"AbpAuditLogging": "Data Source=data/auditlogging.db", //审计日志,目前只能是Sqlite
"SqliteConnectionString": "Data Source=data/spider.db" //sqlite的链接字符串,注意使用-v进行映射,否则下次更新后数据就丢失了 容器内文件夹为/app/data/spider.db 示例 -v /spider/sqlite/:/app/data/ 记得宿主要先创建文件夹/spider/sqlite
},
"KeeperConfig": {
"GroupName": "default", //集群模式中的群组划分 同一个群组名称的服务器会划分给同名的spider管理 最大字符8位数,对应服务器的组别名称!
"UseRedis": false, //是否采用redis缓存机制,还是使用内存缓存机制,集群部署模式必须使用redis作为缓存
"SqlDataType": "sqlite", //sqlite pgsql(推荐) 我们将在后续版本中支持mysql(mariadb)/mssql等
"LogSqlDataType": "sqlite", //审计日志的数据库类型 和上的AbpAuditLogging对应 目前仅支持sqlite
"RecoveryDay": 90, //资源回收跨度(天)
"SingleModel": true, //是否是单例模式(单个PasteSpider,也是可以连接多台服务器的),否则为集群模式(多个PasteSpider组合)
"WorkDir": "/spider/", //绑定的执行目录,如果不需要构建可以不需要设定在docker/podman run 中使用 -v /xxx/:/spider/指定,映射到宿主服务器上 请保持两边一致,否则在直连的时候会有问题
"WaitNginxLoadTime": 10, //等待nginx生效时间多少秒
"WebHost": "", //用于多服务器之间文件同步 示例 http://10.1.4.5:8012 注意是非/结尾
"WaitRunTime": 20, //等待启动最大时间,超过这个时间则判定启动失败!
"RunCollectTask": true, //是否收集容器服务器的信息,记录运行状态
"CollectTaskSecond": 300, //多少秒执行一次统计,统计运行状态等
"LoginAccount": "admin@spider.com", //默认的账号
"LoginPassWord": "123456", //如果不为123456则可以使用这个登陆 默认账号的密码
"Sversion": "25.03.16.01", //24.x.x.x以后版本PasteSpiderWeb和PasteSpiderFile也需要24.x.x.x以上版本
"TestImage": "pastetestimage", //创建仓库的时候创建的测试镜像的镜像名称
"UserToken": "111222333444555666", //token的加密字符串,建议必须更改!!! 也作为集群部署的密钥使用
"CurrentHost": ""//当前节点的访问地址,示例http://172.23.2.1:1290 集群模式必填
},
"RedisConfig": {
"MainConnection": "192.168.1.168:8379,password=123456", //redis连接字符串
"Prefix": "spider:", //redis的key的前缀,防止和其他项目撞库
"ClientName": "spider" //redis连接名称,在redis客户端后台可以查看
},
"certificates": {
"Stores": [
{
"Name": "My",
"Path": "",
"Claims": [ "Read" ]
}
]
},
"IpRateLimiting": {
//false,则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制
//true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,
"EnableEndpointRateLimiting": false,
//false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等) //,则必须设置StackBlockedRequests为true。
"StackBlockedRequests": false,
//Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置
"RealIpHeader": "X-Real-IP",
//取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
"ClientIdHeader": "X-ClientId",
//限制状态码
"HttpStatusCode": 429,
"QuotaExceededResponse": {
"Content": "{{ \"message\": \"Too many requests,Please try again in {2} second(s).\", \"code\": 429,\"data \":\"\"}}",
"ContentType": "application/json"
},
////IP白名单:支持Ip v4和v6
//"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
////端点白名单
"EndpointWhitelist": [ "post:/api/spider/upload/drop", "post:/api/spider/upload/delete", "get:/api/spider/open/download" ],
////客户端白名单
//"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
//通用规则
"GeneralRules": [
{
//端点路径
"Endpoint": "*",
//时间段,格式:{数字}{单位};可使用单位:s, m, h, d
"Period": "5s",
//限制
"Limit": 30
}
]
},
"Serilog": {
"LevelSwitches": {
"$errorSwitch": "Error",
"$infoSwitch": "Information",
"$warnSwitch": "Warning"
},
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Information"
}
},
"WriteTo": [
{
"Name": "Console",
"Args": {
"restrictedToMinimumLevel": "Warning"
}
},
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"levelSwitch": "$infoSwitch", //也可以使用 restrictedToMinimumLevel:Information
"rollingInterval": "Day", // "创建文件的类别,可以是分钟,小时,天,月,年": null,
"retainedFileCountLimit": 60, // "--设置日志文件个数最大值,默认31,意思就是只保留最近的31个日志文件", "等于null时永远保留文件": null,
"fileSizeLimitBytes": 3145728, //设置单个文件大小为3M 默认1G
"rollOnFileSizeLimit": true //超过文件大小后创建新的
}
},
{
"Name": "File",
"Args": {
"path": "logs/warning.txt",
"levelSwitch": "$warnSwitch",
"rollingInterval": "Day", // "创建文件的类别,可以是分钟,小时,天,月,年": null,
"retainedFileCountLimit": 60, // "--设置日志文件个数最大值,默认31,意思就是只保留最近的31个日志文件", "等于null时永远保留文件": null,
"fileSizeLimitBytes": 3145728, //设置单个文件大小为3M 默认1G
"rollOnFileSizeLimit": true //超过文件大小后创建新的
}
},
{
"Name": "File",
"Args": {
"path": "logs/error.txt",
"levelSwitch": "$errorSwitch",
"rollingInterval": "Day", // "创建文件的类别,可以是分钟,小时,天,月,年": null,
"retainedFileCountLimit": 60, // "--设置日志文件个数最大值,默认31,意思就是只保留最近的31个日志文件", "等于null时永远保留文件": null,
"fileSizeLimitBytes": 3145728, //设置单个文件大小为3M 默认1G
"rollOnFileSizeLimit": true //超过文件大小后创建新的
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
}
}
如上图所示,如果你拆开下载获得的PasteSpider镜像包,在/app/文件夹下可以找到大概如上的内容,我们可以不修改他,在使用podman或者docker启动的时候去修改他,比如我们要修改redis的连接字符串,则:
podman run -it -e RedisConfig:Mainconnection="192.168.0.139:6379,password=111111,defaultdatabase=9" --name myspider -d localhost/imgspider:1059
同理你也可以动态的修改数据库的连接字符串等!
在使用PasteSpider部署你的项目的时候,可以动态的设置这些配置,使用PasteSpider里面的key-val配置,设定为环境变量,结合PasteSpider占位符可以实现很多有意义的需求!
** 以下是一个使用单例模式**
Sqlite数据库,内存缓存的配置启动参考:
docker run -it -v "/spider/:/spider/" -v /spider/data/:/app/data/ -p 8012:80 -e KeeperConfig:SqlDataType="sqlite" -e KeeperConfig:UseRedis=false --name myspider -d imgspider:2000
服务方式,就是把安装包下载后,解压然后执行运行,比如Linux中以systemd的方式运行,而Windows中以Windows.Service的方式运行,这个时候对于上面的-e传递参数环境变量就不合适了,我们可以使用另外一个方式!
1.复制根目录的appsettings.json文件,命名为appsettings.Production.json,然后你需要修改的地方都在这个appsettings.Production.json上操作,为什么不在appsettings.json上直接操作呢?因为PasteSpider下次升级,可能会新增配置,还容易把你的配置给覆盖了,升级的时候是绝对不会出现有appsettings.Production.json文件的,出现了就表示我这打包有问题了!这样就保证了每次升级你们都可以直接覆盖,不需要对比配置啥的!
1.如果在一个宿主机上部署3个订单服务,由于路径映射都是一样的,比如/shop/log/:/app/logs/,按照上面的appsettings.json可以知道他们将公用一个log.txt文件,或者logyyyyMMdd.txt文件,这样应该是有IO问题的,如何解决?
答:可以使用PasteSpider的启动参数,启动参数配置动态的key-value模式,比如你可以配置键:"Serilog:WriteTo:1:Args:path"对应的值为"logs/log{{App.Id}}.txt",这样每个容器生成的日志文件名就不一样了!注意要把环境变量打勾!
2.如果有一个服务,比如Nodejs,部署了3个nodejs容器,另外一个服务比如main,需要给他们发送信息,也就是需要轮询,如何让nodejs每次部署,都能很好的告知main,使得main能够快速的,正确的给所有Nodejs发送消息?
答:在项目信息中有一个通知地址,这个的意思是每次服务升级等会把最新的NginxRoute信息推送到这个地址,这样服务可以基于收到的信息做适当的动作!