わかりにくいコケ方をしたので備忘録として
構成
前提
- リバースプロキシを経由してMisskeyインスタンスへアクセスすることが可能
- サーバがamd64環境で動作している(arm64では未検証)
NW
172.16.5.0/24
リバースプロキシ
OS: Ubuntu 22.04 LTS
HTTPServ: apache2
IP: 172.16.5.2
Misskeyサーバ
OS: Ubuntu 22.04 LTS
HTTPServ: Nginx
FQDN: mi.example.net
IP: 172.16.5.3
MinIO
OS: Ubuntu 22.04 LTS
FQDN: media.example.net
IP: 172.16.5.4
データ格納場所: /mnt/data/
Misskeyから見るURL: media.example.net/misskey/
MinIOのインストール
2023/06/26時点での手順です.
$ wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230619195250.0.0_amd64.deb -O minio.deb
$ sudo dpkg -i minio.deb
値の設定
$ sudo vim /etc/default/minio
MINIO_ROOT_USER="minio-admin"
MINIO_VOLUMES="/mnt/data"
MINIO_OPTS="-C /etc/minio --address :9000 --console-address :9001"
MINIO_ROOT_PASSWORD="miniopasswd"
systemdの設定作成
$ sudo vim /etc/systemd/system/multi-user.target.wants/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio
[Service]
Type=notify
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible
EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=1048576
# Specifies the maximum number of threads this process can create
TasksMax=infinity
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
# Built for ${project.name}-${project.version} (${project.name})
ユーザの作成
$ sudo useradd minio-user -s /sbin/nologin
データ格納場所の作成(あなたの環境に合わせて置き換えてください)
$ sudo mount /dev/sdxN /mnt/data/
$ sudo chown -R minio-user:minio-user /mnt/data
$ sudo chmod -R 600 /mnt/data
サービスの起動
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now minio
これでWebからアクセスすることが可能です.
設定したディレクトリに対して,minio-userに書き込み権限がない場合,起動することができません.
MinIOの設定
http://172.16.5.4:9001
/etc/default/minioで定義したユーザ名とパスワードでログインします.
バケットの作成
Bucketsから,Create Bucketをクリックします.
公開先が https://media.example.net/misskey/ の場合,バケット名をmisskeyにします
バージョニングやクォータなどは不要なのでオフのままCreate Bucketをクリックします.
バケットの設定
Bucketsから作成したバケットをクリックし,ポリシなどを設定します.
Access Policyを設定します.
プルダウンメニューからCustomをクリックし,以下を入力します.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"*"
]
},
"Action": [
"s3:GetBucketLocation",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::*",
"arn:aws:s3:::misskey/*"
]
}
]
}
アクセスキーの生成
Misskeyからアクセスするためにアクセスキイーを生成します.
Access Keysから,Create access keyをクリックします
自動で生成されるので,特に改変せずにCreateします.
アクセスキーとアクセストークンが表示されます.
アクセストークンはこれ以降確認することができないため,忘れないでください.
生成したAccess Keyをクリックすると,ポリシの入力画面が出てきます
以下のようにポリシを入力します
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::misskey/*"
]
}
]
}
入力後,Setをクリックし,反映します.
リバースプロキシの設定
この設定はあなたの環境に合わせて設定してください.
とりあえずアクセスできるだけの設定です.
$ sudo vim /etc/apache2/sites-available/minio.conf
<VirtualHost *:80>
ServerName media.example.net
ProxyPreserveHost On
ProxyPass / http://172.16.5.4:9000/
ServerAdmin webmaster@localhost
#DocumentRoot /var/www/html/
CustomLog /var/log/apache2/media-access_log combined
ErrorLog /var/log/apache2/media-error_log
</VirtualHost>
設定の反映.
$ sudo a2ensite minio
$ sudo systemctl reload apache2
DNSサーバの設定
設定については割愛します.
注意事項
内部向けにプライベートIPアドレスを返却するDNSサーバを構築し,Misskeyインスタンスがこれを使用している場合,
カスタム絵文字やアイコンが表示できなくなることがあります.
この詳細は後々書きます.
Misskeyへの設定
コントロールパネル→オブジェクトストレージで設定します.
オブジェクトストレージを使用を有効にし,以下のように設定します
Base URL: ファイルへのURL. ここでは http://media.example.net/misskey
Bucket: バケット名. ここでは misskey
Prefix: バケットのルートに配置する場合は空で可
EndPoint: MinIOのIPアドレスを入力
Region: リージョン.存在しないが,us-east-1を設定
Access key: アクセスキーを入力
Secret key: アクセストークンを入力
保存をクリックし,設定を反映させます.
画像を投稿に添付し,正常に画像が表示されれば完了です.
画像へのリンクが次のように設定されます.
http://media.example.net/misskey//filename.jpg
トラブルシューティング
そのうち書きます