我们都在被监控着

众所周知,在现代的信息社会,想保持不被监控是非常困难的事情。由于种种原因,总有人会希望监控你。
例如,某些视频平台(例如B站)为了提高视频推送准确度,不惜用各种手段刺探用户喜好,虽然我不好说是用了什么手段,因为没有调查就没有发言权,但是有我这种感受的人估计不在少数。我就有过类似的经历:在QQ群谈论一个事物(例如洋垃圾平台),然后打开B站首页给你推的就是刚刚你谈论过的平台相关的内容,细思极恐啊兄弟们!
还有一些购物网站也会这样,为了分析用户喜好,也会想尽各种办法来刺探用户的兴趣。我也有过刚谈论完某个感兴趣的物品,淘宝或者闲鱼一打开就是相关内容。给人各种不爽。
值得一提的是,在我们日常生活中,对个人隐私泄漏最严重的设备是——手机。手机也是我最鄙视的电子产品之一,尤其是现在国内手机厂商开始搞封闭,限制用户自己安装应用,非要从他们提供的如同公厕一般的垃圾应用商店去下载APP。无语至极!你想换个系统?或者删掉自带的垃圾应用(例如广告浏览器)?没门,新的国内安卓系统已经给你堵死了,解锁Bootloader更是不可能。既然都要封闭起来给用户喂屎,为什么我不选择应用商店环境更好的苹果?
扯远了。。。
那么,在现在这个信息化时代,还有没有办法说悄悄话呢?答案是肯定的,绝对有办法,而且方法很多。
例如:用记事本写下相关的消息,然后使用约定好的密码加密压缩打包后发送。或者,如果有能力的,可以自己写一套简单的文本消息加密算法。
而这次,我打算尝试搭建一个有趣的开源项目——Fiora

Fiora是什么?

Fiora是由碎碎酱使用node.jsreactsocket.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屏幕的天下,为了实现毛玻璃效果,图片没有设置成随着浏览器窗口大小进行缩放剪裁。正因如此,导致了现在在高分辨率屏幕拉伸窗口,超过默认图片背景大小后剩余部分就是白色,十分的不好看。并且背景图也没有能随着浏览器窗口改变大小,让我很不爽。
Screenshot_20250313_001536.png
虽然我没用过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],
    );

由于我技术水平有限,我只能把毛玻璃效果干掉了,如果要保留的话我不知道怎么设置图片的截取部分,这样子就直接让聊天背景透明了。
Screenshot_20250313_004424.png
效果还行吧。
修改后的Fiora:Fiora.7z