beta

セルフホスト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環境があれば基本的には大丈夫ですが、

  1. バージョンが同じであること
  2. 同じ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なのでデータが飛ぶリスクはあります。ですので、定期的にバックアップをすると良いかと思います。

Author

Koji Kadoma
Member of codit.work

新着ノート

新着コード