-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
462 lines (240 loc) · 180 KB
/
Copy pathatom.xml
File metadata and controls
462 lines (240 loc) · 180 KB
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>puzzle9 blog</title>
<subtitle>I exist because you need me.</subtitle>
<link href="https://puzzle9.github.io/atom.xml" rel="self"/>
<link href="https://puzzle9.github.io/"/>
<updated>2026-04-04T06:56:15.196Z</updated>
<id>https://puzzle9.github.io/</id>
<author>
<name>puzzle9</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>webdav</title>
<link href="https://puzzle9.github.io/posts/ed46b67c/"/>
<id>https://puzzle9.github.io/posts/ed46b67c/</id>
<published>2026-04-04T06:46:56.000Z</published>
<updated>2026-04-04T06:56:15.196Z</updated>
<content type="html"><![CDATA[<blockquote><p>要说什么通用 那就是先有了良好的设计</p></blockquote><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="alipine"><a href="#alipine" class="headerlink" title="alipine"></a>alipine</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/hacdias/webdav/releases/download/v5.11.4/linux-amd64-webdav.tar.gz</span><br><span class="line">tar -xvf linux-amd64-webdav.tar.gz</span><br></pre></td></tr></table></figure><p><code>/etc/init.d/webdav</code></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/sbin/openrc-run</span></span><br><span class="line"></span><br><span class="line">name=<span class="string">"webdav"</span></span><br><span class="line"><span class="built_in">command</span>=<span class="string">"/data/webdav"</span></span><br><span class="line">command_args=<span class="string">"-c /data/webdav.yaml"</span></span><br><span class="line">command_background=<span class="string">"yes"</span></span><br><span class="line">pidfile=<span class="string">"/run/<span class="variable">${RC_SVCNAME}</span>.pid"</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">depend</span></span>() {</span><br><span class="line"> need net</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x /etc/init.d/webdav</span><br><span class="line">rc-service webdav start</span><br><span class="line">rc-update add webdav</span><br></pre></td></tr></table></figure><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><p><code>/etc/webdav.yaml</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">address:</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span></span><br><span class="line"><span class="attr">port:</span> <span class="number">6065</span></span><br><span class="line"><span class="attr">tls:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">prefix:</span> <span class="string">/dav</span></span><br><span class="line"><span class="attr">debug:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">noSniff:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">behindProxy:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">directory:</span> <span class="string">.</span></span><br><span class="line"><span class="attr">permissions:</span> <span class="string">R</span></span><br><span class="line"><span class="attr">rules:</span> []</span><br><span class="line"><span class="attr">rulesBehavior:</span> <span class="string">overwrite</span></span><br><span class="line"><span class="attr">log:</span></span><br><span class="line"> <span class="attr">format:</span> <span class="string">console</span></span><br><span class="line"> <span class="attr">colors:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">outputs:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">stderr</span></span><br><span class="line"></span><br><span class="line"><span class="attr">cors:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="attr">users:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">username:</span> <span class="string">username</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">password</span></span><br><span class="line"> <span class="attr">permissions:</span> <span class="string">CRUD</span></span><br><span class="line"> <span class="attr">directory:</span> <span class="string">/hdd/path</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><blockquote>
<p>要说什么通用 那就是先有了良好的设计</p>
</blockquote>
<h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="alipine"><a </summary>
</entry>
<entry>
<title>parser video tencent</title>
<link href="https://puzzle9.github.io/posts/84d0123/"/>
<id>https://puzzle9.github.io/posts/84d0123/</id>
<published>2026-03-08T22:00:48.000Z</published>
<updated>2026-03-14T17:07:23.947Z</updated>
<content type="html"><![CDATA[<blockquote><p>站在巨人的肩膀上就是站在巨人的肩膀上</p></blockquote><h1 id="ckey-生成"><a href="#ckey-生成" class="headerlink" title="ckey 生成"></a><code>ckey</code> 生成</h1><p>按照目前了解到的 <code>cKey</code> <code>9.1</code> 是可以继续用的</p><p>但是吧 这么搞出来会限流</p><p>再者 他还有个 <code>8.5</code> 的东东</p><h2 id="8-5"><a href="#8-5" class="headerlink" title="8.5"></a>8.5</h2><p>研究了后发现 只要把这文件的这方法暴露出来就行</p><p><code>1.59.0/superplayer-txv.js</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">(e.<span class="property">videoTool</span> = ja),</span><br><span class="line"><span class="comment">// 核心代码就这一句</span></span><br><span class="line">(e.<span class="property">op</span> = op),</span><br></pre></td></tr></table></figure><p>然后 就可以快乐的调用了</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">SuperPlayerExport</span>.<span class="title function_">op</span>({</span><br><span class="line"><span class="comment">// 这玩意写死</span></span><br><span class="line"><span class="attr">appVer</span>: <span class="string">''</span>,</span><br><span class="line"><span class="comment">// 这玩意看着是活的</span></span><br><span class="line"><span class="attr">guid</span>: <span class="string">''</span>,</span><br><span class="line"><span class="comment">// 这玩意写死</span></span><br><span class="line"><span class="attr">h38</span>: <span class="string">''</span>,</span><br><span class="line"><span class="comment">// 这玩意写死</span></span><br><span class="line"><span class="attr">platform</span>: <span class="string">''</span>,</span><br><span class="line"><span class="comment">// 这个空就行</span></span><br><span class="line"><span class="attr">updateTimeStamp</span>: <span class="string">''</span>,</span><br><span class="line"><span class="comment">// 这个得变</span></span><br><span class="line"><span class="attr">vid</span>: <span class="string">''</span>,</span><br><span class="line">})</span><br></pre></td></tr></table></figure><p>这个会输出以下内容</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"><span class="string">"cKey"</span>: <span class="string">""</span>,</span><br><span class="line"><span class="string">"encryptVer"</span>: <span class="string">"8.5"</span>,</span><br><span class="line"><span class="string">"tm"</span>: <span class="string">""</span>,</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>然后再改改 <code>proxyhttp</code> 接口中的入参</p><p>这个他就通了</p><p>不过 可能会遇到 <code>该账号检测到有可疑违规、侵权等行为,已限制播放,如有疑问,请向我们反馈</code> 这个错误</p><p>这么个提示</p><h2 id="9-2"><a href="#9-2" class="headerlink" title="9.2"></a>9.2</h2><p>这玩意研究起来真的头大</p><p>看着有 <code>wasm</code><br>看着又有 <code>RSASSA-PKCS1-v1_5</code> <code>sign</code><br>看着还有 <code>RSA-OAEP</code> <code>SHA-1</code></p><h1 id="邪修"><a href="#邪修" class="headerlink" title="邪修"></a>邪修</h1><p>虽然我生成不了这玩意</p><p>也解密不了 <code>9.2</code> 返回的 <code>base64</code> 的东西</p><p>但是他既然要播放 那肯定就有解密的地方</p><p>直接 <code>hook</code> 也不失为一种方案</p><p>核心代码</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// onMiddlewareExecuteSuccess</span></span><br><span class="line"><span class="attr">key</span>: <span class="title function_">t</span>(<span class="number">158</span>),</span><br><span class="line"><span class="comment">// 这里的 e.reqParams 就是解密后的数据</span></span><br><span class="line"><span class="attr">value</span>: <span class="keyword">function</span>(<span class="params">e, t</span>) {</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="视频格式"><a href="#视频格式" class="headerlink" title="视频格式"></a>视频格式</h1><h2 id="4k-hdr-60fps"><a href="#4k-hdr-60fps" class="headerlink" title="4k hdr 60fps"></a>4k hdr 60fps</h2><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">defn = 'suhd'</span><br><span class="line"># 我也不清楚为什么是这个数</span><br><span class="line">sphevcfps = 52784342368127</span><br><span class="line">drm = 32</span><br><span class="line">playctrl = 418</span><br></pre></td></tr></table></figure><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://github.com/caoyuwu/caoyuwu.github.io/blob/214d5244cdc2f0a1197b416ce8ee1ea4f82f169b/tv/plugins/QQVideo.js">https://github.com/caoyuwu/caoyuwu.github.io/blob/214d5244cdc2f0a1197b416ce8ee1ea4f82f169b/tv/plugins/QQVideo.js</a></li><li><a href="https://blog.weimo.info/archives/423/">https://blog.weimo.info/archives/423/</a></li></ul>]]></content>
<summary type="html"><blockquote>
<p>站在巨人的肩膀上就是站在巨人的肩膀上</p>
</blockquote>
<h1 id="ckey-生成"><a href="#ckey-生成" class="headerlink" title="ckey 生成"></a><code>ckey</</summary>
</entry>
<entry>
<title>wstunnel</title>
<link href="https://puzzle9.github.io/posts/7a8879b5/"/>
<id>https://puzzle9.github.io/posts/7a8879b5/</id>
<published>2026-03-06T08:26:05.000Z</published>
<updated>2026-03-06T08:29:34.863Z</updated>
<content type="html"><![CDATA[<blockquote><p>这真是个神奇的隧道</p></blockquote><ul><li><a href="https://github.com/erebe/wstunnel">https://github.com/erebe/wstunnel</a></li></ul><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><h2 id="服务端"><a href="#服务端" class="headerlink" title="服务端"></a>服务端</h2><p><code>/etc/systemd/system/wstunnel.service</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=wstunnel</span><br><span class="line">After=network-online.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=simple</span><br><span class="line">User=root</span><br><span class="line">Restart=on-failure</span><br><span class="line">RestartSec=5s</span><br><span class="line">DynamicUser=true</span><br><span class="line">ExecStart=wstunnel server --restrict-http-upgrade-path-prefix tunnel wss://[::]:28170</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure><h2 id="客户端"><a href="#客户端" class="headerlink" title="客户端"></a>客户端</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wstunnel client --http-upgrade-path-prefix tunnel -L <span class="string">'udp://0.0.0.0:28170:127.0.0.1:28170?timeout_sec=0'</span> -L <span class="string">'tcp://0.0.0.0:28171:127.0.0.1:28171?timeout_sec=0'</span> wss://[server_ip]:28170</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><blockquote>
<p>这真是个神奇的隧道</p>
</blockquote>
<ul>
<li><a href="https://github.com/erebe/wstunnel">https://github.com/erebe/wstunnel</a></li>
</summary>
</entry>
<entry>
<title>rclone</title>
<link href="https://puzzle9.github.io/posts/dd6717ac/"/>
<id>https://puzzle9.github.io/posts/dd6717ac/</id>
<published>2026-03-06T08:11:56.000Z</published>
<updated>2026-03-06T08:29:34.863Z</updated>
<content type="html"><![CDATA[<blockquote><p>要说什么厉害 那就是做对拷的</p></blockquote><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>记得要安装最新版的哦</p><ul><li><a href="https://github.com/rclone/rclone">https://github.com/rclone/rclone</a></li></ul><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><p><code>~/.config/rclone/rclone.conf</code></p><h2 id="sp"><a href="#sp" class="headerlink" title="sp"></a>sp</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[sp]</span><br><span class="line">type = onedrive</span><br><span class="line">token = {"access_token":"","token_type":"Bearer","refresh_token":"[refresh_token]","expiry":"2026-03-01T01:01:01.4922688Z","expires_in":1}</span><br><span class="line">client_id =</span><br><span class="line">client_secret =</span><br><span class="line">drive_id =</span><br><span class="line">drive_type = documentLibrary</span><br></pre></td></tr></table></figure><h2 id="od"><a href="#od" class="headerlink" title="od"></a>od</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[od]</span><br><span class="line">type = onedrive</span><br><span class="line">token = {"access_token":"","token_type":"Bearer","refresh_token":"[refresh_token]","expiry":"2026-03-01T01:01:01.4922688Z","expires_in":1}</span><br><span class="line">client_id =</span><br><span class="line">client_secret =</span><br><span class="line">drive_id = me</span><br><span class="line">drive_type = personal</span><br></pre></td></tr></table></figure><h2 id="gd"><a href="#gd" class="headerlink" title="gd"></a>gd</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[gd]</span><br><span class="line">type = drive</span><br><span class="line">client_id =</span><br><span class="line">client_secret =</span><br><span class="line">scope = drive</span><br><span class="line">token = {"access_token":"access_token","refresh_token":"[refresh_token]","expiry":"2026-03-01T01:01:01.4922688Z"}</span><br><span class="line">team_drive =</span><br><span class="line">root_folder_id =</span><br></pre></td></tr></table></figure><h1 id="命令"><a href="#命令" class="headerlink" title="命令"></a>命令</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rclone copy <span class="string">"/data/directory/"</span> <span class="string">"mount:/files/directory/"</span> --progress -v</span><br><span class="line">rclone copy <span class="string">"/data/directory/file"</span> <span class="string">"mount:/files/directory/"</span> --progress --log-level DEBUG</span><br></pre></td></tr></table></figure><h1 id="挂载"><a href="#挂载" class="headerlink" title="挂载"></a>挂载</h1><p><code>/etc/systemd/system/rclone_mount.service</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">[Service]</span><br><span class="line">Type=notify</span><br><span class="line">ExecStart=rclone mount mount:files/ /data/storage/mount/ --vfs-cache-mode writes --no-check-certificate --buffer-size 256M --log-file /var/log/data/rclone_gd.log --log-level INFO</span><br><span class="line">ExecStop=fusermount -u /data/storage/mount</span><br><span class="line">Restart=on-failure</span><br><span class="line">RestartSec=5</span><br><span class="line">User=root</span><br><span class="line">Group=root</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=default.target</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rclone mount mount:files/ /data/storage/mount/ --no-check-certificate</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><blockquote>
<p>要说什么厉害 那就是做对拷的</p>
</blockquote>
<h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>记得要安装最新版的哦</p>
<ul>
<</summary>
</entry>
<entry>
<title>debian 转换为 pve</title>
<link href="https://puzzle9.github.io/posts/753b7709/"/>
<id>https://puzzle9.github.io/posts/753b7709/</id>
<published>2026-03-06T07:51:37.000Z</published>
<updated>2026-05-11T16:26:59.727Z</updated>
<content type="html"><![CDATA[<blockquote><p>人嘛 总有些奇奇怪怪的需求</p></blockquote><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><h2 id="先确认主地址并设置-host"><a href="#先确认主地址并设置-host" class="headerlink" title="先确认主地址并设置 host"></a>先确认主地址并设置 <code>host</code></h2><p>假设ip为 <code>192.168.2.1</code><br>主机名为 <code>pve</code></p><p>那 <code>host</code> 内容大概为</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">127.0.0.1 localhost.localdomain localhost</span><br><span class="line">192.168.2.1 pve</span><br><span class="line">::1 localhost ip6-localhost ip6-loopback</span><br><span class="line">ff02::1 ip6-allnodes</span><br><span class="line">ff02::2 ip6-allrouters</span><br></pre></td></tr></table></figure><p>可输入 <code>hostname --ip-address</code> 验证</p><h2 id="更新软件源"><a href="#更新软件源" class="headerlink" title="更新软件源"></a>更新软件源</h2><h3 id="trixie"><a href="#trixie" class="headerlink" title="trixie"></a><code>trixie</code></h3><p>清空 <code>/etc/apt/sources.list</code> 文件</p><p>新建以下源</p><p><code>/etc/apt/sources.list.d/debian.sources</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">Types: deb</span><br><span class="line">URIs: http://deb.debian.org/debian/</span><br><span class="line">Suites: trixie trixie-updates</span><br><span class="line">Components: main contrib non-free-firmware</span><br><span class="line">Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg</span><br><span class="line"></span><br><span class="line">Types: deb</span><br><span class="line">URIs: http://security.debian.org/debian-security/</span><br><span class="line">Suites: trixie-security</span><br><span class="line">Components: main contrib non-free-firmware</span><br><span class="line">Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg</span><br></pre></td></tr></table></figure><p><code>/etc/apt/sources.list.d/proxmox.sources</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Types: deb</span><br><span class="line">URIs: http://download.proxmox.com/debian/pve</span><br><span class="line">Suites: trixie</span><br><span class="line">Components: pve-no-subscription</span><br><span class="line">Signed-By: /usr/share/keyrings/proxmox-release-trixie.gpg</span><br></pre></td></tr></table></figure><p>下载pve的仓库密钥</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://enterprise.proxmox.com/debian/proxmox-release-trixie.gpg -O /usr/share/keyrings/proxmox-release-trixie.gpg</span><br></pre></td></tr></table></figure><h1 id="开始转换"><a href="#开始转换" class="headerlink" title="开始转换"></a>开始转换</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apt update && apt full-upgrade</span><br><span class="line">apt install proxmox-default-kernel</span><br></pre></td></tr></table></figure><p>重启</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install proxmox-ve postfix open-iscsi chrony</span><br></pre></td></tr></table></figure><p>再移除 旧内核</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt purge linux-image-amd64 <span class="string">'linux-image-6.1*'</span></span><br></pre></td></tr></table></figure><h1 id="后续配置"><a href="#后续配置" class="headerlink" title="后续配置"></a>后续配置</h1><h2 id="ipv4-网络启用-nat-模式"><a href="#ipv4-网络启用-nat-模式" class="headerlink" title="ipv4 网络启用 nat 模式"></a><code>ipv4</code> 网络启用 <code>nat</code> 模式</h2><p>重要的在于 <code>iptables</code></p><p><code>/etc/sysctl.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">net.ipv4.ip_forward = 1</span><br></pre></td></tr></table></figure><p><code>/etc/network/interfaces</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">auto lo</span><br><span class="line">iface lo inet loopback</span><br><span class="line"></span><br><span class="line">auto enp1s0f0</span><br><span class="line">iface enp1s0f0 inet static</span><br><span class="line"> address 192.168.1.2/32</span><br><span class="line"> gateway 192.168.1.1</span><br><span class="line"> dns-nameservers 1.1.1.1</span><br><span class="line"> dns-nameservers 8.8.8.8</span><br><span class="line"></span><br><span class="line">iface enp1s0f1 inet manual</span><br><span class="line"></span><br><span class="line">auto nat</span><br><span class="line">iface nat inet static</span><br><span class="line"> address 192.168.2.1/24</span><br><span class="line"> bridge-ports none</span><br><span class="line"> bridge-stp off</span><br><span class="line"> bridge-fd 0</span><br><span class="line"> post-up iptables -t nat -A POSTROUTING -s '192.168.2.1/24' -o enp1s0f0 -j MASQUERADE</span><br><span class="line"> post-down iptables -t nat -D POSTROUTING -s '192.168.2.1/24' -o enp1s0f0 -j MASQUERADE</span><br></pre></td></tr></table></figure><p>虚拟机配 <code>192.168.2.1/24</code></p><h2 id="ipv6-启用-ULA-模式"><a href="#ipv6-启用-ULA-模式" class="headerlink" title="ipv6 启用 ULA 模式"></a><code>ipv6</code> 启用 <code>ULA</code> 模式</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iface nat inet6 static</span><br><span class="line"> address fd10::1/64</span><br></pre></td></tr></table></figure><p>虚拟机配 <code>fd10::1/64</code> 不填网关</p><h2 id="ipv6-启用-手动-模式"><a href="#ipv6-启用-手动-模式" class="headerlink" title="ipv6 启用 手动 模式"></a><code>ipv6</code> 启用 <code>手动</code> 模式</h2><p><code>/etc/sysctl.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">net.ipv6.conf.all.forwarding=1</span><br><span class="line">net.ipv6.conf.all.proxy_ndp=1</span><br><span class="line">net.ipv6.conf.nat.forwarding=1</span><br><span class="line">net.ipv6.conf.nat.proxy_ndp=1</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">auto eth0</span><br><span class="line">iface eth0 inet manual</span><br><span class="line"></span><br><span class="line">auto eth0</span><br><span class="line">iface eth0 inet6 static</span><br><span class="line"> address 2xxx:xxxx:xxxx:xxxx::2/64</span><br><span class="line"> # 网关为服务商提供</span><br><span class="line"> gateway fe80::1</span><br><span class="line"> dns-nameserver 2606:4700:4700::1111</span><br><span class="line"> dns-nameserver 2001:4860:4860::8888</span><br><span class="line"> post-up ip -6 route del 2xxx:xxxx:xxxx:xxxx::/64 dev eth0</span><br><span class="line"> # 网关为 ::1 必写</span><br><span class="line"> post-up ip -6 route add 2xxx:xxxx:xxxx:xxxx::1 dev eth0</span><br><span class="line"></span><br><span class="line">auto nat</span><br><span class="line">iface nat inet6 static</span><br><span class="line"> address 2xxx:xxxx:xxxx:xxxx::3/128</span><br><span class="line"> bridge-ports none</span><br><span class="line"> bridge-stp off</span><br><span class="line"> bridge-fd 0</span><br><span class="line"> dns-nameserver 2606:4700:4700::1111</span><br><span class="line"> dns-nameserver 2001:4860:4860::8888</span><br><span class="line"> post-up ip -6 route add 2xxx:xxxx:xxxx:xxxx::::/64 dev nat</span><br><span class="line"> # 此处不清楚为何重启pve后 ipv6 的转发会失效</span><br><span class="line"> post-up sysctl -p</span><br></pre></td></tr></table></figure><p>虚拟机配 <code>2xxx:xxxx:xxxx:xxxx::/64</code> 网关填 <code>2xxx:xxxx:xxxx:xxxx::3</code></p><p>网络不通时 可以在 <code>pve</code> 上通过 <code>tcpdump -i nat -n icmp6</code> 抓包</p><p>如果服务商给的网关为 <code>::1</code> 必须要配置 <code>ndppd</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install ndppd</span><br></pre></td></tr></table></figure><p><code>/etc/ndppd.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">proxy eth0 {</span><br><span class="line"> rule 2xxx:xxxx:xxxx:xxxx::/64 {</span><br><span class="line"> static</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> ndppd</span><br></pre></td></tr></table></figure><h2 id="ipv6-启用-dhcp-模式"><a href="#ipv6-启用-dhcp-模式" class="headerlink" title="ipv6 启用 dhcp 模式"></a><code>ipv6</code> 启用 <code>dhcp</code> 模式</h2><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="如果开始的-host-设置失败-将会导致-pve-的-web-无法访问"><a href="#如果开始的-host-设置失败-将会导致-pve-的-web-无法访问" class="headerlink" title="如果开始的 host 设置失败 将会导致 pve 的 web 无法访问"></a>如果开始的 <code>host</code> 设置失败 将会导致 <code>pve</code> 的 <code>web</code> 无法访问</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart pve-cluster</span><br><span class="line">pvecm updatecerts --force</span><br></pre></td></tr></table></figure><h2 id="如果系统用到了-netplan-则需要先卸载"><a href="#如果系统用到了-netplan-则需要先卸载" class="headerlink" title="如果系统用到了 netplan 则需要先卸载"></a>如果系统用到了 <code>netplan</code> 则需要先卸载</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apt purge netplan.io</span><br><span class="line">apt install ifupdown</span><br></pre></td></tr></table></figure><p>使用 <code>systemctl restart systemd-networkd</code> 或 <code>systemctl restart networking</code></p><h2 id="备份与迁移"><a href="#备份与迁移" class="headerlink" title="备份与迁移"></a>备份与迁移</h2><p>在页面上备份后 直接将 <code>/var/lib/vz/dump/</code> 目录打包带走就行</p><h2 id="修改主机名"><a href="#修改主机名" class="headerlink" title="修改主机名"></a>修改主机名</h2><p>修改 <code>/etc/hosts</code></p><p>修改 <code>/etc/hostname</code></p><p>修改 <code>/etc/postfix/main.cf</code></p><p>重启</p><p>然后再将 <code>/etc/pve/nodes/</code> 里面的 <code>lxc</code> 与 <code>qemu-server</code> 移动到新目录中</p><p>再注意 <code> ~/.ssh/authorized_keys</code> 这个文件</p><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_12_Bookworm">https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_12_Bookworm</a></li><li><a href="https://alldreams.one/posts/2023/12/hetzner%E5%BC%80nat%E5%B0%8F%E9%B8%A1%E5%B9%B6%E5%AE%8C%E6%88%90ikuai%E7%9A%84dhcp%E9%85%8D%E7%BD%AE/">https://alldreams.one/posts/2023/12/hetzner%E5%BC%80nat%E5%B0%8F%E9%B8%A1%E5%B9%B6%E5%AE%8C%E6%88%90ikuai%E7%9A%84dhcp%E9%85%8D%E7%BD%AE/</a></li><li><a href="https://pve.proxmox.com/wiki/Renaming_a_PVE_node">https://pve.proxmox.com/wiki/Renaming_a_PVE_node</a></li></ul>]]></content>
<summary type="html"><blockquote>
<p>人嘛 总有些奇奇怪怪的需求</p>
</blockquote>
<h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><h2 id="先确认主地址并设置</summary>
</entry>
<entry>
<title>nfs</title>
<link href="https://puzzle9.github.io/posts/47a3d39f/"/>
<id>https://puzzle9.github.io/posts/47a3d39f/</id>
<published>2025-12-01T12:22:48.000Z</published>
<updated>2026-03-06T08:06:53.539Z</updated>
<content type="html"><![CDATA[<p>这真是个神奇了 <code>40</code> 年的东西啊</p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="pve"><a href="#pve" class="headerlink" title="pve"></a>pve</h2><ul><li><a href="https://www.turnkeylinux.org/docs/fileserver">https://www.turnkeylinux.org/docs/fileserver</a></li><li><a href="https://forum.proxmox.com/threads/nfs-server-in-lxc.105073">https://forum.proxmox.com/threads/nfs-server-in-lxc.105073</a></li></ul><p>debian</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install nfs-kernel-server</span><br></pre></td></tr></table></figure><p>lxc alpine <code>/etc/pve/lxc/xxx.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lxc.apparmor.profile: unconfined</span><br></pre></td></tr></table></figure><p>alpine</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apk add nfs-utils</span><br></pre></td></tr></table></figure><p><code>/etc/exports</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/hdd/webdav *(rw,async,no_subtree_check,no_root_squash)</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># restart</span></span><br><span class="line">exportfs -ra</span><br></pre></td></tr></table></figure><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><p><code>/etc/fstab</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ip]:/hdd/webdav /webdav nfs rw,hard,intr 0 0</span><br></pre></td></tr></table></figure><h1 id="端口"><a href="#端口" class="headerlink" title="端口"></a>端口</h1><ul><li><code>111</code> <code>tcp/udp</code></li><li><code>2049</code> <code>tcp/udp</code></li></ul>]]></content>
<summary type="html"><p>这真是个神奇了 <code>40</code> 年的东西啊</p>
<h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="pve"><a href="#pve" class="h</summary>
</entry>
<entry>
<title>caddy</title>
<link href="https://puzzle9.github.io/posts/fcbc6e21/"/>
<id>https://puzzle9.github.io/posts/fcbc6e21/</id>
<published>2025-08-23T08:40:12.000Z</published>
<updated>2025-08-23T08:56:10.076Z</updated>
<content type="html"><![CDATA[<p>嗯 不愧是现有的替代品</p><p>这个出现源于浏览器的默认 <code>https</code> 模式访问</p><p>浏览器是 <code>chrome</code> 的<br>这个是 <code>go</code> 写的<br>嗯 这都很 <code>google</code></p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="alpine"><a href="#alpine" class="headerlink" title="alpine"></a>alpine</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apk add caddy caddy-openrc</span><br></pre></td></tr></table></figure><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><p>默认配置文件位置 <code>/etc/caddy/Caddyfile</code></p><p>可以这么引入更多文件</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">import /data/conf/*.caddy</span><br></pre></td></tr></table></figure><h1 id="示例配置"><a href="#示例配置" class="headerlink" title="示例配置"></a>示例配置</h1><p><code>/data/conf/example.caddy</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">[domain] {</span><br><span class="line"> encode zstd gzip</span><br><span class="line"></span><br><span class="line"> #tls email@domain</span><br><span class="line"></span><br><span class="line"> header -X-Powered-By</span><br><span class="line"> header -Server</span><br><span class="line"></span><br><span class="line"> log {</span><br><span class="line"> output file /var/log/caddy_domain.log</span><br><span class="line"></span><br><span class="line"> format console {</span><br><span class="line"> time_format wall</span><br><span class="line"> time_local</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> root * /data/html</span><br><span class="line"> file_server</span><br><span class="line"></span><br><span class="line"> respond / 418</span><br><span class="line"></span><br><span class="line"> #reverse_proxy 127.0.0.1:9000</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>可以使用 <code>caddy fmt Caddyfile --overwrite</code> 格式化缩进等并保存文件</p><h1 id="插件"><a href="#插件" class="headerlink" title="插件"></a>插件</h1><p>使用插件时会自动从 <a href="https://caddyserver.com/download">https://caddyserver.com/download</a> 下载编译后的版本替换本地文件<br>如果使用源安装会出现被替换情况<br>建议直接<code>二进制</code>安装</p><h2 id="dns-tencentcloud"><a href="#dns-tencentcloud" class="headerlink" title="dns_tencentcloud"></a><a href="https://github.com/caddy-dns/tencentcloud">dns_tencentcloud</a></h2><p><code>dns</code> 类的解决 非标准端口的证书服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">caddy add-package github.com/caddy-dns/tencentcloud</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">https://[domain]:[port] {</span><br><span class="line"> tls {</span><br><span class="line"> dns tencentcloud {</span><br><span class="line"> secret_id 'SecretId'</span><br><span class="line"> secret_key 'SecretKey'</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="webdav"><a href="#webdav" class="headerlink" title="webdav"></a><a href="https://github.com/mholt/caddy-webdav">webdav</a></h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">caddy add-package github.com/mholt/caddy-webdav</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"> order webdav before file_server</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">[domain] {</span><br><span class="line"> encode zstd gzip</span><br><span class="line"></span><br><span class="line"> redir /webdav /webdav/</span><br><span class="line"> handle /webdav/* {</span><br><span class="line"> basic_auth {</span><br><span class="line"> # 用户名为 user 密码为 123 使用 caddy hash-password 生成</span><br><span class="line"> user $2a$14$Yf5JnX4iYPX4Jrmki5h.hO.1J2JDrBPIVbK2oqIj5geG6RNG.bMc6</span><br><span class="line"> }</span><br><span class="line"> webdav {</span><br><span class="line"> root /data</span><br><span class="line"> prefix /webdav</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://young-lord.github.io/posts/caddy-webdav">https://young-lord.github.io/posts/caddy-webdav</a></li><li><a href="https://caddy.community/t/caddy-service-wont-stay-running-or-start-with-boot-alpine-openrc">https://caddy.community/t/caddy-service-wont-stay-running-or-start-with-boot-alpine-openrc</a></li></ul>]]></content>
<summary type="html"><p>嗯 不愧是现有的替代品</p>
<p>这个出现源于浏览器的默认 <code>https</code> 模式访问</p>
<p>浏览器是 <code>chrome</code> 的<br>这个是 <code>go</code> 写的<br>嗯 这都很 <code>google</summary>
</entry>
<entry>
<title>webhookd 发布</title>
<link href="https://puzzle9.github.io/posts/23ac3883/"/>
<id>https://puzzle9.github.io/posts/23ac3883/</id>
<published>2025-08-14T08:30:57.000Z</published>
<updated>2025-08-14T08:41:54.475Z</updated>
<content type="html"><![CDATA[<p>要说 什么简单 与 复杂并存</p><p>唯有 <a href="https://github.com/ncarlier/webhookd"><code>发布</code></a></p><p>就是有点耗 <code>流量</code> 与 <strong>摸鱼</strong></p><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><blockquote><p>这是个回调通知工具 是属于被动的</p></blockquote><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>直接下载 <a href="https://github.com/ncarlier/webhookd/releases"><code>releases</code></a> 就行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p /data/webhookd/logs</span><br><span class="line"><span class="built_in">cd</span> /data/webhookd/</span><br><span class="line">wget https://github.com/ncarlier/webhookd/releases/download/v1.20.2/webhookd-linux-amd64.tgz</span><br><span class="line">tar -xvf webhookd-linux-amd64.tgz</span><br></pre></td></tr></table></figure><p><code>/etc/systemd/system/webhookd.service</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=WEBHOOKD</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">ExecStart=/data/webhookd/webhookd</span><br><span class="line">User={user}</span><br><span class="line">Group={user}</span><br><span class="line">EnvironmentFile=-/data/webhookd/webhookd.env</span><br><span class="line">Restart=always</span><br><span class="line">Type=simple</span><br><span class="line">RestartSec=30s</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure><p><code>/data/webhookd/webhookd.env</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">###</span><br><span class="line"># Webhookd configuration</span><br><span class="line">###</span><br><span class="line">WHD_LISTEN_ADDR=":9310"</span><br><span class="line">WHD_HOOK_DEFAULT_EXT=sh</span><br><span class="line">WHD_HOOK_TIMEOUT=600</span><br><span class="line">WHD_HOOK_SCRIPTS="/data/webhookd/scripts"</span><br><span class="line">WHD_HOOK_LOG_DIR="/data/webhookd/logs"</span><br><span class="line">WHD_HOOK_WORKERS=2</span><br></pre></td></tr></table></figure><h1 id="脚本"><a href="#脚本" class="headerlink" title="脚本"></a>脚本</h1><h2 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">LOCKFILE=<span class="string">"/data/webhookd/tmp/build_web.lock"</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">exec</span> 200><span class="string">"<span class="variable">$LOCKFILE</span>"</span></span><br><span class="line">flock -n 200 || {</span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"另一个编译正在运行中,退出..."</span></span><br><span class="line"> <span class="built_in">exit</span> 1</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">"todo..."</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>要说 什么简单 与 复杂并存</p>
<p>唯有 <a href="https://github.com/ncarlier/webhookd"><code>发布</code></a></p>
<p>就是有点耗 <code>流量</code> 与 <strong>摸鱼</st</summary>
</entry>
<entry>
<title>win 系统部署 by WinRM</title>
<link href="https://puzzle9.github.io/posts/da4872cc/"/>
<id>https://puzzle9.github.io/posts/da4872cc/</id>
<published>2025-08-13T01:48:53.000Z</published>
<updated>2025-08-13T07:58:33.190Z</updated>
<content type="html"><![CDATA[<p><code>ssh</code> 一片天<br><code>powershell</code> 两片天</p><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><h2 id="win"><a href="#win" class="headerlink" title="win"></a>win</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置连接的白名单</span></span><br><span class="line"><span class="built_in">Set-Item</span> WSMan:\localhost\Client\TrustedHosts <span class="literal">-Force</span> <span class="literal">-Concatenate</span> <span class="literal">-Value</span> <span class="number">172.20</span>.<span class="number">36.133</span></span><br><span class="line"><span class="comment"># 获取已经设置的白名单</span></span><br><span class="line"><span class="built_in">get-item</span> wsman:\localhost\client\trustedhosts</span><br><span class="line"><span class="comment"># 重启服务</span></span><br><span class="line"><span class="built_in">Restart-Service</span> WinRM</span><br><span class="line"><span class="comment"># 查看监听端口</span></span><br><span class="line">winrm enumerate winrm/config/listener</span><br><span class="line"><span class="comment"># 允许执行所有命令</span></span><br><span class="line"><span class="built_in">set-executionpolicy</span> remotesigned</span><br><span class="line"><span class="comment"># 查看命令是否完成</span></span><br><span class="line"><span class="built_in">Get-ExecutionPolicy</span></span><br></pre></td></tr></table></figure><p><img src="/posts/11c11b49/n/setting_win.png"></p><p>需要放通 <code>WinRM</code> 端口 <code>5985-5986/tcp</code></p><h1 id="连接"><a href="#连接" class="headerlink" title="连接"></a>连接</h1><h2 id="linux-下-用-powershell-连接"><a href="#linux-下-用-powershell-连接" class="headerlink" title="linux 下 用 powershell 连接"></a>linux 下 用 <code>powershell</code> 连接</h2><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><h4 id="debian"><a href="#debian" class="headerlink" title="debian"></a>debian</h4><ul><li><a href="https://learn.microsoft.com/en-us/powershell/scripting/install/install-debian">https://learn.microsoft.com/en-us/powershell/scripting/install/install-debian</a></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> /etc/os-release</span><br><span class="line">wget -q https://packages.microsoft.com/config/debian/<span class="variable">$VERSION_ID</span>/packages-microsoft-prod.deb</span><br><span class="line">dpkg -i packages-microsoft-prod.deb</span><br><span class="line">apt-get install -y powershell</span><br></pre></td></tr></table></figure><h4 id="安装-PSWSMan-扩展"><a href="#安装-PSWSMan-扩展" class="headerlink" title="安装 PSWSMan 扩展"></a>安装 PSWSMan 扩展</h4><p>不装时会报</p><p><code>Invoke-Command: This parameter set requires WSMan, and no supported WSMan client library was found. WSMan is either not installed or unavailable for this system.</code></p><p>以 <code>root</code> 运行 <code>pwsh</code> 进入</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Install-Module</span> <span class="literal">-Name</span> PSWSMan <span class="literal">-Force</span> <span class="literal">-AllowClobber</span></span><br><span class="line"><span class="built_in">Install-WSMan</span></span><br></pre></td></tr></table></figure><h3 id="连接-1"><a href="#连接-1" class="headerlink" title="连接"></a>连接</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$cred</span>=Get-Credential</span><br><span class="line">Enter-PSSession -ComputerName <span class="string">"192.168.3.132"</span> -Port <span class="string">"9195"</span> -Credential <span class="variable">$cred</span> -Authentication Basic</span><br><span class="line"></span><br><span class="line">Invoke-Command -ComputerName <span class="string">"192.168.3.132"</span> -Port <span class="string">"9195"</span> -Credential <span class="variable">$cred</span> -ScriptBlock {</span><br><span class="line"> <span class="string">"systeminfo"</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>嗯 都失败了 报</p><p><code>OpenError: [192.168.3.132] Connecting to remote server 192.168.3.132 failed with the following error message : acquiring creds with username only failed An invalid name was supplied SPNEGO cannot find mechanisms to negotiate For more information, see the about_Remote_Troubleshooting Help topic.</code></p><h2 id="用-python-的-pywinrm-库连接"><a href="#用-python-的-pywinrm-库连接" class="headerlink" title="用 python 的 pywinrm 库连接"></a>用 <code>python</code> 的 <code>pywinrm</code> 库连接</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">import winrm</span><br><span class="line"></span><br><span class="line">def cmd(hotsip="", username="", password=""):</span><br><span class="line"> s = winrm.Session(hotsip, auth=(username, password), transport="ntlm")</span><br><span class="line"> r = s.run_cmd("ipconfig")</span><br><span class="line"> print(r.status_code)</span><br><span class="line"> print(r.std_out.decode('gbk'))</span><br><span class="line"></span><br><span class="line">cmd("192.168.3.132:9195", "username", "password")</span><br></pre></td></tr></table></figure><h3 id="部署脚本"><a href="#部署脚本" class="headerlink" title="部署脚本"></a>部署脚本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -i https://mirrors.cernet.edu.cn/pypi/web/simple pywinrm</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python3</span><br><span class="line">import winrm</span><br><span class="line">from http.server import SimpleHTTPRequestHandler</span><br><span class="line">import socketserver</span><br><span class="line">import os</span><br><span class="line">import sys</span><br><span class="line">import time</span><br><span class="line">import threading</span><br><span class="line">from datetime import datetime</span><br><span class="line"></span><br><span class="line">def run_http_server():</span><br><span class="line"> port=9210</span><br><span class="line"> handler = SimpleHTTPRequestHandler</span><br><span class="line"> httpd = socketserver.TCPServer(("", port), handler)</span><br><span class="line"> print(f"临时 HTTP 服务启动在端口 {port}")</span><br><span class="line"> httpd.serve_forever()</span><br><span class="line"></span><br><span class="line">def deploy(file_path):</span><br><span class="line"> host = '192.168.3.132:9195'</span><br><span class="line"> username = 'username'</span><br><span class="line"> password = 'password'</span><br><span class="line"> </span><br><span class="line"> session = winrm.Session(</span><br><span class="line"> host,</span><br><span class="line"> auth=(username, password),</span><br><span class="line"> transport='ntlm'</span><br><span class="line"> )</span><br><span class="line"></span><br><span class="line"> current_date = datetime.now().strftime("%Y%m%d%H%M%S")</span><br><span class="line"> file_name = f"dist_{current_date}.zip"</span><br><span class="line"></span><br><span class="line"> print(f"正在下载 {file_name}...")</span><br><span class="line"> download_script = f"""</span><br><span class="line"> $zip_url = "http://192.168.3.132:9210/{file_path}"</span><br><span class="line"> $output = "D:\\web\\{file_name}"</span><br><span class="line"> Invoke-WebRequest -Uri $zip_url -OutFile $output</span><br><span class="line"> """</span><br><span class="line"> result = session.run_ps(download_script)</span><br><span class="line"> if result.status_code != 0:</span><br><span class="line"> raise Exception(result.std_err.decode().strip())</span><br><span class="line"></span><br><span class="line"> print(f"正在解压")</span><br><span class="line"> unzip_script = f"""</span><br><span class="line"> Expand-Archive -Path "D:\\web\\{file_name}" -DestinationPath "D:\\web\\dist_new" -Force</span><br><span class="line"> Remove-Item -Path "D:\\web\\{file_name}"</span><br><span class="line"> """</span><br><span class="line"> result = session.run_ps(unzip_script)</span><br><span class="line"> if result.status_code != 0:</span><br><span class="line"> raise Exception(result.std_err.decode().strip())</span><br><span class="line"></span><br><span class="line"> print(f"正在备份与发布")</span><br><span class="line"> rename_script = f"""</span><br><span class="line"> if (Test-Path "D:\\web\\dist") {{</span><br><span class="line"> Rename-Item -Path "D:\\web\\dist" -NewName "dist_{current_date}"</span><br><span class="line"> }}</span><br><span class="line"> Rename-Item -Path "D:\\web\\dist_new" -NewName "dist"</span><br><span class="line"> """</span><br><span class="line"> result = session.run_ps(rename_script)</span><br><span class="line"> if result.status_code != 0:</span><br><span class="line"> raise Exception(result.std_err.decode().strip())</span><br><span class="line"></span><br><span class="line"> print(f"部署完成")</span><br><span class="line"></span><br><span class="line">def main(file_path):</span><br><span class="line"> http_thread = threading.Thread(target=run_http_server, daemon=True)</span><br><span class="line"> http_thread.start()</span><br><span class="line"></span><br><span class="line"> deploy(file_path)</span><br><span class="line"></span><br><span class="line">if __name__ == "__main__":</span><br><span class="line"> if len(sys.argv) != 2:</span><br><span class="line"> print("Usage: python deploy.py <file_path>")</span><br><span class="line"> sys.exit(1)</span><br><span class="line"></span><br><span class="line"> file_path = sys.argv[1]</span><br><span class="line"> if not os.path.exists(file_path):</span><br><span class="line"> print(f"错误: 文件 {file_path} 不存在")</span><br><span class="line"> sys.exit(1)</span><br><span class="line"></span><br><span class="line"> main(file_path)</span><br></pre></td></tr></table></figure><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://blog.csdn.net/qq_38773240/article/details/139522787">https://blog.csdn.net/qq_38773240/article/details/139522787</a></li><li><a href="https://notes.mengxin.science/2018/08/21/Remote-SSH-Access-PowerShell/">https://notes.mengxin.science/2018/08/21/Remote-SSH-Access-PowerShell/</a></li><li><a href="https://zhuanlan.zhihu.com/p/359605804">https://zhuanlan.zhihu.com/p/359605804</a></li></ul>]]></content>
<summary type="html"><p><code>ssh</code> 一片天<br><code>powershell</code> 两片天</p>
<h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><h2 id="win"><</summary>
</entry>
<entry>
<title>hl7 初探</title>
<link href="https://puzzle9.github.io/posts/c870c22e/"/>
<id>https://puzzle9.github.io/posts/c870c22e/</id>
<published>2025-08-07T12:30:28.000Z</published>
<updated>2025-08-07T12:44:07.977Z</updated>
<content type="html"><![CDATA[<p>嗯 这玩意是医疗行业用的很多的东西</p><p>类似于 <code>json</code> <code>xml</code> <code>wsdl</code> 等系统之间的数据交互等</p><h1 id="接受与回复"><a href="#接受与回复" class="headerlink" title="接受与回复"></a>接受与回复</h1><h2 id="收到的消息"><a href="#收到的消息" class="headerlink" title="收到的消息"></a>收到的消息</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">MSH|^~\&|MediII|MediInfo|pyaya|p|20250807203037||RAS^O17^RAS_O17|5605e7b8f2d9479c9016b00a7eb44773|P|2.4|</span><br></pre></td></tr></table></figure><ul><li><code>MediII</code> - 发送应用程序(Sending Application)</li><li><code>Mediinfo</code> - 发送设施(Sending Facility)</li><li><code>pyaya</code> - 接收应用程序(Receiving Application)</li><li><code>p</code> - 接收设施(Receiving Facility)</li><li><code>20250807203037</code> 消息发送时间</li><li><code>RAS^O17^RAS_O17</code> 消息类型</li><li><code>5605e7b8f2d9479c9016b00a7eb44773</code> 收到的消息唯一ID</li></ul><h2 id="回复消息"><a href="#回复消息" class="headerlink" title="回复消息"></a>回复消息</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">MSH|^~\&|pyaya|p|MediII|MediInfo|20210518071522||ACK|ca05552821e0492ea0322170f4b870a8|P|2.4MSA|AA|5605e7b8f2d9479c9016b00a7eb44773</span><br></pre></td></tr></table></figure><ul><li>发送方和接收方需要换下</li><li><code>ACK</code> 表收回复</li><li><code>ca05552821e0492ea0322170f4b870a8</code> 自己发出的的消息唯一ID</li><li><code>AA</code> 表收到 还有 <code>AE</code> 失败 <code>AR</code> 拒绝</li><li><code>5605e7b8f2d9479c9016b00a7eb44773</code> 对方过来时的消息ID</li></ul><h1 id="消息类型"><a href="#消息类型" class="headerlink" title="消息类型"></a>消息类型</h1><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">ADT入院、出院和转院</span><br><span class="line">ORM订单输入</span><br><span class="line">ORU观察结果</span><br><span class="line">ORL实验室订单结果</span><br><span class="line">MDM医疗文件管理</span><br><span class="line">DFT详细财务交易</span><br><span class="line">BAR开票账户记录</span><br><span class="line">SIU未被计划输入的信息</span><br><span class="line">RDS药房/治疗配药</span><br><span class="line">RDE药房/治疗编码的订单</span><br><span class="line">ACK确认信息</span><br><span class="line">CRM临床试验信息</span><br></pre></td></tr></table></figure><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://cn.community.intersystems.com/post/hl7v2%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E4%B9%88">https://cn.community.intersystems.com/post/hl7v2到底是什么</a></li><li><a href="https://www.cnblogs.com/Javame/p/17385597.html">https://www.cnblogs.com/Javame/p/17385597.html</a></li></ul>]]></content>
<summary type="html">要不说这玩意使用人多呢</summary>
</entry>
<entry>
<title>realm 端口转发</title>
<link href="https://puzzle9.github.io/posts/fa96dbda/"/>
<id>https://puzzle9.github.io/posts/fa96dbda/</id>
<published>2025-08-07T12:21:48.000Z</published>
<updated>2025-08-07T12:30:06.313Z</updated>
<content type="html"><![CDATA[<p>要说 什么简单 省事</p><p>唯有 <a href="https://github.com/zhboner/realm"><code>转发</code></a></p><p>就是有点耗 <code>脑子</code> 与 <strong>红尘</strong></p><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><p>这是个 端口转发工具<br>类似于 <code>linux</code> 的 <code>ssh -R</code><br>类似于 <code>win</code> 的 <code>netsh interface portproxy</code></p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="debian"><a href="#debian" class="headerlink" title="debian"></a>debian</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/zhboner/realm/releases/download/v2.8.0/realm-x86_64-unknown-linux-gnu.tar.gz</span><br><span class="line">tar -xvf -d /usr/bin/ realm-x86_64-unknown-linux-gnu.tar.gz</span><br><span class="line"><span class="built_in">chmod</span> +x /usr/bin/realm</span><br></pre></td></tr></table></figure><p><code>/etc/systemd/system/realm.service</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=realm</span><br><span class="line">After=network-online.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=simple</span><br><span class="line">User=root</span><br><span class="line">Restart=on-failure</span><br><span class="line">RestartSec=5s</span><br><span class="line">DynamicUser=true</span><br><span class="line">Environment="RUST_BACKTRACE=1"</span><br><span class="line">ExecStart=/usr/bin/realm -c /etc/realm.toml</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> realm.service --now</span><br></pre></td></tr></table></figure><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[log]</span></span><br><span class="line"><span class="attr">level</span> = <span class="string">"warn"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[network]</span></span><br><span class="line"><span class="attr">no_tcp</span> = <span class="literal">false</span></span><br><span class="line"><span class="attr">use_udp</span> = <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="section">[[endpoints]]</span></span><br><span class="line"><span class="comment"># 将 1234 转发到那个地址</span></span><br><span class="line"><span class="attr">listen</span> = <span class="string">"0.0.0.0:1234"</span></span><br><span class="line"><span class="attr">remote</span> = <span class="string">"192.168.3.30:1234"</span></span><br></pre></td></tr></table></figure><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://fmk.im/posts/realm-script/">https://fmk.im/posts/realm-script/</a></li></ul>]]></content>
<summary type="html"><p>要说 什么简单 省事</p>
<p>唯有 <a href="https://github.com/zhboner/realm"><code>转发</code></a></p>
<p>就是有点耗 <code>脑子</code> 与 <strong>红尘</strong></p</summary>
</entry>
<entry>
<title>airflow</title>
<link href="https://puzzle9.github.io/posts/6fc07c7e/"/>
<id>https://puzzle9.github.io/posts/6fc07c7e/</id>
<published>2025-07-11T06:23:09.000Z</published>
<updated>2025-07-13T09:25:47.893Z</updated>
<content type="html"><![CDATA[<p>一款优秀的 调度工具</p><h1 id="前提"><a href="#前提" class="headerlink" title="前提"></a>前提</h1><p>现有版本用的 <a href="https://github.com/pentaho/pentaho-kettle"><code>kattle</code></a><br>因为是图像界面操作 再者 不好做版本控制<br>便把目光转向了 <a href="https://github.com/apache/airflow"><code>airflow</code></a></p><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>用 <code>docker</code> 呀</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wget https://download.oracle.com/otn_software/linux/instantclient/2380000/instantclient-basic-linux.x64-23.8.0.25.04.zip</span><br><span class="line">unzip instantclient-basic-linux.x64-23.8.0.25.04.zip</span><br></pre></td></tr></table></figure><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> apache/airflow:<span class="number">3.0</span>.<span class="number">2</span></span><br><span class="line"><span class="keyword">USER</span> root</span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> sed -i <span class="string">'s#http://deb.debian.org#https://mirror.nju.edu.cn#g'</span> /etc/apt/sources.list.d/debian.sources \</span></span><br><span class="line"><span class="language-bash"> && apt-get update \</span></span><br><span class="line"><span class="language-bash"> && apt-get install -y --no-install-recommends \</span></span><br><span class="line"><span class="language-bash"> libaio1 \</span></span><br><span class="line"><span class="language-bash"> && apt-get autoremove -yqq --purge \</span></span><br><span class="line"><span class="language-bash"> && apt-get clean \</span></span><br><span class="line"><span class="language-bash"> && <span class="built_in">rm</span> -rf /var/lib/apt/lists/*</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> ./instantclient_23_8 /opt/oracle_instantclient_23_8</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> <span class="built_in">echo</span> /opt/oracle_instantclient_23_8 > /etc/ld.so.conf.d/oracle_instantclient.conf && ldconfig</span></span><br><span class="line"><span class="keyword">USER</span> airflow</span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> pip install --proxy http://172.17.0.1:8889 -i https://mirror.nju.edu.cn/pypi/web/simple --no-cache-dir \</span></span><br><span class="line"><span class="language-bash"> <span class="string">"apache-airflow==3.0.2"</span> \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[mysql] \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[microsoft-mssql] \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[odbc] \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[oracle] \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[postgres] \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[redis] \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[samba] \</span></span><br><span class="line"><span class="language-bash"> apache-airflow[http]</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker build -t puzzle9/airflow:3.0.2 .</span><br><span class="line"></span><br><span class="line"><span class="comment">#docker build -t puzzle9/airflow:3.0.2 --build-arg http_proxy="http://192.168.1.1:8888" --build-arg https_proxy="http://192.168.1.1:8888" .</span></span><br></pre></td></tr></table></figure><p>好了 基础镜像就出来了</p><p>再来个 <code>docker-compose.yaml</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># https://airflow.apache.org/docs/apache-airflow/3.0.2/docker-compose.yaml</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">x-airflow-common:</span> <span class="string">&airflow-common</span></span><br><span class="line"> <span class="attr">image:</span> <span class="string">puzzle9/airflow:3.0.2</span></span><br><span class="line"> <span class="comment"># build: .</span></span><br><span class="line"> <span class="attr">environment:</span> <span class="string">&airflow-common-env</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__DEFAULT_TIMEZONE:</span> <span class="string">Asia/Shanghai</span></span><br><span class="line"> <span class="attr">AIRFLOW__SCHEDULER__SCHEDULER_HEARTBEAT_SEC:</span> <span class="string">${AIRFLOW_SCHEDULER_HEARTBEAT_SEC}</span></span><br><span class="line"> <span class="attr">AIRFLOW__DAG_PROCESSOR__MIN_FILE_PROCESS_INTERVAL:</span> <span class="string">${AIRFLOW_MIN_FILE_PROCESS_INTERVAL}</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__PARALLELISM:</span> <span class="string">${AIRFLOW_PARALLELISM}</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG:</span> <span class="string">${AIRFLOW_MAX_ACTIVE_RUNS_PER_DAG}</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__EXECUTOR:</span> <span class="string">${AIRFLOW_EXECUTOR}</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__AUTH_MANAGER:</span> <span class="string">airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager</span></span><br><span class="line"> <span class="attr">AIRFLOW__DAG_PROCESSOR__DISABLE_BUNDLE_VERSIONING:</span> <span class="string">'true'</span></span><br><span class="line"> <span class="attr">AIRFLOW__DATABASE__SQL_ALCHEMY_CONN:</span> <span class="string">postgresql+psycopg2://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT:-5432}/${POSTGRES_DATABASE}</span></span><br><span class="line"> <span class="attr">AIRFLOW__CELERY__RESULT_BACKEND:</span> <span class="string">db+postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT:-5432}/${POSTGRES_DATABASE}</span></span><br><span class="line"> <span class="attr">AIRFLOW__CELERY__BROKER_URL:</span> <span class="string">redis://:${VALKEY_PASSWORD}@${VALKEY_HOST}:${VALKEY_PORT:-6379}/${VALKEY_DATABASE:-0}</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__FERNET_KEY:</span> <span class="string">''</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION:</span> <span class="string">'true'</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__LOAD_EXAMPLES:</span> <span class="string">'false'</span></span><br><span class="line"> <span class="attr">AIRFLOW__CORE__EXECUTION_API_SERVER_URL:</span> <span class="string">'http://airflow-apiserver:8080/execution/'</span></span><br><span class="line"> <span class="attr">AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK:</span> <span class="string">'false'</span></span><br><span class="line"> <span class="attr">_PIP_ADDITIONAL_REQUIREMENTS:</span> <span class="string">${_PIP_ADDITIONAL_REQUIREMENTS:-}</span></span><br><span class="line"> <span class="attr">AIRFLOW_CONFIG:</span> <span class="string">'/opt/airflow/config/airflow.cfg'</span></span><br><span class="line"> <span class="attr">volumes:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">./data/dags:/opt/airflow/dags</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">./data/logs:/opt/airflow/logs</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">./data/config:/opt/airflow/config</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">./data/plugins:/opt/airflow/plugins</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">/etc/localtime:/etc/localtime:ro</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">/etc/timezone:/etc/timezone:ro</span></span><br><span class="line"> <span class="attr">user:</span> <span class="string">'${AIRFLOW_UID:-50000}:0'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"> <span class="attr">airflow-apiserver:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common</span></span><br><span class="line"> <span class="attr">command:</span> <span class="string">api-server</span></span><br><span class="line"> <span class="attr">ports:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">'8080:8080'</span></span><br><span class="line"> <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">airflow-scheduler:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common</span></span><br><span class="line"> <span class="attr">command:</span> <span class="string">scheduler</span></span><br><span class="line"> <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">airflow-dag-processor:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common</span></span><br><span class="line"> <span class="attr">command:</span> <span class="string">dag-processor</span></span><br><span class="line"> <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">airflow-triggerer:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common</span></span><br><span class="line"> <span class="attr">command:</span> <span class="string">triggerer</span></span><br><span class="line"> <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">airflow-worker:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common</span></span><br><span class="line"> <span class="attr">profiles:</span> [<span class="string">'airflow-worker'</span>]</span><br><span class="line"> <span class="attr">command:</span> <span class="string">celery</span> <span class="string">worker</span></span><br><span class="line"> <span class="attr">healthcheck:</span></span><br><span class="line"> <span class="comment"># yamllint disable rule:line-length</span></span><br><span class="line"> <span class="attr">test:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">'CMD-SHELL'</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">'celery --app airflow.providers.celery.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}" || celery --app airflow.executors.celery_executor.app inspect ping -d "celery@$${HOSTNAME}"'</span></span><br><span class="line"> <span class="attr">interval:</span> <span class="string">30s</span></span><br><span class="line"> <span class="attr">timeout:</span> <span class="string">10s</span></span><br><span class="line"> <span class="attr">retries:</span> <span class="number">5</span></span><br><span class="line"> <span class="attr">start_period:</span> <span class="string">30s</span></span><br><span class="line"> <span class="attr">environment:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common-env</span></span><br><span class="line"> <span class="comment"># Required to handle warm shutdown of the celery workers properly</span></span><br><span class="line"> <span class="comment"># See https://airflow.apache.org/docs/docker-stack/entrypoint.html#signal-propagation</span></span><br><span class="line"> <span class="attr">DUMB_INIT_SETSID:</span> <span class="string">'0'</span></span><br><span class="line"> <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">airflow-init:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common</span></span><br><span class="line"> <span class="attr">profiles:</span> [<span class="string">'airflow-init'</span>]</span><br><span class="line"> <span class="attr">entrypoint:</span> <span class="string">/bin/bash</span></span><br><span class="line"> <span class="comment"># yamllint disable rule:line-length</span></span><br><span class="line"> <span class="attr">command:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">-c</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">|</span></span><br><span class="line"><span class="string"> if [[ -z "${AIRFLOW_UID}" ]]; then</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo -e "\033[1;33mWARNING!!!: AIRFLOW_UID not set!\e[0m"</span></span><br><span class="line"><span class="string"> echo "If you are on Linux, you SHOULD follow the instructions below to set "</span></span><br><span class="line"><span class="string"> echo "AIRFLOW_UID environment variable, otherwise files will be owned by root."</span></span><br><span class="line"><span class="string"> echo "For other operating systems you can get rid of the warning with manually created .env file:"</span></span><br><span class="line"><span class="string"> echo " See: https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#setting-the-right-airflow-user"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> export AIRFLOW_UID=$(id -u)</span></span><br><span class="line"><span class="string"> fi</span></span><br><span class="line"><span class="string"> one_meg=1048576</span></span><br><span class="line"><span class="string"> mem_available=$$(($$(getconf _PHYS_PAGES) * $$(getconf PAGE_SIZE) / one_meg))</span></span><br><span class="line"><span class="string"> cpus_available=$$(grep -cE 'cpu[0-9]+' /proc/stat)</span></span><br><span class="line"><span class="string"> disk_available=$$(df / | tail -1 | awk '{print $$4}')</span></span><br><span class="line"><span class="string"> warning_resources="false"</span></span><br><span class="line"><span class="string"> if (( mem_available < 4000 )) ; then</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo -e "\033[1;33mWARNING!!!: Not enough memory available for Docker.\e[0m"</span></span><br><span class="line"><span class="string"> echo "At least 4GB of memory required. You have $$(numfmt --to iec $$((mem_available * one_meg)))"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> warning_resources="true"</span></span><br><span class="line"><span class="string"> fi</span></span><br><span class="line"><span class="string"> if (( cpus_available < 2 )); then</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo -e "\033[1;33mWARNING!!!: Not enough CPUS available for Docker.\e[0m"</span></span><br><span class="line"><span class="string"> echo "At least 2 CPUs recommended. You have $${cpus_available}"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> warning_resources="true"</span></span><br><span class="line"><span class="string"> fi</span></span><br><span class="line"><span class="string"> if (( disk_available < one_meg * 10 )); then</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo -e "\033[1;33mWARNING!!!: Not enough Disk space available for Docker.\e[0m"</span></span><br><span class="line"><span class="string"> echo "At least 10 GBs recommended. You have $$(numfmt --to iec $$((disk_available * 1024 )))"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> warning_resources="true"</span></span><br><span class="line"><span class="string"> fi</span></span><br><span class="line"><span class="string"> if [[ $${warning_resources} == "true" ]]; then</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo -e "\033[1;33mWARNING!!!: You have not enough resources to run Airflow (see above)!\e[0m"</span></span><br><span class="line"><span class="string"> echo "Please follow the instructions to increase amount of resources available:"</span></span><br><span class="line"><span class="string"> echo " https://airflow.apache.org/docs/apache-airflow/stable/howto/docker-compose/index.html#before-you-begin"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> fi</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Creating missing opt dirs if missing:"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> mkdir -v -p /opt/airflow/{logs,dags,plugins,config}</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Airflow version:"</span></span><br><span class="line"><span class="string"> /entrypoint airflow version</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Files in shared volumes:"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> ls -la /opt/airflow/{logs,dags,plugins,config}</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Running airflow config list to create default config file if missing."</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> /entrypoint airflow config list >/dev/null</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Files in shared volumes:"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> ls -la /opt/airflow/{logs,dags,plugins,config}</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Change ownership of files in /opt/airflow to ${AIRFLOW_UID}:0"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> chown -R "${AIRFLOW_UID}:0" /opt/airflow/</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Change ownership of files in shared volumes to ${AIRFLOW_UID}:0"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> chown -v -R "${AIRFLOW_UID}:0" /opt/airflow/{logs,dags,plugins,config}</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> echo "Files in shared volumes:"</span></span><br><span class="line"><span class="string"> echo</span></span><br><span class="line"><span class="string"> ls -la /opt/airflow/{logs,dags,plugins,config}</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"> <span class="comment"># yamllint enable rule:line-length</span></span><br><span class="line"> <span class="attr">environment:</span></span><br><span class="line"> <span class="string"><<:</span> <span class="string">*airflow-common-env</span></span><br><span class="line"> <span class="attr">_AIRFLOW_DB_MIGRATE:</span> <span class="string">'true'</span></span><br><span class="line"> <span class="attr">_AIRFLOW_WWW_USER_CREATE:</span> <span class="string">'true'</span></span><br><span class="line"> <span class="attr">_AIRFLOW_WWW_USER_USERNAME:</span> <span class="string">${_AIRFLOW_WWW_USER_USERNAME:-airflow}</span></span><br><span class="line"> <span class="attr">_AIRFLOW_WWW_USER_PASSWORD:</span> <span class="string">${_AIRFLOW_WWW_USER_PASSWORD:-airflow}</span></span><br><span class="line"> <span class="attr">_PIP_ADDITIONAL_REQUIREMENTS:</span> <span class="string">''</span></span><br><span class="line"> <span class="attr">user:</span> <span class="string">'0:0'</span></span><br></pre></td></tr></table></figure><p>用的是 <code>LocalExecutor</code> 模式部署的<br>所以把 <code>healthcheck</code> 也都去掉了</p><p>后端的 <code>postgresql</code> <code>redis</code> 独立部署的</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"># airflow</span><br><span class="line"># echo $(id -u)</span><br><span class="line">AIRFLOW_UID=1000</span><br><span class="line">AIRFLOW_SCHEDULER_HEARTBEAT_SEC=30</span><br><span class="line"># 刷新dag文件秒数 正式环境改为600</span><br><span class="line">AIRFLOW_MIN_FILE_PROCESS_INTERVAL=60</span><br><span class="line">AIRFLOW_PARALLELISM=18</span><br><span class="line">AIRFLOW_MAX_ACTIVE_RUNS_PER_DAG=16</span><br><span class="line">AIRFLOW_EXECUTOR=LocalExecutor</span><br><span class="line"></span><br><span class="line"># postgres</span><br><span class="line">POSTGRES_HOST=172.17.0.1</span><br><span class="line">POSTGRES_USERNAME=postgres</span><br><span class="line">POSTGRES_PASSWORD=postgres</span><br><span class="line">POSTGRES_DATABASE=airflow</span><br><span class="line"></span><br><span class="line"># valkey</span><br><span class="line">VALKEY_HOST=172.17.0.1</span><br><span class="line">VALKEY_PASSWORD=valkey</span><br></pre></td></tr></table></figure><p>先 <code>docker compose up airflow-init</code> 初始化<br>再 <code>docker compose up -d</code> 一键启动</p><h1 id="Q-A"><a href="#Q-A" class="headerlink" title="Q&A"></a>Q&A</h1><h2 id="dag-不会出来"><a href="#dag-不会出来" class="headerlink" title="dag 不会出来"></a><code>dag</code> 不会出来</h2><p>需要给 <code>执行</code> 权限 <code>chmod +x data/dags/*.py</code></p><h2 id="mssql-相关"><a href="#mssql-相关" class="headerlink" title="mssql 相关"></a>mssql 相关</h2><h3 id="mssql-连接时候报-DB-Lib-error-message-20002"><a href="#mssql-连接时候报-DB-Lib-error-message-20002" class="headerlink" title="mssql 连接时候报 DB-Lib error message 20002"></a>mssql 连接时候报 <code>DB-Lib error message 20002</code></h3><p>用这个解决</p><ul><li><a href="https://github.com/pymssql/pymssql/issues/896">https://github.com/pymssql/pymssql/issues/896</a></li></ul><p>再 <code>connections</code> 时 <code>Extra Fields JSON</code> 中加入 <code>{"tds_version": "7.0"}</code></p><h2 id="oracle-相关"><a href="#oracle-相关" class="headerlink" title="oracle 相关"></a>oracle 相关</h2><ul><li><a href="https://airflow.apache.org/docs/apache-airflow-providers-oracle/stable/connections/oracle.html">https://airflow.apache.org/docs/apache-airflow-providers-oracle/stable/connections/oracle.html</a></li><li><a href="https://python-oracledb.readthedocs.io/en/latest/user_guide/installation.html">https://python-oracledb.readthedocs.io/en/latest/user_guide/installation.html</a></li></ul><h3 id="DPY-4027-no-configuration-directory-specified"><a href="#DPY-4027-no-configuration-directory-specified" class="headerlink" title="DPY-4027: no configuration directory specified"></a><code>DPY-4027: no configuration directory specified</code></h3><p>再 <code>connections</code> 时 <code>Extra Fields JSON</code> 中加入 <code>{"service_name": "orcl"}</code></p><h3 id="DPY-3015-password-verifier-type-0x939-is-not-supported-by-python-oracledb-in-thin-mode"><a href="#DPY-3015-password-verifier-type-0x939-is-not-supported-by-python-oracledb-in-thin-mode" class="headerlink" title="DPY-3015: password verifier type 0x939 is not supported by python-oracledb in thin mode"></a><code>DPY-3015: password verifier type 0x939 is not supported by python-oracledb in thin mode</code></h3><p>再 <code>connections</code> 时 <code>Extra Fields JSON</code> 中加入 <code>{"thick_mode": true, "thick_mode_lib_dir": "/opt/oracle_instantclient_23_8"}</code></p><h3 id="ORA-28726-set-current-schema-operation-failed-because-the-given-schema-name-is-either-invalid-or-does-not-exist"><a href="#ORA-28726-set-current-schema-operation-failed-because-the-given-schema-name-is-either-invalid-or-does-not-exist" class="headerlink" title="ORA-28726: set current schema operation failed because the given schema name is either invalid or does not exist"></a><code>ORA-28726: set current schema operation failed because the given schema name is either invalid or does not exist</code></h3><p>修改 <code>Schema</code> 为 库名</p><h2 id="如何本地化运行"><a href="#如何本地化运行" class="headerlink" title="如何本地化运行"></a>如何本地化运行</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker run --name <span class="string">"airflow"</span> -d -p 8080:8080 --<span class="built_in">env</span> <span class="string">"_AIRFLOW_DB_MIGRATE=true"</span> --<span class="built_in">env</span> <span class="string">"_AIRFLOW_WWW_USER_CREATE=true"</span> --<span class="built_in">env</span> <span class="string">"_AIRFLOW_WWW_USER_PASSWORD=admin"</span> -v ./data/dags:/opt/airflow/dags apache/airflow:3.0.2 airflow standalone</span><br></pre></td></tr></table></figure><h2 id="如何删除dag历史记录"><a href="#如何删除dag历史记录" class="headerlink" title="如何删除dag历史记录"></a>如何删除<code>dag</code>历史记录</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 删除指定的</span></span><br><span class="line">airflow dags delete -v [dag_id]</span><br><span class="line">airflow tasks clear -v [dag_id]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除全部的</span></span><br><span class="line">airflow db clean --skip-archive --clean-before-timestamp <span class="string">'2020-01-01 00:00:00+01:00'</span> -y</span><br></pre></td></tr></table></figure><h2 id="超时相关"><a href="#超时相关" class="headerlink" title="超时相关"></a>超时相关</h2><p>运行模式有 <code>LocalExecutor</code> 和 <code>CeleryExecutor</code> 两种</p><p>都用的 <code>orphaned_tasks_check_interval</code> 和 <code>task_instance_heartbeat_timeout</code> 作为默认时间<br>也都用 <code>parallelism</code> 作为 <code>work</code> 数量</p><p>在 <code>CeleryExecutor</code> 中 可以用 <code>execution_timeout</code> 定义超时时间 部署时需要启用 <code>airflow-worker</code><br>在 <code>LocalExecutor</code> 中 开始时间为 <code>入队时间</code></p><p>心跳 在 <code>3.0.2</code> 好像有点问题 不会自己更新</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">import time</span><br><span class="line"></span><br><span class="line">from airflow import DAG</span><br><span class="line">from airflow.decorators import task</span><br><span class="line">from datetime import datetime, timedelta</span><br><span class="line"></span><br><span class="line">with DAG(</span><br><span class="line"> dag_id='test_timeouta2',</span><br><span class="line"> schedule='@once',</span><br><span class="line"> start_date=datetime(2025, 7, 10),</span><br><span class="line"> default_args={</span><br><span class="line"> "execution_timeout": timedelta(seconds=86),</span><br><span class="line"> },</span><br><span class="line">) as dag:</span><br><span class="line"> @task</span><br><span class="line"> def start():</span><br><span class="line"> print("start")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> @task</span><br><span class="line"> def sleep_dag_600():</span><br><span class="line"> print("start sleep 600")</span><br><span class="line"> time.sleep(600)</span><br><span class="line"> print("sleep 600 ok")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> @task(execution_timeout=timedelta(seconds=96))</span><br><span class="line"> def sleep_dag_95():</span><br><span class="line"> print("start sleep 95")</span><br><span class="line"> time.sleep(95)</span><br><span class="line"> print("sleep 95 ok")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> @task</span><br><span class="line"> def sleep_dag_90():</span><br><span class="line"> print("start sleep 90")</span><br><span class="line"> time.sleep(90)</span><br><span class="line"> print("sleep 90 ok")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> @task</span><br><span class="line"> def sleep_dag_85():</span><br><span class="line"> print("start sleep 85")</span><br><span class="line"> time.sleep(85)</span><br><span class="line"> print("sleep 85 ok")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> @task</span><br><span class="line"> def sleep_dag_60():</span><br><span class="line"> print("start sleep 60")</span><br><span class="line"> time.sleep(60)</span><br><span class="line"> print("sleep 60 ok")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> @task(execution_timeout=timedelta(seconds=30))</span><br><span class="line"> def sleep_dag_30():</span><br><span class="line"> print("start sleep 30")</span><br><span class="line"> time.sleep(30)</span><br><span class="line"> print("sleep 30 ok")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> @task</span><br><span class="line"> def sleep_dag_6():</span><br><span class="line"> print("start sleep 6")</span><br><span class="line"> time.sleep(6)</span><br><span class="line"> print("sleep 6 ok")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> start() >> [</span><br><span class="line"> sleep_dag_600(),</span><br><span class="line"> sleep_dag_95(),</span><br><span class="line"> sleep_dag_90(),</span><br><span class="line"> sleep_dag_85(),</span><br><span class="line"> sleep_dag_60(),</span><br><span class="line"> sleep_dag_30(),</span><br><span class="line"> sleep_dag_6(),</span><br><span class="line"> ]</span><br></pre></td></tr></table></figure><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://www.echo.cool/docs/data/airflow/">https://www.echo.cool/docs/data/airflow/</a></li><li><a href="https://gist.github.com/worbas/c2e6d99d4fecc7cef506d90fa012d5b9">https://gist.github.com/worbas/c2e6d99d4fecc7cef506d90fa012d5b9</a></li></ul>]]></content>
<summary type="html">airflow3 的使用吧</summary>
</entry>
<entry>
<title>mysql 迁移到 mssql</title>
<link href="https://puzzle9.github.io/posts/85b64b8/"/>
<id>https://puzzle9.github.io/posts/85b64b8/</id>
<published>2025-07-02T13:15:06.000Z</published>
<updated>2025-07-02T13:34:19.828Z</updated>
<content type="html"><![CDATA[<p>所以 为什么会有这种需求</p><h1 id="迁移"><a href="#迁移" class="headerlink" title="迁移"></a>迁移</h1><p>有官方工具 也有第三方的</p><p>但是 无一例外 都不支持迁移<code>表</code>和<code>字段</code><strong>注释</strong></p><h2 id="navicat"><a href="#navicat" class="headerlink" title="navicat"></a><a href="https://www.navicat.com/">navicat</a></h2><p>这个 可以使用 导出表结构 导入表结构处理</p><h2 id="dbconvert-studio"><a href="#dbconvert-studio" class="headerlink" title="dbconvert_studio"></a><a href="https://dbconvert.com/">dbconvert_studio</a></h2><p>同上 也是傻瓜式操作</p><h2 id="ssma"><a href="#ssma" class="headerlink" title="ssma"></a><a href="https://aka.ms/ssmaformysql">ssma</a></h2><p>这是个官方的</p><p>只支持 <code>mysql</code></p><p>需要安装 <code>vc 2019+</code> <a href="https://dev.mysql.com/downloads/connector/odbc/"><code>odbc_mysql</code></a></p><p>需要开启 <code>sqlserveragent</code> 服务</p><p><img src="/posts/11c11b49/mssql/sqlserveragent.png"></p><p>先在源表那转换表结构 再去目标表同步数据即可</p><h2 id="mysql-workbench"><a href="#mysql-workbench" class="headerlink" title="mysql workbench"></a><a href="https://dev.mysql.com/downloads/workbench/">mysql workbench</a></h2><p>没研究出来怎么用</p><h1 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h1><p>想了想 还是用程序从 <code>mysql</code> 中读出来 再更新到 <code>mssql</code> 中吧</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mssql_db</span> = DB::<span class="title function_ invoke__">connection</span>(<span class="string">'mssql'</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$local_database</span> = <span class="title function_ invoke__">config</span>(<span class="string">'database.connections.mariadb.database'</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$local_tables</span> = DB::<span class="title function_ invoke__">connection</span>(<span class="string">'mariadb'</span>)</span><br><span class="line"> -><span class="title function_ invoke__">table</span>(<span class="string">'information_schema.TABLES'</span>)</span><br><span class="line"> -><span class="title function_ invoke__">where</span>(<span class="string">'TABLE_SCHEMA'</span>, <span class="variable">$local_database</span>)</span><br><span class="line"> -><span class="title function_ invoke__">pluck</span>(<span class="string">'table_comment'</span>, <span class="string">'table_name'</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$local_columns</span> = DB::<span class="title function_ invoke__">connection</span>(<span class="string">'mariadb'</span>)</span><br><span class="line"> -><span class="title function_ invoke__">table</span>(<span class="string">'information_schema.COLUMNS'</span>)</span><br><span class="line"> -><span class="title function_ invoke__">select</span>(<span class="string">'table_name'</span>, <span class="string">'column_name'</span>, <span class="string">'column_comment'</span>)</span><br><span class="line"> -><span class="title function_ invoke__">where</span>(<span class="string">'TABLE_SCHEMA'</span>, <span class="variable">$local_database</span>)</span><br><span class="line"> -><span class="title function_ invoke__">get</span>()</span><br><span class="line"> -><span class="title function_ invoke__">groupBy</span>(<span class="string">'table_name'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">foreach</span> (<span class="variable">$local_columns</span> <span class="keyword">as</span> <span class="variable">$table_name</span> => <span class="variable">$table_columns</span>) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="variable">$mssql_db</span>-><span class="title function_ invoke__">table</span>(<span class="variable">$table_name</span>)-><span class="title function_ invoke__">exists</span>();</span><br><span class="line"> } <span class="keyword">catch</span> (\<span class="built_in">Exception</span>) {</span><br><span class="line"> <span class="comment">// $this->error("{$table_name} no exists");</span></span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="variable">$table_comment</span> = <span class="variable">$local_tables</span>[<span class="variable">$table_name</span>];</span><br><span class="line"></span><br><span class="line"> <span class="variable">$mssql_db</span>-><span class="title function_ invoke__">statement</span>(<span class="string">"IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description',</span></span><br><span class="line"><span class="string">'SCHEMA', 'dbo',</span></span><br><span class="line"><span class="string">'TABLE', ?, NULL, NULL)) > 0)</span></span><br><span class="line"><span class="string">EXEC sp_updateextendedproperty</span></span><br><span class="line"><span class="string">'MS_Description', ?,</span></span><br><span class="line"><span class="string">'SCHEMA', 'dbo',</span></span><br><span class="line"><span class="string">'TABLE', ?</span></span><br><span class="line"><span class="string">ELSE</span></span><br><span class="line"><span class="string">EXEC sp_addextendedproperty</span></span><br><span class="line"><span class="string">'MS_Description', ?,</span></span><br><span class="line"><span class="string">'SCHEMA', 'dbo',</span></span><br><span class="line"><span class="string">'TABLE', ?"</span>, [</span><br><span class="line"> <span class="variable">$table_name</span>,</span><br><span class="line"> <span class="variable">$table_comment</span>,</span><br><span class="line"> <span class="variable">$table_name</span>,</span><br><span class="line"> <span class="variable">$table_comment</span>,</span><br><span class="line"> <span class="variable">$table_name</span>,</span><br><span class="line"> ]);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">foreach</span> (<span class="variable">$table_columns</span> <span class="keyword">as</span> <span class="variable">$column</span>) {</span><br><span class="line"> <span class="variable">$column_name</span> = <span class="variable">$column</span>->column_name;</span><br><span class="line"></span><br><span class="line"> <span class="variable">$column_comment</span> = <span class="variable">$column</span>->column_comment;</span><br><span class="line"> <span class="variable">$mssql_db</span>-><span class="title function_ invoke__">statement</span>(<span class="string">"IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description',</span></span><br><span class="line"><span class="string">'SCHEMA', 'dbo',</span></span><br><span class="line"><span class="string">'TABLE', ?,</span></span><br><span class="line"><span class="string">'COLUMN', ?)) > 0)</span></span><br><span class="line"><span class="string">EXEC sp_updateextendedproperty</span></span><br><span class="line"><span class="string">'MS_Description', ?,</span></span><br><span class="line"><span class="string">'SCHEMA', 'dbo',</span></span><br><span class="line"><span class="string">'TABLE', ?,</span></span><br><span class="line"><span class="string">'COLUMN', ?</span></span><br><span class="line"><span class="string">ELSE</span></span><br><span class="line"><span class="string">EXEC sp_addextendedproperty</span></span><br><span class="line"><span class="string">'MS_Description', ?,</span></span><br><span class="line"><span class="string">'SCHEMA', 'dbo',</span></span><br><span class="line"><span class="string">'TABLE', ?,</span></span><br><span class="line"><span class="string">'COLUMN', ?"</span>, [</span><br><span class="line"> <span class="variable">$table_name</span>,</span><br><span class="line"> <span class="variable">$column_name</span>,</span><br><span class="line"> <span class="variable">$column_comment</span>,</span><br><span class="line"> <span class="variable">$table_name</span>,</span><br><span class="line"> <span class="variable">$column_name</span>,</span><br><span class="line"> <span class="variable">$column_comment</span>,</span><br><span class="line"> <span class="variable">$table_name</span>,</span><br><span class="line"> <span class="variable">$column_name</span>,</span><br><span class="line"> ]);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>所以 为什么会有这种需求</p>
<h1 id="迁移"><a href="#迁移" class="headerlink" title="迁移"></a>迁移</h1><p>有官方工具 也有第三方的</p>
<p>但是 无一例外 都不支持迁移<code>表</code>和<</summary>
</entry>
<entry>
<title>租房啊</title>
<link href="https://puzzle9.github.io/posts/abbe4be6/"/>
<id>https://puzzle9.github.io/posts/abbe4be6/</id>
<published>2025-06-25T08:16:52.000Z</published>
<updated>2025-06-25T08:29:38.771Z</updated>
<content type="html"><![CDATA[<p>啊 租房</p><p>有了房子</p><p>那不得点满技能树</p><h1 id="住处"><a href="#住处" class="headerlink" title="住处"></a>住处</h1><p>有了 床架<br>那就得有 床垫<br>那就得有 床单<br>那就得有 被罩<br>那就得有 被褥<br>那就得有 枕套<br>那就得有 …</p><h1 id="厨房"><a href="#厨房" class="headerlink" title="厨房"></a>厨房</h1><p>有了 食物<br>那就得有 煤气灶/电磁炉<br>那就得有 案板<br>那就得有 厨刀/刮菜/<br>那就得有 炒菜锅/汤锅<br>那就得有 铲子/漏勺/汤勺/饭勺<br>那就得有 油/盐/酱/醋/辣<br>那就得有 抹布/钢丝球/垃圾袋<br>那就得有 …</p>]]></content>
<summary type="html"><p>啊 租房</p>
<p>有了房子</p>
<p>那不得点满技能树</p>
<h1 id="住处"><a href="#住处" class="headerlink" title="住处"></a>住处</h1><p>有了 床架<br>那就得有 床垫<br>那就得有 床单<br</summary>
</entry>
<entry>
<title>cr660x 路由器研究</title>
<link href="https://puzzle9.github.io/posts/2d3b406e/"/>
<id>https://puzzle9.github.io/posts/2d3b406e/</id>
<published>2025-06-24T08:51:04.000Z</published>
<updated>2025-06-24T14:06:55.588Z</updated>
<content type="html"><![CDATA[<p>嗯 ta的价格还是<code>50</code>没有变!!!</p><h1 id="解锁"><a href="#解锁" class="headerlink" title="解锁"></a>解锁</h1><p>按照解释说 如果获取不到ip时 会把自己ip设为 <code>169.254.31.2</code> 并且去 <code>169.254.31.1</code> 拉去参数并执行</p><p>那么 在 <code>archlinux</code> 中可以用 <a href="https://aur.archlinux.org/packages/linux-wifi-hotspot"><code>linux-wifi-hotspot</code></a> 提供的 <code>create_ap</code> 快捷创建热点</p><p>当然 要<a href="https://github.com/lakinduakash/linux-wifi-hotspot/issues/435">先停止</a> <code>NetworkManager</code> 服务</p><p>首先 开热点</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">create_ap wlan0 lo ap 12345678 -g 169.254.31.1 --no-dnsmasq -<span class="built_in">dd</span></span><br></pre></td></tr></table></figure><p>再启动一个拉参数的服务</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> http.server <span class="keyword">import</span> BaseHTTPRequestHandler, HTTPServer</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">SimpleServer</span>(<span class="title class_ inherited__">BaseHTTPRequestHandler</span>):</span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">do_POST</span>(<span class="params">self</span>):</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"It comes!"</span>)</span><br><span class="line"> data = {</span><br><span class="line"> <span class="string">"code"</span>: <span class="number">0</span>,</span><br><span class="line"> <span class="string">"token"</span>: <span class="string">"; nvram set ssh_en=1; nvram commit; sed -i 's/channel=.*/channel=\"debug\"/g' /etc/init.d/dropbear; /etc/init.d/dropbear start;"</span></span><br><span class="line"> }</span><br><span class="line"> <span class="variable language_">self</span>.send_response(<span class="number">200</span>)</span><br><span class="line"> <span class="variable language_">self</span>.end_headers()</span><br><span class="line"> <span class="variable language_">self</span>.wfile.write(json.dumps(data).encode())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">server_address = (<span class="string">'0.0.0.0'</span>, <span class="number">80</span>)</span><br><span class="line">httpd = HTTPServer(server_address, SimpleServer)</span><br><span class="line">httpd.serve_forever()</span><br></pre></td></tr></table></figure><p>运行 <code>python server.py</code> 启动服务</p><p>再去访问</p><ul><li><code>http://<CR660X设备IP>/cgi-bin/luci/;stok=<获取到的stok>/api/misystem/extendwifi_connect?ssid=ap&password=12345678</code></li></ul><p>可以看到日志有</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">wlan0: STA aa:bb:cc:b2:b2:cc IEEE 802.11: authenticated</span><br><span class="line">wlan0: STA aa:bb:cc:b2:b2:cc IEEE 802.11: associated (aid 1)</span><br><span class="line">wlan0: AP-STA-CONNECTED aa:bb:cc:b2:b2:cc</span><br><span class="line">wlan0: STA aa:bb:cc:b2:b2:cc RADIUS: starting accounting session F94929848293082E</span><br><span class="line">wlan0: STA aa:bb:cc:b2:b2:cc WPA: pairwise key handshake completed (RSN)</span><br><span class="line">wlan0: EAPOL-4WAY-HS-COMPLETED aa:bb:cc:b2:b2:cc</span><br></pre></td></tr></table></figure><ul><li><code>http://<CR660X设备IP>/cgi-bin/luci/;stok=<获取到的stok>/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx</code></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">It comes!</span><br><span class="line">169.254.31.2 - - [24/Jun/2025 20:34:47] "POST /cgi-bin/luci/api/xqsystem/token HTTP/1.1" 200 -</span><br></pre></td></tr></table></figure><p>至此 <code>ssh</code> 已经解锁</p><h1 id="刷入-breed-或-bpboot"><a href="#刷入-breed-或-bpboot" class="headerlink" title="刷入 breed 或 bpboot"></a>刷入 <a href="https://breed.hackpascal.net/r1338%20%5b2021-12-16%5d/breed-mt7621-xiaomi-r3g.bin">breed</a> 或 <a href="https://downloads.pangubox.com:63443/lintel/CR660X/pb-boot/pb-boot.img">bpboot</a></h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /tmp/</span><br><span class="line">wget http://169.254.31.1:3000/pb-boot.img</span><br><span class="line">mtd write pb-boot.img Bootloader</span><br></pre></td></tr></table></figure><p>以网线模式插入 <code>lan</code> 口 进入页面</p><h1 id="刷-wrt-并优化"><a href="#刷-wrt-并优化" class="headerlink" title="刷 wrt 并优化"></a>刷 wrt 并优化</h1><h2 id="刷"><a href="#刷" class="headerlink" title="刷"></a>刷</h2><p>先在 <code>pb-boot</code> 刷入 <a href="https://downloads.openwrt.org/releases/24.10.1/targets/ramips/mt7621/openwrt-24.10.1-ramips-mt7621-xiaomi_mi-router-cr6608-initramfs-kernel.bin%60"><code>openwrt-24.10.1-ramips-mt7621-xiaomi_mi-router-cr6608-initramfs-kernel.bin</code></a></p><p>以空密码登录后 再刷入 <a href="https://downloads.openwrt.org/releases/24.10.1/targets/ramips/mt7621/openwrt-24.10.1-ramips-mt7621-xiaomi_mi-router-cr6608-squashfs-sysupgrade.bin"><code>openwrt-24.10.1-ramips-mt7621-xiaomi_mi-router-cr6608-squashfs-sysupgrade.bin</code></a></p><h2 id="国内源"><a href="#国内源" class="headerlink" title="国内源"></a>国内源</h2><ul><li><a href="https://help.mirrors.cernet.edu.cn/openwrt/">https://help.mirrors.cernet.edu.cn/openwrt/</a></li></ul><h2 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h2><ul><li><a href="https://github.com/jerrykuku/luci-theme-argon/releases/download/v2.3.2/luci-theme-argon_2.3.2-r20250207_all.ipk">luci-theme-argon-2.3.2-r20250207_all.apk</a></li></ul><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="http://cnblogs.com/milton/p/18694477">http://cnblogs.com/milton/p/18694477</a></li><li><a href="https://haoyu.love/blog1389.html">https://haoyu.love/blog1389.html</a></li></ul>]]></content>
<summary type="html"><p>嗯 ta的价格还是<code>50</code>没有变!!!</p>
<h1 id="解锁"><a href="#解锁" class="headerlink" title="解锁"></a>解锁</h1><p>按照解释说 如果获取不到ip时 会把自己ip设为 <code>1</summary>
<category term="路由器" scheme="https://puzzle9.github.io/categories/%E8%B7%AF%E7%94%B1%E5%99%A8/"/>
</entry>
<entry>
<title>hs8145v 光猫研究</title>
<link href="https://puzzle9.github.io/posts/ac7934cb/"/>
<id>https://puzzle9.github.io/posts/ac7934cb/</id>
<published>2025-06-11T15:59:55.000Z</published>
<updated>2025-06-12T06:30:03.956Z</updated>
<content type="html"><![CDATA[<p>翻出来了来 `` 的光猫</p><p>好在是 默认 用户名 <code>telecomadmin</code> 密码 <code>nE7jA%5m</code></p><p><img src="/posts/11c11b49/145v/login.png"></p><p>这不 很顺畅的登录进去了</p><p>不得不说 这个界面后面的动态效果真不错 这可是好几年前的啊</p><p>又发现版本是 <code>B79.A</code> <code>V3.17.C10S115</code></p><p><img src="/posts/11c11b49/145v/manage_index.png"></p><p>嗯 逛了下论坛</p><p>发下 还有升级包 虽然此刻并不知道最后都因为<a href="https://www.chinadsl.net/forum.php?mod=viewthread&tid=171477">型号不匹配</a>而失败了</p><p>嗯 很顺畅</p><p>开启 <code>telnet</code></p><p><img src="/posts/11c11b49/145v/telnet.png"></p><p>连接</p><p>用户名 <code>root</code> 密码 <code>adminHW</code></p><p>嗯 很顺畅</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">➜ ~ telnet 192.168.2.11</span><br><span class="line">Trying 192.168.2.11...</span><br><span class="line">Connected to 192.168.2.11.</span><br><span class="line">Escape character is <span class="string">'^]'</span>.</span><br><span class="line"></span><br><span class="line">Welcome Visiting Huawei Home Gateway</span><br><span class="line">Copyright by Huawei Technologies Co., Ltd.</span><br><span class="line"></span><br><span class="line">Login:root</span><br><span class="line">Password:</span><br><span class="line">WAP>su</span><br><span class="line">success!</span><br><span class="line">SU_WAP></span><br></pre></td></tr></table></figure><p>看了眼下下的刷机包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">.</span><br><span class="line">├── HS8145V5_V500R019C20SPC115_China_All.bin</span><br><span class="line">├── HS8546V5_V500R019C00SPC110_china_all.bin</span><br><span class="line">├── HS8546V5_V500R019C20SPC050_china_all.bin</span><br><span class="line">└── HS8546V5_V500R019C20SPC105_china_all.bin</span><br></pre></td></tr></table></figure><p>开启 <a href="https://wiki.archlinux.org/title/TFTP"><code>tftp</code></a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pacman -S tftp-hpa</span><br><span class="line">systemctl start tftpd</span><br></pre></td></tr></table></figure><p>开刷</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">SU_WAP>load pack by tftp svrip 192.168.1.21 remotefile HS8145V5_V500R019C20SPC115_China_All.bin</span><br><span class="line">success!</span><br><span class="line">SU_WAP>Software Operation Faild!RetCode=0xf7204045!</span><br></pre></td></tr></table></figure><p>好了 <a href="https://www.right.com.cn/forum/thread-8370161-1-1.html">失败告终</a></p><p>但 不影响他作为一个<code>ap</code>呀</p><p>先将其余的网络都删除 新建一个</p><p><img src="/posts/11c11b49/145v/network_create.png"></p><p>虽然我没看明白为什么要再绑定个 <a href="https://www.right.com.cn/forum/thread-5768047-1-1.html"><code>vlan</code></a></p><p><img src="/posts/11c11b49/145v/vlan_setting.png"></p><p>再关闭 <code>dhcp</code> 的 <code>v4</code> 和 <code>v6</code> 并修改 <code>v4</code> 的 <code>ip地址</code></p><p><img src="/posts/11c11b49/145v/dhcp_ipv4.png"><br><img src="/posts/11c11b49/145v/dhcp_ipv6.png"></p><p>再修改下 <code>wifi</code> 的配置</p><p>再关闭 <code>上报</code> <code>日志</code> <code>ntp</code> 等<code>有的没的</code>的东西</p><p>好了 一个 <code>ap</code> 设置完成</p><p>至于 <code>补全shell</code> 等用 <code>win</code> 了后再研究</p>]]></content>
<summary type="html"><p>翻出来了来 &#96;&#96; 的光猫</p>
<p>好在是 默认 用户名 <code>telecomadmin</code> 密码 <code>nE7jA%5m</code></p>
<p><img src="/posts/11c11b49/145v/login.png</summary>
<category term="路由器" scheme="https://puzzle9.github.io/categories/%E8%B7%AF%E7%94%B1%E5%99%A8/"/>
</entry>
<entry>
<title>dae 跨墙</title>
<link href="https://puzzle9.github.io/posts/f1a175df/"/>
<id>https://puzzle9.github.io/posts/f1a175df/</id>
<published>2025-06-10T13:27:33.000Z</published>
<updated>2025-06-10T13:47:18.230Z</updated>
<content type="html"><![CDATA[<p>要说 什么简单 危险</p><p>唯有 <a href="https://github.com/wireguard"><code>跨墙</code></a></p><p>就是有点费 <code>身体</code> 与 <strong>红尘</strong></p><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><blockquote><p>这是个跨过限制大门的工具</p></blockquote><h1 id="设计"><a href="#设计" class="headerlink" title="设计"></a>设计</h1><p>很佩服设计这个方案的大神们</p><p>要访问域名 就牵扯到了 <code>dns</code></p><p>要应对解析 就牵扯到了 <code>路由</code></p><p>要应对分流 就牵扯到了 <code>节点</code></p><p>要应对速度 就牵扯到了 <code>群组</code></p><p>要应对更新 就牵扯到了 <code>订阅</code></p><p>…</p><p>一个工具只做一件事</p><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><p>直接安装 <a href="https://github.com/daeuniverse/daed"><code>daed</code></a> 使用 <code>网页</code> 版本配置吧</p>]]></content>
<summary type="html"><p>要说 什么简单 危险</p>
<p>唯有 <a href="https://github.com/wireguard"><code>跨墙</code></a></p>
<p>就是有点费 <code>身体</code> 与 <strong>红尘</strong></p>
<h</summary>
</entry>
<entry>
<title>ZeroTier 打洞 🕊</title>
<link href="https://puzzle9.github.io/posts/b54f4888/"/>
<id>https://puzzle9.github.io/posts/b54f4888/</id>
<published>2025-06-10T13:15:58.000Z</published>
<updated>2025-06-10T13:20:01.985Z</updated>
<content type="html"><![CDATA[<p>要说 什么简单 刺激</p><p>唯有 <a href="https://github.com/zerotier/ZeroTierOne"><code>打洞</code></a></p><p>就是有点看 <code>运气</code> 与 <strong>红尘</strong></p><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><blockquote><p>我也不知道这是个基于什么的 <code>ipv4</code> 的 <code>nat</code>打洞工具</p></blockquote><h1 id="todo"><a href="#todo" class="headerlink" title="todo"></a>todo</h1><p>我还在积攒运气中</p>]]></content>
<summary type="html"><p>要说 什么简单 刺激</p>
<p>唯有 <a href="https://github.com/zerotier/ZeroTierOne"><code>打洞</code></a></p>
<p>就是有点看 <code>运气</code> 与 <strong>红尘</str</summary>
</entry>
<entry>
<title>rathole 穿透</title>
<link href="https://puzzle9.github.io/posts/60e86601/"/>
<id>https://puzzle9.github.io/posts/60e86601/</id>
<published>2025-06-10T13:02:46.000Z</published>
<updated>2025-11-12T02:46:43.398Z</updated>
<content type="html"><![CDATA[<p>要说 什么简单 省心</p><p>唯有 <a href="https://github.com/yujqiao/rathole"><code>穿透</code></a></p><p>就是有点耗 <code>流量</code> 与 <strong>红尘</strong></p><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><blockquote><p>这是个内网穿透工具 类似于 <a href="https://github.com/fatedier/frp"><code>frp</code></a> <a href="https://github.com/ehang-io/nps"><code>nps</code></a> 等</p></blockquote><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><h2 id="alpine"><a href="#alpine" class="headerlink" title="alpine"></a>alpine</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget https://mirror.nju.edu.cn/alpine/edge/testing/x86_64/rathole-0.5.0-r0.apk</span><br><span class="line">apk add ./rathole-0.5.0-r0.apk</span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> /etc/rathole</span><br></pre></td></tr></table></figure><p><code>/etc/init.d/ratholec</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/sbin/openrc-run</span></span><br><span class="line"></span><br><span class="line">name=<span class="string">"Rathole Client Service"</span></span><br><span class="line">description=<span class="string">"Rathole Client Service"</span></span><br><span class="line"><span class="built_in">command</span>=<span class="string">"/usr/bin/rathole"</span></span><br><span class="line">command_args=<span class="string">"-c /etc/rathole/rathole.toml"</span></span><br><span class="line">pidfile=<span class="string">"/run/<span class="variable">$SVCNAME</span>.pid"</span></span><br><span class="line">command_background=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">depend</span></span>() {</span><br><span class="line"> need net</span><br><span class="line"> after firewall</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x /etc/init.d/ratholec</span><br><span class="line">rc-service ratholec start</span><br><span class="line">rc-update add ratholec</span><br></pre></td></tr></table></figure><h2 id="debian"><a href="#debian" class="headerlink" title="debian"></a>debian</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">apt install unzip</span><br><span class="line">wget https://github.com/yujqiao/rathole/releases/download/v0.5.0/rathole-x86_64-unknown-linux-gnu.zip</span><br><span class="line">unzip -d /usr/bin/ rathole-x86_64-unknown-linux-gnu.zip</span><br><span class="line"><span class="built_in">chmod</span> +x /usr/bin/rathole</span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> /etc/rathole</span><br></pre></td></tr></table></figure><p><code>/etc/systemd/system/ratholes.service</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=Rathole Server Service</span><br><span class="line">After=network.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=simple</span><br><span class="line">Restart=on-failure</span><br><span class="line">RestartSec=5s</span><br><span class="line">LimitNOFILE=1048576</span><br><span class="line">User=root</span><br><span class="line"></span><br><span class="line">WorkingDirectory=/etc/rathole</span><br><span class="line">ExecStart=/usr/bin/rathole -s /etc/rathole/rathole.toml</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> ratholes.service --now</span><br></pre></td></tr></table></figure><h2 id="openwrt"><a href="#openwrt" class="headerlink" title="openwrt"></a>openwrt</h2><p><code>/etc/init.d/rathole</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/sh /etc/rc.common</span><br><span class="line"></span><br><span class="line">START=99</span><br><span class="line">USE_PROCD=1</span><br><span class="line">PROG=/data/rathole/rathole</span><br><span class="line"></span><br><span class="line">start_service() {</span><br><span class="line"> procd_open_instance</span><br><span class="line"> procd_set_param command "$PROG" -c /data/rathole/rathole.toml</span><br><span class="line"> procd_set_param respawn</span><br><span class="line"> procd_close_instance</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">stop_service() {</span><br><span class="line"> killall rathole</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[server]</span></span><br><span class="line"><span class="comment"># 服务器监听了这个端口</span></span><br><span class="line"><span class="attr">bind_addr</span> = <span class="string">"0.0.0.0:2333"</span></span><br><span class="line"><span class="attr">default_token</span> = <span class="string">"rathole"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[client]</span></span><br><span class="line"><span class="comment"># 客户端通过ip与端口进行连接</span></span><br><span class="line"><span class="attr">remote_addr</span> = <span class="string">"{ip}:2333"</span></span><br><span class="line"><span class="attr">default_token</span> = <span class="string">"rathole"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 加密方式如下</span></span><br><span class="line"><span class="section">[server.transport]</span></span><br><span class="line"><span class="attr">type</span> = <span class="string">"noise"</span></span><br><span class="line"><span class="section">[server.transport.noise]</span></span><br><span class="line"><span class="attr">local_private_key</span> = <span class="string">"nKdq0NUp3pcnRzfQEtFI/Qe/GdO6zYh1G56etEZgeIo="</span></span><br><span class="line"></span><br><span class="line"><span class="section">[client.transport]</span></span><br><span class="line"><span class="attr">type</span> = <span class="string">"noise"</span></span><br><span class="line"><span class="section">[client.transport.noise]</span></span><br><span class="line"><span class="attr">remote_public_key</span> = <span class="string">"OZgtXqojrnphLrNL/o8tFYxkRDCPNaoRfRxbuMOgqHg="</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 服务端起了一个叫 go 的服务 对外端口为 16070</span></span><br><span class="line"><span class="section">[server.services.go]</span></span><br><span class="line"><span class="attr">bind_addr</span> = <span class="string">"0.0.0.0:16070"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 客户端将本机的 6070 端口 转发给服务端的 go 服务</span></span><br><span class="line"><span class="section">[client.services.go]</span></span><br><span class="line"><span class="attr">local_addr</span> = <span class="string">"127.0.0.1:6070"</span></span><br></pre></td></tr></table></figure><p>这个配置文件可以写到一起 他是用 <code>命令</code> 去区分 当前是运行的 <code>服务端 --server</code> 还是 <code>客户端 --client</code> 的<br>置于区分是不是同一个服务 用的是 <code>services.{name}</code> 进行区分的<br>这个<code>key</code>用 <code>rathole --genkey</code> 生成</p><h1 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h1><h2 id="supervisor"><a href="#supervisor" class="headerlink" title="supervisor"></a>supervisor</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[program:rathole]</span><br><span class="line">command=rathole --client /data/rathole/config.toml</span><br><span class="line">directory=/data/rathole</span><br><span class="line">user=root</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p>要说 什么简单 省心</p>
<p>唯有 <a href="https://github.com/yujqiao/rathole"><code>穿透</code></a></p>
<p>就是有点耗 <code>流量</code> 与 <strong>红尘</strong><</summary>
</entry>
<entry>
<title>WireGuard 组网</title>
<link href="https://puzzle9.github.io/posts/3ec5a2b7/"/>
<id>https://puzzle9.github.io/posts/3ec5a2b7/</id>
<published>2025-06-10T11:44:02.000Z</published>
<updated>2025-06-10T13:38:56.602Z</updated>
<content type="html"><![CDATA[<p>要说 什么简单 省事</p><p>唯有 <a href="https://github.com/wireguard"><code>组网</code></a></p><p>就是有点爽 <code>爱好</code> 与 <strong>红尘</strong></p><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><blockquote><p>这是个基于 <code>UDP</code> 的异地组网工具</p></blockquote><p>先放下官方的定义 <code>对等体/节点/设备</code> <code>Peer/Node/Device</code></p><p>诺 如下</p><table><thead><tr><th align="center">名称</th><th align="center">虚拟ip</th><th align="center">自带网段</th></tr></thead><tbody><tr><td align="center">Isaac</td><td align="center">192.168.99.1/32</td><td align="center"></td></tr><tr><td align="center">Alice</td><td align="center">192.168.99.2/32</td><td align="center">192.168.2.0/24</td></tr><tr><td align="center">Bob</td><td align="center">192.168.99.3/32</td><td align="center">192.168.3.0/24</td></tr><tr><td align="center">Carol</td><td align="center">192.168.99.4/32</td><td align="center">192.168.4.0/24</td></tr><tr><td align="center">Dave</td><td align="center">192.168.99.5/32</td><td align="center">192.168.5.0/24</td></tr></tbody></table><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><ul><li>将 <code>net.ipv4.ip_forward = 1</code> 添加到 <code>/etc/sysctl.conf</code></li></ul><h2 id="debian"><a href="#debian" class="headerlink" title="debian"></a>debian</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install wireguard-tools iptables</span><br></pre></td></tr></table></figure><h2 id="alpine"><a href="#alpine" class="headerlink" title="alpine"></a>alpine</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apk add wireguard-tools-wg-quick iptables wireguard-tools-openrc</span><br><span class="line">rc-update add sysctl</span><br></pre></td></tr></table></figure><p>修改 <code>/etc/conf.d/iptables</code> 中 <code>IPFORWARD</code> 为 <code>yes</code></p><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><ul><li>公钥私钥采用 <code>wg genkey | tee key.privatekey | wg pubkey > key.publickey</code> 生成 每个人都是独立的</li><li>配置文件在 <code>/etc/wireguard</code> 文件名就是网卡名 规则为 <code>^[a-zA-Z0-9_=+.-]{1,15}$</code></li><li>以下配置文件有精简</li></ul><h2 id="Alice-和-Bob-一起玩-Alice-有公网"><a href="#Alice-和-Bob-一起玩-Alice-有公网" class="headerlink" title="Alice 和 Bob 一起玩 Alice 有公网"></a><code>Alice</code> 和 <code>Bob</code> 一起玩 <code>Alice</code> 有公网</h2><ul><li><code>wg-quick up wg_ab_a</code></li></ul><p><code>Alice</code> <code>/etc/wireguard/wg_ab_a.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[Interface]</span><br><span class="line">Address = 192.168.99.2/24</span><br><span class="line">ListenPort = 51820</span><br><span class="line">PrivateKey = {Alice_PrivateKey}</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Bob</span><br><span class="line">PublicKey = {Bob_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.3/32, 192.168.3.0/24</span><br></pre></td></tr></table></figure><p><code>Bob</code> <code>/etc/wireguard/wg_ab_a.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[Interface]</span><br><span class="line">Address = 192.168.99.3/24</span><br><span class="line">PrivateKey = {Bob_PrivateKey}</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Alice</span><br><span class="line">Endpoint = {Alice_ip}:51820</span><br><span class="line">PublicKey = {Alice_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.2/32, 192.168.2.0/24</span><br></pre></td></tr></table></figure><h2 id="Alice-Bob-Carol-一起玩-Alice-有公网"><a href="#Alice-Bob-Carol-一起玩-Alice-有公网" class="headerlink" title="Alice Bob Carol 一起玩 Alice 有公网"></a><code>Alice</code> <code>Bob</code> <code>Carol</code> 一起玩 <code>Alice</code> 有公网</h2><ul><li><code>wg-quick up wg_abc_a</code></li><li><code>Bob</code> <code>Carol</code> 玩耍时通过 <code>Alice</code> 中转</li></ul><p><code>Alice</code> <code>/etc/wireguard/wg_abc_a.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[Interface]</span><br><span class="line">Address = 192.168.99.2/24</span><br><span class="line">ListenPort = 51820</span><br><span class="line">PrivateKey = {Alice_PrivateKey}</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Bob</span><br><span class="line">PublicKey = {Bob_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.3/32, 192.168.3.0/24</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Carol</span><br><span class="line">PublicKey = {Carol_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.4/32, 192.168.4.0/24</span><br></pre></td></tr></table></figure><p><code>Bob</code> <code>/etc/wireguard/wg_abc_a.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[Interface]</span><br><span class="line">Address = 192.168.99.3/24</span><br><span class="line">PrivateKey = {Bob_PrivateKey}</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Alice</span><br><span class="line">Endpoint = {Alice_ip}:51820</span><br><span class="line">PublicKey = {Alice_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.2/32, 192.168.3.0/24, 192.168.4.0/24</span><br></pre></td></tr></table></figure><p><code>Carol</code> <code>/etc/wireguard/wg_abc_a.conf</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[Interface]</span><br><span class="line">Address = 192.168.99.4/24</span><br><span class="line">PrivateKey = {Carol_PrivateKey}</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Alice</span><br><span class="line">Endpoint = {Alice_ip}:51820</span><br><span class="line">PublicKey = {Alice_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.2/32, 192.168.2.0/24, 192.168.4.0/24</span><br></pre></td></tr></table></figure><h2 id="Alice-Bob-Carol-一起玩-都有公网"><a href="#Alice-Bob-Carol-一起玩-都有公网" class="headerlink" title="Alice Bob Carol 一起玩 都有公网"></a><code>Alice</code> <code>Bob</code> <code>Carol</code> 一起玩 都有公网</h2><h1 id="Q-A"><a href="#Q-A" class="headerlink" title="Q&A"></a>Q&A</h1><h2 id="Address-和-AllowedIPs-什么"><a href="#Address-和-AllowedIPs-什么" class="headerlink" title="Address 和 AllowedIPs 什么"></a><code>Address</code> 和 <code>AllowedIPs</code> 什么</h2><p>站在 <code>Alice</code> 的角度</p><ul><li><code>Address</code> 是组网的ip地址 只有同个局域网才能一起玩</li><li><code>[Peer]</code> 可以找谁一起玩</li><li><code>AllowedIPs</code> 是路由 找他可以通过那个路出去</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">[Interface]</span><br><span class="line"># 我组了一个局域网</span><br><span class="line">Address = 192.168.99.2/24</span><br><span class="line"># 监听地址是这个</span><br><span class="line">ListenPort = 51820</span><br><span class="line"># 我的私钥</span><br><span class="line">PrivateKey = {Alice_PrivateKey}</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Bob</span><br><span class="line"># 访问 192.168.3.0/24 网段时 去找 Bob</span><br><span class="line">PublicKey = {Bob_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.3/32, 192.168.3.0/24</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Carol</span><br><span class="line"># 访问 192.168.4.0/24 网段时 去找 Carol</span><br><span class="line">PublicKey = {Carol_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.4/32, 192.168.4.0/24</span><br></pre></td></tr></table></figure><p>至于 <code>WireGuard</code> 怎么知道是 <code>Bob</code> 还是 <code>Carol</code> 来找自己了<br>那不是有 <code>PublicKey</code> 字段嘛 我推测是用它判断的</p><p>站在 <code>Bob</code> 的角度</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[Interface]</span><br><span class="line"># 我组了或者加入了一个局域网</span><br><span class="line">Address = 192.168.99.3/24</span><br><span class="line"># 我的私钥</span><br><span class="line">PrivateKey = {Bob_PrivateKey}</span><br><span class="line">[Peer]</span><br><span class="line"># Name = Alice</span><br><span class="line">Endpoint = {Alice_ip}:51820</span><br><span class="line">PublicKey = {Alice_PublicKey}</span><br><span class="line">AllowedIPs = 192.168.99.2/32, 192.168.3.0/24, 192.168.4.0/24</span><br><span class="line"># 每25秒去敲下 Alice 的门 防止他忘记我</span><br><span class="line">PersistentKeepalive = 25</span><br></pre></td></tr></table></figure><p>可以通过 <code>Endpoint</code> 这个去找 <code>Alice</code> 玩<br>我也想去找 <code>Carol</code> 玩 但是他和我都没得 <code>公网</code><br>那我只能把相关的网段都给 <code>Alice</code> 让他去中转</p><h1 id="参考地址"><a href="#参考地址" class="headerlink" title="参考地址"></a>参考地址</h1><ul><li><a href="https://wiki.alpinelinux.org/wiki/Configure_a_Wireguard_interface_(wg)">https://wiki.alpinelinux.org/wiki/Configure_a_Wireguard_interface_(wg)</a></li><li><a href="https://github.com/pirate/wireguard-docs">https://github.com/pirate/wireguard-docs</a></li><li><a href="https://wiki.archlinux.org/title/WireGuard">https://wiki.archlinux.org/title/WireGuard</a></li><li><a href="https://www.skyone.host/2024/wireguard-configure">https://www.skyone.host/2024/wireguard-configure</a></li><li><a href="https://v2ex.com/t/934101">https://v2ex.com/t/934101</a></li><li><a href="https://www.reddit.com/r/homelab/comments/gw22bv/wireguard_confusion_on_allowedips_and_addresses">https://www.reddit.com/r/homelab/comments/gw22bv/wireguard_confusion_on_allowedips_and_addresses</a></li><li><a href="https://www.cnblogs.com/milton/p/14178344.html">https://www.cnblogs.com/milton/p/14178344.html</a></li><li><a href="https://www.cyberciti.biz/faq/how-to-set-up-wireguard-vpn-server-on-alpine-linux/">https://www.cyberciti.biz/faq/how-to-set-up-wireguard-vpn-server-on-alpine-linux/</a></li><li><a href="https://github.com/smile365/blog/blob/master/wireguard.md">https://github.com/smile365/blog/blob/master/wireguard.md</a></li><li><a href="https://forum.proxmox.com/threads/proxmox-lxc-container-alpine-linux-set-up-wireguard-vpn-server-howto-05-2022-rev1.110778/">https://forum.proxmox.com/threads/proxmox-lxc-container-alpine-linux-set-up-wireguard-vpn-server-howto-05-2022-rev1.110778/</a></li></ul>]]></content>
<summary type="html"><p>要说 什么简单 省事</p>
<p>唯有 <a href="https://github.com/wireguard"><code>组网</code></a></p>
<p>就是有点爽 <code>爱好</code> 与 <strong>红尘</strong></p>
<h</summary>
</entry>
</feed>