Featured image of post Misskey

Misskey

啰嗦预警

多图预警

购买 VPS

⚠️不要买机房在大陆的服务商 VPS ⚠️

在备案通过之前 80 和 443 端口是封禁的 -> 无法申请 SSL 证书 -> Misskey 需要 SSL 才能访问,GG

(即使没有这个问题,买大陆节点的服务建站也是一种自杀行为)

注册 Vultr 账号,充值

image-20221120012614543

创建 VPS

image-20221120012203832

选 Cloud Computer

CPU 选 AMD 和 Intel 都行

机房位置选择日本、新加坡、美西都行,一般不推荐欧洲(对于中国国内)

选择操作系统:Ubuntu 22.10 x64

选择 Size:$5 的 1C1G1TB 套餐(记得勾选 No Thanks)

关闭自动备份,省 $1

Additional Features:勾选 Enable IPv6

这时底部付款栏应该显示 $5.00/month ,点击 Deploy Now 确认创建服务器,等待一会,等 Status 变成 Running 就好了

image-20221120012909994

点击刚刚创建的 VPS,看到如下界面。

左下角的 IP Address、Username、Password 是待会连接服务器的时候,要用到的 SSH 连接信息

image-20221120013010174

  1. 登录 VNC:查看控制台,类似 Xshell 但是功能没那么丰富
  2. 关机:就和关电脑一样(关机的时候仍然在计费哦!)
  3. 重启:就和重启电脑一样
  4. 重装系统:把服务器重置成刚创建时的状态
  5. 销毁/删除:销毁了服务器就不计费了,数据丢失,无法找回

Snapshots:快照,指将当前 VPS 的状态保存下来,对 VPS 进行完整备份

服务器创建完成

检查 IP

Ping 一下 IP

image-20221120013147886

用检查工具比如 https://ip112.cn/ 检查 IP,此 IP 可用

image-20221120013305544

域名

在域名商 Dynadot 注册账号,买一个域名

解析域名

依次点击

image-20221120013439245

暂停⏸️

CloudFlare 注册登录账号,依次操作:

添加新站点

image-20221120013614146

输入你的域名

image-20221120013635155

选择免费方案

添加 DNS 解析记录

* 是通配符,意思是我的二级域名,xxx.ponderduck.cc 的 DNS 解析也一起被接管了。不用我一个一个设置

第二行是域名本体

www 让输入 www.ponderduck.cc 也能访问

复制 CloudFlare 提供的两个名称服务器,填进 Dynadot 的 DNS 设置,保存

回到 CloudFlare 点击 Done, check nameservers,等一会

测试,ping 你的域名,返回服务器 IP 说明解析生效

✅域名解析完成

配置 VPS

对哪一步不自信,可以在开始做之前先去服务器管理面板创建一个快照(snapshots),快照就是存档点

远程连接

Win 用户推荐用 Xshell,Mac 用自带的 Terminal 就可以

1
ssh [email protected] # 换成你的ip地址,回车

然后把密码从 vultr 复制过来回车,连接成功则会看到类似这样的提示:

安全设置

因为 root 权限太太太强大,为了避免婴儿(我)拿核武器发射按钮的情况出现,创建一个普通用户日常使用

新建普通用户并设定密码

1
adduser vpsadmin

然后输入密码-确认密码(太简单会被拒绝==)

赋予 「vpsadmin」 使用 sudo 指令的权限

什么是 su 和 sudo 请看:Linux 的 su 與 sudo 指令教學與範例

1
sudo adduser vpsadmin sudo

另外开一个终端窗口,登录 vpsadmin 账号

1
ssh [email protected] # 换成你的IP,回车,然后输入密码

验证是否获得 sudo 权限

1
sudo ls -al /root

返回类似内容(展示 /root 目录下的资料)就表示成功了

禁止 root 登录

登录 root 账户,输入

1
nano /etc/ssh/sshd_config

使用 control + W 进入搜索模式,输入 PerimitRootLogin 并回车,找到所在行,改成(记得要取掉注释 #!!)

1
PermitRootLogin: no

*prohibit-password/without-password 意为禁止密码登录

使用 control + O,保存更改,control + X 退出

重新启动 SSH 服务

1
sudo /etc/init.d/ssh restart

打开一个新窗口,尝试用 root 登录

✅成功禁止 root 登录

从现在开始,用「vpsadmin」这个账户远程连接 VPS 吧

搭建环境

修改服务器时间

查看时间

1
timedatectl

列出所有时区

1
timedatectl list-timezones

改成香港🇭🇰

1
sudo timedatectl set-timezone Asia/Hong_Kong

安装常用命令

1
sudo apt-get install curl wget screen tree -y

*curl用于请求 Web 服务器

*wget用来下载软件包

*screen用于命令行终端的窗口切换

*tree用于显示当前文件夹的目录结构

(如果你有其它要用的也一起加进来,或者要用了再用这个命令单独安装也可以)

添加 SWAP

swap 是 Linux 中的虚拟内存,用于在物理内存不足的情况下储存临时数据,可以提升小内存 VPS 的运行效率

确认是否已存在 SWAP

1
free -m

有 Swap 项而且 total 列不为零,说明 Swap 已存在,可以自行修改分区容量,参考:为 Linux 添加 swap 分区或修改 swap 分区容量

配置防火墙

1
2
sudo ufw allow OpenSSH
sudo ufw enable

打开防火墙

1
2
sudo ufw allow http
sudo ufw allow https

打开 80、443 的端口

1
2
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

(其它服务需要的端口也用 sudo ufw allow xx/tcp 开启)

验证防火墙是否打开,端口是否开启

1
sudo ufw status

和其它服务商不同,Vultr 没有默认防火墙设置,所以要自己开启

在 Vultr 添加防火墙规则

安装 Docker 和 Docker Compose

*Compose 是 Docker 的一个命令行工具,通过 yml 文件定义、创建、管理多容器的 Docker 应用

跟着 如何在 Ubuntu 22.04 LTS 中安装 Docker 和 Docker Compose 丝滑完成安装

推荐:Docker Commands Tutorial | Getting Started With Docker In Linux

修改 Docker 配置

Docker 的配置文件路径是 /etc/docker/daemon.json,需要手动创建:

进入 /etc 目录

1
cd /etc

进入 docker 目录

1
cd docker

用 vim 编辑 daemon.json 文件

1
sudo vim daemon.json

进入 vim 后输入如下内容,这段代码会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,限制日志文件的大小(20M),限制日志文件数量,防止 Docker 日志过多占用硬盘

(代码来自烧饼博客

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "20m",
        "max-file": "3"
    },
    "ipv6": true,
    "fixed-cidr-v6": "fd00:dead:beef:c0::/80",
    "experimental":true,
    "ip6tables":true
}

⚠️ vim 和普通键入略有不用

  • 首先 I 进入编辑模式,输入内容(注意格式:大括号 {} 里的内容除了最后一行,都必须用英文逗号 , 结尾)

  • 完成输入后,按 esc 回到一般模式

  • 输入 :wq ,回车(意为保存-离开)

  • 不放心可以再次进入 daemon.json 检查是否成功写入,效果类似:

了解:Linux vi/vim 是什么,怎么使用

重启 Docker 服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker
检查 Docker 是否正在运行
1
sudo systemctl status docker

换个方式,再测试一下

1
sudo docker run hello-world

终于成功了 😭

文件管理

给 Docker 的数据和配置文件新建一个文件夹

1
mkdir -p data/docker_data

Misskey

创建安装目录

之前给 Docker 的数据和配置文件新建一个目录 docker_data,这个文件夹就是包住整个 Misskey 的盒子

进入目录

1
cd data/docker_data

创建 misskey 文件夹

1
sudo mkdir misskey

配置安装文件

进入 misskey 文件夹

1
cd misskey

创建并编辑 yml 文件,让它去部署

1
sudo vim docker-compose.yml

把以下内容粘贴进去

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Misskey minimal deploy config
version: "3"

services:
  web:
    restart: unless-stopped # always意味着自动重启,请注意如果您对您的配置没有信心,请不要开启这个选项,以避免进程崩溃反复重启耗费大量资源!
    image: misskey/misskey:latest # 这里使用了官方镜像,以避免本地构建时资源不足的问题
    container_name: misskey_web # 容器名,方便管理,您可以自行修改为您觉得合适的内容
    links:
      - db
      - redis
    ports:
      - "3001:3001"
    networks:
      - internal_network
      - external_network
    volumes:
      - ./config:/misskey/.config:ro # 用于映射配置文件,请根据您的实际配置来决定文件夹名称,设定为只读即可;
      - ./files:/misskey/files # 用户上传到本地的文件,如果您一开始就接入外部存储(如wasabi或是AWS S3)您可以忽略这块配置

  redis:
    restart: unless-stopped
    image: redis:latest
    container_name: misskey_redis
    networks:
      - internal_network
    volumes:
      - ./redis:/data # redis数据库的数据文件夹映射,创建后默认在 ./redis 文件夹中

  db:
    restart: unless-stopped
    image: postgres:12.2-alpine
    container_name: misskey_db
    networks:
      - internal_network
    env_file:
      - ./config/docker.env # 需要使用配置文件中设置的 Docker 环境变量
    volumes:
      - ./db:/var/lib/postgresql/data # 主数据库的数据文件夹映射,创建后默认在 ./db 文件夹中

networks:
  internal_network: # 内部网络
    internal: true
  external_network: # 外部网

esc ,按 :wq ,回车(保存-退出)

创建 config/default.yml 目录并进入 yml 文件中

1
2
3
sudo mkdir config
cd config
sudo vim default.yml

填入以下内容

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Misskey configuration
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

#   ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────

# Final accessible URL seen by a user.
url: https://ponderduck.cc/       # 注意改成自己最后反向代理想要的网址

# 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: 3001

#   ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────

db:
  host: db
  port: 5432

  # Database name
  db: misskey

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

  # Whether disable Caching queries
  #disableCache: true

  # Extra Connection options
  #extra:
  #  ssl: true

#   ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────

redis:
  host: redis
  port: 6379
  #family: 0  # 0=Both, 4=IPv4, 6=IPv6
  #pass: example-pass
  #prefix: example-prefix
  #db: 1

#   ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────

#elasticsearch:
#  host: localhost
#  port: 9200
#  ssl: false
#  user: 
#  pass: 

#   ┌───────────────┐
#───┘ 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

# Job rate limiter
# deliverJobPerSec: 128
# inboxJobPerSec: 16

# Job attempts
# deliverJobMaxAttempts: 12
# inboxJobMaxAttempts: 8

# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4

# Syslog option
#syslog:
#  host: localhost
#  port: 514

# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128

#proxyBypassHosts: [
#  'example.com',
#  '192.0.2.8'
#]

# 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
#mediaProxy: https://example.com/proxy

# Proxy remote files (default: false)
#proxyRemoteFiles: true

# Sign to ActivityPub GET request (default: false)
#signToActivityPubGet: true

#allowedPrivateNetworks: [
#  '127.0.0.1/32'
#]

# Upload or download file size limits (bytes)
#maxFileSize: 262144000

esc ,按 :wq ,回车(保存-退出)

进入 env 文件

1
sudo vim docker.env

填写如下内容

1
2
3
4
# db settings
POSTGRES_PASSWORD=example-misskey-pass
POSTGRES_USER=example-misskey-user
POSTGRES_DB=misskey

部署

还记得我说「创建并编辑 yml 文件,让它去部署」吗?

现在文件已经配置完毕了,是时候让它跑起来了!

双手合十🙏

切换到上一级目录

1
cd ..

屏住呼吸

1
2
sudo docker-compose run --rm web yarn run init # 初始化数据库
sudo docker-compose up -d # 后台启动项目容器

跑了跑了,好了好了

访问站点

查看端口状态

1
sudo lsof -i:<port>

假如这个端口不能用,那就换一个。

新端口要在服务商防火墙、ufw 命令、default.ymldocker-compose.yml 里都开启、改过来

然后重启 Docker

1
sudo docker-compose restart [指定服务的容器]

完成这一步之后,尝试用 IP 访问站点吧

在浏览器输入 http://<ip>:<port>(IP 可以用 curl ip.sb 返回)

成功了口牙!

流出大河泪

Misskey 要求 SSL 访问,另外站点还需要设置反向代理,这两件事让⬇️ NPM 一起干了

NginxProxyManager(NPM)

是一个带前端管理界面的 Nginx 服务器,通过Let’s encrypt 来自动申请 SSL 证书并自动部署,反向代理你所需要的容器

可以拿来实现二级域名分别访问指定端口的容器 + 一键部署 SSL

创建并配置 docker-compose.yml 文件

创建并进入 yml 文件

1
2
3
4
cd /home
sudo mkdir myapp
cd myapp
sudo vim docker-compose.yml

把以下配置粘贴进去,保存退出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql

后台启动项目容器

1
sudo docker-compose up -d

遇到报错:

1
Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

执行 netstat -pna | grep 80 (查询端口 80 是否开放/被占用),返回:

image-20221118003045589

Listen 表示被占用,80 端口被 nginx 占用

*netstat:控制台命令,用于监控 TCP/IP 网络

*grep:查找文件内容

🔪杀掉这个进程

1
sudo kill 19306

再次部署,查看容器的运行情况

1
docker container ls

🎆解决报错

✅完成 yml 文件的配置

申请 SSL 证书

去 CloudFlare

设置反代

打开服务器的 81 端口

1
sudo ufw allow 81/tcp

在浏览器输入 <ip>:81 ,用默认账号密码登录 NPM

1
2
[email protected]
changeme

修改账号密码,NPM 初始化完成,开始配置

Forward Hostname / IP 填的是容器所在 Docker 网桥的虚拟 IP,通过命令查到

1
sudo docker network inspect bridge

找到 IPAM - Config - Gateway 节点,后面的 IP 就是我们需要的

*如果你在 docker-compose.yml 中自定义了网桥,那么自定义网桥名称替换掉上面的 bridge 参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[
    {
        "IPAM": {
            "Config": [
                {
                    "Gateway": "xxxx:xxxx:xxxx:xx::x"
                }
            ]
        },
    }
]

设置管理员

图片到37th

其它参考

[User] Linux 新增使用者並賦予其使用 sudo 的權限

保护好你的小鸡!保姆级服务器安全教程!

mjj版的linux入门教程

Nginx Proxy Manager——小而美的多容器转发方案

comments powered by Disqus
未经允许不得随意转载
Built with Hugo
Theme Stack designed by Jimmy