From 45bb0a4d412c40290b4b0a7be2954d849b5de7cc Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Wed, 26 Nov 2025 19:22:05 +0800 Subject: [PATCH] docker --- .env | 2 +- Dockerfile | 8 +- docker-compose.yml | 2 +- docker_deplay.sh | 220 ++++++++++++++++++++++++++++++++++++++++ epage_server-latest.tar | 0 5 files changed, 226 insertions(+), 6 deletions(-) create mode 100755 docker_deplay.sh create mode 100644 epage_server-latest.tar diff --git a/.env b/.env index 3597b73..8068ce8 100644 --- a/.env +++ b/.env @@ -1,7 +1,7 @@ # 环境变量配置文件 # 数据库配置 -DATABASE_URL=postgresql://luna:123luna@121.43.104.161:6432/luna +DATABASE_URL=postgresql://luna:123luna@localhost:6432/luna # MQTT配置 MQTT_BROKER_HOST=luna-mqtt diff --git a/Dockerfile b/Dockerfile index b815d4a..c9828c6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,8 +11,8 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # 使用国内pip镜像源 -RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \ - pip config set global.trusted-host mirrors.aliyun.com +# RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \ +# pip config set global.trusted-host mirrors.aliyun.com # 使用国内apt镜像源 RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources && \ @@ -24,7 +24,7 @@ RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debia # 复制requirements文件并安装Python依赖 COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt +RUN pip install --no-cache-dir -r requirements.txt # 复制项目文件 COPY . . @@ -36,4 +36,4 @@ RUN mkdir -p static/uploads static/processed EXPOSE 9999 # 启动命令 -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "9999"] \ No newline at end of file +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "3199"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 130f7aa..2d4fa8a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: dockerfile: Dockerfile container_name: luna-app ports: - - "9999:9999" + - "3199:8199" volumes: - ./static:/app/static env_file: diff --git a/docker_deplay.sh b/docker_deplay.sh new file mode 100755 index 0000000..d046a5f --- /dev/null +++ b/docker_deplay.sh @@ -0,0 +1,220 @@ +#!/bin/bash + +# ============================================================================= +# Docker 镜像构建和部署自动化脚本 +# ============================================================================= + +# 配置变量 - 请根据实际情况修改 +SERVER_HOST="6.6.6.86" # 服务器IP地址 +SERVER_USER="ubuntu" # 服务器用户名 +SERVER_PASSWORD="qweasdzxc1" # 服务器密码 +SERVER_PORT="22" # SSH端口,默认22 +IMAGE_NAME="epage_server" # Docker镜像名称 +IMAGE_TAG="latest" # Docker镜像标签 +CONTAINER_NAME="epage_server-container" # 容器名称 +LOCAL_PORT="3199" # 本地端口 +CONTAINER_PORT="8199" # 容器端口 +TAR_FILE="${IMAGE_NAME}-${IMAGE_TAG}.tar" # 压缩包文件名 + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 日志函数 +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +log_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# 检查依赖 +check_dependencies() { + log_info "检查依赖..." + + if ! command -v docker &> /dev/null; then + log_error "Docker 未安装,请先安装 Docker" + exit 1 + fi + + if ! command -v sshpass &> /dev/null; then + log_error "sshpass 未安装,请先安装 sshpass" + log_info "macOS: brew install sshpass" + log_info "Ubuntu: sudo apt-get install sshpass" + exit 1 + fi + + log_success "依赖检查完成" +} + +# 构建Docker镜像 +build_image() { + log_info "开始构建 Docker 镜像..." + + # 检查是否存在旧的tar文件 + if [ -f "$TAR_FILE" ]; then + log_warning "发现旧的tar文件,正在删除..." + rm -f "$TAR_FILE" + fi + + # 构建镜像并导出为tar文件 + docker buildx build --platform linux/amd64 -t "${IMAGE_NAME}:${IMAGE_TAG}" --output type=docker,dest="./${TAR_FILE}" . + + if [ $? -eq 0 ]; then + log_success "Docker 镜像构建完成: ${TAR_FILE}" + else + log_error "Docker 镜像构建失败" + exit 1 + fi +} + +# 上传文件到服务器 +upload_to_server() { + log_info "上传文件到服务器..." + + sshpass -p "$SERVER_PASSWORD" scp -P "$SERVER_PORT" -o StrictHostKeyChecking=no "$TAR_FILE" "${SERVER_USER}@${SERVER_HOST}:/tmp/" + + if [ $? -eq 0 ]; then + log_success "文件上传成功" + else + log_error "文件上传失败" + exit 1 + fi +} + +# 在服务器上部署 +deploy_on_server() { + log_info "在服务器上部署..." + + sshpass -p "$SERVER_PASSWORD" ssh -p "$SERVER_PORT" -o StrictHostKeyChecking=no "${SERVER_USER}@${SERVER_HOST}" << EOF + set -e + + echo "[INFO] 开始服务器端部署..." + + # 检查并停止现有容器 + if docker ps -a --format 'table {{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then + echo "[INFO] 发现现有容器 ${CONTAINER_NAME},正在停止并删除..." + docker stop ${CONTAINER_NAME} || true + docker rm ${CONTAINER_NAME} || true + fi + + # 检查并删除现有镜像 + if docker images --format 'table {{.Repository}}:{{.Tag}}' | grep -q "^${IMAGE_NAME}:${IMAGE_TAG}$"; then + echo "[INFO] 发现现有镜像 ${IMAGE_NAME}:${IMAGE_TAG},正在删除..." + docker rmi ${IMAGE_NAME}:${IMAGE_TAG} || true + fi + + # 加载新镜像 + echo "[INFO] 加载新镜像..." + docker load -i /tmp/${TAR_FILE} + + # 验证镜像是否加载成功 + if docker images | grep -q "${IMAGE_NAME}"; then + echo "[SUCCESS] 镜像加载成功" + else + echo "[ERROR] 镜像加载失败" + exit 1 + fi + + # 运行新容器 + echo "[INFO] 启动新容器..." + docker run -d -p ${LOCAL_PORT}:${CONTAINER_PORT} --name ${CONTAINER_NAME} ${IMAGE_NAME}:${IMAGE_TAG} + + # 验证容器是否启动成功 + if docker ps | grep -q "${CONTAINER_NAME}"; then + echo "[SUCCESS] 容器启动成功" + echo "[INFO] 容器状态:" + docker ps | grep "${CONTAINER_NAME}" + else + echo "[ERROR] 容器启动失败" + echo "[INFO] 查看容器日志:" + docker logs ${CONTAINER_NAME} + exit 1 + fi + + # 清理临时文件 + echo "[INFO] 清理临时文件..." + rm -f /tmp/${TAR_FILE} + + echo "[SUCCESS] 部署完成!" + echo "[INFO] 应用访问地址: http://${SERVER_HOST}:${LOCAL_PORT}" +EOF + + if [ $? -eq 0 ]; then + log_success "服务器部署完成" + else + log_error "服务器部署失败" + exit 1 + fi +} + +# 清理本地文件 +cleanup_local() { + log_info "清理本地临时文件..." + + if [ -f "$TAR_FILE" ]; then + rm -f "$TAR_FILE" + log_success "本地临时文件已清理" + fi +} + +# 显示部署信息 +show_deployment_info() { + log_success "部署完成!" + echo "" + echo "==========================================" + echo "部署信息:" + echo "==========================================" + echo "服务器地址: ${SERVER_HOST}" + echo "应用端口: ${LOCAL_PORT}" + echo "访问地址: http://${SERVER_HOST}:${LOCAL_PORT}" + echo "容器名称: ${CONTAINER_NAME}" + echo "镜像名称: ${IMAGE_NAME}:${IMAGE_TAG}" + echo "==========================================" + echo "" + log_info "如需查看容器日志,请在服务器上运行: docker logs ${CONTAINER_NAME}" + log_info "如需停止容器,请在服务器上运行: docker stop ${CONTAINER_NAME}" +} + +# 主函数 +main() { + echo "==========================================" + echo "Docker 镜像构建和部署自动化脚本" + echo "==========================================" + echo "" + + # 检查配置 + if [ "$SERVER_HOST" = "your-server-ip" ] || [ "$SERVER_PASSWORD" = "your-password" ]; then + log_error "请先配置脚本顶部的服务器信息" + log_info "需要修改的变量:" + log_info " - SERVER_HOST: 服务器IP地址" + log_info " - SERVER_USER: 服务器用户名" + log_info " - SERVER_PASSWORD: 服务器密码" + exit 1 + fi + + # 执行部署流程 + check_dependencies + build_image + upload_to_server + deploy_on_server + cleanup_local + show_deployment_info +} + +# 脚本入口 +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + main "$@" +fi diff --git a/epage_server-latest.tar b/epage_server-latest.tar new file mode 100644 index 0000000..e69de29