使用PeerTube时,使用Vultr的对象存储
为什么
我的实例正在Vultr Cloud Compute上运行,但我把Mastodon迁移到了Vultr的对象存储上。
https://qiita.com/atsu1125/items/fc44c2de0ec6ed197669
顺便说一下,我也计划迁移PeerTube。
这里还有关于Pleroma的部分。
https://qiita.com/atsu1125/items/20b7afbccab6bc829fa2
環境
うちは以下のサーバーでPeerTubeのアプリケーションを実行しています。
データベースはまた別なサーバーにあります。
通常1台のサーバーだと思いますのでそれ向けの内容で書きます。
この方法はPeerTubeのバージョンが3.4以降でのみ使えます。
Vultr High Frequency Compute Tokyo Region
CPU 1Core / RAM 2GB / NVMe 64GB
Fedora 35 non Docker
PeerTube 3.4.1
そして今回はオブジェクトストレージのURLをそのまま公開することはせず、PeerTubeをホストしているNginxでリバースプロキシを行います。
そうしないとリージョンが遠くて単純に不利だし、転送量課金なのでなるべくキャッシュして帯域利用量を減らすべきなのです。
またオブジェクトストレージを将来的に廃止した場合や移転した場合は、自分のインスタンス上では設定ファイルの書き換えだけでURLを変更できちゃいますが、リモートインスタンスから見ればその画像を投稿した時点のURLを参照し続けるので、そのURLが消滅した時点で404になってしまいます。
しかしリバースプロキシしておけば、URLを変えずにオブジェクトストレージを変更できますし、最悪廃止した場合でも、そのURLでローカルのファイルを読み出すように設定すれば404になること回避可能です。
通过Vultr的网站创建对象存储。
Vultrのアカウントにログインしてオブジェクトストレージを追加する。
今はアメリカのニュージャージー州にしか置けない。Labelは適当に。
ReadyになったらCreate Bucketsでバケット作成する。
このバケット名は同一リージョン内で他のユーザのものを含めユニークである(重複しない)必要があるので、
オリジナル性の高い名前(インスタンス名)とかにするといいんじゃないかしら。
バケット作成できたらそのタブは開きっぱなしにして次に。
オブジェクトストレージのポリシーを設定する
Vultr的对象存储默认是私有的,需要将其设为公开以进行访问。
首先,通过以下命令连接到对象存储。
关于如何使用s3cmd,请参考 https://www.vultr.com/ja/docs/how-to-use-s3cmd-with-vultr-object-storage。
sudo dnf install s3cmd
s3cmd --configure
输入Access Key为之前保持打开的页面的Access Key
输入Secret Key为该页面的Secret Key
输入Default Region为Enter
输入S3 Endpoint为ewr1.vultrobjects.com
输入DNS-style为%(bucket)s.ewr1.vultrobjects.com
然后按Enter,Enter,Enter,y+Enter,y+Enter继续。
如果可以的话,这次创建一个名为peertube-media_policy的文本文件。将yourbacketname替换为各自设置的存储桶名称。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::yourbacketname/*"
}
]
}
执行命令”保存,s3cmd setpolicy peertube-media_policy s3://yourbacketname”。
接下来,我们需要设置CORS政策。
在日语中称之为跨域资源共享,
由于PeerTube服务器和对象存储的视频分别来自不同的域名,
如果不进行设置,为了安全起见,视频将无法播放。
因此,首先需要创建corsrules.xml文件。
请将yourdomain替换为您自己的PeerTube域名。
<CORSConfiguration>
<CORSRule>
<ID>Allow WebFont for PeerTube instance</ID>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<MaxAgeSeconds>3000</MaxAgeSeconds>
</CORSRule>
</CORSConfiguration>
保存后,请运行以下命令来进行反映,将yourbacketname替换为您设置的存储桶名称。
s3cmd setcors corsrules.xml s3://yourbacketname
在名称服务器上创建媒体代理的子域名记录。
将对象存储的媒体作为Web服务器地址注册为子域名。
我使用Google Domains,在这里添加与PeerTube服务器相同的地址,并添加名为s3的子域名的A记录和AAAA记录。虽然s3是Amazon Web Services(AWS)中使用的名称,但因为它是一个简短的名称且提到了s3兼容性,所以应该是可以的。
顺便说一句,即使将其托管到完全不同的域也是可以的。例如,misskey.io就在s3.arkjp.net上托管媒体代理。
创建用于媒体代理的Nginx配置文件。
然后,我会为该媒体使用的代理服务器编写Nginx的配置文件。
我正在/etc/nginx/conf.d/s3.yourdomain.conf中编写配置文件,但请根据各自的运营情况进行创建。
请将yourdomain替换为各自的域名,
将proxy_pass后面的URL替换为你刚刚创建的存储桶名称,即yourbucketname。
mkdir /var/cache/nginx/proxy_cache_images
chown -R nginx: /var/cache/nginx/proxy_cache_images
server {
listen 80;
listen [::]:80;
server_name s3.yourdomain;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}
proxy_cache_path /var/cache/nginx/proxy_cache_images levels=1 keys_zone=images:2m max_size=20g inactive=90d;
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name s3.yourdomain;
ssl_session_cache shared:ssl_session_cache:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
location / {
proxy_ignore_headers set-cookie;
proxy_hide_header set-cookie;
proxy_set_header cookie "";
proxy_hide_header etag;
resolver 8.8.8.8 valid=100s;
proxy_pass https://yourbacketname.ewr1.vultrobjects.com$request_uri;
proxy_buffering on;
proxy_hide_header Set-Cookie;
proxy_ignore_headers Set-Cookie;
proxy_set_header cookie "";
proxy_cache images;
proxy_cache_valid 200 302 90d;
proxy_cache_valid any 5m;
proxy_ignore_headers Cache-Control Expires;
proxy_cache_lock on;
add_header X-Cache $upstream_cache_status;
}
}
如果保存了这个,就可以通过sudo nginx -t来检查配置文件,如果一切正常的话,就可以确定OK。
获取媒体代理子域名的SSL证书
刚刚创建了一个名为s3的子域名主机,所以需要SSL证书对吧。
这次我们会使用certbot的nginx插件一次性获取证书。
yourdomain请替换为各自的域名。
运行以下命令:sudo certbot –nginx -d s3.yourdomain。
如果成功了,可以通过运行sudo nginx -t进行确认,然后运行sudo systemctl reload nginx进行应用。
编辑Nginx的systemd服务文件
使用以下的代码在Nginx启动之前等待网络连接就绪:
“`
[Unit]
Wants=network-online.target
After=network-online.target
[Service]
ExecStartPre=/bin/sleep 5
[Install]
WantedBy=default.target
“`
这样做可以确保Nginx在网络连接就绪后再启动,避免了在连接不上 upstream 时出现错误的情况。
systemctl edit --full nginx.service
打开Nginx的服务文件后,在[Service]中
Restart=always
RestartSec=5
请添加以下内容:
如果可能,请通过运行”systemctl status nginx”命令,确认没有出现错误。
该设置将在Nginx进程由于某种原因崩溃时,等待5秒后重新启动。
这样可以等待Internet连接成功,确保在多次重启后可以正常启动。
编辑PeerTube的配置文件。
登录PeerTube用户后,打开/www/peertube/config/production.yaml进行编辑
使用以下值替换yourbacketname、youraccesskey、yoursecretkey、yourdomain等设置的个人值。
object_storage:
enabled: true
# Without protocol, will default to HTTPS
endpoint: 'ewr1.vultrobjects.com' # 's3.amazonaws.com' or 's3.fr-par.scw.cloud' for example
region: 'us-east-1'
credentials:
# You can also use AWS_ACCESS_KEY_ID env variable
access_key_id: 'youraccesskey'
# You can also use AWS_SECRET_ACCESS_KEY env variable
secret_access_key: 'yoursecretkey'
# Maximum amount to upload in one request to object storage
max_upload_part: 4GB
streaming_playlists:
bucket_name: 'yourbacketname'
# Allows setting all buckets to the same value but with a different prefix
prefix: 'streaming-playlists/' # Example: 'streaming-playlists:'
# Base url for object URL generation, scheme and host will be replaced by this URL
# Useful when you want to use a CDN/external proxy
base_url: 'https://s3.yourdomain' # Example: 'https://mirror.example.com'
# Same settings but for webtorrent videos
videos:
bucket_name: 'yourbacketname'
prefix: 'videos/'
base_url: 'https://s3.yourdomain'
如果没有问题, 切回到sudo用户, 使用sudo systemctl restart peertube重新启动并应用配置文件。如果出现错误, 可以使用sudo journalctl -u peertube -f等命令查看详细内容。同时尝试在浏览器中打开PeerTube,可能在这个时候没有任何图片显示出来,但可以尝试上传一张图片,并在DM的公开范围内发布,如果只有这张图片可见,则表示一切正常。
将现有的媒体文件复制到对象存储中
因为现在有很多看不到的图像,所以想要将其复制到对象存储中。
cd /var/www/peertube/peertube-latest
sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run create-move-video-storage-job -- --to-object-storage --all-videos
用这个方法,你可以将数据从本地移动到对象存储。
一旦传输完成,应该可以像平常一样使用PeerTube。