渊澄YC

川流不息,渊澄取映

进入六月份以后国内众多的docker加速镜像突然停止了服务,外加docker官方源在国内被屏蔽,导致拉取docker镜像成了难题,就算是挂上梯子,速度也不理想。有网友发布了通过cloudflare的worker服务来加速docker镜像拉取的教程,我也实际操作了一遍,操作不复杂,而且加速效果明显,感兴趣的同学可以根据我下面的步骤操作。

将域名停靠到cloudflare

先去注册cloudflare账号,然后添加你的域名,将域名的NS地址改到cloudflare,等待生效。

新建worker项目

进入左侧的worker和pages菜单
20240708094217
新建一个worker项目,然后自己随意起个项目名字,最后点击右下角的部署按钮。
20240708094525

复制代码

创建成功之后点击如图所示的编辑代码按钮。
20240708094650
将下面的代码全部复制过去,然后点击右上角的部署按钮。
20240708094926

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
'use strict'
const hub_host = 'registry-1.docker.io'
const auth_url = 'https://auth.docker.io'
const workers_url = 'https://docker.miaoyang.win'
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
})
}

添加自定义域名

之后进入到worker项目页面点击设置-触发器,添加一个自定义域,这个自定义域可以是你解析到cloudflare的域名的一个二级域名,例如docker.example.com 。然后将该域名添加一条路由。
20240708104819

测试加速效果

如果你需要拉取的镜像homeassistant/aarch64-homeassistant:latest
现在需要在docker镜像前面加上你的自定义域,命令如下

1
docker pull docker.example.com/homeassistant/aarch64-homeassistant:latest

最近入手了一台京东AX1800pro 亚瑟路由器,64GB版本的,算上各种优惠后不到80块钱拿下。
到手后看到版本是R2242,按理说应该是是符合网上大神教程里面的免拆刷机版本的,但是按照教程一步一步折腾了好几次之后都没成功,后来回想可能是第一次开机之后在wan口插了网线,连接了互联网,导致被打了补丁所致。于是乎只剩下拆机通过TTL来刷机了。
过程倒是挺顺利的。
首先是将顶部的盖板撬开,拆除里面的两颗螺丝,接着底部的橡胶垫边缘撬起,在六边形的六个角有六颗螺丝,拆掉后就可以将底板拆掉。拆掉之后还有五颗螺丝固定主板的固定支架,拆掉后就可以将主板抽出了。
接着在主板TTL接口处焊接三个接线柱,分别是G、T、R三个口,对应CH340G模块的G、R、T,用杜邦线连接好,电脑上装好驱动,用网线连接路由器LAN口和电脑,就可以开始操作了。

阅读全文 »

20240605104448
该剧改编自猫腻同名畅销小说,承接上季,范闲(张若昀 饰)率领使团回归途中,二皇子以费介、范思辙以及滕家遗孤的安危来威胁范闲,逼他向自己俯首称臣,二人的矛盾就此激发。范闲所面对的抱月楼迷局,以及接踵而至的春闱危机,都是二皇子精心给范闲布下的陷阱。

  范闲与林婉儿如愿大婚,紧接着,范闲接手内库,却发现内库负债累累。 范闲拒绝了庆余堂大掌柜的相助,决定靠自己的力量解决内库危机,范闲相约城中众商贾相聚苍山,以售卖“库债”为机筹集了两千多万银两,解决了内库空虚问题。

  悬空寺上,庆帝遭遇三连刺杀,范闲出手相救却导致武功全废。危机四伏,压力陡增,范闲别无选择,他必须以这样的身体下江南,挑战庞大的势力与既定的游戏规则,以求彻底夺回内库。

种子链接

https://1827552651-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FzyeXCfWDMCUsuUrT3Z6v%2Fuploads%2FNPmNxNXaUFnXoGjSbn9q%2F%E5%BA%86%E4%BD%99%E5%B9%B4.%E7%AC%AC%E4%BA%8C%E5%AD%A3.Joy.of.Life.S02.2024.Chinese.EP01-36.Complete.1080P.Disney.WEB-DL.H265.DDP2.0-Vampire.torrent?alt=media&token=ed8dcd91-4a8e-47bd-aad5-1502043e6dfe

今天我在三个平台发布了第一篇图文内容,分别是今日头条、小红书和什么值得买,之后可能会在短视频平台也同步。
太详细的中远期规划还没有想好,目前主要是分享一些电脑使用技巧和资源转载,大家有什么好的建议和意见可以在平台留言或私信与我交流。
欢迎大家站内搜索“渊澄YC”关注!

前言

上周趁着清明假期,鼓捣了一下局域网iptv组播,然后自己也在一些平台和终端测试了一些主流的IPTV播放软件,结合自己手头现有设备的情况,推荐下面几款播放软件,如果你有更好的软件,欢迎推荐分享。
软件本身并不提供IPTV直播服务,需要我们将自己创建或是下载到的m3u文件导入到软件内进行播放。另外有部分软件支持epg节目预告,可以根据m3u里面的频道匹配该频道的节目播放单,实现节目预告。这里感谢51zmt提供的epg服务(http://epg.51zmt.top:8000/) 。另外该站点还支持台标匹配,你可以上传自己的m3u文件,然后匹配对应的频道台标LOGO。

kodi(全平台)

只要你的设备能安装和运行kodi,推荐使用kodi来播放IPTV的m3u。
首先需要在插件里面下载 iptv simply client 这个插件,安装好之后在插件设置里面设置好m3u源文件地址,设置好epg节目预告地址(http://epg.51zmt.top:8000/e.xml), 然后在主页面进去电视菜单,就可以观看IPTV了。
官网 https://kodi.tv

阅读全文 »

网络环境

山西太原联通宽带。光猫INTERNET口与IPTV口为不同的网络。IPTV口接联通送的IPTV盒子可以观看IPTV电视节目。
INTERNET口桥接模式连接华为AX3路由器(IP地址为192.168.1.2),AX3负责PPPOE拨号。
AX3下连一台刷了Openwrt的斐讯N1盒子(IP地址为192.168.1.2)用于科学工作。连了一台刷了Openwrt的网件AX206路由器(IP地址为192.168.1.4)用于扩展WIFI覆盖范围。
网件WAX206的LAN口与华为AX3的LAN口相连,并且与主路由AX3设置成了统一的SSID和密码,关闭了DHCP。

阅读全文 »

N1刷了W大的电视盒子固件有两三年的时间了,期间配了T1遥控器,又扩容到了32G的存储,可以装下更多的APP了。运行KODI和日常的爱优腾都还算比较流畅,但唯独有一点,运行官方Youtube应用的时候会经常出现卡顿和死机的情况,体验不是很好,加之KODI下里面的Yotube插件也不能正常使用了,所以在N1上看油管视频一直没有一个很好的解决方案。
最近闲逛的时候发现有好多网友和我一样的情况,下面有热心网友推荐第三方的油管APP-smarttube。不仅可以流畅观看油管视频,而且可以免安装谷歌框架登录油管谷歌账号,同步观看记录和订阅频道。
这是软件的官网地址,可以下载稳定版和测试版:
https://smarttubenext.com/
安装方法也很简单,下载APK拷贝到优盘,插到N1上直接安装就可以了。

最近入手了一台爱普生的L3251彩色喷墨打印机,可以连WIFI实现网络共享,但有点遗憾的是机器原生并不支持苹果的Airprint协议,也就是无法通过iOS设备直接打印,但是官方提供了一款名为“Epson Smart Panel”的软件,在该软件中配置好打印机之后,可以直接通过该软件打印照片或文档等内容,也可以在相册中选择需要打印的图片,点击共享按钮,选择“使用epson打印”,系统可以直接跳到该软件,完成打印任务,如果你在共享中直接选择系统自带的打印服务,是发现不了打印机的。

阅读全文 »