我尝试建立了一个适用于Misskey的独立服务器

首先

六扇花成长了。
因为以前我一直在骗人说要建立一个独立的服务器,但实际上一直都没有建成。所以我想参加一下 #MisskeyInstallBattle,尝试着创建了一个。
这是一个模仿他人构建步骤的备忘录。
虽然我对Linux一窍不通™,但还是稍微做了一些麻烦的事情,希望能对其他人有些参考价值。

这次的构成

在使用Fedora时,我们参考了官方的安装方法(不使用Docker)来确定步骤和软件。

 

虚拟专用服务器环境

使用卡高亚云服务。

項目値OSFedora 39 BetaCPU2コアメモリ2 GBストレージ200GB

域名系统

在Gandi.net上获得。

每个软件版本在任务时点上的情况

为了支持QUIC,需要构建Nginx。

ソフトウェアバージョンMisskeyv2023.10.1Node.jsv20.8.1PostgreSQL15.4Redis7.2.1FFmpeg6.0Nginx1.25.2 w/ quictls

对象存储

使用了芥末。

证书

使用ZeroSSL。

(Note: This is a direct translation of the given statement into Chinese.)

邮箱

使用樱花的邮箱。

不使用的物品 (Bù de

    • Docker

 

    Cloudflare

操作系统安装

创建VPS实例

登录KAGOYA云VPS控制面板。
为了使用不在模板中的软件包,上传Fedora的ISO映像。
复制粘贴到Fedora下载页面的ISO实际URL。
由于ISO映像会在1天后消失,因此名称可以任意设置。

rezjr97uum9u96g.png
如果使用其他操作系统映像,由于KAGOYA的映像是在BIOS上运行的,因此无法启动仅支持UEFI的自定义ISO(如CentOS Stream 9)。

转到“创建实例”页面,选择已上传到ISO映像的图像。
选择以CPU 2核 / 内存2GB / 存储200GB为规格的实例。(鉴于此次使用对象存储,可能不需要选择大容量的存储。)
virtio保持默认设置即可。
输入控制台登录密码和实例名称(为了管理VPS,名称可以随意),然后创建实例。
创建实例后,转到实例信息页面,确认分配的IPv4和IPv6地址。

DNS记录注册

正引き 的意思是“古时候船或汽车从背面反方向驶离”。

登录Gandi.net,在目标域名中添加一个A记录(IPv4)和一个AAAA记录(IPv6)。TTL保持默认值即可。

逆引き can be paraphrased in Chinese as “反向搜索” .

在KAGOYA的实例信息的逆引设置处输入域名。

“安装”

当您启动控制台时,将弹出一个显示控制台的弹窗。
由于某些浏览器会将弹窗阻止一次,您可以在授权后再次启动。
此外,由于屏幕很快会超时,您可以每次按下F5或Ctrl+R来重新加载页面,或者重新打开窗口。

确认Fedora安装界面是否显示。

语言设置

由于转换为日语可能会稍微麻烦,所以请继续使用英语。

hfyk9gapjgb3t23.png

安装概述

按照以下设定的顺序进行记述。

uxxknkz79537ytd.png
键盘

根据自己使用的键盘选择英语(美国)或日语。(实际上,由于几乎都是使用SSH操作,除了最初的密码输入外,键盘并不太相关。)

语言支持

暂时增加一项日语(日本)内容。

软件选择

确认已选择 Fedora 服务器版。

安装目标地点

选择Custom并点击Done。

进入分区创建界面,首先选择LVM自动创建(点击此处自动创建)。

BIOS Boot、/boot、/这三个分区将自动创建。

由于2GB的内存不足以构建Misskey,因此使用”+”来创建swap。由于此次使用了大容量的存储,所以创建了稍微多一点的8GiB。

然后,在Desired Capacity的/分区处填入非常大的值并点击Update,剩余的全部容量将自动分配。

aj86nb8ie8atm7z.png
网络和主机名

在以太网(ens3)被选择状态下,点击“配置”。

IPv4 配置
項目値MethodManualAddressインスタンス画面のIPv4のIPNetmaskインスタンス画面のサブネットGatewayインスタンス画面のゲートウェイDNS serversインスタンス画面のDNS、
またはお好きなDNSサーバのIPをカンマ(,)形式で入力
IPv6设置
項目値MethodManualAddressインスタンス画面のIPv6のIPPrefix64GatewayIPv6の先頭4つ部分に::1を付加 (xxxx:yyyy:zzzz:wwww::1)DNS serversお好きなDNSサーバのIPをカンマ(,)形式で入力

一旦完成输入之后,请保存并激活。如果DNS记录已经生效,则在当前主机名处会显示域名。
如果显示了“kagoya”的内容,则请在主机名处输入要使用的域名并应用。

时间和日期

点击日本地区。确保时区设置为Asia/Tokyo,网络时间已启用。

用户创建

输入用户名和密码。确认两个复选框都被选中。

开始安装

在以上的设置下,点击“Begin Installation”按钮,开始安装。
安装完成后,通过“Reboot System”重新启动。
确保安装的操作系统成功启动。

SSH连接设置

使用手头的终端软件进行SSH连接,为了加强安全性,更改SSH的端口号并切换到公钥认证。

公開密钥加密

添加新的鑰匙

    • クライアント側で鍵を作成する(手順省略)

 

    • サーバにSCPなどを用いて作成した公開鍵をリモートに転送する(手順省略)

 

    以下コマンドでauthorized_keysに鍵を登録
mkdir ~/.ssh
cat (持ってきたファイル) >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
rm (持ってきたファイル)
    公開鍵認証で対応する秘密鍵を指定し、SSH接続できることを確認する

禁止使用密码登录和root登录

/etc/ssh/sshd_config.d/内にファイルを作成し、追記

PermitRootLogin no
PasswordAuthentication no

sudo systemctl restart sshd.serviceでSSHサーバを再起動し、今のセッションを維持したまま別セッションでログインできることを確認する

更改端口编号

添加端口号

更改sshd_config文件

/etc/ssh/sshd_config.d/内のファイルに追記

+ Port 22
+ Port (変更後のポート番号)
PermitRootLogin no
PasswordAuthentication no
增加防火墙
    sshのサービスファイルを複製する
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-alt.xml

ssh-alt.xmlを変更

<?xml version="1.0" encoding="utf-8"?>
<service>
- <short>SSH</short>
+ <short>SSH-ALT</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessin    g your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
- <port protocol="tcp" port="22"/>
+ <port protocol="tcp" port="(変更後のポート番号)"/>
</service>
    以下でファイアウォールルール追加
# ssh-altを反映
sudo firewall-cmd --reload
sudo firewall-cmd --get-services | grep ssh-alt

# ssh-altをファイアウォールルールに追加
sudo firewall-cmd --permanent --add-service=ssh-alt
sudo firewall-cmd --reload

# 確認
sudo firewall-cmd --list-all
添加SELinux规则
    以下実行
sudo semanage port --add --type ssh_port_t --proto tcp (変更後のポート番号)

sudo systemctl restart sshd.serviceでSSHサーバを再起動し、変更後のポート番号でログインできることを確認する

删除端口号。

更改sshd_config文件

/etc/ssh/sshd_config.d/内のファイルを変更

- Port 22
Port (変更後のポート番号)
PermitRootLogin no
PasswordAuthentication no
删除防火墙
    以下でファイアウォールルール削除
# sshをファイアウォールルールから削除
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

# 確認
sudo firewall-cmd --list-all

sudo systemctl restart sshd.serviceでSSHサーバを再起動し、デフォルトのポート番号でログインできないことを確認する

其他防火墙更新

关闭驾驶舱

sudo firewall-cmd --permanent --remove-service=cockpit
sudo firewall-cmd --reload
sudo systemctl disable --now cockpit.socket

使HTTP协议进行通信。

防火墙规则

如果未定义http3,则通过add-port将443/udp传递。

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=http3
sudo firewall-cmd --reload

SELinux规则 (SELinux

sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P httpd_can_network_relay 1
sudo semanage port --add --type http_port_t --proto udp 443

防护云

随便放在那里。

sudo dnf install fail2ban
sudo systemctl enable --now fail2ban.service

構建Nginx

如果要将Nginx适配QUIC协议,那么只使用软件包自带的Nginx,它是使用的内置OpenSSL(不支持QUIC),所以无法运行QUIC。
因此,需要构建一个集成了支持QUIC的SSL软件包的Nginx。
此外,由于Wasabi存储不能进行公共访问(请参考以下信息),因此需要以某种方式集成AWS的身份验证访问功能。

 

这次我们将使用quictls来替代OpenSSL,并使用ngx_aws_auth模块来进行AWS的认证。

安装基本软件包。

安装通用包以构建。每个构建中所需的特定包会逐次列出。

sudo dnf groupinstall 'Development Tools'
sudo dnf install cmake

快速TLS的安装

启用kTLS

据说将TLS处理委托给内核可以提高性能,所以我想试一试。

sudo modprobe tls

安装必要的软件包

sudo dnf install perl wget gcc gcc-arm-linux-gnu tcp_wrappers

下载源代码

cd /usr/local/src
sudo git clone https://github.com/quictls/openssl.git
cd openssl
sudo git submodule update --init

安装

sudo ./Configure enable-ktls
sudo make
sudo make install

设置库的路径

由于/usr/local/lib64路径没有被正确设置,所以需要将其添加到环境变量中通行。

/etc/ld.so.conf.d/内にファイルを作成し、追記

/usr/local/lib
/usr/local/lib64

sudo ldconfigで反映

openssl versionを実行し、バージョンに+quicがついていることを確認する

留下quictls的源代码供在构建Nginx时使用。

准备AWS代理模块

听说Wasabi无法进行公共访问,并且似乎无法正常使用SigV4进行身份验证。换句话说,它不起作用。

 

由于没有办法,为了能够使用SigV2进行认证,需要将模块更改为V2分支的版本。

cd /usr/local/src
sudo git clone https://github.com/anomalizer/ngx_aws_auth.git
cd ngx_aws_auth
sudo git checkout AuthV2

由于这是一个旧的程序,如果保持不变,将无法在当前的Nginx构建过程中运行。
请执行以下操作,事先对代码进行部分更改。

sudo sed -i -e 's/\(ngx_http_variable_unknown_header(\)\(val\)/\1r, \2/' ngx_http_aws_auth_module.c

提供Brotli压缩模块

听说通信量要减少?那就趁机试试看。

 

cd /usr/local/src
sudo git clone https://github.com/google/ngx_brotli.git
cd ngx_brotli
sudo git submodule update --init

安装Nginx

添加用户

sudo useradd --system --comment 'Nginx web server' --home-dir /var/local/lib/nginx --shell /sbin/nologin nginx

安装所需的软件包

由于过度配置选项,导致所需的软件包数量增加。如果不需要的话,也许可以删除选项。

sudo dnf install pcre-devel libxslt-devel gd-devel GeoIP-devel gperftools

请下载资源。

在下载网站上查看公式的版本信息,然后下载相应的版本。

cd /usr/local/src
sudo curl -O https://nginx.org/download/nginx-1.25.2.tar.gz
sudo tar xvf nginx-1.25.2.tar.gz
cd nginx-1.25.2

进行配置

由于试错的结果,我们选择了以下选项进行执行。由于对细节的解释不是很清楚,所以省略。

sudo ./configure \
--prefix=/var/local/nginx \
--sbin-path=/usr/local/sbin/nginx \
--modules-path=/usr/local/lib64/nginx/modules \
--conf-path=/usr/local/etc/nginx/nginx.conf \
--error-log-path=/var/local/log/nginx/error.log \
--http-log-path=/var/local/log/nginx/access.log \
--http-client-body-temp-path=/var/local/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/local/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/local/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/local/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/local/lib/nginx/tmp/scgi \
--pid-path=/run/nginx.pid \
--lock-path=/run/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-threads \
--with-file-aio \
--with-debug \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_v3_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-google_perftools_module \
--with-compat \
--with-pcre \
--with-pcre-jit \
--with-openssl=/usr/local/src/openssl \
--with-openssl-opt=enable-ktls \
--add-module=/usr/local/src/ngx_brotli \
--add-module=/usr/local/src/ngx_aws_auth \
--with-cc-opt='-g -O2 -m64 -mtune=generic -fPIC -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-all -fstack-clash-protection -fcf-protection -grecord-gcc-switches -I/usr/local/src/openssl/include' \
--with-ld-opt='-no-pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -Wl,-Bsymbolic-functions -L/usr/local/src/openssl/ssl'

进行

编译并安装。

sudo make
sudo make install

SELinux 上下文修改

我觉得如果将其设置为unconfined_service_t并且运行SELinux,意义不太大,因此需要修正上下文以使其与通过dnf安装时相同的方式。

创建相关文件夹

sudo mkdir -p /usr/local/etc/nginx/conf.d
sudo mkdir -p /usr/local/etc/nginx/default.d
sudo mkdir -p /usr/local/lib64/nginx/modules
sudo mkdir -p /var/local/cache/nginx
sudo mkdir -p /var/local/lib/nginx/tmp/client_body
sudo mkdir -p /var/local/lib/nginx/tmp/proxy
sudo mkdir -p /var/local/lib/nginx/tmp/fastcgi
sudo mkdir -p /var/local/lib/nginx/tmp/uwsgi
sudo mkdir -p /var/local/lib/nginx/tmp/scgi

改变背景情况

sudo semanage fcontext -a -f f -s system_u -t httpd_exec_t '/usr/local/sbin/nginx'
sudo semanage fcontext -a -f a -s system_u -t httpd_config_t '/usr/local/etc/nginx(/.*)?'
sudo semanage fcontext -a -f a -s system_u -t httpd_sys_content_t '/var/local/nginx/html(/.*)?'
sudo semanage fcontext -a -f a -s system_u -t httpd_var_lib_t '/var/local/lib/nginx(/.*)?'
sudo semanage fcontext -a -f a -s system_u -t httpd_log_t '/var/local/log/nginx(/.*)?'
sudo semanage fcontext -a -f a -s system_u -t httpd_cache_t '/var/local/cache/nginx(/.*)?'

# 確認
sudo semanage fcontext -l | grep nginx

情境反映

sudo restorecon -vF /usr/local/sbin/nginx
sudo restorecon -vFR /usr/local/etc/nginx
sudo restorecon -vFR /var/local/nginx/html
sudo restorecon -vFR /var/local/lib/nginx
sudo restorecon -vFR /var/local/log/nginx
sudo restorecon -vFR /var/local/cache/nginx

编辑nginx.conf文件

生成的nginx.conf在构建时路径等是默认的,如果不正确更改,它就无法运行。
由于已经大量修改了(仅仅做了与dnf中nginx格式的合适调整),所以将文件整体替换为以下内容。

user  nginx;
worker_processes  auto;
error_log  /var/local/log/nginx/error.log notice;
pid  /run/nginx.pid;

# Load dynamic modules.
include  /usr/local/lib64/nginx/modules/*.conf;

events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/local/log/nginx/access.log  main;

    sendfile             on;
    tcp_nopush           on;
    keepalive_timeout    65;
    types_hash_max_size  4096;

    charset utf-8;

    include              /usr/local/etc/nginx/mime.types;
    default_type         application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    include  /usr/local/etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/local/nginx/html;

        # Load configuration files for the default server block.
        include  /usr/local/etc/nginx/default.d/*.conf;

        #error_page  404              /404.html;
        #location = /404.html {
        #}

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        }
    }
}

确认sudo nginx -t的结果是否成功。

创建systemd单位文件

创建以下文件。

(?2023-10-22 追筆:若不添加Restart=always,则操作系统重启时会崩溃,故在下方的misskey.service中添加了相同的内容。)

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/local/sbin/nginx -t
ExecStart=/usr/local/sbin/nginx
ExecReload=/usr/local/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
TimeoutSec=60
StandardOutput=journal
StandardError=journal
SyslogIdentifier=nginx
Restart=always

[Install]
WantedBy=multi-user.target

确认通过在浏览器中使用http://(域名)进行访问,运行并在后台持续,需使用sudo systemctl enable –now nginx.service命令进行启动。

颁发证书

请参考以下步骤,使用lego生成ZeroSSL的证书。

 

获取ZeroSSL API密钥

ZeroSSLのアカウントを登録する
登録完了後、DeveloperタブよりAPI Keyを確認する

乐高的安装

为了脚本,还需要安装一个JSON处理器。

sudo dnf install golang-github-acme-lego jq

撰写证书发行脚本

请创建以下脚本。(地点可以在任何地方)

#!/bin/bash

API_KEY=(ZeroSSLで取得したAPIキー)
EMAIL=(ZeroSSLに登録したメールアドレス?)
DOMAIN=(認証したいドメイン名)
WEBROOT_PATH=/var/local/nginx/html
CERTKEY_PATH=/etc/zerossl

JSON=$(curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=$API_KEY")
EAB_KID=$(echo "$JSON" | jq -r .eab_kid)
EAB_HMAC_KEY=$(echo "$JSON" | jq -r .eab_hmac_key)

lego --http --http.webroot "$WEBROOT_PATH" --path "$CERTKEY_PATH" --eab --kid "$EAB_KID" --hmac "$EAB_HMAC_KEY" --server "https://acme.zerossl.com/v2/DV90" --domains "$DOMAIN" --email "$EMAIL" --accept-tos "$1"

颁发证书

sudo chmod a+x /usr/local/bin/lego-invoke.sh
sudo lego-invoke.sh run

为了使用Misskey,准备好nginx的配置。

基於Nginx配置的公式,添加了QUIC支持、kTLS支持和Brotli壓縮支持。
對象儲存的代理描述將在之後補充。

# For WebSocket
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

proxy_cache_path /var/local/cache/nginx levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;

server {
    listen 80;
    listen [::]:80;
    server_name (ドメイン名);

    # For SSL domain validation
    root /var/local/nginx/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 quic reuseport;
    listen [::]:443 quic reuseport;
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name (ドメイン名);

    # QUIC settings
    http3 on;
    http3_hq on;
    http2 on;
    quic_retry on;
    ssl_early_data on;

    ssl_session_timeout 1d;
    ssl_session_cache shared:ssl_session_cache:10m;
    ssl_session_tickets off;

    # To use ZeroSSL certificate
    ssl_certificate     /etc/zerossl/certificates/(ドメイン名).crt;
    ssl_certificate_key /etc/zerossl/certificates/(ドメイン名).key;

    # To use Let's Encrypt certificate
    #ssl_certificate     /etc/letsencrypt/live/example.tld/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem;

    # To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
    #ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;
    #ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

    # SSL protocol settings
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_conf_command Options KTLS;

    # Change to your upload limit
    client_max_body_size 80m;

    # brotli setting
    brotli on;
    brotli_comp_level 7;
    brotli_static on;
    brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml audio/mpeg font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;

    # Proxy to S3 storage

    # Proxy to Node
    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 https;

        # For WebSocket
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;

        # Cache settings
        proxy_cache cache1;
        proxy_cache_lock on;
        proxy_cache_use_stale updating;
        proxy_force_ranges on;
        add_header X-Cache $upstream_cache_status;

        # To negotiate with QUIC directly
        add_header Alt-Svc 'h3=":443"; h3-29=":443"; ma=86400';
    }
}

sudo nginx -tの結果がsuccessfulになることを確認する。

sudo systemctl restart nginx.serviceでサービスを再起動する。
ブラウザからhttps://(ドメイン名)でアクセスし、ZeroSSLで認証されていることを確認する。(現時点ではリクエスト結果は502エラーでOK)

Misskey的構建準備

创建用户

sudo useradd --system --comment 'Misskey app server' --home-dir /opt/misskey --shell /bin/bash misskey

安装 Node.js

# インストール
sudo dnf install https://rpm.nodesource.com/pub_20.x/nodistro/repo/nodesource-release-nodistro-1.noarch.rpm
sudo dnf install nodejs --setopt=nodesource-nodejs.module_hotfixes=1

# バージョン確認
node -v

# corepack enable
sudo corepack enable

引入PostgreSQL

安装

sudo dnf install postgresql postgresql-server postgresql-upgrade
sudo postgresql-setup --initdb

# バージョン確認
postgres --version

# 実行
sudo systemctl enable --now postgresql.service

创建用户和数据库

sudo -u postgres psql
CREATE ROLE misskey LOGIN PASSWORD '(pgsqlのmisskeyユーザ用のパスワード)';
CREATE DATABASE (データベース名) OWNER misskey;
\q

连接设置

如果按照现在的情况,数据库访问在权限方面可能不会顺利进行,所以请将所有“all all”行的METHOD更改为trust。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
- local   all             all                                     peer
+ local   all             all                                     trust
# IPv4 local connections:
- host    all             all             127.0.0.1/32            ident
+ host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
- host    all             all             ::1/128                 ident
+ host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            ident
host    replication     all             ::1/128                 ident

进行DB调优

通过使用PGTune,可以根据使用的机器规格获取适用于PostgreSQL的调整设置。本次将输入如下内容,并确认输出结果。

項目値DB version15Total Memory (RAM)2GBNumber of CPUs2Number of Connections100

根据获得的输出结果,编辑/var/lib/pgsql/data/postgresql.conf文件的相应行。请注意顺序可能会乱。

設定値行番号max_connections65行目shared_buffers127行目effective_cache_size403行目maintenance_work_mem140行目checkpoint_completion_target238行目wal_buffers226行目default_statistics_target426行目random_page_cost395行目effective_io_concurrency187行目work_mem138行目huge_pages129行目min_wal_size241行目max_wal_size242行目

编辑完成后,使用systemctl restart postgresql.service进行重启。

Redis的安装

sudo dnf install redis
sudo systemctl enable --now redis

# バージョン確認
redis-server --version

安装FFmpeg

sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install ffmpeg

# バージョン確認
ffmpeg -version

jemalloc的验证

据说如果将内存分配器更改为jemalloc,可以缓解Misskey v13的内存问题,因此我们打算使用jemalloc。
请通过以下命令确认是否已安装:

sudo find / -name "*jemalloc*"

如果没有安装,请使用sudo dnf install jemalloc进行安装。

Misskey的安装

下载Misskey

sudo mkdir /opt/misskey
sudo chown misskey:misskey /opt/misskey
sudo -iu misskey
cd /opt
git clone --recursive https://github.com/misskey-dev/misskey.git
cd misskey
git checkout master
git submodule update --init
NODE_ENV=production pnpm install --frozen-lockfile

默认.yml文件的设置

创建下列文件。

# Misskey URL
url: https://(ドメイン名)/
port: 3000

# PostgreSQL setting
db:
  host: localhost
  port: 5432
  db  : (PostgreSQLのデータベース名)
  user: (PostgreSQLのユーザー名)
  pass: (PostgreSQLのパスワード)

# Redis setting
redis:
  host: localhost
  port: 6379

# ID type
id: 'aid'

# syslog setting
syslog:
  host: localhost
  port: 514

# proxy setting
proxyRemoteFiles: true

# ActivityPub setting
signToActivityPubGet: true

Misskey的构建

cd /opt/misskey
NODE_ENV=production pnpm run build
pnpm run init

启动测试

NODE_ENV=production pnpm run start

确认能够在浏览器上访问。

创建systemd的单位文件

创建下列文件。

[Unit]
Description=Misskey daemon

[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/misskey
Environment="NODE_ENV=production"
Environment="LD_PRELOAD=/usr/lib64/libjemalloc.so.2"
TimeoutSec=60
StandardOutput=journal
StandardError=journal
SyslogIdentifier=misskey
Restart=always

[Install]
WantedBy=multi-user.target

使用sudo systemctl enable –now misskey.service命令来启动并使其常驻化。

请设置Misskey

初始设定

    • 最初の管理ユーザーを作成

 

    • 「コントロールパネル」→「設定」→「モデレーション」

「誰でも新規登録できるようにする」のチェックを外す
「アカウント登録にメールアドレスを必須にする」のチェックを入れる
「利用規約URL」「プライバシーポリシーURL」を入力する

使わない場合でもなんらかの値をいったん入れないと保存できないので、いったん入れて保存後に空欄にして保存し直す

「予約ユーザー名」に「media」を追加

「コントロールパネル」→「設定」→「全般」

「サーバー名」「管理者の名前」「管理者のメールアドレス」「運営者情報URL」を入力する

使わない場合でも(以下略)

「コントロールパネル」→「設定」→「その他」

「サーバーのマシン情報を公開する」のチェックを入れる

反映にはMisskeyの再起動が必要

电子邮件发送功能

因为独立的域名感觉比较专业,所以我原本打算使用Gandi.net的邮箱功能,但很快它似乎要变成收费了。

 

我选择在便宜的樱花邮件信箱中仅托管邮件服务器,而不迁移域名,这样就不用花费太多费用。

 

增加电子邮件地址

さくらインターネットにログインし、「契約中のサービス一覧」→「さくらのメールボックス」よりコントロールパネルを開く
「メール」→「メール一覧」→「新規追加」より、メール配信に使用したいユーザー名とパスワードでメールアドレスを追加する
「(ユーザー名)@ドメイン」が追加されることを確認

添加域名

    • 「ドメイン/SSL」→「ドメイン/SSL」→「ドメイン新規追加」を選択

 

    • 「他社で取得したドメインを移管せずに使う」を選択

 

    「他社で取得した独自ドメインの追加」のところに契約しているドメインを入力し、追加

DNS记录设置

    • 追加したドメインの「設定」に、「SPFレコードの使用」にチェックが入っていることを確認し、「ドメインコントロールパネル」に遷移する

 

    • 「登録済みゾーン」→「ゾーン >」にあるTXTレコード(SPFレコードのやつ)のテキストをコピー

 

    Gandi.netに移動し、「DNSレコード」の「詳細表示」よりレコードを直接編集
+ @ 10800 IN MX 0 xxx.sakura.ne.jp.(xxxはSPFレコードについているwwwなんちゃらを入れる)
+ @ 10800 IN TXT (コピーしてきたSPFレコード)
- @ 10800 IN MX 10 spool.mail.gandi.net.
- @ 10800 IN MX 50 fb.mail.gandi.net.
- @ 10800 IN TXT "v=spf1 include:_mailcust.gandi.net ?all"
- _imap._tcp 10800 IN SRV 0 0 0   .
- _imaps._tcp 10800 IN SRV 0 1 993 mail.gandi.net.
- _pop3._tcp 10800 IN SRV 0 0 0   .
- _pop3s._tcp 10800 IN SRV 10 1 995 mail.gandi.net.
- _submission._tcp 10800 IN SRV 0 1 465 mail.gandi.net.
- gm1._domainkey 10800 IN CNAME gm1.gandimail.net.
- gm2._domainkey 10800 IN CNAME gm2.gandimail.net.
- gm3._domainkey 10800 IN CNAME gm3.gandimail.net.
- webmail 10800 IN CNAME webmail.gandi.net.

Misskey的设置

    • 「コントロールパネル」→「設定」→「メールサーバー」

「メール配信機能を有効化する」にチェックを入れる

以下の通り設定

項目値メールアドレス(ユーザー名)@(独自ドメイン名)ホスト(さっきのMXレコードに入れたやつ、末尾の.は不要)ポート587ユーザー名(メールアドレスと同じ)パスワード(メールアカウントのパスワード)
    • 保存し、配信テストを実施し、テストメールが届くことを確認する

数分くらい時間かかるかも

对象存储配置

Wasabi配置的设置

?2023-11-02 附注:根据日志前缀,似乎可以创建文件夹,所以进行了修改,使其都放入同一个文件夹中。

Wasabi コンソールにログインし、Bucketを作成

一応プロパティはバケットのログだけ有効にし、ログ用プレフィックスに「log/」を指定しておいた

如果选择了Tokyo地区,则正确的区域名称不是ap-northeast-1,而是”ap-northeast-1-ntt”;
如果选择了Osaka地区,则正确的区域名称不是ap-northeast-2,而是”ap-northeast-2-ntt”。
    • 「アクセスキー」→「Create Access Key」より、ルートユーザーでキーを作成

アクセスキーと秘密鍵の両方を控えておく

Nginx配置

在对象存储中添加如下所述的代理。

    # Proxy to S3 storage
    location /media/ {
        rewrite /(.*) /(バケット名)/$1 break;

        # 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 https;

        # AWS compatible authentication with Signature Version 2
        proxy_pass http://s3.(リージョン名).wasabisys.com;
        proxy_set_header Host s3.(リージョン名).wasabisys.com;

        aws_access_key (アクセスキー);
        aws_secret_key (秘密鍵);
        s3_bucket (バケット名);
        chop_prefix /(バケット名);

        proxy_set_header Authorization $s3_auth_token;
        proxy_set_header x-amz-date $aws_date;
    }

sudo nginx -tの結果がsuccessfulになることを確認する。

sudo systemctl restart nginx.serviceでサービスを再起動する。

Misskey的设置

    「コントロールパネル」→「設定」→「オブジェクトストレージ」より「オブジェクトストレージを使用」にチェックを入れ、以下の通り設定する。
項目値Base URL(Misskeyと同じURL)Bucket(バケット名)PrefixmediaEndpoint(proxy_passのところに書いたURL)Region(リージョン名)Access Key(アクセスキー)Secret Key(秘密鍵)SSLを使用する有効Proxyを利用する有効アップロード時に’public-read’を設定する無効s3ForcePathStyle有効

上传文件到云端后,确保能够读写和访问它。

其他功能

服务工作者

按照以下步骤生成并设置公钥和私钥。

sudo npm install web-push -g
web-push generate-vapid-keys

机器人保护

虽然一般不会公开,但还是采用hCaptcha作为一种预防措施。

    アカウントを登録し、サイトキーとシークレットキーを控えておき、Misskeyで入力

DeepL API 深度学习语言翻译接口

感觉可能没什么必要,但还是试一试吧。

DeepLでアカウントを登録
「アカウント」→「アカウント」→「DeepL APIで使用する認証キー」のキーを控えておき、Misskeyで入力

关于代理账户和角色分配等事项

听说如果事先不发布笔记,就搜索不到任何东西。

总结

因为我刚刚建设了服务器,所以从现在开始就像一个人居住的感觉。
至于运维方面,我还没有完全调查,如果感兴趣的话,以后再逐步了解。

广告
将在 10 秒后关闭
bannerAds