セルフホストCMS・DiretusをDocker&独自ドメインでサクッと構築する方法
セルフホストCMS・DiretusをDocker&独自ドメインでサクッと構築する方法をまとめました。
公開日:2022年11月24日
DockerでDirectusサーバーを独自ドメインで構築する
さて、肝心のDockerの設定ですが、Docker composeを使えばファイル数個で即Directusサーバーを独自ドメイン(SSL付き)で構築できます。
サーバーはどこでも良いですが、VPSなどのDockerをインストール出来る(してある)サーバーが必須です。
Dockerがインストール済みのサーバーを探しているなら、ConoHa VPSが簡単でおすすめです。
Dockerインストールの手間もないため、ConoHa VPSなら15分もあればDirectusサーバーを構築できると思います。
必要なファイル
必要なファイルはdocker-compose.ymlだけでOKです。
# docker-compose.yml
version: '3'
services:
database:
container_name: database
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
volumes:
- ./mysql:/var/lib/mysql
networks:
- directus
ports:
- 5101:3306
cap_add:
- SYS_NICE
environment:
MYSQL_ROOT_PASSWORD: rootユーザーのパスワード
MYSQL_DATABASE: directus
cache:
container_name: cache
image: redis:6
networks:
- directus
directus:
container_name: directus
image: directus/directus:latest // directus/directus:バージョン
ports:
- 8055:8055
volumes:
- ./uploads:/directus/uploads
networks:
- directus
depends_on:
- cache
- database
environment:
KEY: 'キー'
SECRET: 'シークレット'
DB_CLIENT: 'mysql'
DB_HOST: 'database'
DB_PORT: '3306'
DB_DATABASE: 'directus'
DB_USER: 'root'
DB_PASSWORD: 'rootユーザーのパスワード'
CACHE_ENABLED: 'true'
CACHE_STORE: 'redis'
CACHE_REDIS: 'redis://cache:6379'
ADMIN_EMAIL: 'メールアドレス'
ADMIN_PASSWORD: 'パスワード'
# Make sure to set this in production
# (see https://docs.directus.io/self-hosted/config-options#general)
PUBLIC_URL: 'https://ドメイン'
VIRTUAL_HOST: ドメイン
LETSENCRYPT_HOST: ドメイン
LETSENCRYPT_EMAIL: メールアドレス
nginx-proxy:
image: nginxproxy/nginx-proxy
container_name: nginx-proxy
ports:
- 80:80
- 443:443
volumes:
- conf:/etc/nginx/conf.d
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- certs:/etc/nginx/certs:ro
- ./htpasswd:/etc/nginx/htpasswd
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- directus
acme-companion:
image: nginxproxy/acme-companion
container_name: nginx-proxy-acme
environment:
- DEFAULT_EMAIL=your@email.com
- NGINX_PROXY_CONTAINER=nginx-proxy
volumes:
- conf:/etc/nginx/conf.d
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- certs:/etc/nginx/certs:rw
- acme:/etc/acme.sh
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- directus
volumes:
conf:
vhost:
html:
certs:
acme:
networks:
directus:
書き換える部分は、日本語で書いてある部分だけです。キーとシークレットは自由な文字列ですが、UUIDなどで発行するか、
openssl rand -base64 24
などで乱数を発行すればOKです。
なお、データベースのセキュリティ設定は各自変えましょう。
MySQL 8からパスワードによるログインがmysql_native_passwordではないものに変更されています。そのため、directusインスタンスからMySQLサーバーにアクセスができなくなるので、
command: --default-authentication-plugin=mysql_native_password
で、対処しています。
MySQLデータベースやSSLの認証データなどは永続化されているので、このままマシンを再起動しても問題ありません。
セルフホストの通常版から移行する際の注意点
Docker&Docker Compose環境があれば基本的には大丈夫ですが、
- バージョンが同じであること
- 同じDBベンダーであること
という点だけは注意です。
特に大事なのがDirectusのバージョンで、バージョンが合わないと予期せぬエラーに遭遇して詰みます。自分はこれで半日溶かしました。
Directusのバージョンはdocker-compose.yml内の「image: directus/directus:バージョン」で指定します。
data-model、collectionのitemをimportする方法
Directusはdata-modelのインポート方法を提供していない(そもそも今回のようなケースを想定していない)ため、機能としてはありません。
ですので、単純にデータベースをまるっとDocker環境にコピーすることでimportを実施します。
Sequal Proなどのクライアントを使うか、コマンドラインからmysqldumpでデータベース全体をバックアップして、新しいDBにインポートする方法になります。
起動する
ということで、任意の場所にdocker-compose.ymlを配置したら、
docker-compose up -d
で起動します。これだけで設定がきちんと書けていればMySQLサーバー、Redisサーバー、Nginxサーバー、プロキシサーバー、Directusサーバーが一気に立ち上がっているはずです。
もし初回起動でDirectusがMySQLに接続できなくてエラーになる場合は、MySQLコンテナの起動よりも先にDirectusコンテナが起動してしまったためなので、もしエラーを吐いたら、
docekr-compose restart
でコンテナを再起動するか、
docker logs directus
でエラー内容をチェックしましょう。
既存のDirectusから移行する場合は、MySQLサーバーは「IPアドレス:5101」でアクセスできるので、SQLクライアントなどでインポートすればきちんと動作するはずです。インポートが終わったら、5501のポートは閉じてしまった方がセキュリティ的には安全です。
運用上の注意点
SSDのVPSを使う場合、メモリが1GB以下のインスタンスではSwapが設定されていないとメモリ不足になってフリーズすることがあるので、Swapが設定しておいたが安心です。
あとは、MySQLのデータは永続化はしていますが、VPSなのでデータが飛ぶリスクはあります。ですので、定期的にバックアップをすると良いかと思います。
新着ノート
-
NUXT3
公開日:2023年2月16日
-
NUXT3
公開日:2023年1月30日
新着コード
-
Vue.js
公開日:2022年4月18日
-
Vue.js
公開日:2022年4月13日