Bläddra i källkod

feat: 添加 Docker 部署支持(Dockerfile + docker-compose 编排)

- 新增 Dockerfile:基于 python:3.12-slim + uv 构建,含 Playwright 支持
- 新增 docker-compose.yml:web + PostgreSQL 双服务编排,含 healthcheck
- 新增 .dockerignore:排除虚拟环境、缓存等不必要文件
- 修改 run.py:支持 FLASK_DEBUG 环境变量控制,绑定 0.0.0.0
kinglee 1 vecka sedan
förälder
incheckning
f7f5093b3a
4 ändrade filer med 122 tillägg och 1 borttagningar
  1. 27 0
      .dockerignore
  2. 32 0
      Dockerfile
  3. 61 0
      docker-compose.yml
  4. 2 1
      run.py

+ 27 - 0
.dockerignore

@@ -0,0 +1,27 @@
+# Python
+__pycache__/
+*.py[cod]
+*.egg-info/
+dist/
+build/
+
+# 虚拟环境
+venv/
+.venv/
+
+# uv
+.uv/
+
+# 数据库
+*.db
+*.sqlite3
+
+# 环境变量(如需本地覆盖可创建 .env.local)
+.env
+
+# IDE
+.vscode/
+.idea/
+
+# Docker
+postgres_data/

+ 32 - 0
Dockerfile

@@ -0,0 +1,32 @@
+FROM python:3.12-slim AS base
+
+# 设置工作目录
+WORKDIR /app
+
+# 安装系统依赖(Playwright 依赖)
+RUN apt-get update && apt-get install -y --no-install-recommends \
+    build-essential \
+    curl \
+    libpq-dev \
+    && rm -rf /var/lib/apt/lists/*
+
+# 安装 uv
+RUN pip install --no-cache-dir uv
+
+# 复制依赖文件
+COPY pyproject.toml ./
+
+# 使用 uv 安装 Python 依赖(不含 dev)
+RUN uv sync --frozen --no-dev
+
+# 安装 Playwright 浏览器
+RUN uv run playwright install chromium --with-deps
+
+# 复制应用代码
+COPY . .
+
+# 暴露端口
+EXPOSE 5000
+
+# 启动命令(生产模式)
+CMD ["uv", "run", "python", "run.py"]

+ 61 - 0
docker-compose.yml

@@ -0,0 +1,61 @@
+version: '3.8'
+
+services:
+  web:
+    build: .
+    container_name: liaowang-web
+    ports:
+      - "5000:5000"
+    environment:
+      - DB_HOST=${DB_HOST:-db}
+      - DB_PORT=${DB_PORT:-5432}
+      - DB_USER=${DB_USER:-liaowang}
+      - DB_PASSWORD=${DB_PASSWORD:-liaowang_secret}
+      - DB_NAME=${DB_NAME:-liaowang_db}
+      - SECRET_KEY=${SECRET_KEY:-change-me-to-a-random-secret}
+      - JWT_SECRET_KEY=${JWT_SECRET_KEY:-jwt-secret-change-me-to-random-string}
+      - SSO_BASE_URL=${SSO_BASE_URL:-http://192.168.92.61:8200}
+      - SSO_CLIENT_ID=${SSO_CLIENT_ID}
+      - SSO_CLIENT_SECRET=${SSO_CLIENT_SECRET}
+      - SSO_REDIRECT_URI=${SSO_REDIRECT_URI:-http://localhost:5000/auth/callback}
+      - SSO_FRONTEND_URL=${SSO_FRONTEND_URL:-http://localhost:5000}
+      - SSO_SCOPE=${SSO_SCOPE:-email}
+      - SSO_LOGOUT_REDIRECT_URL=${SSO_LOGOUT_REDIRECT_URL:-http://192.168.92.61:9200/login}
+    env_file:
+      - .env
+    depends_on:
+      db:
+        condition: service_healthy
+    volumes:
+      # 开发模式:挂载代码实现热重载
+      - .:/app
+      - /app/venv  # 排除虚拟环境目录
+    restart: unless-stopped
+    # 健康检查
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:5000"]
+      interval: 30s
+      timeout: 10s
+      retries: 3
+      start_period: 15s
+
+  db:
+    image: postgres:16-alpine
+    container_name: liaowang-db
+    environment:
+      POSTGRES_DB: ${DB_NAME:-liaowang_db}
+      POSTGRES_USER: ${DB_USER:-liaowang}
+      POSTGRES_PASSWORD: ${DB_PASSWORD:-liaowang_secret}
+    ports:
+      - "5432:5432"
+    volumes:
+      - postgres_data:/var/lib/postgresql/data
+    restart: unless-stopped
+    healthcheck:
+      test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-liaowang}"]
+      interval: 10s
+      timeout: 5s
+      retries: 5
+
+volumes:
+  postgres_data:

+ 2 - 1
run.py

@@ -9,4 +9,5 @@ from app import create_app
 app = create_app()
 
 if __name__ == '__main__':
-    app.run(debug=True, port=5000)
+    debug_mode = os.environ.get('FLASK_DEBUG', 'true').lower() == 'true'
+    app.run(debug=debug_mode, host='0.0.0.0', port=5000)