【Arch Linux】misskey 手动部署和配置

misskey 是一款开源的“跨星际”(interplanetary)社交平台,以微博为主要形式,界面美观,内含元素丰富。本文即针对该平台在 Arch Linux 的手动安装方式作说明。

笔者:为什么不用 docker 安装(这是官方认定 recommended 的安装方式)?只是不怎么想用 docker(

注意:基于 Arch Linux 发行版的特殊性(非开箱即用),笔者会尽可能多地补充安装过程,尽可能让读者能从头到尾依照本文操作。但若存在疏漏,敬请谅解。

检查系统配置

misskey 对服务端的性能配置要求较高,建议配置至少 2 核 CPU 和 4GB RAM。笔者使用的服务器部分配置如下(多人共有,但对 misskey 来说也已足够):

1
2
3
4
5
6
$ neofetch
# 省略部分输出
OS: Arch Linux x86_64
Kernel: 5.15.34-1-lts
CPU: AMD EPYC 7282 (4) @ 2.794GHz
Memory: 1590MiB / 7950MiB

安装

依赖

系统

安装所有依赖(这里假设读者已经安装了 sudo 并配置好相关权限):

1
2
3
4
5
sudo pacman -Syu  # 更新系统
sudo pacman -S sudo visudo nano base-devel python --needed
sudo python -m ensurepip --upgrade # 安装/升级 pip
sudo ln -sf /usr/bin/{nano,vi}
sudo visudo

在打开的编辑器 nano 中去除 #%wheel ALL=(ALL:ALL) ALL 一行前的注释,依次按 Ctrl+XyEnter 保存。

同时考虑到 pip 用户配置下 $PATH 环境变量问题,使用编辑器打开当前终端配置(例如 ~/.bashrc),添加如下行:

1
PATH=~/.local/bin:$PATH

misskey

官方文档中给出的 misskey 需要的依赖有:

  • Node.JS(16.x)
  • PostgreSQL(建议 12.x 或 13.x)
  • Redis
  • yarn(可选,若不安装,后续安装过程中 yarn 应替换为 npx yarn
  • FFmpeg

考虑到大部分软件的向后兼容性,可以直接安装所有依赖:

1
sudo pacman -S nodejs npm postgresql redis yarn ffmpeg --needed

用户

因笔者服务器环境中存在多用户、多管理情况,此处的操作与官方文档不同——创建了一个有 sudo 权限、可登录、有家目录的用户。

1
useradd -m -G wheel -s /bin/bash misskey

并使用 sudo passwd misskey 设置登录密码。

若依照官方文档,仅需:

1
useradd -r -s /usr/bin/nologin misskey

之后切换入该用户继续操作:su - misskey

下载源码

根据上文中用户创建方式,目录的路径可能不能完全如文中所述。请读者根据自身情况合理选择安装路径。

在终端中执行:

1
2
3
4
5
mkdir .opt
cd .opt
git clone --recursive https://github.com/misskey-dev/misskey.git
cd misskey
git checkout master

注意:截至本文编写时,misskey 源码库克隆大小 88.22MB,子库(misskey-assets)克隆大小 69.76MB。请自行选择是否“科学上网”或使用镜像站。

安装依赖库

在终端中执行:

1
yarn

注意:请自行选择是否“科学上网”或使用镜像站。

注意:该过程耗时较长。若无人值守,建议使用 tmuxscreen 防止 ssh 连接中断导致安装过程中断。

编译

在终端中执行:

1
NODE_ENV=production yarn build

注意:该过程耗时较长。若无人值守,建议使用 tmuxscreen 防止 ssh 连接中断导致安装过程中断。

初始化数据库

Postgresql

在终端中执行:

1
2
3
4
5
6
7
8
9
10
11
sudo -iu postgres  # 切换到 postgres 用户
initdb -D /var/lib/postgres/data
# (可选)修改 locale 和编码:
# initdb --locale=en_US.UTF-8 --encoding=UTF8 -D /var/lib/postgres/data
exit # 返回 misskey 用户
sudo systemctl enable postgresql --now
sudo systemctl status postgresql # 查看服务状态
# (可选)添加 SQL 操作历史文件
sudo touch /var/lib/postgres/.psql_history
sudo chown postgres:postgres /var/lib/postgres/.psql_history
sudo -u postgres psql

进入 Postgresql 操作界面,执行:

1
2
3
4
create database misskey;
create user misskey with encrypted password '{YOUR_PASSWORD}';
grant all privileges on database misskey to misskey;
\q

其中上面的 '{YOUR_PASSWORD}' 可以任意配置,但需要和后面的 misskey 配置文件保持一致。

Redis

在终端中执行:

1
2
sudo systemctl enable redis --now
sudo systemctl status redis # 查看服务状态

前置配置

.config 文件夹中复制 example.ymldefault.yml

1
cp .config/{example,default}.yml

然后使用编辑器编辑后者,例如 nano .config/default.yml。其中最重要的配置(不修改就会直接导致 misskey 跑不通)是:

1
2
3
4
5
6
7
8
9
10
11
12
13
#   ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────

db:
host: localhost
port: 5432

# Database name
db: misskey

# Auth
user: example-misskey-user
pass: example-misskey-pass

将其中的 user 配置项改为 user: misskeypass 配置项根据上面的配置保持一致。

初始化

在终端中执行:

1
2
yarn run init
NODE_ENV=production npm start

若在终端中看到类似如下的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
INFO *  [core boot]     Welcome to Misskey!
INFO * [core boot] Misskey v12.110.1
INFO * [core boot env] NODE_ENV: production
INFO * [core boot env] You do not have root privileges
INFO * [core boot nodejs] Version v17.9.0 detected.
DONE * [core boot config] Loaded
INFO * [core boot db] Connecting...
DONE * [core boot db] Connected: v14.2
DONE * [core boot] Misskey initialized
INFO * [core boot] Starting 1 worker...
(node:324552) ExperimentalWarning: Importing JSON modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
DONE * [core boot] All workers started
DONE * [core boot] Now listening on port 3000 on https://example.tld

则表示 misskey 部署成功。

配置

systemd 服务

可以配置 systemd 服务让其管理 misskey 的运行。新建 /etc/systemd/system/misskey.service,在编辑器中打开并填入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Misskey daemon

[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/.opt/misskey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always

[Install]
WantedBy=multi-user.target

然后分别通过 sudo systemctl start misskeysudo systemctl enable misskey 启动 misskey 并添加开机自启。

端口转发(反向代理)和 TLS

misskey 支持 HTTPS/SSL/TLS 。这需要配置相关证书,并设置端口转发(反向代理)。笔者使用的软件包是 nginx,并已在 Cloudflare 添加一个域名。

注意:部分免费二级域名(如 .cf、.tk)无法使用后文中提及的 Cloudflare API 自动更新 DNS 记录。请读者自行选用其他域名,或使用其他 DNS 服务。

证书

首先安装自动签发 Let’s Encrypt 证书的软件包 certbot:

1
python -m pip install certbot certbot-cloudflare-dns

为防止证书信息泄露(certbot 默认工作和日志目录均在 /etc/var 等文件夹中),先创建相关文件夹:

1
2
# 工作目录、日志目录、配置目录(存放证书)
mkdir -p ~/.var/letsencrypt ~/.logs/letsencrypt ~/.etc/letsencrypt

再写入 Cloudflare API 的相关配置文件:

1
2
mkdir -p ~/.secrets/certbot
echo 'dns_cloudflare_api_token = {API_TOKEN}' > ~/.secrets/certbot/cloudflare.ini

其中 {API_TOKEN} 表示 Cloudflare 账户的 API token。请参见 Cloudflare 和 Certbot 相关文档配置。

为保证安全性,建议为其重新配置权限:

1
2
chmod -R 700 ~/.secrets
chmod -R 600 ~/.secrets/certbot/cloudflare.ini

最后,在终端中执行:

1
2
# 此处使用 Cloudflare API 更新 DNS
certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini -d '{domain}' --config-dir ~/.etc/letsencrypt --work-dir ~/.var/letsencrypt --logs-dir ~/.logs/letsencrypt

其中 '{domain}' 是为 misskey 分配的域名。certbot 运行过程中需要同意相关服务条款并输入邮箱注册。

DNS

在 DNS 服务商(如 Cloudflare)中添加一条 A/AAAA 记录,从域名指向服务器的 IP 地址。

端口转发(反向代理)

在终端中执行:

1
2
sudo pacman -S nginx-mainline --needed
sudo systemctl enable nginx --now

再打开 /etc/nginx/nginx.conf,添加如下类似的配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 443 ssl http2;
server_name '{domain}';
error_log /var/log/nginx/log.log;

ssl_certificate /home/misskey/.etc/letsencrypt/live/'{domain}'/fullchain.pem;
ssl_certificate_key /home/misskey/.etc/letsencrypt/live/'{domain}'/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://localhost:3000;
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 Referer http://$host;
}
}

其中 '{domain}' 表示分配的域名。证书路径以实际情况为准。

最后重启 nginx 服务:

1
sudo systemctl restart nginx

misskey

打开 misskey 配置文件 ~/.opt/misskey/.config/default.yml,修改如下配置项:

1
2
3
4
5
#   ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────

# Final accessible URL seen by a user.
url: '{domain}'

设置为先前分配的域名。

最后重启 misskey 服务:

1
sudo systemctl restart misskey

特别致谢

感谢一位朋友“梦可味”在撰写本文前提供的在 Ubuntu 发行版中安装 misskey 的教程,其上有对多处踩坑的详细记录,让笔者能更快速地完成安装。之后会发布 misskey 在 Ubuntu 下的安装及配置教程。

参考

【Arch Linux】misskey 手动部署和配置

https://blog.tamako.work/techdev/arch/misskey/

Posted on

2022-04-29

Updated on

2022-07-13

Licensed under

Comments