首页
关于
推荐
ByteVirt主机
Search
1
win10 锁屏壁纸 Windows聚焦不更新解决方法
467 阅读
2
SpringBoot 集成Logback实现rsyslog日志记录
396 阅读
3
群晖Docker搭建Redis集群
206 阅读
4
群晖自动更换登录页背景图为Bing壁纸
206 阅读
5
阿里云maven仓库慢的解决方法
116 阅读
数据库
群晖
maven
windows
docker
Java
登录
Search
标签搜索
群晖
壁纸
postgresql
数据库
mysql
windows
maven
阿里云
docker
代码搬运工
累计撰写
8
篇文章
累计收到
0
条评论
首页
栏目
数据库
群晖
maven
windows
docker
Java
页面
关于
推荐
ByteVirt主机
搜索到
8
篇与
的结果
2025-01-08
解决springboot升级3.X后form-data类型请求无法传参的问题
解决这个问题前先普及一下Spring Boot是如何解析form-data的,Spring Boot通过MultipartResolver接口来解析multipart/form-data类型请求,该接口有两个实现类CommonsMultipartResolver和StandardServletMultipartResolver,下面我们来分别看一下这两个实现类1、CommonsMultipartResolverCommonsMultipartResolver是基于Apache Commons FileUpload库实现的。它使用Jakarta Commons FileUpload来解析multipart/form-data请求。这个解析器可以在application.properties或application.yml文件中通过配置spring.servlet.multipart.resolver属性来启用。但是在springboot 3.x中,该实现类已被弃用。2、StandardServletMultipartResolverStandardServletMultipartResolver是Spring Boot默认的MultipartResolver实现。它依赖于Servlet 3.0规范提供的API来解析multipart/form-data请求。当没有显式配置其他MultipartResolver时,Spring Boot会自动使用这个解析器。 刚才已经说明了,springboot3只支持StandardServletMultipartResolver,所以如果遇到form-data无法解析的情况,就是StandardServletMultipartResolver没有被加载,StandardServletMultipartResolver加载是由MultipartAutoConfiguration来实现的,贴上代码如下 从代码中可以看到MultipartAutoConfiguration被加载的关键是 spring.servlet.multipart.enabled 这个配置项,经过排查发现,原因是springboot升级前项目使用的是CommonsMultipartResolver,所以将 spring.servlet.multipart.enabled 设为false了,将该配置项改为true问题解决!如果不是这个原因,那么你需要排查一下项目中是否自定义实现MultipartResolver接口。
2025年01月08日
3 阅读
0 评论
0 点赞
2024-06-16
群晖更换docker加速源
近期由于种种原因,国内的docker镜像源纷纷被禁,群晖也是只能查询镜像,但是无法pull,从网上查了很多方案,发现一种通过cloudflare的 worker服务代理的方式,这种方式个人感觉比较简单有效方法推荐给大家。{dotted startColor="#ff6c6c" endColor="#1989fa"/}前提条件注册一个域名。 域名注册可以选择国内的腾讯云、阿里云等,新人注册一般会有较大的优惠,如果不想花钱,网上也有免费注册域名的教程,比如eu.org( https://nic.eu.org ),虽然免费,但是审核周期比较长,大家可自行选择。注册cloudflare账号。 注册环节比较简单,此处不再过多赘述,附上注册地址: 点击跳转开始部署1、登录 Cloudflare 账号,进入到主页,点击“网站”菜单,添加站点,这里我添加一个已经注册好的域名。2、选择计划。这里选择免费计划Free即可,免费计划已经完全能够满足我们的使用,具体的区别可自行对比(计划对比 )。3、修改DNS服务器。首先点击“开始快速扫描”,之后点击“继续”,下面需要我们修改域名的DNS服务地址,以腾讯云为例,首先前往“我的域名”,找到我们的域名,点击更多,选择“修改DNS服务器”,之后选择“自定义DNS”,把刚才cloudflare提供给我们的名称服务器填上,然后返回cloudflare,点击继续,之后就等待cloudflare验证通过后会通过邮件的形式告知我们。4、自定义一个DNS记录。域名验证通过后,我们进入域名的网站,点击DNS菜单中的设置,我们添加一个A记录,名称随便起一个,这里叫docker吧,ipv4地址随便填,这里填8.8.8.8,启用代理。5、创建Workers。回到cloudflare首页,选择“Workers 和 Pages菜单”,点击左侧“创建”,填一下名字,这里叫“dockerhub”,点击保存、完成,之后点击右上角“编辑代码”,把下面的代码粘贴进去(PS:代码是从网上找的,看懂原理,大家可自行编辑),修改workers_url为上一步添加的A记录域名,之后点击右上角“部署”,然后回到项目页面,点击“设置”-》“触发器”-》添加路由,路由填刚才添加的A记录域名,后面一定要加上/*,区域选择我们的域名就可以了。'use strict' const hub_host = 'registry-1.docker.io' const auth_url = 'https://auth.docker.io' // 请将 workers_url替换成自己的域名 const workers_url = '' const PREFLIGHT_INIT = { status: 204, headers: new Headers({ 'access-control-allow-origin': '*', 'access-control-allow-methods': 'GET,POST,PUT,PATCH,TRACE,DELETE,HEAD,OPTIONS', 'access-control-max-age': '1728000', }), } function makeRes(body, status = 200, headers = {}) { headers['access-control-allow-origin'] = '*' return new Response(body, {status, headers}) } function newUrl(urlStr) { try { return new URL(urlStr) } catch (err) { return null } } addEventListener('fetch', e => { const ret = fetchHandler(e) .catch(err => makeRes('cfworker error:\n' + err.stack, 502)) e.respondWith(ret) }) async function fetchHandler(e) { const getReqHeader = (key) => e.request.headers.get(key); let url = new URL(e.request.url); if (url.pathname === '/token') { let token_parameter = { headers: { 'Host': 'auth.docker.io', 'User-Agent': getReqHeader("User-Agent"), 'Accept': getReqHeader("Accept"), 'Accept-Language': getReqHeader("Accept-Language"), 'Accept-Encoding': getReqHeader("Accept-Encoding"), 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0' } }; let token_url = auth_url + url.pathname + url.search return fetch(new Request(token_url, e.request), token_parameter) } url.hostname = hub_host; let parameter = { headers: { 'Host': hub_host, 'User-Agent': getReqHeader("User-Agent"), 'Accept': getReqHeader("Accept"), 'Accept-Language': getReqHeader("Accept-Language"), 'Accept-Encoding': getReqHeader("Accept-Encoding"), 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0' }, cacheTtl: 3600 }; if (e.request.headers.has("Authorization")) { parameter.headers.Authorization = getReqHeader("Authorization"); } let original_response = await fetch(new Request(url, e.request), parameter) let original_response_clone = original_response.clone(); let original_text = original_response_clone.body; let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); let status = original_response.status; if (new_response_headers.get("Www-Authenticate")) { let auth = new_response_headers.get("Www-Authenticate"); let re = new RegExp(auth_url, 'g'); new_response_headers.set("Www-Authenticate", response_headers.get("Www-Authenticate").replace(re, workers_url)); } if (new_response_headers.get("Location")) { return httpHandler(e.request, new_response_headers.get("Location")) } let response = new Response(original_text, { status, headers: new_response_headers }) return response; } function httpHandler(req, pathname) { const reqHdrRaw = req.headers // preflight if (req.method === 'OPTIONS' && reqHdrRaw.has('access-control-request-headers') ) { return new Response(null, PREFLIGHT_INIT) } let rawLen = '' const reqHdrNew = new Headers(reqHdrRaw) const refer = reqHdrNew.get('referer') let urlStr = pathname const urlObj = newUrl(urlStr) /** @type {RequestInit} */ const reqInit = { method: req.method, headers: reqHdrNew, redirect: 'follow', body: req.body } return proxy(urlObj, reqInit, rawLen, 0) } async function proxy(urlObj, reqInit, rawLen) { const res = await fetch(urlObj.href, reqInit) const resHdrOld = res.headers const resHdrNew = new Headers(resHdrOld) // verify if (rawLen) { const newLen = resHdrOld.get('content-length') || '' const badLen = (rawLen !== newLen) if (badLen) { return makeRes(res.body, 400, { '--error': `bad len: ${newLen}, except: ${rawLen}`, 'access-control-expose-headers': '--error', }) } } const status = res.status resHdrNew.set('access-control-expose-headers', '*') resHdrNew.set('access-control-allow-origin', '*') resHdrNew.set('Cache-Control', 'max-age=1500') resHdrNew.delete('content-security-policy') resHdrNew.delete('content-security-policy-report-only') resHdrNew.delete('clear-site-data') return new Response(res.body, { status, headers: resHdrNew }) }6、验证结果。我们用ssh命令进入群晖,使用 sudo -i 命令切换到root用户,下面我们来验证一下操作结果。# 使用curl命令,返回404 curl https://docker.*** 404 page not found # 拉取nginx镜像,能够成功拉取表示成功 docker pull https://docker.***/library/nginx:latest 7、替换群晖docker镜像加速地址,进入群晖的Container Manager,点击“注册表”-》“设置”,选择“Docker Hub (v1)”,,点击“编辑”,勾选“启用注册表镜像”,填上我们刚才配置的A记录域名,然后我们删除掉上一步拉取的nginx镜像,尝试直接执行 docker pull nginx:latest ,能够拉取则证明成功了。
2024年06月16日
76 阅读
0 评论
1 点赞
2024-05-25
Postgresql不常用函数语法汇总
以下是在国产化适配国产中总结的一些mysql转pg的语法函数,分享出来供大家参考。1. 在mysql中,我们习惯使用 DATE_FORMAT 函数对时间日期进行格式化,在pg中我们使用 to_char 代替--- DATE_FORMAT用法 SELECT DATE_FORMAT(my_datetime, '%Y-%m-%d') AS formatted_date FROM my_table;--- to_char用法 SELECT to_char(my_datetime, 'YYYY-MM-DD') AS my_table;2.mysql里的 GROUP_CONCAT 用于将多行的值连接成一个字符串,pg中使用 string_agg代替--- GROUP_CONCAT的用法 GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val]) SELECT class, GROUP_CONCAT(name) AS student_names FROM students GROUP BY class;{alert type="info"}如果students表包含以下数据:classname1AAlice1ABob1BCharlie1BDavid那么查询的结果将是:classstudent_names1AAlice,Bob1BCharlie,David{/alert}--- string_agg的用法 string_agg(expression, delimiter) SELECT class, string_agg(name, ',') AS student_names FROM students GROUP BY class;{alert type="info"}如果students表包含以下数据:classname1AAlice1ABob1BCharlie1BDavid那么查询的结果将是:classstudent_names1AAlice,Bob1BCharlie,David{/alert}3.mysql的 DATE_SUB 函数用于从一个日期中减去指定的时间间隔,pg中使用间隔(interval)来进行日期的减法---使用DATE_SUB从当前日期减去 5 天 SELECT DATE_SUB(CURDATE(), INTERVAL 5 DAY); SELECT DATE_SUB('2023-10-23', INTERVAL 3 MONTH); SELECT DATE_SUB(your_date_column, INTERVAL 1 YEAR);---使用interval从当前日期减去 5 天 SELECT current_date - INTERVAL '5 days' AS new_date; SELECT current_date - INTERVAL '3 months' AS new_date; SELECT '2023-10-23'::date - INTERVAL '1 years' AS new_date;4.mysql的 find_in_set 函数用于查找一个字符串在逗号分隔的字符串列表中的位置,pg中使用ANY--- FIND_IN_SET用法 FIND_IN_SET(search_string, string_list) SELECT name FROM students WHERE FIND_IN_SET('swimming', hobbies) > 0;--- 使用ANY代替 SELECT CASE WHEN 'your_search_string' = ANY (string_to_array(your_column, ',')) THEN TRUE ELSE FALSE END AS is_present FROM your_table;5.mysql的 on duplicate update 在pg中使用 ON CONFLICT DO UPDATE 代替--- mysql用法 INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, ...;--- pg用法 INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...) ON CONFLICT (constraint_column) DO UPDATE SET column1 = value1, column2 = value2, ...;{alert type="warning"}constraint_column 是你希望避免冲突的唯一约束或主键列的名称{/alert}
2024年05月25日
69 阅读
0 评论
2 点赞
2022-05-02
win10 锁屏壁纸 Windows聚焦不更新解决方法
问题:锁屏壁纸设置为 Windows聚焦 ,锁屏壁纸突然显示为固定的图片,不会自动更新。解决方法:1、打开服务找到下图中的两个服务,看到第一个服务Background Intelligent Transfer Service启动类型为手动,将手动改为自动,并应用;2、进入设置-个性化-锁屏壁纸,修改背景为“图片”3、进入设置-隐私-后台应用,找到设置,将开关打开4、进入C:\Users\用户名\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_\Settings,删除下面的文件,往上返一级,找到LocalState\Assets,删除下面所有的文件5、回到设置-个性化-锁屏壁纸,修改背景为“Windows聚焦”,可以发现Settings目录下又自动生成新的.bat文件了,Assets目录下也自动下载了新的壁纸
2022年05月02日
467 阅读
0 评论
3 点赞
2021-08-21
SpringBoot 集成Logback实现rsyslog日志记录
最近项目中需要将用户请求日志记录下来,打算通过Spring boot的logback将请求日志和一场数据通过发送到rsyslog,再通过rsyslog将日志发送到kafka中,之后就是消费处理就可以了。参考百度部分文章整理实现,个中问题欢迎指正,转载请指明出处 :@(脸红)引入springboot logging <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>新建logback-spring.xml文件{alert type="success"}LogBack 在 Spring Boot 中建议命名为 logback-spring.xml。本文主要讲解如何对接rsyslog,像写日志到文件这些详细的配置方法可参考以下文章:https://segmentfault.com/a/1190000018323081{/alert}<?xml version="1.0" encoding="UTF-8"?> <!-- 说明: 1. 文件的命名和加载顺序有关 logback.xml早于application.yml加载,logback-spring.xml晚于application.yml加载 如果logback配置需要使用application.yml中的属性,需要命名为logback-spring.xml 2. logback使用application.yml中的属性 使用springProperty才可使用application.yml中的值 可以设置默认值 --> <configuration scan="true" scanPeriod="5 seconds" debug="false"> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <!-- 从yml文件中读取配置--> <!-- rsyslog主机地址--> <springProperty scope="context" name="syslogHost" source="logback.rsyslog.host" defaultValue="10.221.2.77"/> <!-- rsyslog端口号--> <springProperty scope="context" name="syslogPort" source="logback.rsyslog.port" defaultValue="514"/> <!-- root日志级别--> <springProperty scope="context" name="rootLevel" source="logback.level.root" defaultValue="INFO"/> <!-- 业务代码的日志级别--> <springProperty scope="context" name="commonLevel" source="logback.level.common" defaultValue="DEBUG"/> <!-- 彩色日志 --> <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 --> <!-- magenta:洋红 --> <!-- boldMagenta:粗红--> <!-- cyan:青色 --> <!-- white:白色 --> <!-- magenta:洋红 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!--withJansi>true</withJansi--> <encoder> <pattern>%boldCyan(%d{yyyy/MM/dd-HH:mm:ss}) [%thread] %highlight(%-5level) %logger- %msg%n %ex</pattern> </encoder> </appender> <!-- pattern配置参考https://www.cnblogs.com/jasenin/p/12692690.html --> <appender name="sysExceptionlog" class="ch.qos.logback.classic.net.SyslogAppender"> <syslogHost>${syslogHost}</syslogHost> <port>${syslogPort}</port> <facility>local2</facility> <throwableExcluded>true</throwableExcluded> <suffixPattern>|{"type":"exception","date":"%d{yyyy/MM/dd HH:mm:ss}","level": "%level","class":"%logger","message": "%replace(%message){'\"', '\''}","requestId":"%X{requestId}","stackTrace": "%replace(%ex{short}){'\"', '\''}"}</suffixPattern> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> <level>WARN</level> </filter> </appender> <appender name="sysRequestlog" class="ch.qos.logback.classic.net.SyslogAppender"> <syslogHost>${syslogHost}</syslogHost> <port>${syslogPort}</port> <facility>local2</facility> <throwableExcluded>true</throwableExcluded> <suffixPattern>|{"type":"request","date":"%d{yyyy/MM/dd HH:mm:ss}","clientIp":"%X{clientIp}","requestId":"%X{requestId}","requestUrl":"%X{requestUrl}","requestMethod":"%X{requestMethod}","requestParam":"%X{requestParam}","requestBody":"%X{requestBody}","responseBody":"%X{responseBody}"}</suffixPattern> </appender> <appender name="asyncSysExceptionLog" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="sysExceptionlog" /> </appender> <!--为了使日志记录对程序的正常运行产生影响,日志记录采用异步方式--> <appender name="asyncSysRequestLog" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="sysRequestlog" /> </appender> <root level="${rootLevel}"> <appender-ref ref="console"/> <appender-ref ref="asyncSysExceptionLog"/> </root> <logger name="com.demo" level="${commonLevel}" additivity="false"> <appender-ref ref="console"/> <appender-ref ref="asyncSysExceptionLog"/> </logger> <logger name="com.demo.config.filter.RequestLogFilter" level="info" additivity="false"> <appender-ref ref="asyncSysRequestLog"/> </logger> </configuration>自定义filter{alert type="success"}filter的作用是用来拦截用户请求。通过MDC记录用户的请求url、IP、请求参数及相应参数等,方便对异常进行跟踪;获取用户真实IP徐正确配置代理,此处以nginx为例,其他代理请自行百度:location /demo { proxy_pass http://localhost/demo; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }{/alert}隐藏内容,请前往内页查看详情自定义wrapper,获取响应值package com.demo.config.wrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StreamUtils; import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; /** * @Title: RequestWrapper * @Description: 包装HttpServletRequest,目的是让其输入流可重复读 * @Author: andy * @CreateDate: 2021/7/29 17:50 * @Version: 1.0 */ public class HttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper { private static final Logger logger = LoggerFactory.getLogger(HttpServletRequestWrapper.class); /** * 用于保存读取body中数据 */ private byte[] body = null; public HttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); try { body = StreamUtils.copyToByteArray(request.getInputStream()); } catch (IOException e) { logger.error("Wrap requestBody failed"); } } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body); return new ServletInputStream() { @Override public int read() throws IOException { return bais.read(); } @Override public boolean isFinished() { // TODO Auto-generated method stub return false; } @Override public boolean isReady() { // TODO Auto-generated method stub return false; } @Override public void setReadListener(ReadListener arg0) { // TODO Auto-generated method stub } }; } } 获取到日志信息2021-08-20T12:08:40+08:00 DESKTOP-O6HS2C6 |{"type": "request","date":"2021/08/20 12:08:40","clientIp":"124.133.195.42","requestId":"83acb55394f74b40a5294c36a02cb778","requestUrl":"/demo/api/test","requestMethod":"GET","requestParam":"phone=19900002222","requestBody":"","responseBody":"{\"code\":\"S20003\",\"msg\":\"手机号不存在\"}"} {alert type="success"}日志信息由 日志产生时间、产生日志的主机名 | 日志类型(request:请求;exception:异常)、自定义时间格式、客户端IP、requestId(用于绑定请求与异常日志,方便跟踪查询)、请求接口、接口方式、请求param、请求body、响应body{/alert}
2021年08月21日
396 阅读
1 评论
1 点赞
2021-08-15
阿里云maven仓库慢的解决方法
使用Maven构建项目时,虽然配置了阿里云的maven仓库,但是项目中有的依赖包下载还是非常慢,通过以下修改你的maven将会光速运行。 <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> </mirror> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> <!-- 中央仓库1 --> <mirror> <id>repo1</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo1.maven.org/maven2/</url> </mirror> <!-- 中央仓库2 --> <mirror> <id>repo2</id> <mirrorOf>central</mirrorOf> <name>Human Readable Name for this Mirror.</name> <url>http://repo2.maven.org/maven2/</url> </mirror>{callout color="#f0ad4e"}转载于:https://blog.csdn.net/weixin_34191845/article/details/91946662{/callout}
2021年08月15日
116 阅读
0 评论
1 点赞
2021-02-28
群晖自动更换登录页背景图为Bing壁纸
群晖DSM登录界面可以自己设置壁纸,但无法直接动态更换,这里使用脚本加计划任务每天更换壁纸为bing今日美图顺便收集壁纸美图。1.新建一个文件夹用来保存壁纸和脚本,这里我在photo下新建了一个wallpaper文件夹;2.创建定时任务;脚本如下:savepath="/volume1/photo/wallpaper" #在FileStation里面右键文件夹属性可以看到路径 pic=$(wget -t 5 --no-check-certificate -qO- "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1") echo $pic|grep -q enddate||exit link=$(echo https://www.bing.com$(echo $pic|sed 's/.\+"url"[:" ]\+//g'|sed 's/".\+//g')) date=$(echo $pic|sed 's/.\+enddate[": ]\+//g'|grep -Eo 2[0-9]{7}|head -1) tmpfile=/tmp/$date"_bing.jpg" wget -t 5 --no-check-certificate $link -qO $tmpfile [ -s $tmpfile ]||exit rm -rf /usr/syno/etc/login_background*.jpg cp -f $tmpfile /usr/syno/etc/login_background.jpg &>/dev/null cp -f $tmpfile /usr/syno/etc/login_background_hd.jpg &>/dev/null title=$(echo $pic|sed 's/.\+"title":"//g'|sed 's/".\+//g') copyright=$(echo $pic|sed 's/.\+"copyright[:" ]\+//g'|sed 's/".\+//g') word=$(echo $copyright|sed 's/(.\+//g') if [ ! -n "$title" ];then cninfo=$(echo $copyright|sed 's/,/"/g'|sed 's/,/"/g'|sed 's/(/"/g'|sed 's/ //g'|sed 's/\//_/g'|sed 's/)//g') title=$(echo $cninfo|cut -d'"' -f1) word=$(echo $cninfo|cut -d'"' -f2) fi sed -i s/login_background_customize=.*//g /etc/synoinfo.conf echo "login_background_customize=\"yes\"">>/etc/synoinfo.conf sed -i s/login_welcome_title=.*//g /etc/synoinfo.conf echo "login_welcome_title=\"$title\"">>/etc/synoinfo.conf sed -i s/login_welcome_msg=.*//g /etc/synoinfo.conf echo "login_welcome_msg=\"$word\"">>/etc/synoinfo.conf if (echo $savepath|grep -q '/') then cp -f $tmpfile $savepath/$date-$title-$word.jpg fi rm -rf /tmp/*_bing.jpg3.勾选任务,点击运行按钮测试,发现背景和欢迎信息已经下载下来了。
2021年02月28日
206 阅读
0 评论
3 点赞
2021-02-28
群晖Docker搭建Redis集群
本次我们已创建3主3从集群模式为例1.在Docker中选择左侧菜单“注册表”,搜索redis;2.在File Station中创建Redis目录,用于存放配置文件和数据文件;3.分别创建5个配置文件,端口分别是7001到7006以下是7001端口redis配置# 绑定IP地址,主机实际IP bind 192.168.0.106 # 端口号 port 7001 # 日志文件目录 logfile /data/redis/redis.log # 数据文件目录 dir /data/redis # 开启集群模式 cluster-enabled yes4.创建容器,选择高级设置进行配置5.6个redis容器创建完成后,全部启动;6.选择其中一个容器,点击详情,切换到“终端机”,新增一个终端;7.输入以下命令创建集群;redis-cli --cluster create 192.168.0.106:7001 192.168.0.106:7002 192.168.0.106:7003 192.168.0.106:7004 192.168.0.106:7005 192.168.0.106:7006 --cluster-replicas 1 8.连接redis集群,查看nodes,验证集群搭建成功;
2021年02月28日
206 阅读
1 评论
0 点赞