搭建去中心化分布式短文社交平台 Misskey
本文最后更新于 2023-09-05,文章内容可能已经过时。
什么是 Misskey
Misskey 是一个兼容 ActivityPub 协议的 Fediverse 短文社交平台。简单地说,它就像去中心化的 Twitter 或 微博。这些平台的“分布性”体现在:互联网上有许多服务器,运行着这些平台软件。这些服务器相对独立,而用户就注册在这些服务器(为讨论方便,把用户注册的服务器称为其的Homeserver)上,他们可以在服务器上发类似推文或微博的短文,体验和 Twitter 类似。然而,如果用户只能和 Homeserver上的人社交,那就太无聊了(当然,也不是不可以,后面会提到)。 因此,上述问题就引出了“联邦”的概念。在 Fediverse(联邦宇宙)中,各服务器之间使用统一的协议进行沟通,建立起了“联邦”关系。联邦关系让一台服务器可以将用户发的内容(有条件地)同步到网络中的其它服务器。这样,我可以在自己的服务器上关注其它服务器的用户,在我的时间线上看到他们发的短文,并评论、转发、点赞。甚至,我可以在全局时间线上看到所有和我的Homeserver联邦的服务器发来的内容(Misskey 世界称为 Note,对标 Twitter 的推文、微博的微博和Mastodon的嘟文)。 当然,数据的同步是有条件的,一般服务器并不会把所有本地用户的动态转发到所有服务器。后方会详细讨论这带来的问题。 那么,为什么要离开 Twitter 或者微博这样的中心化的社交工具,而转而使用一个更复杂的方案呢?答案是显而易见的——为了掌握数据的控制权与规避平台对内容的影响。 通过去中心化社交,个人的数据的掌控权从 Twitter 或微博转移到了他们的 Homeserver。同时很多平台软件提供了方便的将 Homeserver 导出的工具,进一步让用户在各个 Homeserver 的迁移成为了可能。至于平台,Twitter 在被 Elon Musk 收购后开始高强度发病,而夹总就众所周知了。同时,这些平台也让我们逃离推荐算法成为了可能,一定程序上避免了被动信息茧房的形成。另外这些平台也对 Bot 更友好。 实际上,Fediverse 的短文软件远不止 Misskey。短文平台还包括最成熟、用户最多的 Mastodon、Pleroma和轻量的 Soapbox。还有一些非短文性质(如分享视频)的平台,如PeerTube。更多常用平台可以去 https://fediverse.party/ 了解。而相较于自建平台的人,远远更多的人会选择加入一个已经有很多人的 Fediverse 平台。
一些常见的实例
Misskey.io:Misskey社区最大实例,日语为主
Misskey.cf:Misskey社区比较大的日语实例
mstdn.jp:Mastodon日语比较大的实例
m.cmx.im:长毛象中文站,Mastodon简中最大实例,巨量键政内容
o3o.ca:嘟站,Mastondon简中较大实例
wxw.moe:呜呜站,Mastodon简中较大实例,ACGN主题,一般禁键政
hello.2heng.xin:小森林,Mastodon简中的中小实例,ACGN/萌宠主题,一般禁键政
nya.one:喵窝,Misskey简中中小实例,ACGN主题
可以注意到很多实例有比较明显的“主题”。在这些实例的“本地”(即所有本服务器内的用户的动态)会和这些主题强贴合,适合对这些主题有兴趣的人加入。在足够大的实例上,有很多人会检查自己Homeserver的本地时间线。
Linux
官方搭建文件 docker-compose
version: "3"
services:
web:
# build: . # 注释本地构建
image: misskey/misskey:latest # 使用官方镜像
restart: always
container_name: misskey_web
links:
- db
- redis
ports:
- "127.0.0.1:3000:3000"
networks:
- internal_network
- external_network
volumes:
- ./files:/misskey/files # 用户文件映射目录
- ./config:/misskey/.config:ro # 配置文件映射目录
redis:
restart: always
image: redis:4.0-alpine
container_name: misskey_redis
networks:
- internal_network
volumes:
- ./redis:/data # redis 文件夹映射目录
db:
restart: always
image: postgres:12.2-alpine
container_name: misskey_db
networks:
- internal_network
env_file:
- ./config/docker.env # Docker 环境变量文件路径
volumes:
- ./db:/var/lib/postgresql/data # 数据库文件夹映射目录
networks:
internal_network:
internal: true
external_network:
将上面的 docker-compose.yml
文件保存在合适的路径下(例如:/home/web/misskey/),然后进入该路径,新建用于存放配置文件的文件夹:
mkdir config
进入 config 文件夹
需要准备两个文件:
参照官方示例的 docker_example.env 文件,修改数据库相关信息后保存为
docker.env
;参照官方示例的 example.yml 文件,修改后保存为
default.yml
,主要需要修改下列内容,其中数据库名和验证信息需要和上面docker.env
中的一致。url: [你的域名] db: host: db port: 5432 # Database name db: misskey # Auth user: [数据库用户] pass: [数据库密码] redis: host: redis
docker-compose run --rm web yarn run init #初始化
运行项目
docker-compose up -d
# 停止运行
# docker-compose stop
配置 Nginx 反代
完整的文件可以参考官方示例,这里只贴出反代部分:
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_redirect off;
# If it's behind another reverse proxy or CDN, remove the following.
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# For WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
更新,直接 pull 然后重启启动即可:
docker-compose pull
docker-compose up -d
Unraid
先创建一个容器
参考填写
misskey #容器名
misskey/misskey:latest
http://[IP]:[PORT:3000]
添加其他参数
3000:3000 #端口映射
/misskey/files:/mnt/user/appdata/misskey/files
/misskey/.config:/mnt/user/appdata/misskey/.config
启动,在日志可以看到少了配置文件default.yml
去到github的仓库(misskey-dev),在.config文件夹中,下载example.yml文件。
打开修改example.yml文件
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Misskey configuration
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────
# Final accessible URL seen by a user.
url: https://www.oneisall.one #修改url为IP+端口号 这个设置影响相关文件图片的访问路径 如果公开网络访问填写公网ip+端口号
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!
# ┌───────────────────────┐
#───┘ Port and TLS settings └───────────────────────────────────
#
# Misskey requires a reverse proxy to support HTTPS connections.
#
# +----- https://example.tld/ ------------+
# +------+ |+-------------+ +----------------+|
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
# +------+ |+-------------+ +----------------+|
# +---------------------------------------+
#
# You need to set up a reverse proxy. (e.g. nginx)
# An encrypted connection with HTTPS is highly recommended
# because tokens may be transferred in GET requests.
# The port that your Misskey server should listen on.
port: 3000
# You can also use UNIX domain socket.
# socket: /path/to/misskey.sock
# chmodSocket: '777'
# ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────
db:
host: 192.168.100.22
port: 5432
# Database name
db: misskey
# Auth
user: postgres
pass: postgres
# Whether disable Caching queries
#disableCache: true
# Extra Connection options
#extra:
# ssl: true
dbReplications: false
# You can configure any number of replicas here
#dbSlaves:
# -
# host:
# port:
# db:
# user:
# pass:
# -
# host:
# port:
# db:
# user:
# pass:
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
redis:
host: 192.168.100.22
port: 6379
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
#pass: example-pass
#prefix: example-prefix
#db: 1
# You can specify more ioredis options...
#username: example-username
#redisForPubsub:
# host: localhost
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
# # You can specify more ioredis options...
# #username: example-username
#redisForJobQueue:
# host: localhost
# port: 6379
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
# #pass: example-pass
# #prefix: example-prefix
# #db: 1
# # You can specify more ioredis options...
# #username: example-username
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────
#meilisearch:
# host: localhost
# port: 7700
# apiKey: ''
# ssl: true
# index: ''
# scope: local
# ┌───────────────┐
#───┘ ID generation └───────────────────────────────────────────
# You can select the ID generation method.
# You don't usually need to change this setting, but you can
# change it according to your preferences.
# Available methods:
# aid ... Short, Millisecond accuracy
# meid ... Similar to ObjectID, Millisecond accuracy
# ulid ... Millisecond accuracy
# objectid ... This is left for backward compatibility
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# ID SETTINGS AFTER THAT!
id: 'aid'
# ┌─────────────────────┐
#───┘ Other configuration └─────────────────────────────────────
# Whether disable HSTS
#disableHsts: true
# Number of worker processes
#clusterLimit: 1
# Job concurrency per worker
#deliverJobConcurrency: 128
#inboxJobConcurrency: 16
#relashionshipJobConcurrency: 16
# What's relashionshipJob?:
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
# Job rate limiter
#deliverJobPerSec: 128
#inboxJobPerSec: 16
#relashionshipJobPerSec: 64
# Job attempts
#deliverJobMaxAttempts: 12
#inboxJobMaxAttempts: 8
# Local address used for outgoing requests
#outgoingAddress: 127.0.0.1
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128
proxyBypassHosts:
- api.deepl.com
- api-free.deepl.com
- www.recaptcha.net
- hcaptcha.com
- challenges.cloudflare.com
# Proxy for SMTP/SMTPS
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
# Media Proxy
# Reference Implementation: https://github.com/misskey-dev/media-proxy
# * Deliver a common cache between instances
# * Perform image compression (on a different server resource than the main process)
#mediaProxy: https://example.com/proxy
# Proxy remote files (default: true)
# Proxy remote files by this instance or mediaProxy to prevent remote files from running in remote domains.
proxyRemoteFiles: true
# Movie Thumbnail Generation URL
# There is no reference implementation.
# For example, Misskey will point to the following URL:
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
#videoThumbnailGenerator: https://example.com
# Sign to ActivityPub GET request (default: true)
signToActivityPubGet: true
#allowedPrivateNetworks: [
# '127.0.0.1/32'
#]
# Upload or download file size limits (bytes)
#maxFileSize: 262144000
去到应用商店“APPS”,搜索“postgresql”
建议把 Database Storage Path 的路径修改为 /mnt/user/appdata/postgresql14
打开命令行
注意:使用命令行前,都要注意当前状态。
切换到postgres用户
su postgres
进入控制台
psql
创建数据库
create database 表名;
create database misskey; #创建misskey的数据库
如果穿件不成功请检查
;
符号是否正确。
查看所有数据库
list
修改example.yml文件中postgres部分
# ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────
db:
host: 192.168.100.22
port: 5432
# Database name
db: misskey
# Auth
user: postgres
pass: postgres
# Whether disable Caching queries
#disableCache: true
# Extra Connection options
#extra:
# ssl: true
去到应用商店“APPS”,搜索“redis”
安装过程全部默认即可。
进入Redis命令行界面redis-cli
# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
发送ping命令测试,检查redis服务是否正常工作,运行正常退出即可。
修改example.yml文件中修改redis部分,
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
redis:
host: 192.168.100.22
port: 6379
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
#pass: example-pass
#prefix: example-prefix
#db: 1
# You can specify more ioredis options...
#username: example-username
修改完后,将文件 example.yml
重命名为 default.yml
,放到映射路径.config
下即 /mnt/user/appdata/misskey/.config
以上完成后启动,服务端运行成功!
🎉
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ONEISALL !