我们都在被监控着
众所周知,在现代的信息社会,想保持不被监控是非常困难的事情。由于种种原因,总有人会希望监控你。
例如,某些视频平台(例如B站)为了提高视频推送准确度,不惜用各种手段刺探用户喜好,虽然我不好说是用了什么手段,因为没有调查就没有发言权,但是有我这种感受的人估计不在少数。我就有过类似的经历:在QQ群谈论一个事物(例如洋垃圾平台),然后打开B站首页给你推的就是刚刚你谈论过的平台相关的内容,细思极恐啊兄弟们!
还有一些购物网站也会这样,为了分析用户喜好,也会想尽各种办法来刺探用户的兴趣。我也有过刚谈论完某个感兴趣的物品,淘宝或者闲鱼一打开就是相关内容。给人各种不爽。
值得一提的是,在我们日常生活中,对个人隐私泄漏最严重的设备是——手机。手机也是我最鄙视的电子产品之一,尤其是现在国内手机厂商开始搞封闭,限制用户自己安装应用,非要从他们提供的如同公厕一般的垃圾应用商店去下载APP。无语至极!你想换个系统?或者删掉自带的垃圾应用(例如广告浏览器)?没门,新的国内安卓系统已经给你堵死了,解锁Bootloader更是不可能。既然都要封闭起来给用户喂屎,为什么我不选择应用商店环境更好的苹果?
扯远了。。。
那么,在现在这个信息化时代,还有没有办法说悄悄话呢?答案是肯定的,绝对有办法,而且方法很多。
例如:用记事本写下相关的消息,然后使用约定好的密码加密压缩打包后发送。或者,如果有能力的,可以自己写一套简单的文本消息加密算法。
而这次,我打算尝试搭建一个有趣的开源项目——Fiora
Fiora是什么?
Fiora是由碎碎酱使用node.js
,react
和socket.io
打造的一款在线聊天室,可以自己托管运行,具有较高的隐私安全性。简单来说就有点类似与简单的QQ,但是服务是有你自己进行托管的。可以在一定程度上规避监控和审查。所以适合用来键(bushi
不过这个项目似乎不再维护了,最后一次更新已经是两年前的2023年了,不过只是更新了Readme,代码最后一次更新已经是2022年了。。。
Fiora的搭建
项目的文档有详细的搭建教程和方法,至于为什么我还要写这篇博客,那是因为我遇到了一些问题,按照官方的搭建教程文档无法进行下去,所以再次整理总结经验。
注意,本教程操作系统环境为Alpine Linux 3.20
!
搭建环境准备
我们需要做的事情有:
- 安装 Node.js
- 安装 MongoDB
- 安装 redis
安装Node.js和redis比较简单,一条命令搞定:
apk add redis npm nodejs
但是,安装MongoDB就相对麻烦一点了,由于新版的Alpine将MongoDB移出了软件包列表,我们只能通过旧版的软件源安装。
首先,编辑apk的软件源:
nano /etc/apk/repositories
添加Alpine 3.9的软件源:
http://mirrors.ustc.edu.cn/alpine/v3.9/main
http://mirrors.ustc.edu.cn/alpine/v3.9/community
然后安装MongoDB:
apk update
apk add mongodb
安装完成后,一定,一定,一定要删除掉刚刚添加的软件源,不然后期安装软件可能导致系统崩溃!!!
然后启动相关服务:
rc-update add mongodb default
rc-update add redis default
rc-service mongodb start
rc-service redis start
运行项目
先克隆项目到本地:
git clone https://github.com/yinxin630/fiora.git -b master
然后安装yarn
:
npm install -g yarn
安装项目依赖:
yarn install
注意,这一步可能会因为网络的原因报错,因为依赖在GitHub上面,GitHub国内访问经常不稳定,所以可能需要挂代理才能正常安装依赖。
终端代理:
export https_proxy=http://192.168.0.18:20171
export http_proxy=http://192.168.0.18:20171
然后接下来就是一个意想不到的大坑:
构建客户端代码:
yarn build:web
然后你就会喜提如下报错:
localhost:/mnt/data/fiora# yarn build:web
yarn run v1.22.22
$ npx lerna run build:web --stream
lerna notice cli v4.0.0
lerna info versioning independent
lerna info Executing command in 1 package: "yarn run build:web"
@fiora/web: warning package.json: "dependencies" has dependency "@testing-library/jest-dom" with range "^5.14.1" that collides with a dependency in "devDependencies" of the same name with version "^4.2.4"
@fiora/web: $ rm -rf dist && cross-env NODE_ENV=production DOTENV_CONFIG_PATH=../../.env webpack --config build/webpack.prod.js && cp -r -f dist/fiora/* ../server/public
@fiora/web: ℹ Compiling Webpack
@fiora/web: Error: error:0308010C:digital envelope routines::unsupported
@fiora/web: at new Hash (node:internal/crypto/hash:79:19)
@fiora/web: at Object.createHash (node:crypto:139:10)
@fiora/web: at BulkUpdateDecorator.hashFactory (/mnt/data/fiora/packages/web/node_modules/webpack/lib/util/createHash.js:145:18)
@fiora/web: at BulkUpdateDecorator.update (/mnt/data/fiora/packages/web/node_modules/webpack/lib/util/createHash.js:46:50)
@fiora/web: at RawSource.updateHash (/mnt/data/fiora/packages/web/node_modules/webpack/node_modules/webpack-sources/lib/RawSource.js:64:8)
@fiora/web: at NormalModule._initBuildHash (/mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:868:17)
@fiora/web: at handleParseResult (/mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:934:10)
@fiora/web: at /mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:1026:4
@fiora/web: at processResult (/mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:743:11)
@fiora/web: at /mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:807:5
@fiora/web: Browserslist: caniuse-lite is outdated. Please run:
@fiora/web: npx browserslist@latest --update-db
@fiora/web: Why you should do it regularly:
@fiora/web: https://github.com/browserslist/browserslist#browsers-data-updating
@fiora/web: node:internal/crypto/hash:79
@fiora/web: this[kHandle] = new _Hash(algorithm, xofLen, algorithmId, getHashCache());
@fiora/web: ^
@fiora/web: Error: error:0308010C:digital envelope routines::unsupported
@fiora/web: at new Hash (node:internal/crypto/hash:79:19)
@fiora/web: at Object.createHash (node:crypto:139:10)
@fiora/web: at BulkUpdateDecorator.hashFactory (/mnt/data/fiora/packages/web/node_modules/webpack/lib/util/createHash.js:145:18)
@fiora/web: at BulkUpdateDecorator.update (/mnt/data/fiora/packages/web/node_modules/webpack/lib/util/createHash.js:46:50)
@fiora/web: at RawSource.updateHash (/mnt/data/fiora/packages/web/node_modules/webpack/node_modules/webpack-sources/lib/RawSource.js:64:8)
@fiora/web: at NormalModule._initBuildHash (/mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:868:17)
@fiora/web: at handleParseResult (/mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:934:10)
@fiora/web: at /mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:1026:4
@fiora/web: at processResult (/mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:743:11)
@fiora/web: at /mnt/data/fiora/packages/web/node_modules/webpack/lib/NormalModule.js:807:5 {
@fiora/web: opensslErrorStack: [
@fiora/web: 'error:03000086:digital envelope routines::initialization error',
@fiora/web: 'error:0308010C:digital envelope routines::unsupported'
@fiora/web: ],
@fiora/web: library: 'digital envelope routines',
@fiora/web: reason: 'unsupported',
@fiora/web: code: 'ERR_OSSL_EVP_UNSUPPORTED'
@fiora/web: }
@fiora/web: Node.js v20.15.1
@fiora/web: error Command failed with exit code 1.
@fiora/web: info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
lerna ERR! yarn run build:web exited 1 in '@fiora/web'
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
localhost:/mnt/data/fiora#
这错误通常与 Node.js 和 OpenSSL 的版本兼容性有关。这个错误在较新版本的 Node.js (如 v20.15.1) 中可能出现,尤其是在使用旧版本的依赖库或工具(比如 Webpack)时。问题的根本原因在于新的 Node.js 版本默认启用了更严格的 OpenSSL 配置,而一些旧的软件可能不支持这些配置。
解决方案是设置一个环境变量,然后再构建:
export NODE_OPTIONS=--openssl-legacy-provider
yarn build:web
配置 JwtSecret:
echo "JwtSecret=GTX690" > .env
这里你可以根据你的需求,设置秘密文本,我这里设置的是GTX690
然后就是启动Fiora了:
yarn start
个人建议是使用Tmux
这类工具挂着:
tmux new -t fiora
yarn start
不出意外的话,至此,Fiora应该是可以正常运行了。
Fiora的管理和配置
相关的配置就写在项目目录下的.env
文件中,以键值对的形式存在,官方有详细的说明:https://yinxin630.github.io/fiora/zh-Hans/docs/config
写的很详细,我这里就不再赘述了。
但是,我在尝试运行自带的管理脚本的时候,出现问题了:
localhost:/mnt/data/fiora# fiora doctor
/mnt/data/fiora/packages/i18n/node.index.ts:15
return languages[locale][key] || enUS[key] || key;
^
TypeError: Cannot read properties of undefined (reading 'getUserIdDescription')
at Object.i18n [as default] (/mnt/data/fiora/packages/i18n/node.index.ts:15:29)
at Object.<anonymous> (/mnt/data/fiora/index.ts:14:22)
at Module._compile (node:internal/modules/cjs/loader:1358:14)
at Module.m._compile (/mnt/data/fiora/node_modules/ts-node/src/index.ts:1225:23)
at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
at Object.require.extensions.<computed> [as .ts] (/mnt/data/fiora/node_modules/ts-node/src/index.ts:1228:12)
at Module.load (node:internal/modules/cjs/loader:1208:32)
at Function.Module._load (node:internal/modules/cjs/loader:1024:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12)
at main (/mnt/data/fiora/node_modules/ts-node/src/bin.ts:330:12)
localhost:/mnt/data/fiora#
由于是Alpine Linux,默认最小化安装,所有有可能是缺了什么东西导致的问题。经过一番排查,我找到了问题所在——Locale支持缺失
以下是解决方案:
apk add libc6-compat libintl ettext
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
然后再运行管理工具就不会报错了。至此,搭建完成。
配置SSL
由于Fiora默认使用的是http通信,为明文通信,存在安全隐患,所以最好是用Nginx套一层反向代理实现Https的访问。
为了使用Https,你需要有一个域名,或者一个固定的IP地址用于签发证书。
以下是Nginx的配置文件:
server {
listen 80;
# 修改为你的域名
server_name chat.nekopara.uk;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
# 修改为你的域名
server_name chat.nekopara.uk;
# 修改为你的ssl证书位置
ssl_certificate /data/certs/nekopara_uk.pem;
ssl_certificate_key /data/certs/nekopara_uk.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_pass http://localhost:9200;
}
}
配置完成即可实现Https访问
DLC:修复Fiora背景覆盖问题
我个人推断,应该是当时碎碎酱设计Fiora的时候,还是1080P屏幕的天下,为了实现毛玻璃效果,图片没有设置成随着浏览器窗口大小进行缩放剪裁。正因如此,导致了现在在高分辨率屏幕拉伸窗口,超过默认图片背景大小后剩余部分就是白色,十分的不好看。并且背景图也没有能随着浏览器窗口改变大小,让我很不爽。
虽然我没用过nodejs,但是网页前端还是稍微懂一点的,解决这个问题很简单,为背景图的css样式添加两条css规则 backgroundPosition: center center;
和backgroundSize: cover;
即可。
然而,这个项目似乎是用nodejs生成的css样式和html代码,给我的改造工作带来了不小的阻力。
终于在阴差阳错下,我找到了对应的位置:fiora/packages/web/src/App.tsx
在这个文件的第99
行,就是要修改的位置,我贴出我修改那部分的代码:
// 主体样式
const style = useMemo(
() => ({
backgroundImage: `url(${backgroundImage})`,
backgroundSize: `${backgroundWidth}px ${backgroundHeight}px`,
backgroundRepeat: 'no-repeat',
backgroundPosition: 'center center',
backgroundSize: 'cover',
}),
[backgroundImage, backgroundWidth, backgroundHeight],
);
// 聊天窗口样式
const childStyle = useMemo(
() => ({
width: `${width * 100}%`,
height: `${height * 100}%`,
left: `${((1 - width) / 2) * 100}%`,
top: `${((1 - height) / 2) * 100}%`,
}),
[width, height],
);
// 模糊背景样式
const blurStyle = useMemo(
() => ({
...childStyle,
}),
[width, height, style, childStyle],
);
由于我技术水平有限,我只能把毛玻璃效果干掉了,如果要保留的话我不知道怎么设置图片的截取部分,这样子就直接让聊天背景透明了。
效果还行吧。
修改后的Fiora:Fiora.7z