@eriko 字写的真好呀。👍
随手记下,日子就有了回声。
这里是一些没有来得及展开的片段:今天的天气、脑子里突然冒出的想法、路上看见的一棵树,以及那些不适合写成文章的小事。
Frp打洞后内网Nginx反代
https://1900.live/frpda-dong-hou-nei-wang-nginxfan-dai
from 1900’Blog.
家里这台NAS从24年10月开组,系统用的飞牛OS,最开始用无线网卡出过几次问题,后来换成有限网卡后趋于稳定。不过官方最近报了个0day漏洞出来炸了锅,不过我情绪还算比较稳定,在期初系统选型时就在黑裙、OMV、truenas、飞牛之间犹豫了很久,最后还是选择了拿安全换方便。
机器从最开始的3D打印机箱+闲置硬盘上手,到后面的疾风知N52机箱+两块4T硬盘上手,后续为了「一步到位」换了10盘位的机箱+陆续上到了7块硬盘,那时的我还不知道短短一年多时间,当时买的这些硬盘能翻上好几倍变成了理财产品。
因为电信不给申请公网服务,所以选择了Frp+中继服务器打洞,当时图方便直接使用了Frp自带的转发服务,但随着玩机的深入,部署的容器服务也从此前的几个增长到了几十个,Frp转发服务的一些问题逐渐暴露出来,如:
- 个别服务需要用到WebSocket服务,但是Frp转发服务没法自定义这些配置,
- 不能对域名下的不同路径转发做处理
- 性能较差,我的体验是看影视资源经常要等个四五秒才能开始播放
- 每个服务一个配置项,管理不方便
所以昨天花了一两个小时从原来的Frp转发服务切…
我失业后能干啥
https://1900.live/what-can-i-do-after-losing-my-job
from 1900’Blog.
可能是因为行业持续低落我始终忍不住把一切往最坏的方面靠拢。
所以最近忽然开始思考,如果有一天我失去了目前的一切之后我还能依靠哪些技能继续找到足以糊口养家的体面工作?我感兴趣的又是那些方面呢?
广告制作
因为门店平时经常做活动,需要设计活动对应的广告传单、宣传物料等。最开始我们全是找外面广告公司来做的,但是感觉沟通成本太高了,效率、质量都不太让我满意。
所以在看了对方制作了几次之后我开始在自己电脑上安装CorelDraw,这是一个用起来有点类似Photoshop的设计工具,它更偏向矢量设计,但是没Adobe Illustrator 那么强大,不过排版功能很强大。
后来学会在nipic这种素材站上下素材,再做对应修改后做出更漂亮的成品,后续几次和广告公司老板沟通后发现我这水平在他们那里找一份5到6k的工作没有问题。
或者自己开个广告公司,其实接触这么多年下来,发现很多广告公司其实根本没有打印设备,都是找同城代打、印刷,如果本地没有还能联系成都的同行进行处理,所以理论上有人和电脑就行了,当然这方面最重要的当然是客户,我目前接触过这么多产品代理,零售店,真要去做资源这块应该还是没问…
花了一两个小时把nas服务原来用frpc自带的代理功能改成了由nginx处理。
感觉速度快了不少,以前用emby看视频经常要等上好一会,现在都是秒加载了。
1900 转嘟 @1900@neodb.social:
在看 南来北往 第 1 季 🌕🌕🌗🌑🌑
依旧是跟着老妈和老婆下班时间围桌而看的。
当生活剧看了,我们全家人一致觉得老马很像我爸。
里面客串的配角大咖可是真的多啊
1900 转嘟 @1900@neodb.social:
在读 点燃希望 🌕🌕🌗🌑🌑
前半部偏向自述,后半部开始讨论人性、神性,对她提到的人类的某些或好或坏的行为是从基因片断里带来还是后天养成的?
tinfoil的黑商店现在大多数都专向收费了,而且质量参差不齐。
所以用 https://github.com/a1ex4/ownfoil 自建了一个tinfoil游戏库,通过夸克网盘下载游戏进行更新,感觉还算比较方便。

对了,直接把代码部分放进openlist的自定义头部里能在所有浏览器上都实现这个功能。
在openlist前端调用aria rpc服务下载时不能指定存放的目录,用AI写了个脚本实现了个弹窗设置存放主目录的功能,需要使用的小伙伴可能要修改 /data/aria-download 为你的aria预设下载路径。
// ==UserScript==
// @name openlist → aria2 强制指定下载目录
// @namespace https://github.com/yourname
// @version 0.2
// @description 给 openlist 前端批量发送到 aria2 的请求自动加上 dir 字段
// @author You
// @match *://alist.demo.com/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function () {
'use strict';
// 缓存用户输入,同一次页面会话内不再反复弹
let userRoot = null;
function getNewRoot() {
if (userRoot === null) {
// 弹窗输入,支持 Windows 盘符或 Unix 风格路径
userRoot = prompt(
'请输入新的下载根目录(留空=保持原目录):\n例:D:\\down 或 /mnt/usb',
''
);
if (userRoot === null) userRoot = ''; // 点取消
// 去掉末尾的 \ 或 /
userRoot = userRoot.replace(/[\\/]+$/, '');
}
return userRoot;
}
function patchBody(bodyStr) {
let body;
try { body = JSON.parse(bodyStr); } catch (e) { return bodyStr; }
// 只处理 aria2.addUri
if (body.method !== 'aria2.addUri') return bodyStr;
const options = body.params[2] || {};
const oldDir = options.dir || '';
// 如果 dir 里包含 /data/aria-download/ 就替换
if (oldDir.includes('/data/aria-download')) {
const newRoot = getNewRoot();
if (newRoot) {
options.dir = oldDir.replace('/data/aria-download', newRoot);
body.params[2] = options;
return JSON.stringify(body);
}
}
return bodyStr;
}
/* ---------- 拦截 fetch ---------- */
const _fetch = window.fetch;
window.fetch = function (url, opts = {}) {
if (url.includes('/jsonrpc') && opts.body && typeof opts.body === 'string') {
opts.body = patchBody(opts.body);
}
return _fetch.call(this, url, opts);
};
/* ---------- 拦截 XMLHttpRequest ---------- */
const _send = XMLHttpRequest.prototype.send;
const _open = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (m, u) {
this._url = u;
return _open.apply(this, arguments);
};
XMLHttpRequest.prototype.send = function (data) {
if (data && this._url && this._url.includes('/jsonrpc')) {
if (typeof data === 'string' || data instanceof String) {
arguments[0] = patchBody(data);
}
}
return _send.apply(this, arguments);
};
})();没有符合条件的记录。