サイトをVPSへ移行
GKEで動かしているサイトをさくらのVPSへ移行する
Plume(現在は落ちてる)
BiB/i'd
秘密のアプリケーション
背景
PeerTubeを動かすのにさくらのVPSを借りた
→VPSでPeerTubeを動かす
ので移行先が出来た
移行のためだけに借りるのは億劫だった
前からちょっと遊んだりする場所は欲しいと思ってたKitaitiMakoto.icon
GKEは三種類のアプリケーションしか動かしてないくせにノードを三台動かしているから割高
そしてデータベースをCloud SQLにしてるけどこれが接続数少ない割に高い
Kubernetesで気軽にぽんぽんアプリケーションやレプリカを増やせない
一度構築しちゃえば気軽に増やせるのメリットなのに
勉強目的でKubernetesにしたけど、何年も構成変えてないのでその目的には今は活用していない
Plumeが落ちてるの、永続的ファイルシステム入れれば解決するんだけどKubernetesでNFSを入れるの面倒でやってなかった
やればそんな難しくないんだけどね……KitaitiMakoto.icon
構築
リバースプロクシーは気になってたTraefik使ってみる
複数のDockerコンテナーを扱うのが得意な新時代リバースプロクシー
GKEにデプロイしていたのでどのアプリケーションもDockerizeされている。準備はできてる。
TLS終端はCloudflare DNSのプロクシー機能でやる
Traefikとの食い合わせが悪かった。Traefikでやる。
構成管理はItamae
RubyistのKitaitiMakoto.iconにとってはAnsibleより心地いい
アプリケーションはDocker Composeで起動することにする
全アプリケーションをそうすると決めればItamaeのカスタムリソースを作ることでアプリケーションの追加を楽にできる
code:resources.rb
define :docker_compose_service, base_dir: nil do
name = params:name
base_dir = params:base_dir || raise("missing required attribute: base_dir")
directory "/srv/#{name}"
template "/srv/#{name}/compose.yml" do
owner "root"
group "root"
mode "644"
source File.join(base_dir, "templates/srv/#{name}/compose.yml.erb")
end
template "/etc/systemd/system/#{name}.service" do
owner "root"
group "root"
mode "644"
source File.join(base_dir, "templates/etc/systemd/system/#{name}.service.erb")
end
group name
user name do
gid name
system_user true
shell "/usr/sbin/nologin"
end
execute "usermod -aG docker #{name}" do
not_if "id -Gn #{name} | grep docker"
end
service name do
action :enable, :start
end
service "enable #{name}" do
action :nothing
subscribes :enable, "template/etc/systemd/system/#{name}.service", :delay
end
service "reload #{name}" do
action :nothing
subscribes :reload, "template/srv/#{name}/compose.yml", :delay
end
end
compose.ymlやsystemdのユニットファイルのパスは決め打ち
内容は各サービスで別々に書く
templateのsourceは本当は:autoにして記述を省略したかったけど、defineで定義する共有のカスタムリソースにしたら、定義しているファイルからのパス検索になってしまったのでできなかった
できないことはないが、レシピはサービス毎にcookbooksディレクトリー下に置いてあるのにこれらだけ外にあるの気持ち悪い
その為base_dirなんて属性を足した
どうせbase_dir __dir__としか書かないのだけど
DNSレコードはRakeでCloudflareのAPIを叩く
ドメインはTraefikでも知る必要があるから一覧を共通ファイルで管理したいな
Itamaeのノード属性を使えばできるけど、ノードに紐づく物でもないしな……と思うとItamaeの枠組みから外れた所でやるのがいいかな
ストレージは思案のしどころ
PeerTubeは自分だけ使うつもりだから実はそんなに気にしなくていいはず
とはいえ他のアプリケーションに迷惑かけないようにしておきたい
動画ファイルのバックアップってみんなどうしているんだろう
Plumeが、fediverseに繋いでるとめちゃめちゃ画像ファイルが増える
本来的にはPlume自体を何とかした方がいいのだが……KitaitiMakoto.icon
普通にストレージをいっぱいにして他のアプリケーションを圧迫する未来が見える
少なくとも専用NFSにはしておく
それでもいっぱいになると思うがどうしようか
もうそうなったらしょうがない、ファイルは追加できない、にしかならん気がする
Plume本体を何とかしましょうKitaitiMakoto.icon
オブジェクトストレージ対応するとか
Linuxのディレクトリーでのサイズ制限
データベースはローカル(Dockerホスト)に立てる手もあるけど、アプリケーション毎にコンテナーで立てるので当面いいかな
これも少しずつストレージ使ってくやつだけど流石にNFSは使えない
監視しておいて増えてきたら別マシンとかホスティングサービスに移行しよう
あれ、でもホストに立てるとUNIXドメインソケットで通信できるのか。パフォーマンス出るはずだから魅力的
移行
アップロードした静的ファイルの移行が億劫だな
というかKubernetes忘れ過ぎててどんなやり方がいいか、空では思い付かん。調べよう。
rsyncできたら楽だが
BiB/i'dはDockerizeしてあってデータベースがCloud SQL、ストレージがGCPだったので割とすんなり移行できた。バックアップもいらないし。
Cloud SQLも高いから、脱GKEが終わったら今度はデータベースをホスト内で動かす。
↑はやった。
次はバックアップ
シェルスクリプト
backup gem
何かDockerで動くいいやつある?
Cloudflare R2試してみる?
別にアウトバウンドが無料なのの恩恵はあんまないけど