×
Community Blog Cài đặt Database Neo4j bằng Docker Compose, mã hóa SSL

Cài đặt Database Neo4j bằng Docker Compose, mã hóa SSL

Hướng dẫn cài đặt Database Neo4j bằng Docker compose, có mã hóa SSL, quản lý bằng systemd

Docker đơn giản

Câu lệnh docker đơn giản nhất để chạy Neo4j

sudo mkdir -p /opt/neo4j
openssl rand -base64 1024 | tr -dc 'A-Za-z0-9' | head -c 32  | sudo tee /opt/neo4j/passwd.txt
sudo docker rm -f neo4j
sudo docker run -d \
  --name neo4j \
  -e NEO4J_AUTH=neo4j/$(cat /opt/neo4j/passwd.txt) \
  neo4j:community

1

Chúc mừng bạn đã cài đặt thành công Neo4j, bài học đến đây là kết thúc !

Cài đặt Docker (nếu chưa có)

Để chạy được câu lệnh trên cần cài đặt Docker. Nếu đã cài đặt rồi thì bỏ qua. Nếu chưa biết cách cài đặt Docker, hãy chạy câu lệnh sau

source /etc/os-release
NAME=docker
GPG=https://download.docker.com/linux/$ID/gpg
REPO="https://download.docker.com/linux/$ID $VERSION_CODENAME stable"
curl -fsSL $GPG | sudo gpg --dearmor -o /etc/apt/keyrings/$NAME.gpg
cat << EOF | sudo tee /etc/apt/sources.list.d/$NAME.list
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/$NAME.gpg] $REPO
EOF
sudo apt update
sudo apt install -y \
  docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker --version

Giới thiệu các port của Neo4j

Port 7474: Website giao diện frontend vẽ đồ thị sơ đồ mạng lưới các nút, giao thức HTTP
Port 7473: Cũng là website như port 7474, nhưng giao thức là HTTPS
Port 7687: Data giữa client và server được vận chuyển qua đây
Port 6000: Tạo cluster Neo4j, các node trong cluster tìm thấy nhau qua port này. Chức năng cluster chỉ có trên phiên bản Enterprise

Truy cập Database bằng giao diện website

Chạy lệnh sau để tìm địa chỉ IP của container

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
  neo4j

Ví dụ IP của container là: 172.17.0.2. Mở trình duyệt web truy cập vào container qua địa chỉ: http://172.17.0.2:7474. Lấy mật khẩu đăng nhập website bằng câu lệnh

cat /opt/neo4j/passwd.txt

Ví dụ mật khẩu là: zcvI6TLPHrp9k69VZzjpyouqWguQDuS5. Username mặc định là neo4j

2

Sau khi đăng nhập, ghi thử một bản ghi "Hello World" vào database

3

Query bản ghi vừa tạo
4

Truy cập Database bằng giao diện dòng lệnh

Tool client CLI để kết nối với Neoj4 database có tên là cypher-shell. Tool này không có gói lẻ, phải download về toàn bộ gói cài đặt Neo4j. Chạy lệnh sau để cài đặt cypher-shell

source /etc/os-release
NAME=neo4j
GPG=https://debian.neo4j.com/neotechnology.gpg.key
REPO="https://debian.neo4j.com stable latest"
sudo rm -rf /etc/apt/keyrings/$NAME.gpg
curl -fsSL $GPG | sudo gpg --dearmor -o /etc/apt/keyrings/$NAME.gpg
cat << EOF | sudo tee /etc/apt/sources.list.d/$NAME.list
deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/$NAME.gpg] $REPO
EOF
sudo apt update
sudo apt install -y \
  neo4j
cypher-shell --version

Dùng lệnh sau để truy cập vào database

cypher-shell \
  -a bolt://172.17.0.2:7687 \
  -u neo4j \
  -p zcvI6TLPHrp9k69VZzjpyouqWguQDuS5

Query thử bản ghi "Hello World"

MATCH (n1)-[r]->(n2) RETURN r, n1, n2 LIMIT 25;

Thoát ra bằng lệnh :exit

5

Triển khai bằng Docker compose

Chúng ta sẽ triển khai bằng Docker compose để tăng tính ổn định cho Neo4j database.

Cài đặt (nếu chưa có)

Cài đặt Docker compose, bỏ qua bước này nếu bạn đã cài đặt Docker compose

export VER=2.29.6
sudo curl -SL \
  -o /usr/bin/docker-compose \
  "https://github.com/docker/compose/releases/download/v${VER}/docker-compose-linux-x86_64"
sudo chmod +x /usr/bin/docker-compose
docker-compose --version

Câu lệnh triển khai

sudo docker rm -f neo4j

cat << EOF | sudo tee /opt/neo4j/neo4j.yml
networks:
  neo4j_net:
    driver: bridge
services:
  neo4j:
    image: neo4j:community
    container_name: neo4j
    hostname: neo4j
    networks:
    - neo4j_net
    volumes:
    - /data/neo4j:/data:rw
    - /dump/log/neo4j:/logs:rw
    environment:
    - NEO4J_AUTH=neo4j/$(cat /opt/neo4j/passwd.txt)
    deploy:
      resources:
        limits:
          memory: 1G
    healthcheck:
      test: /var/lib/neo4j/bin/cypher-shell -u neo4j -p $(cat /opt/neo4j/passwd.txt) --encryption false --fail-fast "RETURN 1" || exit 1
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s
    logging:
      driver: json-file
      options:
        max-size: 10m
        max-file: 3
    restart: always
EOF

docker-compose -f /opt/neo4j/neo4j.yml -d

6

/data/neo4j : lưu trữ data lâu dài vào thư mục của máy host
/dump/log/neo4j: lưu trữ log lâu dài vào thư mục của máy host
memory: 1G : phòng tránh tràn bộ nhớ RAM
logging : phòng tránh tràn ổ đĩa do console log
healthcheck : không chỉ cho biết trạng thái của container mà còn kiểm tra app database trong container có thực sự sống tốt hay không. Định kỳ kiểm tra 10s/lần, quá 3 lần đánh dấu unhealthy thì docker khẳng định container này là unhealthy
restart: always : tự phục hồi khi gặp lỗi bằng cách tự restart

Mã hóa SSL

Chúng ta sẽ mã hóa SSL cho data port 7687, và chuyển HTTP sang HTTPS hoạt đổng ở port 7473 (bỏ đi port 7474).

Giả sử tên miền là quang.pro

export fqdn=quang.pro

Nguyên liệu cần có là bộ 3 file: cert.pem, privkey.pem, dhparam.pem. Lưu các file này vào thư mục /etc/tls/quang.pro

Chú ý: Neo4j cần các file SSL được phân quyền 777

Bỏ qua các bước tạo SSL nếu bạn đã có đủ các file trên.

Tạo bộ 2 file SSL cơ bản: cert.pem, privkey.pem

Dùng certbot chạy bằng docker để lấy chứng chỉ miễn phí từ Letsencrypt.
Hãy đảm bảo rằng

  1. DNS đã trỏ tiền miền về server Neo4j
  2. Giải phóng port 80 để Letsencrypt vào acme xác nhận

Câu lệnh lấy chứng chỉ và lưu vào thư mục /etc/tls/quang.pro

sudo rm -rf /tmp/letsencrypt
mkdir -p /tmp/letsencrypt
sudo mkdir -p /etc/tls/$fqdn
sudo docker run -it --rm \
  -v /tmp/letsencrypt:/etc/letsencrypt \
  -p 80:80 \
  certbot/certbot certonly \
    --email no@thanks.com --agree-tos --no-eff-email \
    --redirect --hsts \
    --key-type ecdsa --elliptic-curve secp384r1 \
    --force-renew -d $fqdn --cert-name $fqdn \
    --standalone
sudo cp /tmp/letsencrypt/live/$fqdn/cert.pem /etc/tls/$fqdn/cert.pem
sudo cp /tmp/letsencrypt/live/$fqdn/privkey.pem /etc/tls/$fqdn/privkey.pem
sudo cp /tmp/letsencrypt/live/$fqdn/chain.pem /etc/tls/$fqdn/chain.pem
sudo chmod -R 777 /etc/tls/$fqdn

Tạo file SSL: dhparam.pem

sudo openssl dhparam -out /etc/tls/$fqdn/dhparam.pem 2048
sudo chmod 777 /etc/tls/$fqdn/dhparam.pem

Câu lệnh triển khai

Cấu hình Docker compose với SSL. Mượn port 7374 và port 7687 của host để expose ra internet

cat << EOF | sudo tee /opt/neo4j/neo4j.yml
networks:
  neo4j_net:
    driver: bridge

services:
  neo4j:
    image: neo4j:community
    container_name: neo4j
    hostname: neo4j
    networks:
    - neo4j_net
    volumes:
    - /data/neo4j:/data:rw
    - /dump/log/neo4j:/logs:rw
    - /etc/tls/quang.pro:/etc/tls:ro
    environment:
    - NEO4J_AUTH=neo4j/$(cat /opt/neo4j/passwd.txt)
    - NEO4J_server_https_enabled=true
    - NEO4J_dbms_connector_bolt_tls__level=OPTIONAL
    - NEO4J_dbms_ssl_policy_https_enabled=true
    - NEO4J_dbms_ssl_policy_bolt_enabled=true
    - NEO4J_dbms_connector_bolt_enabled=true
    - NEO4J_dbms_connector_https_enabled=true
    - NEO4J_dbms_ssl_policy_https_base__directory=/etc/tls
    - NEO4J_dbms_ssl_policy_bolt_base__directory=/etc/tls
    - NEO4J_dbms_ssl_policy_https_private__key=privkey.pem
    - NEO4J_dbms_ssl_policy_bolt_private__key=privkey.pem
    - NEO4J_dbms_ssl_policy_https_public__certificate=cert.pem
    - NEO4J_dbms_ssl_policy_bolt_public__certificate=cert.pem
    - NEO4J_dbms_ssl_policy_https_dh__param=dhparam.pem
    - NEO4J_dbms_ssl_policy_bolt_dh__param=dhparam.pem
    - NEO4J_dbms_ssl_policy_https_tls__versions=TLSv1.3
    - NEO4J_dbms_ssl_policy_bolt_tls__versions=TLSv1.3
    ports:
    - 7473:7473
    - 7687:7687
    deploy:
      resources:
        limits:
          memory: 1G
    healthcheck:
      test: /var/lib/neo4j/bin/cypher-shell -u neo4j -p $(cat /opt/neo4j/passwd.txt) --encryption false --fail-fast "RETURN 1" || exit 1
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 60s
    logging:
      driver: json-file
      options:
        max-size: 10m
        max-file: 3
    restart: always
EOF

Quản lý Neo4j bằng systemd

Dùng systemd để giúp Neo4j tự động khởi động cùng với hệ điều hành

cat << EOF | sudo tee /etc/systemd/system/neo4j_docker.service
[Unit]
Description=Neo4j Docker Compose Service
After=docker.service
Requires=docker.service

[Service]
Type=simple
User=root
WorkingDirectory=/opt/neo4j
ExecStop=/usr/bin/docker-compose -f /opt/neo4j/neo4j.yml down
ExecStart=/usr/bin/docker-compose -f /opt/neo4j/neo4j.yml up -d
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now neo4j_docker
0 0 0
Share on

quangnn

8 posts | 0 followers

You may also like

Comments

quangnn

8 posts | 0 followers

Related Products