跳转至

数据库服务部署

启动数据库

本文是数据库安装流程的第二步,用于启动基础数据库服务。若镜像尚未准备好,请先阅读 数据库镜像拉取。服务启动后,如果需要导入示例业务数据,继续阅读 场景数据导入;如果要接入 NL2SQL 的 Semantic Service metadata,继续阅读 Semantic Service 部署指南

首先准备 docker compose 使用的网络和 docker-compose-db.yaml 文件:

docker network create datapilot-network 2>/dev/null || true
cat > ~/docker-compose-db.yaml << 'EOF'
services:
  elasticsearch:
    image: elasticsearch:7.10.1
    container_name: datapilot-es
    restart: unless-stopped
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - "discovery.type=single-node"
      - "xpack.security.enabled=false"
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - "path.repo=/usr/share/elasticsearch/snapshots"
    ulimits:
        memlock:
          soft: -1
          hard: -1
        nofile:
          soft: 65536
          hard: 65536
    volumes:
      - ${ES_DATA_DIR:-~/es_data}:/usr/share/elasticsearch/data
    networks:
      datapilot-network:
        aliases:
          - elasticsearch
    healthcheck:
      test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -E '\"status\":\"(green|yellow)\"'"]
      interval: 30s
      timeout: 10s
      retries: 3
  postgres:
    image: postgres:15-alpine
    container_name: datapilot-postgres
    restart: unless-stopped
    ports:
      - "${PG_PORT:-5432}:5432"
    environment:
      POSTGRES_DB: ${DATABASE_NAME:-datapilot}
      POSTGRES_USER: ${DATABASE_USER:-datapilot_user}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD:-your_mysql_root_password}
      PGDATA: /var/lib/postgresql/data/pgdata
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./docker/postgres-init:/docker-entrypoint-initdb.d
    networks:
      datapilot-network:
        aliases:
          - postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${DATABASE_USER:-datapilot_user} -d ${DATABASE_NAME:-datapilot}"]
      interval: 30s
      timeout: 10s
      retries: 3
  mysql:
    image: mysql:8.4
    container_name: datapilot-mysql
    restart: unless-stopped
    ports:
      - "${MYSQL_PORT:-3306}:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-your_mysql_root_password}
      MYSQL_DATABASE: ${MYSQL_DATABASE:-appdb}
      MYSQL_USER: ${MYSQL_USER:-app}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD:-app_pass}
      MYSQL_ALLOW_EMPTY_PASSWORD: "no"
      TZ: Asia/Shanghai
    command:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_0900_ai_ci
        - --default-time-zone=+8:00
        - --sql-mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
        - --max-connections=1000
    volumes:
      - mysql_data:/var/lib/mysql
      - ./docker/mysql-init:/docker-entrypoint-initdb.d/
      - ./docker/mysql-conf:/etc/mysql/conf.d/
    networks:
      datapilot-network:
        aliases:
          - mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-your_mysql_root_password}"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
volumes:
  es_data:
  postgres_data:
  mysql_data:
networks:
  datapilot-network:
    external: true
    name: datapilot-network
EOF

然后设置vm.max_map_count

sudo chmod -R 777 ~/es_data
[ $(cat /proc/sys/vm/max_map_count) -lt 262144 ] && (echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p) || echo "vm.max_map_count 已经符合要求,无需修改。"

然后启动&验证数据库

# 启动数据库
cd ~
docker compose -f ~/docker-compose-db.yaml up -d

# 验证数据库是否启动成功
# 查看容器状态
docker ps

# 连接数据库(连接后退出使用Ctrl+D)
sudo docker exec -it datapilot-mysql mysql -uapp -papp_pass
sudo docker exec -it datapilot-postgres psql -U datapilot_user -d datapilot
curl localhost:9200

若需要停止并删除数据库&卷&网络,执行↓

cd ~
docker compose -f ~/docker-compose-db.yaml down -v