当サイトの記事内ではdockerの管理には現状docker-composeを利用しており、コンテナへの設定受け渡しには原則環境変数を使用しています。しかし環境変数によるパスワードなどの受け渡しは推奨されていないという記事を最近では結構見かけます。代替するものとして、今回はdocker secretsを使用する方法を少し書いておきます(と言ってもdocker-composeのfake secrets)。
ConoHa VPSでbottle
前回
に引き続き、VALUE SERVERからConoHa VPSに移行して動かなくなってたところを直していきます。今回はコレですね。
bottleです。Hello, worldしただけなんですけどね。VALUE SERVERではpython3自体がインストールされていたので、Apacheのmod_cgiを使い、CGIでpythonを起動して動かしていました。
これを今回はdockerコンテナ上のnginxからWSGIで別のdockerコンテナ上のpythonに繋ぎ、bottleを動かします。まあ最近bottle聞かなくなりましたけど。。。
gitlistからgiteaへ
前回はdockerコンテナの起動・停止を独立してできるようにしたので、
今回は新しいコンテナでgitを動かしてみます。
VALUE SERVERはレンタル共有サーバーであり、まともに動くのはPHPだけでした。バージョンは多少古いもののgitコマンドも元から入っており、この組み合わせでgitリポジトリをセルフホストするなら、gitコマンドを必要とし、PHPで動作するgitlistは最適だったと思います。
しかしConoHa VPSに移行しPHP縛りという呪いから開放された現在、同じgitlistで満足してていいのか?と自問した結果、以下の3択ではないかとの結論に至りました。
- 見た目はショボいが最高に低コストで動作する、本家git付属のGitWebに移行
- 見た目もそこそこでコストがPHP分だけになる、gitlistの続投
- 見た目も機能も抜群に良く、同等な機能を持つ競合に比べてコストが低いgiteaに移行
VPSがメモリ1Gでなければ迷わず3なのですが、その気になればプルリクエストが出来たり認証手段も豊富な高機能gitリポジトリセルフホスティングアプリはメモリ消費量が格段に多いのです。giteaはgoで書かれ、Raspberry Piでも動く軽量アプリというのが売りなのですが、それでも何もしてなくてもRSSが150MBほどなわけです。PHPや他のプロセスが50MB程度で顔デカイと思われてる中、その3倍の幅で鎮座しちゃってるのです。しかも仮想メモリVSZを見るとこの人1GBほど使ってて、もう無理!とほぼ諦めてGitWebを調べ始めてたのですが、、、こないだpsコマンドやらtopコマンドやら/procやらで消費メモリをいろいろ見た結果、仮想メモリは障らなければ恐るるに足らずということが分かったため、
一度gitea試してみることになり、今回の設置と相成りました。
docker-compose.ymlの分離
最近は少しメモリ関連の記事を書いていましたが、この記事はそれとは直接関係なく、以下のサーバー運用系の記事の続きになります。
前回最後に、「VALUE SERVER→ConoHa VPS移行作業で漏れた部分」をやっていくということにしてました。まずはgit関連のアプリ追加などを行いたいので、今回はWebとデータベースとアプリを個別に起動/停止できるよう、docker-compose.ymlファイルを分離してみます。
ConoHa VPSでWordPress
前回はdockerのnginxを使ってhttpsで公開できるようにしました。
今回はdockerを使ってWordPressをhttpsで公開できるようにしてみます。
ConoHa VPSでhttps!
前回はLet’s EncryptでSSL証明書を取得しました。
今回はいよいよhttpsでWebサーバーを立ててみます。
ConoHa VPSでSSL証明書取得
前回はdockerを使ったプロキシサーバーを立ててみました。
今回はいよいよhttpsに必要なSSL証明書の取得に取り組みます。
ConoHaのVPSでプロキシサーバー
前回までにdockerを動かせるまでになりました。
今回はdockerで試しにプロキシサーバーを立ててみようと思います。
ConoHaのVPSにdockerを入れる
前回までにssh ユーザー名@elephantcat.workみたいなことができるようになりました。
次はVPSで新しいサービスを稼働させるべく、dockerを入れます。
docker postgresでSSLクライアント認証
何かと面倒なdockerでpostgresを動かし、SSLで接続した上に、せっかくSSLなのでクライアント認証する、という企画です。
CAと鍵と証明書の作成
privateなnetworkなのでオレオレCAを作成します。
create_cert.sh
#!/bin/bash
set -euo pipefail
# create root CA
openssl req -new -nodes -text -subj "/CN=ca.local" -out ca.csr -keyout ca.key
chmod og-rwx ca.key
openssl x509 -req -in ca.csr -text -days 3650 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey ca.key -out ca.crt
rm ca.csr
# create server cert
openssl req -new -nodes -text -out server.csr -keyout server.key -subj "/CN=server.local"
chmod og-rwx server.key
openssl x509 -req -in server.csr -text -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
rm server.csr
# create client certs
openssl req -new -nodes -text -out client1.csr -keyout client1.key -subj "/CN=client1.local"
chmod og-rwx client1.key
openssl x509 -req -in client1.csr -text -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial -out client1.crt
rm client1.csr
# change owner for alpine postgres
sudo chown 70 server.key
- .certが証明書、.keyが秘密鍵
- caがオレオレルートCAで、serverがpostgresが動くサーバ、client1がクライアント用
- domainはとりあえず.local
- CA自己署名証明書は10年、他は1年で作成
- サーバの秘密鍵はalpine上のpostgresイメージのUIDに合わせて70に
postgresをdockerで起動(初回)
docker-compose.yml
version: "3"
services:
db:
image: postgres:12-alpine
container_name: postgres
command: -c ssl=on -c ssl_ca_file=/var/lib/postgresql/ca.crt -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key
ports:
- "5432:5432"
environment:
- POSTGRES_USER=postgres
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=secret
volumes:
- ./ca.crt:/var/lib/postgresql/ca.crt:ro
- ./server.crt:/var/lib/postgresql/server.crt:ro
- ./server.key:/var/lib/postgresql/server.key:ro
- ./data:/var/lib/postgresql/data
- 公式イメージではありません!
起動!
$ docker-compose up
SSLで接続(パスワード認証)
別のコンテナからホストに繋いで確認します。
$ docker run -it --rm postgres:12-alpine psql "host=(ホストIP) user=postgres password=secret"
結果
psql (12.1)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=# \q
外部からの認証をSSLクライアント認証のみに設定
サーバーを一度落とす
$ docker-compose down
./data/pg_hba.confの最後を以下に書き換える
#host all all all md5
hostssl all all all cert map=cnmap
- (ローカルを除く)全IPからのTCPホスト接続をパスワード認証
→ (ローカルを除く)全IPからのTCPホスト接続をSSLクライアント認証(ユーザーマッピングはcnmap)
./data/pg_ident.confに以下を加える
cnmap /^(.*)\.local$ postgres
- cnmapという名前で、.localで終わるCNにユーザーpostgresをマッピングするルールを定義
設定確認
起動!
$ docker-compose up
パスワード認証で接続
$ docker run -it --rm postgres:12-alpine psql "host=(ホストIP) user=postgres password=secret"
結果
psql: error: could not connect to server: FATAL: connection requires a valid client certificate
FATAL: no pg_hba.conf entry for host "172.20.0.1", user "postgres", database "postgres", SSL off
SSLクライアント認証で接続
$ docker run -it --rm \
-v $PWD/client1.crt:/root/.postgresql/postgresql.crt \
-v $PWD/client1.key:/root/.postgresql/postgresql.key \
-v $PWD/ca.crt:/root/.postgresql/root.crt \
postgres:12-alpine psql "host=(ホストIP) user=postgres"
- ややこしそうに見えるが、~/.postgresql/にクライアント証明書とクライアント鍵と信頼してるCAの証明書を置いて、ホスト+ユーザー指定で繋いでるだけ
結果
psql (12.1)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=# \q