2023-01-02(月)

Fly.io に GoToSocial のおひとりさまインスタンスを立てた

  • 2017 年の第一次 Mastodon ブームの折にも自前でインスタンスを立ててみたものの、当時使っていたさくらの VPS ではあまりにも重すぎたのと、Mastodon を積極的に使う理由も無く「結局 Twitter でええやん」となり、すぐに使わなくなった
    • 余談だが、行儀の悪い方法でインスタンスを潰したせいか、当時の URI に対して未だにリクエストが来ているのが分かったので、Cloudflare Workers で 410 Gone を返すようにした
  • 最近の Twitter のゴタゴタを受けても、個人的には思想的にどうのこうのという理由で積極的に脱 Twitter しようという感じではないものの、万が一・億が一レベルで物理的に Twitter が残るか怪しい雰囲気も出てきたことや、世間的に脱 Twitter が加速したときの準備をしようと思い、年末くらいから動き始めた
  • Mastodon はおひとりさまインスタンスにはヘビーすぎるので Misskey を試したけど、なぜかリモートフォローができず詰まっていた
    • Cloudflare が悪さして Misskey までリクエストが届いていなかったりしたということはあったものの、その辺りを潰してもなお解消せずお手上げだった
  • そうこうしているうちに脱TwitterしたいのでMastodonに移行しつつ、gotosocialでオレオレサーバーを立ててみたというエントリをはてブ経由か何かで見つけて、これ良さそうだなと思って試し始めた
  • Misskey と同様、Docker で自前で動かしているとなぜかうまくいかなかったが、Fly.io で動かすという方法があることを知り Fly.io で試したら何となく上手く動き始めたっぽい
    • Fly.io、この日記の引っ越しを検討したときにも存在は認知はしていたが禄に調べてなかったけど、Dockerfile や Docker イメージを食わせれば何でも動くっぽいので、そのうちこの日記も移してしまいたい

といった経緯で @[email protected] でおひとりさまインスタンスを始めた。Twitter 自体、自ら発信するというよりは情報を拾うために使う傾向が強く、「今後は GoToSocial の方でばりばりやっていく」という気概も一切ないので、こっちはこっちでテキトーに使っていく。

「おま環」の可能性は否めないけど、Fly.io で詰まった点がいくつかあるのでメモ。

  • flyctl を打っても反応が無かったり、著しく反応が遅いことがある
    • 特定のコマンドに限らず発生する
    • 未だに解消はしておらず、再実行を繰り返すしか対処しようがないが、今後は GoToSocial のバージョンアップ時の再デプロイくらいでしか使わないだろうから目をつぶることにする
  • CNAME レコードで独自ドメインを設定すると、Cloudflare でプロキシできなかったり、なぜか繋がらない・通信が詰まる感じになることがある
    • Cloudflare でプロキシできない件については、ググって出てきた Fly.io のフォーラムの情報などを見る限りでは「プロキシさせるな」が答えのように見受けられたので大人しくそうした
    • プロキシさせないことで「なぜか全く繋がらない」という事象が一旦は解消できたと思われたが、それでもタイミングによっては繋がらなかったり、フン詰まるということが発生していた。これについては、当てずっぽうで A レコード (と AAAA レコード) に変えてみたら綺麗に解消した
    • また (これも理由はよく分からないけど)、副次的に Cloudflare でプロキシさせても問題なくなったので、画像ファイル等のストレージである S3 に対するリクエストを減らすことができた (はず)

2022-12-31(土)

2022 年買ってよかったもの

Panasonic MC-NS10K

ダイソンのスティック型が壊れたので買い換え。

わしに必要だったのは、吸引力じゃなくてゴミ捨て時に「掃除機の掃除機」が要らない掃除機だった*1。どうせ犬小屋住まいだしバッテリー保ちなんかも問題なし。

スプラトゥーン 3

久しぶりにゲームに大ハマりして、現在進行形で大分時間を溶かされている。

ナワバリバトルばっかりやってるせいもあってウデマエは A にタッチしたことがあるくらいだし、サーモンランも「たつじん」をうろうろしてるくらいの下手くそだけど、飽きずにプレイし続けている。昨日からヨビ祭が始まったので正月休みもこれで大体潰れてしまいそう。

エアウィーヴ ピロー S-LINE

買ったというかふるさと納税の返礼品として。控除上限的にもちょうど良さげだったので QOL 向上を目論んでこれにした。

届いてから初見の感想は「ただのでかい枕」、「値段を考えると失敗したかも」というものだったが、使ってみると感想がガラッと変わった。何が良いのか言語化できないもどかしさがあるし、人によって向き不向きがあるものだろうけど、わしには合っていたので満足している。

*1 実際に掃除機の掃除機を使っていたわけではないが


2022-12-04(日)

tDiary を GCP に移した

2018 年 12 月から Heroku で動かしていたこの日記も Heroku の Free Dyno 廃止にともなって引っ越した。乞食運用を続けるとなると知ってる限りでは GCP (GCE) くらいしか選択肢が無いから移行先はすぐに決まった。PaaS から IaaS へ逆戻りは致し方ないとして、どうせコンテナを動かすだけだし今更「フツー」の Linux ディストリビューションを使うのも色々面倒なので Container-Optimized OS にしたみた。

Container-Optimized OS の存在は昔から知っていて、できることの制限が厳しいのかと勝手に思っていたけど、Docker を動かすことに限れば「フツー」の Linux ディストリビューションとほとんど遜色ない感じではある。ただそうは言っても完全に同じように使えるというわけではないが、GCP の Container-Optimized OS でサイトを運用するときの tips というページが非常に役立った。

試行錯誤の末に以下のような感じになった。

cloud-init

  • 最初はタダで済む「標準永続ディスク」1 本でインスタンスを立てたけど、あんまりにも遅すぎるので、システム領域およびスワップ用として「バランス永続ディスク」を追加して、「標準永続ディスク」はデータ領域に変更した。これのせいで完全無料ではなくなったけど、多分 ¥ 100 もしないくらいだろうし十分安い
  • Docker のもろもろのファイルの置き場所は「標準永続ディスク」にしたので相変わらず遅いっちゃ遅いけど、ここは我慢することにした
#cloud-config
timezone: Asia/Tokyo

write_files:
- path: /etc/docker/daemon.json
  content: |
    {
            "data-root": "/mnt/disks/docker",
            "live-restore": true,
            "log-driver": "gcplogs",
            "storage-driver": "overlay2",
            "mtu": 1460
    }
- path: /etc/systemd/system/nginx.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=nginx
    Requires=docker.service

    [Service]
    ExecStart=/usr/bin/docker run -e TZ=Asia/Tokyo --name nginx --network nginx-proxy -p 443:443 --pull always --rm -v /var/docker/nginx/conf.d:/etc/nginx/conf.d -v /var/cache/nginx:/var/cache/nginx -v /var/run:/var/run nginx:stable-alpine
    ExecStop=/usr/bin/docker stop nginx
    ExecStopPost=/usr/bin/docker rm nginx
- path: /etc/systemd/system/tdiary.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=tDiary
    Requires=docker.service

    [Service]
    ExecStart=/usr/bin/docker run --rm -v /var/docker/tdiary:/var/docker/tdiary -v /var/run/docker.sock:/var/run/docker.sock -w=/var/docker/tdiary docker/compose:1.29.2 up
    ExecStop=/usr/bin/docker run --rm -v /var/docker/tdiary:/var/docker/tdiary -v /var/run/docker.sock:/var/run/docker.sock -w=/var/docker/tdiary docker/compose:1.29.2 down

runcmd:
- systemctl daemon-reload
- systemctl restart docker
- systemctl start tdiary.service
- systemctl start nginx.service

bootcmd:
- swapon /var/swapfile
- fsck.ext4 -tvy /dev/sdb1
- mkdir -p /mnt/disks/docker
- mount -o nosuid,nodev,commit=30,defaults -t ext4 /dev/sdb1 /mnt/disks/docker

tDiary の docker-compose.yml

  • 公式の Docker イメージだと MongoDB が使えない、けど自分でイメージをビルドするのも面倒、ということで command に小細工を仕込んでお茶を濁している
services:
  tdiary:
    image: tdiary/tdiary:${TDIARY_VERSION}
    env_file:
      - ./.env
    command: >
      sh -c '
        echo "gem \"tdiary-io-mongodb\"" >> /usr/src/app/Gemfile.local &&
        echo "gem \"tdiary-cache-memcached\"" >> /usr/src/app/Gemfile.local &&
        curl -o /usr/src/app/tdiary.conf https://raw.githubusercontent.com/tdiary/tdiary-core/v${TDIARY_VERSION}/misc/paas/heroku/tdiary.conf &&
        bundle --path=vendor/bundle --without=development:test --retry=3 &&
        bundle exec rackup'
    expose:
      - 9292
    networks:
      - default
      - nginx-proxy
    depends_on:
      - memcached
    volumes:
      - ./.htpasswd:/usr/src/app/data/.htpasswd

  memcached:
    image: memcached:1.6.17-alpine
    networks:
      - default

networks:
  default:
    internal: true
  nginx-proxy:
    external: true

.env はこんな感じ。

TDIARY_VERSION=5.2.4
AMAZON_ACCESS_KEY=********
AMAZON_SECRET_KEY=********
MEMCACHE_SERVERS=memcached:11211
MONGODB_URI=mongodb+srv://********
RACK_ENV=production
TZ=Asia/Tokyo

Big thanks to Heroku