白衣サーバーの構成
自分は白衣サーバというサーバーをConoHa VPS上で持ってますが、その構成についてちょっとメモ
スペック等
docker-composer.yml
version: "2" services: nginx: image: nginx:alpine container_name: nginx ports: - "80:80" - "443:443" volumes: - "/home/kiridaruma/http/:/web/" - "./nginx/nginx.conf:/etc/nginx/nginx.conf" - "./nginx/conf.d/:/etc/nginx/conf.d" - "/etc/letsencrypt/:/cert/" links: - php-fpm - git - bcdice-api restart: always php-fpm: image: php:7.1-fpm container_name: php-fpm volumes: - "/home/kiridaruma/http/:/web/" - "./php-fpm/php.ini:/usr/local/etc/php/php.ini" - "./php-fpm/www.conf:/etc/php-fpm.d/www.conf" links: - db restart: always db: image: postgres:alpine container_name: postgres volumes: - "./postgres/:/var/lib/postgresql/data" ports: - "5432:5432" environment: POSTGRES_PASSWORD: SECRET_PASSWORD restart: always git: image: gitea/gitea container_name: git volumes: - "./git/:/data/" restart: always bcdice-api: image: ruby container_name: bcdice-api volumes: - "/home/kiridaruma/http/bcdice-api/:/bcdice-api/" restart: always working_dir: "/bcdice-api/" command: sh -c "bundle install && bundle exec rackup" environment: - RACK_ENV=release
各コンテナごとメモ
どうコンテナを組み合わせるのが良いのかは試行錯誤している最中なのでまだわからない。 ただ、今の所この構成が一番しっくりくる。
各ミドルウェアのconfig等はdocker-compose.ymlの直下に専用のフォルダを作って、それをvolumes
でマウントさせるようにしいてる。
全体的なポイントとして、イメージはできる限り軽量なもの(alpine版など)を選ぶようにしている。
version
はよくわからない。
3まであるらしいけど、バージョンが上がると何が変わるんだろう?
とりあえず、今は2を使っている。
あと、restart: always
は大事。
(dnf update
を自動でする設定にしていて、Dockerの更新がかかって1週間ほどサーバが止まってたことがある)
Nginx
HTTPサーバ周りの軸になっている。
そのため、links
やvolumes
がちょっと肥大化しつつある。(もうちょっとスッキリさせたいけど、仕方ないのかなと思いつつある)
他に特徴的なことといえば、TLS証明書はLet's Encryptで発行しているのでvolumes
にその設定が入ってるくらい...?
PHP-FPM
本当はunixドメインソケットでNginxとのやり取りをさせたかったけど、何故かうまく動かない(おそらく、ソケットファイルの権限の問題)ので仕方なくtcpでやっている。 なんでも、unixドメインソケットのほうが効率が良いらしい。
ただ、各コンテナごとに環境が独立しているのでポート番号重複は全く考えなくて良いので少し楽。
DB(PostgreSQL)
自分はMySQL(MariaDB)しか使ったことがなかったけど、色々便利な機能が入ってるのでPostgreSQLにした。
今のところは使ってないけど、今後いろいろやる予定なので、それを見越して追加。
Git(Gitea)
外に出すのはマズイようなプロジェクト用。 個人でプライベートなGit(Githubライクな)サーバを持ってると、なかなか便利。
Gitサーバは
- バイナリファイル1つですぐ動かせるもの
- DBが必要ないもの
- 動作が軽めのもの
を考えて、GogsかGiteaか迷ったけど、Giteaを採用。
正直GogsとGiteaはほとんど同じだけど、何故かGiteaに(理由は覚えてない)。
BCDice-API(Ruby)
BCDice-APIは、TRPG用ダイスロールプログラム(ライブラリ)のBone&CarsをWebAPIとして動くようにしたもので、自分が開発しているOnset!用に使用している。
BCDice-APIはRuby製でSinatraで動いているみたい。
もともとimageはalpine版のRubyで動かそうとしていたが、bundle install
でライブラリが足りなくてコケたので通常版(おそらくDebian)を使用。
ポートは9292で動いてるけど、どこで変えられるのか分からない。 とりあえず支障がないので9292で動かしている。
全体的なまとめ
Dockerは各コンテナごとに独立した環境があるのと、yamlでサーバの構成を書けるのでとても簡単で楽しい。
試行錯誤するときも、さっと試して動かなかったりエラーが出たりしたら直ぐに修正できるのもすごく楽。
ただ、journaldに大量のログが吐かれるので、そこでリソースを結構食われている。 逆に言うと、それ以外はそこまでリソースを食ってない。 メモリ2GBのサーバとしては結構うまく回せていると思う。
今後の改善点として
- 細々とした謎挙動の解決(unixドメインでNginxとPHP-FPMが繋がらない、BCDice-APIのポート設定等)
- 省メモリ化(各種configの調整)
- DockerやDocker-Composeの理解
を頑張りたいなぁと思っている。
このサーバーは仕事とかではなく、単純に趣味なので落ちても問題ないし挑戦できるのでとても楽しい。 メモリ2GBでこれだけやれるし、少ないメモリでいかに回すかを考えると結構面白い。
あなたも、VPSでサーバーを建てたいときはConoHaでどうですか?