Misskey 实例搭建教程
本次搭建使用 Ubuntu 22.10 系统
购买 VPS
⚠️ 不要买机房在大陆的服务商 VPS ⚠️
在备案通过之前 80 和 443 端口是封禁的 -> 无法申请 SSL 证书 -> Misskey 需要 SSL 才能访问,GG
(即使没有这个问题,买大陆节点的服务建站也是一种自杀行为)
注册
注册 Vultr 账号,充值
创建 VPS
选 Cloud Compute
CPU 选 AMD 和 Intel 都行
机房位置选择日本、新加坡、美西都行,一般不推荐欧洲(对于中国国内)
选择操作系统:Ubuntu 22.10 x64
选择 Size:$5 的 1C1G1TB 套餐(记得勾选 No Thanks)
关闭自动备份,省 $1
Additional Features:勾选 Enable IPv6
添加 SSH Keys
打开命令行,输入
ssh-keygen -t rsa -b 4096 -C "Example comment"
在这行提示后面输入你想要保存密钥的路径
Generating public/private rsa key pair.
Enter file in which to save the key (/home/example_user/.ssh/id_rsa):
我输入(uu 是我的电脑用户名)
/home/uu/.ssh/id_rsa_vultr
所以在 /.ssh
目录下可以找到 id_rsa_vultr
和 id_rsa_vultr.pub
文件,它们分别是私钥和公钥
接下来要把公钥内容添加到 vultr 去
# 进入.ssh 目录
cd .ssh
# 打印文件内容
cat id_rsa_vultr.pub
- 这时底部付款栏应该显示
$5.00/month
,点击Deploy Now
确认创建服务器,等待一会,等 Status 变成 Running 就好了
点击刚刚创建的 VPS,看到如下界面。
左下角的 IP Address、Username、Password 是待会连接服务器的时候,要用到的 SSH 连接信息
- 登录 VNC:查看控制台
- 关机:就和关电脑一样(关机的时候仍然在计费哦!)
- 重启:就和重启电脑一样
- 重装系统:把服务器重置成刚创建时的状态
- 销毁/删除:销毁了服务器就不计费了,数据丢失,无法找回
Snapshots:快照,指将当前 VPS 的状态保存下来,对 VPS 进行完整备份
服务器创建完成
检查 IP
Ping 一下 IP
用检查工具比如 https://ip112.cn/ 检查 IP,此 IP 可用
其它测试工具
- http://ping.pe/ — 全球节点 Ping,包括中国的三大运营商
- http://ping.chinaz.com/ — Ping 检测中国大陆的访问情况
域名
在域名商 Dynadot 注册账号,买一个域名
解析域名
依次点击
暂停 ⏸️
去 CloudFlare 注册登录账号,依次操作:
添加新站点
输入你的域名
选择免费方案
添加 DNS 解析记录
*
是通配符,意思是我的二级域名,xxx.ponderduck.cc 的 DNS 解析也一起被接管了。不用我一个一个设置第二行是域名本体
www
让输入 www.ponderduck.cc 也能访问
复制 CloudFlare 提供的两个名称服务器,填进 Dynadot 的 DNS 设置,保存
回到 CloudFlare 点击 Done, check nameservers
,等一会
测试,ping 你的域名,返回服务器 IP 说明解析生效
开启完全 SSL,否则访问站点会报「重定向次数过多」的错误
✅ 域名解析完成
服务器基础配置
对哪一步不自信,可以在开始做之前先去服务器管理面板创建一个快照(snapshots),快照就是存档点
远程连接
ssh root@101.113.22.42 # 换成你的ip地址,回车
然后把密码从 vultr 复制过来回车,会看到类似这样的提示就表示连接服务器成功
Welcome to Ubuntu 22.10 (GNU/Linux 5.19.0-23-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
...省略一部分内容...
root@vultr:~#
安全设置
因为 root 权限太太太强大,为了避免婴儿(我)拿核武器发射按钮的情况出现,创建一个普通用户日常使用
新建普通用户并设定密码
adduser vpsadmin # vpsadmin是用户名
然后输入密码 - 确认密码(太简单会被拒绝==)
赋予 「vpsadmin」 使用 sudo 指令的权限
什么是 su 和 sudo 请看:Linux 的 su 與 sudo 指令教學與範例
sudo adduser vpsadmin sudo
另外开一个终端窗口,登录 vpsadmin 账号
ssh vpsadmin@185.202.62.49 # 换成你的IP,回车,然后输入密码
验证是否获得 sudo 权限
sudo ls -al /root
返回类似内容(展示 /root
目录下的资料)就表示成功了
[可选]SSH 免密登录
每次登录 vpsadmin 都要手动输密码很麻烦,设置一下免密登录
在 Tabby 设置 - Profiles & connections - + New profile
- SSH connection
禁止 root 登录
(禁用核按钮)
登录 root 账户,输入
nano /etc/ssh/sshd_config
使用 control + W
进入搜索模式,输入 PerimitRootLogin
并回车,找到所在行,改成(记得要取掉注释 #
!!)
PermitRootLogin: no
*prohibit-password/without-password 意为禁止密码登录
使用 control + O
,保存更改,control + X
退出
重新启动 SSH 服务
sudo /etc/init.d/ssh restart
打开一个新窗口,尝试用 root 登录,返回 Permission denied…
✅ 成功禁止 root 登录
从现在开始,用「vpsadmin」这个账户远程连接 VPS 吧
搭建环境
修改服务器时间
查看时间
timedatectl
列出所有时区
timedatectl list-timezones
改成香港 🇭🇰
sudo timedatectl set-timezone Asia/Hong_Kong
安装常用命令
sudo apt-get install curl wget screen tree -y
*curl 用于请求 Web 服务器
*wget 用来下载软件包
*screen 用于命令行终端的窗口切换
*tree 用于显示当前文件夹的目录结构
(如果你有其它要用的也一起加进来,或者要用了再用这个命令单独安装也可以)
添加 SWAP
swap 是 Linux 中的虚拟内存,用于在物理内存不足的情况下储存临时数据,可以提升小内存 VPS 的运行效率
确认是否已存在 SWAP
free -m
有 Swap 项而且 total 列不为零,说明 Swap 已存在,可以自行修改分区容量,参考:为 Linux 添加 swap 分区或修改 swap 分区容量
配置防火墙
sudo ufw allow OpenSSH
sudo ufw enable
打开防火墙
sudo ufw allow http
sudo ufw allow https
打开 80、443 的端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
(其它服务需要的端口也用 sudo ufw allow xx/tcp
开启)
验证防火墙是否打开,端口是否开启
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/docker
目录
cd /etc/docker
用 vim 编辑 daemon.json
文件
sudo vim daemon.json
进入 vim 后输入如下内容,这段代码会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,限制日志文件的大小(20M),限制日志文件数量,防止 Docker 日志过多占用硬盘
(代码来自烧饼博客)
{
"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 检查是否成功写入,效果类似:
重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
检查 Docker 是否正在运行
sudo systemctl status docker
换个方式,再测试一下
sudo docker run hello-world
终于成功了 😭
Misskey
创建安装目录
之前给 Docker 的数据和配置文件新建一个目录 docker_data
,这个文件夹就是包住整个 Misskey 的盒子
sudo mkdir -p data/docker_data
进入目录
cd data/docker_data
创建 misskey 文件夹
sudo mkdir misskey
配置安装文件
进入 misskey 文件夹
cd misskey
创建并编辑 yml 文件,让它去部署
sudo vim docker-compose.yml
按 I
,切换到编辑模式,把以下内容粘贴进去
# 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 文件中
sudo mkdir config
cd config
sudo vim default.yml
按 I
,切换到编辑模式,填入以下内容
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 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 文件
sudo vim docker.env
按 I
,切换到编辑模式,填写如下内容
# db settings
POSTGRES_PASSWORD=example-misskey-pass
POSTGRES_USER=example-misskey-user
POSTGRES_DB=misskey
部署
还记得我说「创建并编辑 yml 文件,让它去部署」吗?
现在文件已经配置完毕了,是时候让它跑起来了!
双手合十 🙏
切换到上一级目录
cd ..
初始化数据库
sudo docker-compose run --rm web yarn run init
后台启动项目容器
sudo docker-compose up -d
访问站点
查看端口状态
sudo lsof -i:<port>
假如这个端口不能用,那就换一个。
新端口要在服务商防火墙、ufw 命令、default.yml
和 docker-compose.yml
里都开启、改过来
然后重启 Docker
sudo docker-compose restart [指定服务的容器]
完成这一步之后,尝试用 IP 访问站点吧
在浏览器输入 http://<ip>:<port>
(IP 可以用 curl ip.sb
返回)
(;
还有两个任务
- SSL 证书
- 反向代理
Nginx
安装 Nginx
sudo apt update
sudo apt install nginx
调整防火墙,允许 Nginx 服务通过
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS'
sudo ufw allow 'Nginx FULL'
查看更改结果
sudo ufw status
查看 Nginx 状态(是 active 就行)
systemctl status nginx
在浏览器输入 http://your_vps_ip,返回 Nginx 默认页面
让 Nginx 在系统启动时自动启动
sudo systemctl enable nginx
设置服务器块
创建站点对应目录
sudo mkdir -p /var/www/ponderduck.cc/html
使用$USER
环境变量分配目录的所有权
sudo chown -R $USER:$USER /var/www/ponderduck.cc/html
如果我们没有修改自己的umask
值,那么 Web 根目录的权限应该正确,我们可以通过输入以下命令来确认:
sudo chmod -R 755 /var/www/ponderduck.cc
编辑index.html
sudo vim /var/www/ponderduck.cc/html/index.html
添加以下示例 HTML
<html>
<head>
<title>Welcome to ponderduck.cc!</title>
</head>
<body>
<h1>Success! The ponderduck.cc server block is working!</h1>
</body>
</html>
为 Nginx 创建一个服务器块
创建一个新文件
sudo vim /etc/nginx/sites-available/ponderduck.conf
添加以下内容
server {
listen 80;
listen [::]:80;
root /var/www/ponderduck.cc/html;
index index.html index.htm index.nginx-debian.html;
server_name ponderduck.cc www.ponderduck.cc;
location / {
try_files $uri $uri/ =404;
}
}
通过 ls 命令在sites-enabled
目录新建一个链接,好让 Nginx 在启动过程中会读取这个目录:
sudo ln -s /etc/nginx/sites-available/ponderduck.conf /etc/nginx/sites-enabled/
打开文件:
sudo vim /etc/nginx/nginx.conf
找到server_names_hash_bucket_size
指令并删除#
符号:
...
http {
...
server_names_hash_bucket_size 64;
...
}
...
接下来,测试以确保我们在 Nginx 文件中的改动,没有任何问题:
sudo nginx -t
如果没有任何问题,请重新启动 Nginx:
sudo systemctl restart nginx
现在通过 http://ponderduck.cc 访问服务器的时候,Nginx 会指向我们刚刚添加的那个 HTML 页面
SSL
安装 Certbot
我们需要获得被信任的证书授权中心( CA )签发的安全证书。Let’s Encrypt 是 ISRG ( Internet Security Research Group ,互联网安全研究小组)的组织推出的免费安全证书计划。
ISRG 的发起者 EFF (电子前哨基金会)为 Let’s Encrypt 项目发布了一个官方的客户端 Certbot ,利用它可以完全自动化的获取、部署和更新安全证书
安装 Certbot
去 官网 选择我正在使用的 Web 服务器(Nginx)和操作系统(Ubuntu 20),操作对应的安装步骤
Ubuntu 自带 Snap,用 Snap 安装 Certbot
sudo snap install --classic certbot
用 ln 命令创建符号连接,将 Certbot 加入 PATH 环境变量中
sudo ln -s /snap/bin/certbot /usr/bin/certbot
生成 SSL 证书
sudo certbot --nginx -d www.ponderduck.cc
输入邮箱地址,用于接收邮件
输入 Y
,同意协议;询问是否接收前哨基金会的邮件,接不接收都行
返回(注意证书储存位置)
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/www.ponderduck.cc/fullchain.pem
Key is saved at: /etc/letsencrypt/live/www.ponderduck.cc/privkey.pem
This certificate expires on 2023-02-18.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Let’s Encrypt 的 SSL 证书会在 90 天后过期,但是 Certbot 会自动续订
测试证书自动续订是否生效
sudo certbot renew --dry-run
返回 ⬇️ 说明已生效
Simulating renewal of an existing certificate for www.ponderduck.cc
找到存放站点证书的目录
sudo ls /etc/letsencrypt/live
我的是www.ponderduck.cc
查询证书
sudo ls /etc/letsencrypt/live/www.ponderduck.cc
返回文件名
cert.pem chain.pem fullchain.pem privkey.pem
后两个要添加到 Nginx 配置文件 .conf
里
反向代理
修改网站配置文件
参考 官网文档,以下是我的完整文件内容
# For WebSocket
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;
server {
listen 80;
listen [::]:80;
server_name www.ponderduck.cc ponderduck.cc;
# For SSL domain validation
root /var/www/html;
location /.well-known/acme-challenge/ { allow all; }
location /.well-known/pki-validation/ { allow all; }
location / { return 301 https://$server_name$request_uri; }
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name ponderduck.cc www.ponderduck.cc;
ssl_session_cache shared:ssl_session_cache:10m;
# ssl
ssl_certificate /etc/letsencrypt/live/www.ponderduck.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.ponderduck.cc/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
ssl_stapling on;
ssl_stapling_verify on;
# Change to your upload limit
client_max_body_size 80m;
# 对"/"启用反向代理
location / {
# 指定转发地址
proxy_pass http://127.0.0.1:3001;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_cache cache1;
proxy_cache_lock on;
proxy_cache_use_stale updating;
add_header X-Cache $upstream_cache_status;
}
}
接下来,测试以确保我们在 Nginx 文件中的改动,没有任何问题:
sudo nginx -t
有问题的话按照提示修改,做完之后,重新启动 Nginx:
sudo systemctl restart nginx
现在 SSL 证书和反向代理都生效了,尝试用域名访问站点
完成 🎉
注册一个账号,回到命令行工具把它设置为管理员
日常维护
更新
Docker-compose 部署
cd data/docker_data/misskey
docker-compose down
cp -r /root/data/docker_data/misskey /root/data/docker_data/misskey.archive # 万事先备份,以防万一,其实这边没必要,因为我们没有映射到本地文件夹
docker-compose pull
docker-compose up -d # 请不要使用docker-compose stop来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。
docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像
提示:
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
输入 y
卸载
cd /root/data/docker_data/misskey
docker-compose down
rm -rf /root/data/docker_data/misskey # 完全删除映射到本地的数据
删除旧数据
docker system prune
磁盘空间分析及清理
内容主要来源:https://www.cnblogs.com/jing99/p/10487174.html
有时候要用 sudo
df 命令
可以查看一级文件夹大小、使用比例、档案系统和挂入 dian
[root@oms ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/vda1 ext4 40G 35G 3.1G 92% /
devtmpfs devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs tmpfs 1.9G 191M 1.7G 11% /run
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
tmpfs tmpfs 379M 0 379M 0% /run/user/0
七个字段分别为档案系统、类型、该分割区的容量、已使用的大小、剩下的大小、使用的百分比和挂入点
du 命令
用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh [目录]
du -s 目录 | sort -rn #这是按字节排序
du -sh 目录 | sort -rn #这是按兆(M)来排序
#由于-sh大小显示看起来是乱的,因此建议使用du -s|sort -nr
du -s 目录 | sort -rn | head #选出排在前面的10个
du -s 目录 | sort -rn | tail #选出排在后面的10个
常用选项
-h:以人类可读的方式显示
-a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
-s:只显示目录占用的磁盘空间大小,不显示其子目录和文件占用的磁盘空间大小
-c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
–apparent-size:显示目录或文件自身的大小(文件或目录占用磁盘空间的大小与它们自身大小有时候并非完全一致)
-l :统计硬链接占用磁盘空间的大小
-L:统计符号链接所指向的文件占用的磁盘空间大小。
rm 命令
慎用
以下待做:
https://pullopen.github.io/tags/#Mastodon
- 扫描出不属于任何媒体附件的文件并移除他们
- 清除缓存存储
- 从数据库中删除未被引用的嘟文,例如来自中继的或来自本地用户不再关注的用户的嘟文,同时没有被回复的或以其他方式与之互动的
常用命令
查看 docker 容器状态
sudo docker container stats
其它参考
[User] Linux 新增使用者並賦予其使用 sudo 的權限
【好玩儿的 Docker 项目】10 分钟搭建一个去中心化微博平台——Misskey |二次元风格、联邦宇宙