静看光阴荏苒
不管不顾不问不说也不念

Fluxer:免费开源的即时通讯和VoIP聊天应用

Fluxer目前还处于Beta测试阶段,但已经是我见过的开源软件当中仿Discord完成度最高的了。现已支持如下功能:

  • 消息:与好友私信、群聊,通过频道建立社区
  • 语音和视频:与好友通话或共享屏幕,一起协作
  • 管理工具:通过身份组、权限和日志,让你的社区高效运行
  • 搜索和快速切换:查找历史消息,或快速切换社区和频道
  • 自定义:上传自定义表情和贴纸。保存图片、视频、GIF和音频
  • 自托管:在你的硬件上运行带有Web UI的Fluxer服务器

虽然这个项目目前来看非常值得期待,但是如果你打算自托管的话,这里我可能要给你泼一盆冷水了,目前这个项目的架构极其复杂,当你使用Docker部署的时候,它需要启动足足24个容器:

不过好在官方的部署文档足够详细,且我认为官方对自托管的步骤做了一定的优化,如果你不介意让Caddy容器独占服务器的80 / 443端口,那么其实整个项目部署起来不算麻烦。鉴于此本文不对官方的部署步骤做修改,全部照搬官方文档的步骤,只在一些容易出问题的地方重点说明一下。

部署前的准备:

  • 服务器至少拥有2个虚拟CPU、4GB内存和20GB磁盘空间
  • 服务器的80/tcp,443/tcp端口不能被其它程序占用
  • 服务器的7881/tcp,7882/udp端口不能被其它程序占用
  • 实例的域名,本文示例:chat.example.com

启动时是最耗内存的阶段,因为所有服务的镜像都会同时初始化,4GB内存是最低运行要求,对于小型活跃社区建议使用8GB内存或更多。

安装Docker:

apt update
apt install curl
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

创建工作目录并下载需要用到的文件:

cd /opt
mkdir fluxer
cd fluxer

base=https://raw.githubusercontent.com/fluxerapp/fluxer/main/deploy/self-hosting
curl -fsSLO "$base/docker-compose.yml"
curl -fsSLO "$base/Caddyfile"
curl -fsSLO "$base/livekit.yaml"
curl -fsSL "$base/.env.example" -o .env

你现在应该拥有这些文件:

docker-compose.yml
Caddyfile
livekit.yaml
.env

编辑.env环境变量配置文件:

nano .env

我们使用Caddy容器直接获取证书,所以必须正确配置如下内容:

FLUXER_DOMAIN=chat.example.com
FLUXER_PUBLIC_SCHEME=https
FLUXER_PUBLIC_PORT=443
FLUXER_CADDY_SITE_ADDRESS=chat.example.com
FLUXER_VAPID_EMAIL=imlala@example.com

[可选]配置SMTP:

FLUXER_EMAIL_ENABLED=false
FLUXER_EMAIL_PROVIDER=none
FLUXER_EMAIL_FROM_EMAIL=noreply@example.com
FLUXER_EMAIL_FROM_NAME=Fluxer
FLUXER_EMAIL_SMTP_HOST=
FLUXER_EMAIL_SMTP_PORT=587
FLUXER_EMAIL_SMTP_USERNAME=
FLUXER_EMAIL_SMTP_PASSWORD=
FLUXER_EMAIL_SMTP_SECURE=true

.env文件里的其它内容不用手动配置,全部使用如下命令,一次性生成所需的全部密钥:

for key in POSTGRES_PASSWORD MEILI_MASTER_KEY FLUXER_S3_SECRET_KEY \
  FLUXER_SUDO_MODE_SECRET FLUXER_CONNECTION_INITIATION_SECRET \
  FLUXER_GATEWAY_RPC_AUTH_TOKEN FLUXER_MEDIA_PROXY_SECRET_KEY \
  FLUXER_ADMIN_SECRET_KEY_BASE FLUXER_ADMIN_OAUTH_CLIENT_SECRET \
  LIVEKIT_API_SECRET; do
  sed -i "s|^$key=.*|$key=$(openssl rand -hex 32)|" .env
done

sed -i "s|^FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64=.*|FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64=$(openssl rand -base64 32)|" .env

VAPID=$(docker run --rm node:24-alpine npx --yes web-push generate-vapid-keys --json)
pub=$(printf '%s' "$VAPID" | grep -o '"publicKey":"[^"]*"' | cut -d'"' -f4)
priv=$(printf '%s' "$VAPID" | grep -o '"privateKey":"[^"]*"' | cut -d'"' -f4)
sed -i "s|^FLUXER_VAPID_PUBLIC_KEY=.*|FLUXER_VAPID_PUBLIC_KEY=$pub|" .env
sed -i "s|^FLUXER_VAPID_PRIVATE_KEY=.*|FLUXER_VAPID_PRIVATE_KEY=$priv|" .env

接下来为域名创建DNS记录,Caddy将使用你之前配置的FLUXER_CADDY_SITE_ADDRESS=chat.example.com自动申请和续​​订证书:

A chat.example.com ---> 服务器的公网IPv4
AAAA chat.example.com ---> 服务器的公网IPv6(可选)

按正常情况来说,接下来就可以启动了,但是这里有个坑,我提前替你们踩了。

因为它一次性要启动24个容器,对于一般的服务器来说可能有点顶不住(性能不太够),再加上它使用的是seaweedfs作为s3对象存储服务,seaweedfs本来启动时加载各个组件就慢,再加上其它的容器一怼,大概率会导致seaweedfs-init容器的初始化失败。

一旦这个容器初始化失败了,就会导致S3存储桶无法成功创建,你后续在Fluxer上传头像、表情包、贴纸都会报错500,见此issue:#1164。这个issue里面有解决方法,但是我仔细看了下并没有完全解决问题,而且他那个解决方法也不是最优解,这里记录下我的解决思路。

既然是容器内服务启动优先级问题,那我加一个健康检查不就行了,编辑compose文件:

nano docker-compose.yml

将seaweedfs / seaweedfs-init服务的配置修改为如下内容:

services:
  seaweedfs:
    image: chrislusf/seaweedfs:4.34
    restart: unless-stopped
    networks: [fluxer]
    command: ["server", "-s3", "-dir=/data"]
    volumes:
      - seaweedfs-data:/data
    healthcheck:
      test: ["CMD-SHELL", "test -S /tmp/seaweedfs-filer-grpc-18888.sock || exit 1"]
      interval: 2s
      timeout: 2s
      retries: 10
      start_period: 10s

  seaweedfs-init:
    image: chrislusf/seaweedfs:4.34
    networks: [fluxer]
    depends_on:
      seaweedfs:
        condition: service_healthy
    restart: "no"
    entrypoint:
      - /bin/sh
      - -c
      - >
        for i in $$(seq 1 60); do
          echo "s3.bucket.create -name fluxer" | weed shell -master=seaweedfs:9333 >/dev/null 2>&1 && break || sleep 2;
        done;
        for b in fluxer fluxer-uploads fluxer-downloads fluxer-reports fluxer-harvests; do
          echo "s3.bucket.create -name $$b" | weed shell -master=seaweedfs:9333 || true;
        done;
        echo "buckets ready";

seaweedfs容器启动后,里面的服务启动还得很长一段时间,尤其是S3服务,所以这里探测/tmp/seaweedfs-filer-grpc-18888.sock套接字是否创建,只要这个GRPC套接字创建了,那seaweedfs的S3服务就肯定是起来了的,那么seaweedfs-init服务用于创建S3存储桶的脚本肯定就能执行成功了。

现在我们就可以启动整个堆栈了:

docker compose up -d

有关实例的备份和升级,请参阅官方的文档:

https://docs.fluxer.app/operator/get-started/#backups
https://docs.fluxer.app/operator/get-started/#upgrading

群聊、私聊、URL预览、文件上传、表情包、贴纸和管理员面板,都可以正常工作:

此项目的开发团队目前正大力开发中,基本上是一天发一个版,BUG肯定还是有点多的,再加上这24个容器的架构,说真的,我有点不敢用,我觉得可以再观望一下。。。

赞(0)
未经允许不得转载:荒岛 » Fluxer:免费开源的即时通讯和VoIP聊天应用
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

分享创造快乐

广告合作资源投稿