本文最后更新于 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

以上完成后启动,服务端运行成功!

🎉