diff --git a/.env.example b/.env.example index 24470ad..6b21ee5 100644 --- a/.env.example +++ b/.env.example @@ -4,12 +4,8 @@ # 基础URL BASE_URL=http://10.80.0.2:5045 -# 登录凭据 -USERNAME=hao.wang@westwell-lab.com -PASSWORD=wh707297 # Flask配置 FLASK_DEBUG=False -SECRET_KEY=dev-secret-key PORT=5002 HOST=0.0.0.0 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a03c348 --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +# 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 + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Logs +*.log +logs/ +multi_camera.log +complete_multi_camera.log + +# IDE +.vscode/ +.idea/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Project specific +.Dockerfile +docker-build.sh +docker-run.sh +start.sh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index cfa864f..0000000 --- a/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -# 多摄像头实时监控系统 Docker镜像 -FROM python:3.9-slim - -# 设置工作目录 -WORKDIR /app - -# 设置环境变量 -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 - -# 安装系统依赖 -RUN apt-get update && apt-get install -y \ - curl \ - && rm -rf /var/lib/apt/lists/* - -# 复制依赖文件 -COPY requirements.txt . - -# 安装Python依赖 -RUN pip install --no-cache-dir -r requirements.txt - -# 复制应用文件 -COPY . . - -# 创建日志目录 -RUN mkdir -p /var/log/multi_camera - -# 暴露端口 -EXPOSE 5002 - -# 健康检查(使用/health端点) -HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ - CMD curl -f http://localhost:5002/health || exit 1 - -# 设置启动命令 -CMD ["python3", "run.py"] \ No newline at end of file diff --git a/README.md b/README.md index 8a36aca..46c9298 100644 --- a/README.md +++ b/README.md @@ -1,197 +1,171 @@ -# 多摄像头实时监控系统 +# 多摄像头网格布局监控系统 -## 项目概述 -这是一个基于Flask的多摄像头实时监控系统,支持6个摄像头的网格布局显示,具有完整的登录认证、实时状态监控和摄像头控制功能。 +一个基于Flask的Web应用,用于实时监控多个摄像头流,并以网格布局展示。支持动态添加/删除摄像头、实时画面显示、日志记录等功能。 ## 功能特性 -### 🎥 摄像头功能 -- **6个摄像头网格布局**:3×2无缝连接网格 -- **实时视频流**:直接嵌入原系统摄像头页面 -- **独立摄像头控制**:每个摄像头可单独操作 -- **摄像头编号切换**:支持0-7号摄像头切换 - -### 🎛️ 控制功能 -- **刷新所有摄像头**:一键刷新所有视频流 -- **重新连接系统**:自动重新登录认证 -- **全屏显示**:支持单个摄像头全屏显示 -- **实时状态监控**:显示内存、CPU使用率和当前时间 - -### 🔐 认证功能 -- **自动登录**:使用预设账号密码自动认证 -- **Session保持**:维持登录状态 -- **自动重连**:检测连接状态并自动重连 +- **多摄像头支持**:可同时监控最多6个摄像头(可配置)。 +- **网格布局**:自适应网格展示,支持1x1到3x3布局。 +- **实时画面**:通过RTSP流获取实时视频,低延迟显示。 +- **摄像头管理**:提供RESTful API动态管理摄像头(启动/停止/添加/删除)。 +- **日志系统**:自动记录运行日志到`./logs/multi_camera.log`,支持日志轮转。 +- **环境配置**:通过环境变量灵活配置,无需修改代码。 +- **无健康监控**:已移除CPU/内存监控功能,专注于核心监控。 +- **无认证**:已移除登录和令牌认证,简化访问。 ## 系统要求 -### 依赖包 +- Python 3.8+ +- Flask 2.3+ +- OpenCV (opencv-python) +- 其他依赖见`requirements.txt` + +## 安装步骤 + +1. **克隆仓库** + ```bash + git clone + cd multi_camera_project_v0.1 + ``` + +2. **创建虚拟环境(可选)** + ```bash + python3 -m venv venv + source venv/bin/activate # Linux/Mac + # 或 venv\Scripts\activate # Windows + ``` + +3. **安装依赖** + ```bash + pip install -r requirements.txt + ``` + +4. **环境配置** + - 复制`.env.example`为`.env`: + ```bash + cp .env.example .env + ``` + - 编辑`.env`文件,设置你的摄像头RTSP地址和其他参数: + ``` + BASE_URL=http://10.80.0.2:5045 + FLASK_DEBUG=False + PORT=5002 + HOST=0.0.0.0 + CAMERA_URLS=rtsp://admin:password@192.168.1.101:554/stream1,rtsp://... + ``` + 注意:`CAMERA_URLS`是以逗号分隔的RTSP URL列表,最多支持6个摄像头。 + +## 运行应用 + +### 开发模式 ```bash -Flask==2.3.3 -requests==2.31.0 +python3 run.py ``` +访问 http://localhost:5002 查看网格监控界面。 -### Python版本 -- Python 3.6+ - -## 安装和运行 - -### 方法一:直接运行(推荐开发环境) - -#### 1. 安装依赖 +### 生产部署 +建议使用Gunicorn或uWSGI作为WSGI服务器: ```bash -pip install Flask requests +gunicorn -w 4 -b 0.0.0.0:5002 "app:create_app()" ``` -#### 2. 运行应用 -```bash -python3 complete_multi_camera_app.py +## 项目结构 + +``` +multi_camera_project_v0.1/ +├── app/ # Flask应用 +│ ├── __init__.py # 应用工厂和日志配置 +│ ├── config.py # 配置变量(从环境变量读取) +│ ├── camera_manager.py # 摄像头管理类 +│ ├── routes/ +│ │ └── main.py # 路由定义(API和页面) +│ └── templates/ +│ └── index.html # 前端网格页面 +├── static/ # 静态资源 +│ ├── css/style.css +│ └── js/app.js +├── logs/ # 日志目录(自动创建) +├── .env.example # 环境变量示例 +├── .env # 实际环境变量(本地,不提交) +├── requirements.txt # Python依赖 +├── run.py # 启动脚本 +└── README.md # 本文档 ``` -#### 3. 使用启动脚本 -```bash -chmod +x start.sh -./start.sh +## API接口 + +### 获取摄像头状态 ``` - -#### 4. 访问系统 -打开浏览器访问:`http://127.0.0.1:5002` - -### 方法二:Docker部署(推荐生产环境) - -#### 1. 构建Docker镜像 -```bash -chmod +x docker-build.sh -./docker-build.sh +GET /api/cameras ``` +返回所有摄像头的状态(ID、URL、是否活跃、最后帧时间)。 -#### 2. 运行Docker容器 -```bash -chmod +x docker-run.sh -./docker-run.sh +### 启动/停止摄像头 ``` - -#### 3. 手动Docker命令 -```bash -# 构建镜像 -docker build -t multi-camera-monitor:latest . - -# 运行容器 -docker run -d -p 5002:5002 --name multi-camera-app --restart unless-stopped multi-camera-monitor:latest +POST /api/camera//start +POST /api/camera//stop ``` +启动或停止指定ID的摄像头。 -#### 4. 访问系统 -打开浏览器访问:`http://localhost:5002` - -### Docker管理命令 -```bash -# 查看容器状态 -docker ps - -# 查看容器日志 -docker logs -f multi-camera-app - -# 停止容器 -docker stop multi-camera-app - -# 重启容器 -docker restart multi-camera-app - -# 进入容器 -docker exec -it multi-camera-app bash - -# 删除容器 -docker rm multi-camera-app - -# 删除镜像 -docker rmi multi-camera-monitor:latest +### 添加摄像头 ``` - -## 配置文件 - -### 摄像头配置 -在 `complete_multi_camera_app.py` 中的 `cameras` 列表配置摄像头信息: -```python -self.cameras = [ - { - 'id': 1, - 'room': 'cnfzhjyg-igv-251', - 'camera': 'camera-0', - 'name': '1号车', - 'url': f"{self.camera_url}?room=cnfzhjyg-igv-251&camera=camera-0" - }, - # ... 其他摄像头配置 -] +POST /api/camera/add +Content-Type: application/json +{ + "url": "rtsp://..." +} ``` +添加一个新的摄像头(最多6个)。 -### 登录配置 -在 `CompleteCameraManager` 类中配置登录信息: -```python -self.username = "hao.wang@westwell-lab.com" -self.password = "wh707297" +### 删除摄像头 ``` +DELETE /api/camera/ +``` +删除指定ID的摄像头。 -## 使用说明 +### 获取实时帧 +``` +GET /api/camera//frame +``` +返回指定摄像头的最新JPEG图像(用于前端显示)。 -### 界面布局 -- **顶部控制栏**:刷新、重连按钮和系统状态显示 -- **摄像头网格**:6个摄像头以3×2网格排列 -- **摄像头控制**:每个摄像头下方有独立的控制按钮 +## 配置说明 -### 操作指南 -1. **刷新摄像头**:点击摄像头下方的"刷新"按钮 -2. **切换摄像头编号**:点击0-7数字按钮切换摄像头视角 -3. **全屏显示**:点击"全屏"按钮进入全屏模式 -4. **系统重连**:点击"重新连接"按钮重新登录系统 +- `BASE_URL`:前端访问的基础URL,用于构建API端点。 +- `FLASK_DEBUG`:Flask调试模式,生产环境设为`False`。 +- `PORT`:服务端口,默认5002。 +- `HOST`:绑定地址,`0.0.0.0`允许外部访问。 +- `CAMERA_URLS`:摄像头RTSP URL列表,用逗号分隔。 -### 状态监控 -- **内存使用**:显示应用程序内存消耗(MB) -- **CPU占用**:显示CPU使用率(%) -- **当前时间**:实时显示系统时间 +## 日志 -## 技术架构 +日志文件位于`./logs/multi_camera.log`,每天自动轮转,保留最近10个日志文件。 -### 前端技术 -- **HTML/CSS**:响应式网格布局 -- **JavaScript**:实时状态更新和摄像头控制 -- **Flask模板**:动态内容渲染 +## 常见问题 -### 后端技术 -- **Flask框架**:Web应用服务器 -- **requests库**:HTTP请求处理 -- **Session管理**:登录状态保持 +1. **摄像头画面不显示** + - 检查RTSP URL是否正确,确保网络可达。 + - 检查OpenCV是否支持RTSP(可能需要编译FFmpeg支持)。 -### 监控功能 -- **内存监控**:使用Python内置方法获取内存使用 -- **CPU监控**:估算CPU使用率 -- **连接状态**:定期检查系统连接状态 +2. **端口占用** + - 修改`.env`中的`PORT`变量,然后重启应用。 -## 故障排除 +3. **依赖安装失败** + - 确保已安装Python开发工具(如`python3-dev`、`libopencv-dev`)。 -### 常见问题 -1. **登录失败**:检查网络连接和账号密码 -2. **摄像头无法显示**:检查摄像头URL配置 -3. **端口占用**:修改应用启动端口 +## 版本历史 -### 日志文件 -应用运行日志保存在 `complete_multi_camera.log` 文件中 - -## 开发说明 - -### 扩展功能 -- 添加更多摄像头 -- 实现录像功能 -- 添加报警通知 -- 支持移动端适配 - -### 安全注意事项 -- 定期更新账号密码 -- 使用HTTPS加密传输 -- 限制访问IP范围 +- v0.1 (2025-12-13) + - 移除健康监控(CPU/内存)功能。 + - 移除Docker和启动脚本。 + - 移除认证相关代码(登录、SECRET_KEY)。 + - 配置日志目录为`./logs`。 + - 清理冗余代码和敏感信息。 ## 许可证 -本项目仅供内部使用 -## 更新日志 -- v1.0: 初始版本,支持6个摄像头网格布局和实时监控 -- v1.1: 添加系统状态监控(内存、CPU、时间) -- v1.2: 优化界面布局和控制功能 \ No newline at end of file +本项目仅供内部使用,未经许可不得分发。 + +## 贡献 + +欢迎提交Issue和Pull Request。 \ No newline at end of file diff --git a/app/__init__.py b/app/__init__.py index 801a2d7..bf14991 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -3,8 +3,7 @@ Flask应用工厂 """ import logging from flask import Flask -from .config import DEBUG, SECRET_KEY, HOST, PORT -from .health import register_health_routes +from .config import DEBUG, HOST, PORT from .routes.main import register_main_routes def create_app(): @@ -15,13 +14,11 @@ def create_app(): # 配置 app.config['DEBUG'] = DEBUG - app.config['SECRET_KEY'] = SECRET_KEY # 配置日志 configure_logging(app) # 注册路由 - register_health_routes(app) register_main_routes(app) return app @@ -31,9 +28,16 @@ def configure_logging(app): if not app.debug: # 在生产环境中,将日志输出到文件 import logging + import os from logging.handlers import RotatingFileHandler - file_handler = RotatingFileHandler('multi_camera.log', maxBytes=10240, backupCount=10) + # 日志目录 + log_dir = './logs' + if not os.path.exists(log_dir): + os.makedirs(log_dir) + + log_file = os.path.join(log_dir, 'multi_camera.log') + file_handler = RotatingFileHandler(log_file, maxBytes=10240, backupCount=10) file_handler.setFormatter(logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s' )) diff --git a/app/__pycache__/__init__.cpython-312.pyc b/app/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ee89c78..0000000 Binary files a/app/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/app/__pycache__/camera_manager.cpython-312.pyc b/app/__pycache__/camera_manager.cpython-312.pyc deleted file mode 100644 index cae822d..0000000 Binary files a/app/__pycache__/camera_manager.cpython-312.pyc and /dev/null differ diff --git a/app/__pycache__/config.cpython-312.pyc b/app/__pycache__/config.cpython-312.pyc deleted file mode 100644 index c15b2ed..0000000 Binary files a/app/__pycache__/config.cpython-312.pyc and /dev/null differ diff --git a/app/__pycache__/health.cpython-312.pyc b/app/__pycache__/health.cpython-312.pyc deleted file mode 100644 index db3bd95..0000000 Binary files a/app/__pycache__/health.cpython-312.pyc and /dev/null differ diff --git a/app/camera_manager.py b/app/camera_manager.py index 442025a..1371139 100644 --- a/app/camera_manager.py +++ b/app/camera_manager.py @@ -1,23 +1,18 @@ """ 摄像头管理器 -处理登录、会话管理和摄像头配置 +处理摄像头配置和URL生成 """ import requests import logging -from datetime import datetime -from .config import BASE_URL, LOGIN_API, CAMERA_URL, USERNAME, PASSWORD, CAMERAS +from .config import BASE_URL, CAMERA_URL, CAMERAS logger = logging.getLogger(__name__) class CameraManager: def __init__(self): self.base_url = BASE_URL - self.login_api = LOGIN_API self.camera_url = CAMERA_URL self.session = requests.Session() - self.token = None - self.last_login_time = None - self.is_logged_in = False self.cameras = CAMERAS # 配置请求头 @@ -28,50 +23,6 @@ class CameraManager: 'Content-Type': 'application/json', 'Connection': 'keep-alive', }) - - # 不自动登录,按需登录 - # self.auto_login() - - def login(self): - """登录系统""" - logger.info("正在登录系统...") - - login_data = { - 'username': USERNAME, - 'password': PASSWORD, - 'email': USERNAME, - 'user': USERNAME, - 'account': USERNAME - } - - try: - response = self.session.post( - self.login_api, - json=login_data, - timeout=10 - ) - - if response.status_code == 200: - response_data = response.json() - self.token = response_data.get('token') - self.last_login_time = datetime.now() - self.is_logged_in = True - - # 更新认证头 - if self.token: - self.session.headers.update({ - 'Authorization': f'Bearer {self.token}' - }) - - logger.info("登录成功!") - return True - else: - logger.error(f"登录失败,状态码: {response.status_code}") - return False - - except Exception as e: - logger.error(f"登录请求失败: {e}") - return False def get_camera_url(self, camera_id, camera_number='mixed'): """根据摄像头ID和编号生成URL""" diff --git a/app/config.py b/app/config.py index 7bdc6ad..96b7806 100644 --- a/app/config.py +++ b/app/config.py @@ -7,15 +7,12 @@ from dotenv import load_dotenv # 加载环境变量 load_dotenv() -# 基础URL -BASE_URL = os.getenv("BASE_URL", "http://10.80.0.2:5045") -LOGIN_API = f"{BASE_URL}/api/user/login" +# 基础URL(必须设置) +BASE_URL = os.getenv("BASE_URL") +if BASE_URL is None: + raise ValueError("环境变量 BASE_URL 未设置") CAMERA_URL = f"{BASE_URL}/adaops/blank-layout/camera-view" -# 认证信息 -USERNAME = os.getenv("USERNAME", "hao.wang@westwell-lab.com") -PASSWORD = os.getenv("PASSWORD", "wh707297") - # 摄像头配置(可以从YAML/JSON加载,这里先硬编码) CAMERAS = [ { @@ -62,8 +59,18 @@ CAMERAS = [ } ] -# Flask配置 -DEBUG = os.getenv("FLASK_DEBUG", "False").lower() == "true" -SECRET_KEY = os.getenv("SECRET_KEY", "dev-secret-key") -PORT = int(os.getenv("PORT", 5002)) -HOST = os.getenv("HOST", "0.0.0.0") \ No newline at end of file +# Flask配置(必须设置) +DEBUG_STR = os.getenv("FLASK_DEBUG") +if DEBUG_STR is None: + raise ValueError("环境变量 FLASK_DEBUG 未设置") +DEBUG = DEBUG_STR.lower() == "true" + + +PORT_STR = os.getenv("PORT") +if PORT_STR is None: + raise ValueError("环境变量 PORT 未设置") +PORT = int(PORT_STR) + +HOST = os.getenv("HOST") +if HOST is None: + raise ValueError("环境变量 HOST 未设置") \ No newline at end of file diff --git a/app/health.py b/app/health.py deleted file mode 100644 index 47261c1..0000000 --- a/app/health.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -健康检查端点 -""" -import psutil -import logging -from datetime import datetime -from flask import jsonify - -logger = logging.getLogger(__name__) - -def get_memory_usage(): - """获取内存使用(MB)""" - process = psutil.Process() - memory_mb = process.memory_info().rss / 1024 / 1024 - return round(memory_mb, 2) - -def get_cpu_usage(): - """获取CPU使用率(%)""" - return psutil.cpu_percent(interval=0.1) - -def register_health_routes(app): - """注册健康检查路由到Flask应用""" - - @app.route('/status') - def status(): - """整体状态检查""" - return jsonify({ - 'status': 'ok', - 'service': 'multi-camera-monitor', - 'timestamp': datetime.now().isoformat() - }) - - @app.route('/memory') - def memory(): - """内存使用""" - return jsonify({ - 'memory_mb': get_memory_usage(), - 'unit': 'MB' - }) - - @app.route('/cpu') - def cpu(): - """CPU使用""" - return jsonify({ - 'cpu_percent': get_cpu_usage(), - 'unit': '%' - }) - - @app.route('/health') - def health(): - """综合健康检查(用于Docker)""" - try: - # 简单检查 - memory = get_memory_usage() - cpu = get_cpu_usage() - return jsonify({ - 'status': 'healthy', - 'memory_mb': memory, - 'cpu_percent': cpu - }), 200 - except Exception as e: - logger.error(f"健康检查失败: {e}") - return jsonify({'status': 'unhealthy', 'error': str(e)}), 500 \ No newline at end of file diff --git a/app/routes/__init__.py b/app/routes/__init__.py deleted file mode 100644 index e2cbf50..0000000 --- a/app/routes/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# 路由包 \ No newline at end of file diff --git a/app/routes/__pycache__/__init__.cpython-312.pyc b/app/routes/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e1a4f5b..0000000 Binary files a/app/routes/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/app/routes/__pycache__/main.cpython-312.pyc b/app/routes/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 0b6bc44..0000000 Binary files a/app/routes/__pycache__/main.cpython-312.pyc and /dev/null differ diff --git a/app/routes/main.py b/app/routes/main.py index 2b80184..5385934 100644 --- a/app/routes/main.py +++ b/app/routes/main.py @@ -45,9 +45,4 @@ def register_main_routes(app): return jsonify({'success': True, 'url': url}) except Exception as e: return jsonify({'success': False, 'error': str(e)}), 400 - - @app.route('/api/login', methods=['POST']) - def login(): - """手动登录""" - success = camera_manager.login() - return jsonify({'success': success}) \ No newline at end of file + \ No newline at end of file diff --git a/complete_multi_camera.log b/complete_multi_camera.log deleted file mode 100644 index bd140a0..0000000 --- a/complete_multi_camera.log +++ /dev/null @@ -1,157 +0,0 @@ -2025-11-22 18:13:50,950 - INFO - 正在登录系统... -2025-11-22 18:13:51,072 - INFO - 登录成功! -2025-11-22 18:13:51,074 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-22 18:13:51,076 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.0.101:5002 -2025-11-22 18:13:51,076 - INFO - Press CTRL+C to quit -2025-11-22 18:14:06,980 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:06] "GET / HTTP/1.1" 200 - -2025-11-22 18:14:08,666 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:08] "GET /favicon.ico HTTP/1.1" 404 - -2025-11-22 18:14:09,182 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:09] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:09,664 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:09] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:09,669 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:09] "GET /status HTTP/1.1" 200 - -2025-11-22 18:14:12,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:12] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:12,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:12] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:17,420 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:17] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:17,430 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:17] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:22,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:22] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:22,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:22] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:27,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:27] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:27,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:27] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:32,424 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:32] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:32,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:32] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:37,409 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:37] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:37,418 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:37] "GET /status HTTP/1.1" 200 - -2025-11-22 18:14:37,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:37] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:42,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:42] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:42,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:42] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:47,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:47] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:47,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:47] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:52,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:52] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:52,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:52] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:14:57,423 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:57] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:14:57,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:14:57] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:02,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:02] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:02,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:02] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:07,418 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:07] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:07,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:07] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:07,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:07] "GET /status HTTP/1.1" 200 - -2025-11-22 18:15:12,416 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:12] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:12,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:12] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:17,417 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:17] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:17,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:17] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:22,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:22] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:22,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:22] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:27,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:27] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:27,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:27] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:32,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:32] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:32,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:32] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:37,409 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:37] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:37,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:37] "GET /status HTTP/1.1" 200 - -2025-11-22 18:15:37,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:37] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:42,423 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:42] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:42,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:42] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:47,423 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:47] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:47,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:47] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:52,424 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:52] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:15:52,424 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:52] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:57,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:57] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:15:57,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:15:57] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:16:02,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:02] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:16:02,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:02] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:16:07,419 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:07] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:16:07,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:07] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:16:07,427 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:07] "GET /status HTTP/1.1" 200 - -2025-11-22 18:16:12,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:12] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:16:12,425 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:12] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:16:17,408 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:17] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:16:17,426 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:17] "GET /memory HTTP/1.1" 200 - -2025-11-22 18:16:22,433 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:22] "GET /cpu HTTP/1.1" 200 - -2025-11-22 18:16:22,439 - INFO - 192.168.0.101 - - [22/Nov/2025 18:16:22] "GET /memory HTTP/1.1" 200 - -2025-11-24 09:45:30,202 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-24 09:45:30,204 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.0.101:5002 -2025-11-24 09:45:30,204 - INFO - Press CTRL+C to quit -2025-11-24 09:45:33,643 - INFO - 127.0.0.1 - - [24/Nov/2025 09:45:33] "GET / HTTP/1.1" 200 - -2025-11-24 09:45:35,353 - INFO - 127.0.0.1 - - [24/Nov/2025 09:45:35] "GET /favicon.ico HTTP/1.1" 404 - -2025-11-24 09:46:09,787 - INFO - 127.0.0.1 - - [24/Nov/2025 09:46:09] "GET / HTTP/1.1" 200 - -2025-11-24 09:51:01,616 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-24 09:51:01,618 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.0.101:5002 -2025-11-24 09:51:01,618 - INFO - Press CTRL+C to quit -2025-11-24 09:51:05,716 - INFO - 127.0.0.1 - - [24/Nov/2025 09:51:05] "GET / HTTP/1.1" 200 - -2025-11-24 09:58:41,074 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-24 09:58:41,076 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.0.101:5002 -2025-11-24 09:58:41,076 - INFO - Press CTRL+C to quit -2025-11-24 09:58:43,374 - INFO - 127.0.0.1 - - [24/Nov/2025 09:58:43] "GET / HTTP/1.1" 200 - -2025-11-24 09:58:45,004 - INFO - 127.0.0.1 - - [24/Nov/2025 09:58:45] "GET /favicon.ico HTTP/1.1" 404 - -2025-11-24 10:13:21,233 - INFO - 127.0.0.1 - - [24/Nov/2025 10:13:21] "GET / HTTP/1.1" 200 - -2025-11-24 10:16:09,233 - INFO - 127.0.0.1 - - [24/Nov/2025 10:16:09] "GET / HTTP/1.1" 200 - -2025-11-24 12:12:19,444 - INFO - 127.0.0.1 - - [24/Nov/2025 12:12:19] "GET / HTTP/1.1" 200 - -2025-11-24 12:13:19,861 - INFO - 127.0.0.1 - - [24/Nov/2025 12:13:19] "GET / HTTP/1.1" 200 - -2025-11-24 13:16:09,458 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-24 13:16:09,459 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.66.52:5002 -2025-11-24 13:16:09,460 - INFO - Press CTRL+C to quit -2025-11-24 13:16:12,009 - INFO - 127.0.0.1 - - [24/Nov/2025 13:16:12] "GET / HTTP/1.1" 200 - -2025-11-24 13:16:13,683 - INFO - 127.0.0.1 - - [24/Nov/2025 13:16:13] "GET /favicon.ico HTTP/1.1" 404 - -2025-11-24 20:18:56,297 - INFO - 127.0.0.1 - - [24/Nov/2025 20:18:56] "GET / HTTP/1.1" 200 - -2025-11-24 22:51:50,902 - INFO - 127.0.0.1 - - [24/Nov/2025 22:51:50] "GET / HTTP/1.1" 200 - -2025-11-24 22:53:33,451 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-24 22:54:36,448 - INFO - 127.0.0.1 - - [24/Nov/2025 22:54:36] "GET / HTTP/1.1" 200 - -2025-11-25 10:25:56,694 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-25 10:25:56,696 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.0.101:5002 -2025-11-25 10:25:56,696 - INFO - Press CTRL+C to quit -2025-11-25 10:26:00,447 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:00] "GET / HTTP/1.1" 200 - -2025-11-25 10:26:13,163 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:13] "GET /favicon.ico HTTP/1.1" 404 - -2025-11-25 10:26:13,640 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:13] "GET / HTTP/1.1" 200 - -2025-11-25 10:26:15,182 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:15] "GET / HTTP/1.1" 200 - -2025-11-25 10:26:31,917 - INFO - 127.0.0.1 - - [25/Nov/2025 10:26:31] "GET / HTTP/1.1" 200 - -2025-11-25 10:26:57,688 - INFO - 192.168.0.101 - - [25/Nov/2025 10:26:57] "GET / HTTP/1.1" 200 - -2025-11-25 12:07:50,872 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-25 12:07:50,874 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.0.101:5002 -2025-11-25 12:07:50,874 - INFO - Press CTRL+C to quit -2025-11-25 12:08:05,702 - INFO - 127.0.0.1 - - [25/Nov/2025 12:08:05] "GET / HTTP/1.1" 200 - -2025-11-25 12:08:07,335 - INFO - 127.0.0.1 - - [25/Nov/2025 12:08:07] "GET /favicon.ico HTTP/1.1" 404 - -2025-11-25 12:10:08,292 - INFO - 127.0.0.1 - - [25/Nov/2025 12:10:08] "GET / HTTP/1.1" 200 - -2025-11-25 14:31:18,756 - INFO - 启动多摄像头网格布局Flask应用... -2025-11-25 14:31:18,758 - INFO - WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. - * Running on all addresses (0.0.0.0) - * Running on http://127.0.0.1:5002 - * Running on http://192.168.0.101:5002 -2025-11-25 14:31:18,758 - INFO - Press CTRL+C to quit -2025-11-25 14:31:39,357 - INFO - 127.0.0.1 - - [25/Nov/2025 14:31:39] "GET / HTTP/1.1" 200 - -2025-11-25 14:31:40,949 - INFO - 127.0.0.1 - - [25/Nov/2025 14:31:40] "GET /favicon.ico HTTP/1.1" 404 - -2025-11-26 11:32:47,722 - INFO - 127.0.0.1 - - [26/Nov/2025 11:32:47] "GET / HTTP/1.1" 200 - -2025-11-26 14:41:17,085 - INFO - 127.0.0.1 - - [26/Nov/2025 14:41:17] "GET / HTTP/1.1" 200 - -2025-11-27 13:25:41,362 - INFO - 127.0.0.1 - - [27/Nov/2025 13:25:41] "GET / HTTP/1.1" 200 - -2025-11-28 11:24:37,732 - INFO - 127.0.0.1 - - [28/Nov/2025 11:24:37] "GET / HTTP/1.1" 200 - -2025-11-28 13:33:09,307 - INFO - 127.0.0.1 - - [28/Nov/2025 13:33:09] "GET / HTTP/1.1" 200 - -2025-11-29 10:01:59,435 - INFO - 127.0.0.1 - - [29/Nov/2025 10:01:59] "GET / HTTP/1.1" 200 - -2025-11-29 16:30:49,229 - INFO - 127.0.0.1 - - [29/Nov/2025 16:30:49] "GET / HTTP/1.1" 200 - -2025-11-29 16:31:43,617 - INFO - 127.0.0.1 - - [29/Nov/2025 16:31:43] "GET / HTTP/1.1" 200 - -2025-11-29 17:51:00,240 - INFO - 127.0.0.1 - - [29/Nov/2025 17:51:00] "GET / HTTP/1.1" 200 - -2025-11-29 17:51:23,669 - INFO - 127.0.0.1 - - [29/Nov/2025 17:51:23] "GET / HTTP/1.1" 200 - -2025-11-29 17:51:49,490 - INFO - 127.0.0.1 - - [29/Nov/2025 17:51:49] "GET / HTTP/1.1" 200 - -2025-11-29 17:53:05,961 - INFO - 127.0.0.1 - - [29/Nov/2025 17:53:05] "GET / HTTP/1.1" 200 - -2025-11-29 20:53:15,638 - INFO - 127.0.0.1 - - [29/Nov/2025 20:53:15] "GET / HTTP/1.1" 200 - -2025-11-30 05:56:04,625 - INFO - 127.0.0.1 - - [30/Nov/2025 05:56:04] "GET / HTTP/1.1" 200 - -2025-12-01 05:27:00,795 - INFO - 127.0.0.1 - - [01/Dec/2025 05:27:00] "GET / HTTP/1.1" 200 - -2025-12-01 11:54:07,262 - INFO - 127.0.0.1 - - [01/Dec/2025 11:54:07] "GET / HTTP/1.1" 200 - -2025-12-01 20:32:22,708 - INFO - 127.0.0.1 - - [01/Dec/2025 20:32:22] "GET / HTTP/1.1" 200 - diff --git a/complete_multi_camera_app.py b/complete_multi_camera_app.py deleted file mode 100644 index dc000c1..0000000 --- a/complete_multi_camera_app.py +++ /dev/null @@ -1,543 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -完整多摄像头网格布局Flask应用 -支持6个摄像头的实时监控网格布局 -""" - -from flask import Flask, render_template_string, request, jsonify -import requests -import json -import logging -import time -import os -import resource -from datetime import datetime - -# 配置日志 -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(levelname)s - %(message)s', - handlers=[ - logging.FileHandler('complete_multi_camera.log', encoding='utf-8'), - logging.StreamHandler() - ] -) -logger = logging.getLogger(__name__) - -app = Flask(__name__) - -class CompleteCameraManager: - def __init__(self): - self.base_url = "http://10.80.0.2:5045" - self.login_api = f"{self.base_url}/api/user/login" - self.camera_url = f"{self.base_url}/adaops/blank-layout/camera-view" - self.session = requests.Session() - self.token = None - self.last_login_time = None - self.is_logged_in = False - - # 配置请求头 - self.session.headers.update({ - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', - 'Accept': 'application/json, text/plain, */*', - 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8', - 'Content-Type': 'application/json', - 'Connection': 'keep-alive', - }) - - # 账号信息 - self.username = "hao.wang@westwell-lab.com" - self.password = "wh707297" - - # 摄像头配置 - self.cameras = [ - { - 'id': 1, - 'room': 'cnfzhjyg-igv-251', - 'camera': 'mixed', - 'name': '1号车', - 'url': f"{self.camera_url}?room=cnfzhjyg-igv-251&camera=mixed" - }, - { - 'id': 2, - 'room': 'cnfzhjyg-igv-2', - 'camera': 'mixed', - 'name': '2号车', - 'url': f"{self.camera_url}?room=cnfzhjyg-igv-2&camera=mixed" - }, - { - 'id': 3, - 'room': 'cnfzhjyg-igv-3', - 'camera': 'mixed', - 'name': '3号车', - 'url': f"{self.camera_url}?room=cnfzhjyg-igv-3&camera=mixed" - }, - { - 'id': 4, - 'room': 'cnfzhjyg-igv-5', - 'camera': 'mixed', - 'name': '5号车', - 'url': f"{self.camera_url}?room=cnfzhjyg-igv-5&camera=mixed" - }, - { - 'id': 5, - 'room': 'cnfzhjyg-igv-6', - 'camera': 'mixed', - 'name': '6号车', - 'url': f"{self.camera_url}?room=cnfzhjyg-igv-6&camera=mixed" - }, - { - 'id': 6, - 'room': 'cnfzhjyg-igv-7', - 'camera': 'mixed', - 'name': '7号车', - 'url': f"{self.camera_url}?room=cnfzhjyg-igv-7&camera=mixed" - } - ] - - # 不进行自动登录 - # self.auto_login() - - def login(self): - """登录系统""" - logger.info("正在登录系统...") - - login_data = { - 'username': self.username, - 'password': self.password, - 'email': self.username, - 'user': self.username, - 'account': self.username - } - - try: - response = self.session.post( - self.login_api, - json=login_data, - timeout=10 - ) - - if response.status_code == 200: - response_data = response.json() - self.token = response_data.get('token') - self.last_login_time = datetime.now() - self.is_logged_in = True - - # 更新认证头 - if self.token: - self.session.headers.update({ - 'Authorization': f'Bearer {self.token}' - }) - - logger.info("登录成功!") - return True - else: - logger.error(f"登录失败,状态码: {response.status_code}") - return False - - except Exception as e: - logger.error(f"登录请求失败: {e}") - return False - - -# 创建全局摄像头管理器 -camera_manager = CompleteCameraManager() - -# 完整的HTML模板 -HTML_TEMPLATE = ''' - - - - - - 多摄像头实时监控 - AdaOps - - - -
- -
- 时间: {{ current_time }} -
-
- -
- {% for camera in cameras %} -
-
-
{{ camera.name }}
-
✅ 在线
-
-
- -
-
- - - - - - - - - - - -
-
- {% endfor %} -
- - - - -''' - -@app.route('/') -def index(): - """主页面 - 显示6个摄像头的网格布局""" - return render_template_string(HTML_TEMPLATE, - base_url=camera_manager.base_url, - cameras=camera_manager.cameras, - current_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S')) - - -if __name__ == '__main__': - logger.info("启动多摄像头网格布局Flask应用...") - print("=" * 50) - print("🚀 多摄像头网格布局系统启动") - print(f"📡 访问地址: http://127.0.0.1:5002") - print(f"🎥 摄像头数量: 6个") - print("=" * 50) - - # 使用不同的端口避免冲突 - app.run(host='0.0.0.0', port=5002, debug=False) - \ No newline at end of file diff --git a/docker-build.sh b/docker-build.sh deleted file mode 100755 index 6c79e4f..0000000 --- a/docker-build.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash - -# Docker镜像构建脚本 - -IMAGE_NAME="multi-camera-monitor" -IMAGE_TAG="latest" - -echo "🐳 构建多摄像头监控系统Docker镜像..." - -# 检查Docker是否安装 -if ! command -v docker &> /dev/null; then - echo "❌ 错误: 未找到Docker,请先安装Docker" - exit 1 -fi - -# 构建镜像 -echo "📦 构建镜像: ${IMAGE_NAME}:${IMAGE_TAG}" -docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . - -if [ $? -eq 0 ]; then - echo "✅ 镜像构建成功!" - echo "" - echo "运行镜像:" - echo " docker run -d -p 5002:5002 --name multi-camera ${IMAGE_NAME}:${IMAGE_TAG}" - echo "" - echo "访问地址: http://localhost:5002" -else - echo "❌ 镜像构建失败!" - exit 1 -fi \ No newline at end of file diff --git a/docker-run.sh b/docker-run.sh deleted file mode 100755 index 16f37f0..0000000 --- a/docker-run.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -# Docker容器运行脚本 - -IMAGE_NAME="multi-camera-monitor" -IMAGE_TAG="latest" -CONTAINER_NAME="multi-camera-app" -PORT="5002" - -echo "🚀 启动多摄像头监控系统Docker容器..." - -# 检查Docker是否安装 -if ! command -v docker &> /dev/null; then - echo "❌ 错误: 未找到Docker,请先安装Docker" - exit 1 -fi - -# 检查镜像是否存在 -if ! docker images | grep -q "${IMAGE_NAME}"; then - echo "⚠️ 镜像不存在,请先运行 ./docker-build.sh 构建镜像" - exit 1 -fi - -# 停止并删除已存在的容器 -if docker ps -a | grep -q "${CONTAINER_NAME}"; then - echo "🛑 停止并删除现有容器..." - docker stop ${CONTAINER_NAME} >/dev/null 2>&1 - docker rm ${CONTAINER_NAME} >/dev/null 2>&1 -fi - -# 运行容器 -echo "🎬 启动容器: ${CONTAINER_NAME}" -docker run -d \ - --name ${CONTAINER_NAME} \ - -p ${PORT}:5002 \ - --restart unless-stopped \ - ${IMAGE_NAME}:${IMAGE_TAG} - -if [ $? -eq 0 ]; then - echo "✅ 容器启动成功!" - echo "" - echo "📊 容器状态:" - docker ps | grep ${CONTAINER_NAME} - echo "" - echo "🌐 访问地址: http://localhost:${PORT}" - echo "" - echo "📋 常用命令:" - echo " 查看日志: docker logs -f ${CONTAINER_NAME}" - echo " 停止容器: docker stop ${CONTAINER_NAME}" - echo " 重启容器: docker restart ${CONTAINER_NAME}" - echo " 进入容器: docker exec -it ${CONTAINER_NAME} bash" -else - echo "❌ 容器启动失败!" - exit 1 -fi \ No newline at end of file diff --git a/multi_camera.log b/multi_camera.log deleted file mode 100644 index 03affee..0000000 --- a/multi_camera.log +++ /dev/null @@ -1,2 +0,0 @@ -2025-12-07 01:58:44,962 - INFO - 多摄像头监控系统启动 -2025-12-07 02:06:10,241 - INFO - 多摄像头监控系统启动 diff --git a/requirements.txt b/requirements.txt index f0c6928..d4e86f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ Flask==2.3.3 requests==2.31.0 -python-dotenv==1.0.0 -psutil==5.9.6 \ No newline at end of file +python-dotenv==1.0.0 \ No newline at end of file diff --git a/start.sh b/start.sh deleted file mode 100755 index 0968e62..0000000 --- a/start.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -# 多摄像头实时监控系统启动脚本 - -echo "🚀 启动多摄像头实时监控系统..." - -# 检查Python是否安装 -if ! command -v python3 &> /dev/null; then - echo "❌ 错误: 未找到Python3,请先安装Python3" - exit 1 -fi - -# 检查依赖是否安装 -echo "📦 检查依赖包..." -python3 -c "import flask" 2>/dev/null -if [ $? -ne 0 ]; then - echo "📥 安装Flask..." - pip3 install Flask==2.3.3 -fi - -python3 -c "import requests" 2>/dev/null -if [ $? -ne 0 ]; then - echo "📥 安装requests..." - pip3 install requests==2.31.0 -fi - -python3 -c "import dotenv" 2>/dev/null -if [ $? -ne 0 ]; then - echo "📥 安装python-dotenv..." - pip3 install python-dotenv==1.0.0 -fi - -python3 -c "import psutil" 2>/dev/null -if [ $? -ne 0 ]; then - echo "📥 安装psutil..." - pip3 install psutil==5.9.6 -fi - -# 启动应用 -echo "🎬 启动应用..." -python3 run.py \ No newline at end of file