搭建一只Misskey实例

  1. 1. 前世今生
  2. 2. 正式开始
    1. 2.1. 环境准备
    2. 2.2. 获取Misskey
    3. 2.3. 编辑配置
      1. 2.3.1. default.yml
      2. 2.3.2. docker.env
      3. 2.3.3. docker-compose.yml
    4. 2.4. 开始编译
      1. 2.4.1. 初始化数据库
      2. 2.4.2. 启动服务
    5. 2.5. 配置Nginx
    6. 2.6. 更新

前世今生

众所周知,随着技术门槛的不断降低,越来越多的信息时代的巨婴裹挟着上古时期的抽象文字、或是从某些不可名状的部位抠出来的肮脏字眼,呼嚎着不堪入耳的肮脏口号,用它们沾满鲜血与仇恨的破鞋狠狠践踏在往日宁静祥和的中推圈上。G+早已是历史,中推圈的环境也日益瓦房店化,总有越来越多莫名其妙的存在正不断出现并剥蚀着我们所剩无几的生存空间。既然此处已不适合生存,那是否应该以此为起点,重新寻找适合我们安安静静分享生活、认认真真研究技术、开开心心享受社交的环境呢?

我想,答案很早就已经出现了。越来越多的,以Mastodon为例的实例似乎为我们指出了新时代社交媒体的解决方案之一:去中心化、团聚管理,自己的实例可以精心设计,不喜欢的实例可以互相屏蔽。一切都显得那么简单,一切都是那么自由,每一个人都能获得属于每一个人自己的独特体验——哪怕只是为自己建设的单独实例。

大约是一年前,我曾写过一篇有关Mastodon安装的博文,然而当时的Twitter环境尚且还能接受,且Mastodon的配置相当繁琐,因此仅仅是趁着服务器还没过期的时候稍微支撑了一个小站,那看上去似乎有些许迟缓的UI设计也让人感到一种无力感由心而生。后来在有一次朋友说我那篇教程已经过时的时候,偶遇了Misskey这款同样是基于Fediverse开发的去中心化社交平台,因此不但在两种实例见可以进行跨平台的社交活动,而且Misskey的UI设计简单又可爱,难道还有什么可以犹豫的吗~(雾

正式开始

咳咳,开场白说完了,是时候该正式开始了。正好趁着CloudCone有限时活动,专门为我们的新服务器来开设一个节点吧。

注意一下,我今天买到的机子的IP是被墙掉的,所以无论是SSH还是开网站都需要代理。网站没关系,我放到CloudFlare上还能加一层保护,但SSH的话…魔法上网,启动~(弥天大雾

我个人习惯是使用Debian下的root账号作为部署环境,因为CentOS的某些包实在是太上古了,Ubuntu总给我一种桌面使用的幻视。因此,简单的部署工作完成之后,就可以正式开始来配置啦。

官方有提供比较详细的安装教程或是Docker部署教程,一步一步的跟着顺下去就可以啦~

这一次我仍旧选择了使用Docker来部署,因为安全总是第一位的嘛,要是被奇奇妙妙的家伙攻破服务器获取了数据,那就相当糟心啦~

环境准备

先来安装必要的依赖项吧,像curl啦,git啦,nginx啦这些之后都是需要使用到的呢~

1
apt install curl git nginx -y

如果还需要screen环境的话,也别忘了一并带上哦

要运行嘛,Docker肯定是少不了的。一年过去了,相比起手动搓命令行的方法,有没有什么快速部署Docker的官方解决方案呢?

1
bash <(curl -L -s https://get.docker.com)

这样确实是能自动安装docker,但有个坑就是不会自动安装docker-compose,我们追加安装一下吧,注意调整一下版本号,我写这篇文章的时候最新版是1.12.5,但随时都有可能会更新:

1
2
3
curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

最后一行是指创建了一个快捷链接,这样的话root也能能快乐使用docker啦

获取Misskey

这里参照官方教程,直接用git的方法获取最新的版本就可以的说呢=ω=

1
2
3
git clone -b master git://github.com/syuilo/misskey.git
cd misskey
git checkout master

没错的话现在获取的就是最新版本的程式啦

编辑配置

先把默认的配置文件都先复制一份吧

1
2
3
cd .config
cp example.yml default.yml
cp docker_example.env docker.env

接下来就是编辑具体的配置信息啦,记得用你喜欢的文本编辑器来实现哦

default.yml

这个是站点配置文件,具体的配置信息按照一般的方法来编辑就好啦~开发组贴心地在每一项之前都提供了介绍哦,所以不必担心有任何编辑上的难点的说呢~

首先是站点URL,别忘了改成自己站点的链接哦~

请注意,一旦实例启动之后请不要再修改这个参数,以免造成无法挽回的错误!

我们要让站点在docker下运行,因此指定http端口为3000,删除前面的注释符号:

在Docker环境下,数据库的地址并不是默认的localhost哦,地址的信息写在根目录下的 docker-compose.yml 里面,连接信息可以在 docker.env 下配置,这里给出一些默认的样例吧:

名称地址
Postgresqldb
Redisredis
Elasticsearches

别忘了和 docker.env 下的保持一致哦w

docker.env

这里给出每个配置项的含义吧

项目含义
POSTGRES_PASSWORD数据库密码
POSTGRES_USER数据库用户
POSTGRES_DB数据库名

docker-compose.yml

这个文件是控制docker联合启动的配置哒,在根目录下,别忘了切换路径哦w

已经过气的一点点小贴士(已经合并上啦,尽情享受吧!)

由于这个文件目前没有默认将用户上传的文件夹(在容器里是/misskey/files)映射出来,导致使用docker部署的容器在版本更新的时候会出现文件丢失。我已经提交了一个PR#6598用于修复此问题,但在官方合并PR请求之前,还是先手动加上吧:

可以参照改变的文件来修改docker-compose.yml文件哦,在misskey的networks下加入这样的内容就可以啦:

1
2
volumes:
- ./files:/misskey/files

别忘了调整缩进哦~

开始编译

开始之前建议使用screen环境,这样的话即使中途连接断开,也不至于发生太过悲惨的情况啦

1
docker-compose build

由于这个平台会使用webpack把整个前端项目打包,并且有一大堆的参数设置来配置,因此编译起来相当耗时耗资源;同时由于可能是依赖关系没有完全配置好,导致在处理依赖的时候会报大量的无效错误。唯一让我感到欣慰的,大概是它能克服重重的阻挠,最终完成项目的编译吧。

初始化数据库

使用如下指令来初始化数据库,这点和Mastodon有点像:

1
docker-compose run --rm web yarn run init

经过几分钟的等待之后也就完成啦:

启动服务

还在等什么呢~赶紧启动服务吧!

1
docker-compose up -d

注意,由于这个平台集成度非常高,所以需要相当一段时间来启动,并不是配置错误了哦~

配置Nginx

由于我们使用Docker来运行,因此并不是直接就能访问到Misskey的端口(3000)的,我们需要配置一下反向代理相关的配置文件。

Misskey官方默认提供了一份参考样例,路径为./docs/examples/misskey.nginx,配置时您可以参考着使用,我使用的是自定的方案。

以我的站点 nya.one 为例,可以使用如下的配置,您的站点配置的时候别忘了根据实际情况再行调整哦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
listen [::]:80;
server_name nya.one;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name nya.one;
## SSL
ssl_certificate /etc/nginx/ssl/nyaone.cer;
ssl_certificate_key /etc/nginx/ssl/nyaone.key;

## reverse proxy
location / {
proxy_pass http://127.0.0.1:3000;
client_max_body_size 64m;
include conf.d/shared/revproxy.conf;
}

}

其中 conf.d/shared/revproxy.conf 为手动创建的通用的代理配置,放置在 /etc/nginx/conf.d/shared/revproxy.conf ,内容如下:

1
2
3
4
5
6
7
8
9
10
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;

完成!别忘了生成一张CloudFlare自签证书安装到指定的位置去哦~

nginx -t 来测试一下吧,一切正常的话就可以 nginx -s reload 重载nginx服务,快乐地访问站点啦!

更新

如果版本不是最新了,要试着更新一下Misskey,该怎么做呢?其实也很简单哦,只要使用这些指令就可以啦:

1
2
3
4
5
6
7
git stash
git checkout master
git pull
git stash pop
docker-compose build
# 请仔细检查升级日志以获取数据库迁移信息,并对数据库做出必要的修改。
docker-compose stop && docker-compose up -d