dmitriyVasilievich1986/keychain

GitHub: dmitriyVasilievich1986/keychain

一个基于 FastAPI 与 React 的自托管全栈密码管理器,提供端到端加密、JWT 身份验证及 Docker 化部署。

Stars: 0 | Forks: 0

[![build-backend](https://github.com/dmitriyVasilievich1986/keychain/actions/workflows/build_backend.yml/badge.svg)](https://github.com/dmitriyVasilievich1986/keychain/actions/workflows/build_backend.yml) [![build-frontend](https://github.com/dmitriyVasilievich1986/keychain/actions/workflows/build_frontend.yml/badge.svg)](https://github.com/dmitriyVasilievich1986/keychain/actions/workflows/build_frontend.yml) # Keychain 一个现代化、安全、具备端到端加密的自托管密码管理解决方案。 ## 概述 Keychain 是一个全栈密码管理器,提供了一种安全的方式来存储、管理和访问您的密码。它使用现代 Web 技术构建,具有基于 React 的前端、带有加密存储的 FastAPI 后端,并设计为可通过 Docker 轻松进行自托管。 ### 核心功能 - **安全存储**:所有敏感字段值均使用 Fernet 对称加密进行加密 - **JWT 身份验证**:具有可配置过期时间的基于 token 的身份验证 - **自托管**:通过 Docker 部署,完全控制您的数据 - **现代化 UI**:简洁且响应式的 Material-UI 界面 - **RESTful API**:为所有操作提供文档完善的 API - **CLI 工具**:提供全面的命令行管理界面 - **数据库迁移**:使用 Alembic 进行版本控制的 schema 管理 - **类型安全**:全面采用 TypeScript 前端和 Python type hints ## 架构 该应用程序由通过 Docker Compose 编排的三个主要组件组成: ``` ┌─────────────┐ │ Browser │ └──────┬──────┘ │ HTTP (Port 80) ↓ ┌─────────────────────────────────────────┐ │ Nginx (Reverse Proxy) │ │ • Serves static frontend assets │ │ • Proxies /api/* to backend │ │ • Handles gzip compression │ │ • Manages cache headers │ └────────┬────────────────────┬───────────┘ │ │ │ Static Files │ API Calls ↓ ↓ ┌──────────────┐ ┌──────────────────┐ │ Frontend │ │ Backend │ │ │ │ │ │ React 19 │ │ FastAPI │ │ TypeScript │ │ Python 3.13 │ │ MUI │ │ SQLAlchemy │ │ Zustand │ │ Cryptography │ └──────────────┘ └────────┬─────────┘ │ ↓ ┌──────────────┐ │ SQLite DB │ │ (Encrypted) │ └──────────────┘ ``` ## 项目结构 ``` keychain/ ├── backend/ # Python FastAPI backend │ ├── src/keychain/ # Source code │ │ ├── config/ # Configuration management │ │ ├── modules/ # FastAPI app and routes │ │ ├── services/ # Business logic services │ │ └── utils/ # CLI and utilities │ ├── configurations/ # YAML config files │ ├── Dockerfile # Multi-stage Docker build │ ├── pyproject.toml # Python dependencies │ └── README.md # Backend documentation ├── frontend/ # React TypeScript frontend │ ├── src/ # Source code │ │ ├── components/ # Reusable UI components │ │ ├── pages/ # Page components │ │ ├── store/ # Zustand state management │ │ └── utils/ # Utilities and API client │ ├── package.json # Node dependencies │ ├── vite.config.ts # Vite configuration │ └── README.md # Frontend documentation ├── nginx/ # Nginx configuration │ └── nginx.conf # Reverse proxy config ├── static/ # Static assets and build output │ ├── assets/ # Frontend build artifacts │ └── i/ # Images ├── docker-compose.local.yaml # Docker Compose configuration ├── .github/workflows/ # CI/CD pipelines └── README.md # This file ``` ## 技术栈 ### 后端 - Python 3.13 - FastAPI - Web 框架 - SQLAlchemy - ORM - Alembic - 数据库迁移 - Pydantic - 数据验证 - PyJWT - 身份验证 - Cryptography (Fernet) - 加密 - Uvicorn - ASGI 服务器 ### 前端 - React 19 - TypeScript - Vite - 构建工具 - Material-UI (MUI) - 组件库 - Zustand - 状态管理 - React Router - 路由 - Axios - HTTP 客户端 - Sass - 样式 ### 基础设施 - Docker & Docker Compose - Nginx - 反向代理 - SQLite - 数据库 ## 使用 Docker Compose 快速开始 ### 前置条件 - 已安装 Docker 和 Docker Compose - Git ### 1. 克隆仓库 ``` git clone https://github.com/dmitriyVasilievich1986/keychain.git cd keychain ``` ### 2. 配置后端 在 `backend/` 目录下创建 `.env` 文件: ``` cd backend ``` 创建 `backend/.env`: ``` CONFIG_FILE_PATH=/opt/backend/configurations/local.yaml CRYPTOGRAPHY__SECRET_KEY= AUTH__JWT_SECRET_KEY= ``` 生成加密密钥(需要 Python 3.13): ``` # 在本地安装依赖以生成密钥 python -m venv .venv source .venv/bin/activate pip install cryptography pyjwt # 生成 Fernet 密钥 python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" # 生成 JWT 密钥 python -c "import secrets; print(secrets.token_urlsafe(32))" ``` ### 3. 启动应用程序 在根目录下执行: ``` # 仅启动后端和 nginx(推荐用于生产环境) docker-compose -f docker-compose.local.yaml up -d # 或者在开发模式中包含前端 docker-compose -f docker-compose.local.yaml --profile frontend up -d ``` ### 4. 初始化数据库 ``` # 访问后端容器 docker exec -it keychain-backend bash # 运行迁移 keychain db upgrade # 创建首个用户 keychain db-client user create --username admin --email admin@example.com --password yourpassword # 退出容器 exit ``` ### 5. 构建前端(如果未使用 frontend profile) ``` cd frontend npm install npm run build # Outputs to ../static/ ``` ### 6. 访问应用程序 打开浏览器并访问: ``` http://localhost ``` 应用程序现已运行,配置如下: - 前端:由 Nginx 在端口 80 上提供服务 - 后端 API:`http://localhost/api/` - 后端直接访问:`http://localhost:8000`(如有需要) ## Docker Compose 配置 `docker-compose.local.yaml` 文件编排了三个服务: ### 服务 #### 1. Nginx (keychain-nginx) ``` ports: 80:80 ``` - **用途**:用作反向代理和静态文件服务器 - **配置**:`nginx/nginx.conf` - **职责**: - 从 `/static/` 路径提供 React 前端服务 - 将 API 请求(`/api/*`)代理到后端服务 - 处理 gzip 压缩以提升性能 - 为静态资源设置缓存头(图片和 JS bundle 为期 1 年) - 使用 `try_files` 回退到 `index.html` 以实现 SPA 路由 - **卷(Volumes)**: - `./nginx/nginx.conf` → 配置文件 - `./static/` → 前端构建输出和静态资源 #### 2. 后端 (keychain-backend) ``` ports: 8000:8000 ``` - **用途**:FastAPI 应用程序服务器 - **构建**:使用来自 `./backend` 的多阶段 Dockerfile - **环境**: - 加载 `.env` 文件以获取密钥 - `CONFIG_FILE_PATH`:指向 YAML 配置文件 - **卷(Volumes)**(用于开发): - `./backend/configurations/` → 配置文件 - `./backend/src/` → 源代码(用于热重载) - `./backend/keychain.sqlite` → 数据库持久化 - **健康检查**:每 60 秒轮询一次 `/health` endpoint - **依赖**:无(最先启动) #### 3. 前端 (keychain-frontend) ``` profile: frontend ``` - **用途**:开发构建服务器(可选) - **Profile**:仅在使用 `--profile frontend` 明确请求时启动 - **镜像**:Node.js 24 - **环境**: - `VITE_API_HOST`:API endpoint(留空 = 相对 URL) - `VITE_IMAGES_HOST`:图片路径前缀 - **命令**:运行 `scripts/start.sh`,该脚本会安装依赖并启动 Vite 开发服务器 - **卷**:挂载源文件和配置以进行热重载 - **注意**:在生产环境中,请在本地构建前端并通过 Nginx 提供服务 ### 使用模式 **开发环境**(支持热重载): ``` docker-compose -f docker-compose.local.yaml --profile frontend up ``` **生产环境**(预构建的前端): ``` # 首先构建前端 cd frontend && npm run build && cd .. # 启动后端和 nginx docker-compose -f docker-compose.local.yaml up -d ``` **重新构建后端**: ``` docker-compose -f docker-compose.local.yaml build backend docker-compose -f docker-compose.local.yaml up -d ``` ## 开发环境配置 ### 后端开发 有关详细的后端配置说明,请参阅 [backend/README.md](./backend/README.md)。 快速开始: ``` cd backend python -m venv .venv source .venv/bin/activate pip install -e . keychain db upgrade keychain run --reload ``` ### 前端开发 有关详细的前端配置说明,请参阅 [frontend/README.md](./frontend/README.md)。 快速开始: ``` cd frontend npm install npm run dev ``` ## CLI 命令 后端包含一个用于管理的综合 CLI: ``` # 应用程序 keychain version # Show version keychain run # Start server keychain show-config # Display configuration # 数据库管理 keychain db upgrade # Run migrations keychain db current # Show current version keychain db revision -m "message" # Create migration # 用户管理 keychain db-client user create --username admin --email admin@example.com --password secret keychain db-client user list keychain db-client user get --user-id 1 # 密码管理 keychain db-client password create --name "Gmail" --user-id 1 keychain db-client password list --user-id 1 # 字段管理 keychain db-client field create --name "username" --value "user@example.com" --password-id 1 keychain db-client field list --password-id 1 # 安全 keychain cryptography generate-key # Generate encryption key keychain cryptography encrypt TEXT # Encrypt data keychain cryptography decrypt TOKEN # Decrypt data keychain access-token generate-key # Generate JWT secret keychain access-token generate 1 # Generate token for user ID ``` ## API 文档 后端运行后,可在以下地址获取交互式 API 文档: - **Swagger UI**:`http://localhost:8000/docs` - **ReDoc**:`http://localhost:8000/redoc` ### 主要 Endpoint - `POST /api/v1/login` - 用户身份验证 - `GET /api/v1/user` - 获取当前用户 - `GET /api/v1/password` - 密码列表 - `POST /api/v1/password` - 创建密码 - `GET /api/v1/password/{id}` - 获取密码及其解密后的字段 - `POST /api/v1/field` - 创建加密字段 - `GET /health` - 健康检查 - `GET /version` - 版本信息 ## 环境变量 ### 后端 ``` CONFIG_FILE_PATH # Path to YAML config CRYPTOGRAPHY__SECRET_KEY # Fernet encryption key AUTH__JWT_SECRET_KEY # JWT signing secret DB__DB_URI # Database connection string AUTH__ACCESS_TOKEN_EXPIRE_MINUTES # Token expiration (default: 30) INFO__DEBUG # Debug mode (true/false) ``` ### 前端 ``` VITE_API_HOST # API base URL (empty for relative) VITE_IMAGES_HOST # Image path prefix ``` ## 安全注意事项 - **加密**:所有敏感字段值在静态存储时均使用 Fernet (AES-128) 加密 - **身份验证**:具有可配置过期时间的 JWT token - **密码哈希**:用户密码使用 Werkzeug 的安全方法进行哈希处理 - **HTTPS**:在生产环境中使用反向代理(如带有 Let's Encrypt 的 Nginx) - **密钥管理**:切勿将 `.env` 文件或密钥提交到版本控制系统中 - **数据库**:定期备份 SQLite 数据库 - **更新**:及时更新依赖项以获取安全补丁 ## 生产环境部署 ### 建议 1. **使用 HTTPS**:配置 SSL/TLS 证书(Let's Encrypt) 2. **外部数据库**:在生产环境中考虑使用 PostgreSQL 替代 SQLite 3. **密钥管理**:使用安全的密钥管理解决方案 4. **监控**:实施健康检查和监控 5. **备份**:定期进行自动化的数据库备份 6. **资源限制**:在生产环境中设置容器资源限制 7. **日志记录**:配置集中式日志记录 ### 生产环境 nginx 配置示例 ``` server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; # Include the rest of nginx.conf... } ``` ## 故障排除 ### 后端无法启动 - 检查 `.env` 文件是否存在且包含有效的密钥 - 验证数据库迁移是否为最新:`docker exec keychain-backend keychain db current` - 检查日志:`docker logs keychain-backend` ### 前端构建失败 - 确保已安装 Node.js 18+ - 清除 node_modules 并重新安装:`rm -rf node_modules && npm install` - 检查 TypeScript 错误:`npm run build` ### API 调用失败 - 验证后端是否正在运行:`curl http://localhost:8000/health` - 检查 nginx 配置是否正确代理了 `/api/` 请求 - 检查浏览器网络选项卡,查看是否存在 CORS 或 404 错误 ### 数据库错误 - 确保已应用迁移:`keychain db upgrade` - 检查数据库文件权限 - 验证 `CONFIG_FILE_PATH` 是否指向正确的 YAML 文件 ## 贡献 欢迎您的贡献!请: 1. Fork 该仓库 2. 创建一个功能分支 3. 修改代码并编写测试 4. 运行 linter(后端:`ruff`,前端:`eslint`) 5. 提交 pull request ## CI/CD 该项目包含 GitHub Actions 工作流: - **pre_commit.yml**:运行代码检查和代码质量校验 - **build_project.yml**:构建并测试应用程序 ## 许可证 MIT 许可证 - 详情请参阅 [LICENSE](./LICENSE) 文件。 Copyright (c) 2024 dmitriyvasil@gmail.com ## 作者 Dmitriy Vasilievich - Email: dmitriyvasil@gmail.com - GitHub: [dmitriyVasilievich1986](https://github.com/dmitriyVasilievich1986) ## 鸣谢 使用现代开源技术构建: - FastAPI - 优雅的 Python API 框架 - React - 强大的 UI 库 - Material-UI - 精美的组件库 - Cryptography 库 - 安全的加密 **注意**:这是一个旨在供个人或小团队使用的自托管解决方案。对于企业级部署,请考虑额外的安全强化、审计日志和合规性要求。
标签:AV绕过, Docker, FastAPI, React, Syscalls, 安全防御评估, 密码管理器, 端到端加密, 自托管, 请求拦截, 逆向工具