diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d93662c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,65 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual Environment +venv/ +env/ +ENV/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Git +.git/ +.gitignore + +# Docker +Dockerfile* +docker-compose* +.dockerignore + +# Documentation +README.md +*.md + +# Logs +*.log + +# Environment +.env +.env.* + +# Cache +.cache/ +.pytest_cache/ + +# Temporary files +*.tmp +*.temp \ No newline at end of file diff --git a/.env.docker b/.env.docker new file mode 100644 index 0000000..7ac446c --- /dev/null +++ b/.env.docker @@ -0,0 +1,32 @@ +# Docker环境变量配置文件 + +# 数据库配置 - 使用外部数据库 +DATABASE_URL=postgresql://luna:123luna@121.43.104.161:6432/luna + +# MQTT配置 - 使用Docker内部服务名 +MQTT_BROKER_HOST=luna-mqtt +MQTT_BROKER_PORT=1883 +# MQTT_USERNAME= +# MQTT_PASSWORD= + +# 应用配置 +APP_NAME=墨水屏桌面屏幕系统 +DEBUG=false + +# 文件存储配置 +STATIC_DIR=static +UPLOAD_DIR=static/uploads +PROCESSED_DIR=static/processed + +# 墨水屏配置 +INK_WIDTH=400 +INK_HEIGHT=300 + +# 安全配置 +SECRET_KEY=your-secret-key-change-in-production +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# 管理员配置 +ADMIN_USERNAME=userName +ADMIN_PASSWORD=userPassword \ No newline at end of file diff --git a/.env.example b/.env.example index 087c5d7..c64ef1e 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,7 @@ # 环境变量配置文件 # 数据库配置 -DATABASE_URL=postgresql://luna:123luna@121.43.104.161:6432/luna_ink +DATABASE_URL=postgresql://luna:123luna@121.43.104.161:6432/luna # MQTT配置 MQTT_BROKER_HOST=localhost @@ -23,10 +23,10 @@ INK_WIDTH=400 INK_HEIGHT=300 # 安全配置 -SECRET_KEY=your-secret-key-change-in-production +SECRET_KEY=123tangledup-ai ALGORITHM=HS256 ACCESS_TOKEN_EXPIRE_MINUTES=30 # 管理员配置 -ADMIN_USERNAME=userName -ADMIN_PASSWORD=userPassword \ No newline at end of file +ADMIN_USERNAME=admin +ADMIN_PASSWORD=123456 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..b815d4a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# 使用官方Python基础镜像,配置国内镜像源 +FROM python:3.12-slim + +# 设置工作目录 +WORKDIR /app + +# 设置环境变量 +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PIP_NO_CACHE_DIR=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 + +# 使用国内apt镜像源 +RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources && \ + apt-get update && \ + apt-get install -y --no-install-recommends \ + gcc \ + libpq-dev \ + && rm -rf /var/lib/apt/lists/* + +# 复制requirements文件并安装Python依赖 +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# 复制项目文件 +COPY . . + +# 创建必要的目录 +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 diff --git a/README-Docker.md b/README-Docker.md new file mode 100644 index 0000000..6c9a542 --- /dev/null +++ b/README-Docker.md @@ -0,0 +1,58 @@ +# Docker 部署指南 + +本项目已配置 Docker 和 Docker Compose,可以一键部署整个应用环境。 + +## 快速启动 + +1. 确保已安装 Docker 和 Docker Compose +2. 在项目根目录执行以下命令: + +```bash +# 构建并启动所有服务 +docker-compose up -d + +# 查看服务状态 +docker-compose ps + +# 查看应用日志 +docker-compose logs -f luna-app +``` + +3. 访问应用: + - API 文档:http://localhost:9999/docs + - 管理后台:http://localhost:9999/admin + +## 服务说明 + +- **luna-app**: 主应用服务,运行在 9999 端口 +- **luna-mqtt**: MQTT 服务,运行在 1883 端口 + +注意:本项目使用外部PostgreSQL数据库,数据库地址已在.env.docker文件中配置。 + +## 停止服务 + +```bash +# 停止所有服务 +docker-compose down + +# 停止并删除数据卷(注意:这将删除所有数据) +docker-compose down -v +``` + +## 注意事项 + +1. 首次启动可能需要几分钟等待数据库初始化完成 +2. 应用配置通过.env.docker文件传递,该文件已配置为使用Docker内部服务名 +3. 静态文件通过 volume 挂载,可以直接在宿主机修改 +4. 数据持久化通过 Docker volumes 实现 +5. 如需修改配置,请编辑.env.docker文件,而不是.env文件 + +## 国内镜像源 + +本项目已配置使用国内镜像源,包括: +- Python 基础镜像:阿里云镜像 +- pip 包源:阿里云 pip 源 +- PostgreSQL:阿里云镜像 +- Mosquitto:阿里云镜像 + +这样可以大大提高在国内的构建和拉取速度。 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0f97b27 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,42 @@ +services: + # 主应用服务 + luna-app: + build: + context: . + dockerfile: Dockerfile + container_name: luna-app + ports: + - "9999:9999" + volumes: + - ./static:/app/static + env_file: + - .env.docker + depends_on: + - luna-mqtt + restart: unless-stopped + networks: + - luna-network + + # MQTT服务 (使用Eclipse Mosquitto) + luna-mqtt: + image: eclipse-mosquitto:2.0 + container_name: luna-mqtt + ports: + - "1883:1883" + - "9001:9001" + volumes: + - mosquitto_data:/mosquitto/data + - mosquitto_logs:/mosquitto/log + restart: unless-stopped + networks: + - luna-network + +# 数据卷 +volumes: + mosquitto_data: + mosquitto_logs: + +# 网络 +networks: + luna-network: + driver: bridge \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 898bea2..635473d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,6 @@ pydantic-settings==2.1.0 python-jose[cryptography]==3.3.0 passlib[bcrypt]==1.7.4 aiofiles==23.2.1 -httpx==0.25.2 \ No newline at end of file +httpx==0.25.2 +itsdangerous==2.1.2 +jinja2==3.1.2 \ No newline at end of file