🔨

neo4jのコンテナを立ち上げるとき追加した設定

2022/03/16に公開

概要

docker-composeでneo4jコンテナを立ち上げていました。
最初のyamlファイルからいくつか設定を追加していったので、これを記載していこうと思います。

初回構築時の設定

初回構築時の設定は以下のようになっています。

docker-compose.yaml
version: '3'
services:
  neo4j:
    container_name: neo4j
    image: neo4j
    ports:
        - 7474:7474
        - 7687:7687
    volumes: 
        - neo4j-data:/data
        - neo4j-logs:/logs
        - neo4j-conf:/conf

volumes:
  neo4j-data:
  neo4j-logs:
  neo4j-conf:

passwordの初期設定

課題

neo4jのpasswordはコンテナ起動後、デフォルトパスワードをUIで再設定していました。
webアプリケーションでneo4jを使用していて、github actionsでアプリの自動テストをしたかったです。
そのためデフォルトパスワードを手動で再設定せず、自動で設定できるようにしたいです。

実装

コンテナ起動時に環境変数からパスワードを設定する方法を使用しました。

docker-compose.yaml
version: '3'
services:
  neo4j:
    container_name: neo4j
    image: neo4j
    ports:
        - 7474:7474
        - 7687:7687
    volumes: 
        - neo4j-data:/data
        - neo4j-logs:/logs
        - neo4j-conf:/conf
+     environment:
+         # default username and password "neo4j"
+         # neo4j password setting (NEO4J_AUTH=neo4j/<password>)
+         - NEO4J_AUTH=neo4j/neo4jpasswprd

volumes:
  neo4j-data:
  neo4j-logs:
  neo4j-conf:

証明書設定

課題

webアプリケーションからneo4jへの通信にboltプロトコルを使用したかったです。
しかし、SSL証明書が設定されていないため、安全な接続の確立出来ず、エラーが出力されうまくいきません。

neobolt.exceptions.SecurityError: Failed to establish secure connection to 'EOF occurred in violation of protocol

実装

neo4jコンテナでは以下のように証明書・秘密鍵を配置する必要があるようです。
https://neo4j.com/developer/kb/setting-up-ssl-with-docker/#_2_copy_ssl_certificates_and_correct_permissions

tree
$HOME/neo4j/ssl/
└── bolt
    ├── private.key
    └── public.crt

証明書・秘密鍵が格納されているディレクトリをコンテナにマウントし、
環境変数で証明書・秘密鍵のファイル名を指定しました。
環境変数の指定は下記を参考にしました。
https://neo4j.com/developer/kb/setting-up-ssl-with-docker/#_3_configure_neo4j

ローカルのディレクトリ構成

tree
. 
├── certs
│   ├── private.key
│   └── public.crt
└── docker-compose.yaml

設定ファイル

docker-compose.yaml
version: '3'
services:
  neo4j:
    container_name: neo4j
    image: neo4j
    ports:
        - 7474:7474
        - 7687:7687
    volumes: 
        - neo4j-data:/data
        - neo4j-logs:/logs
        - neo4j-conf:/conf
+         - ./certs:/var/lib/neo4j/certificates/bolt
+     environment:
+         - NEO4J_dbms_ssl_policy_bolt_enabled=true
+         - NEO4J_dbms_ssl_policy_bolt_private__key=private.key
+         - NEO4J_dbms_ssl_policy_bolt_public__certificate=public.crt
+         - NEO4J_dbms_connector_bolt_tls__level=REQUIRED
+         - NEO4J_dbms_ssl_policy_bolt_client__auth=NONE

volumes:
  neo4j-data:
  neo4j-logs:
  neo4j-conf:

Discussion