- infrastructure-setup.md: MinIO bucket, access key, PostgreSQL database/user/table deployment guide - implementation-plan.md: backend (FastAPI) and Android (Flutter) implementation roadmap - .gitignore: exclude credential YAML files (connections-remote.yaml, connections-local.yaml) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
207 lines
6.1 KiB
Markdown
207 lines
6.1 KiB
Markdown
# SnapLedger 基础设施实施文档
|
||
|
||
> **目标服务器:** `Remote_MisakaServer`
|
||
> **日期:** 2026-05-21
|
||
> **对应 PRD:** Phase 1 - 数据通道基建
|
||
|
||
## 1. 服务器现有环境
|
||
|
||
### 1.1 MinIO (systemd 服务)
|
||
|
||
| 项目 | 值 |
|
||
|---|---|
|
||
| 部署方式 | systemd 原生服务 |
|
||
| 二进制路径 | `/usr/local/bin/minio` |
|
||
| API 端口 | `9002` |
|
||
| Console 端口 | `9001` |
|
||
| 数据目录 | `/mnt/disk1` |
|
||
| 管理账号 | `myminioadmin` / `myminioadmin` |
|
||
| mc 客户端 | 已安装,本地 alias `mylocal` → `localhost:9002` |
|
||
|
||
### 1.2 PostgreSQL (systemd 服务)
|
||
|
||
| 项目 | 值 |
|
||
|---|---|
|
||
| 部署方式 | systemd 原生服务 |
|
||
| 版本 | PostgreSQL 18.3 (Ubuntu 18.3-1.pgdg22.04+1) |
|
||
| 二进制路径 | `/usr/lib/postgresql/18/bin/postgres` |
|
||
| 端口 | `5432` |
|
||
| 数据目录 | `/var/lib/postgresql/18/main` |
|
||
| 配置文件 | `/etc/postgresql/18/main/postgresql.conf` |
|
||
| 认证方式 | 本地 peer / 远程 scram-sha-256 |
|
||
| 管理账号 | `postgres` (系统用户,通过 `sudo -u postgres psql` 访问) |
|
||
| 现有数据库 | CompanyDB, ai_image_vault, postgres |
|
||
| 现有角色 | admin, companydb_user, img_vault, mcp_user, postgres |
|
||
|
||
---
|
||
|
||
## 2. 实施计划
|
||
|
||
### Step 1: MinIO - 创建 Bucket
|
||
|
||
- **操作:** 使用 `mc` 创建名为 `snapledger` 的存储桶
|
||
- **用途:** 存储用户上传的支付截图
|
||
- **策略:** 限制 Bucket 仅允许应用访问,不公开
|
||
|
||
### Step 2: MinIO - 创建 Access Key
|
||
|
||
- **操作:** 使用 `mc admin user add` 创建专用访问密钥
|
||
- **用途:** 后端 FastAPI 服务使用此密钥上传/读取图片
|
||
- **权限:** 仅对 `snapledger` 桶有读写权限
|
||
|
||
### Step 3: PostgreSQL - 创建数据库与用户
|
||
|
||
- **操作:** 创建 `snapledger` 数据库和专用用户 `snapledger_user`
|
||
- **权限:** 该用户仅拥有 `snapledger` 数据库的完整权限
|
||
|
||
### Step 4: PostgreSQL - 创建基础表
|
||
|
||
- **操作:** 根据 PRD 数据模型创建 `transactions` 表
|
||
- **内容:** 包含原始数据层、核心业务层、审计运维层全部字段
|
||
|
||
---
|
||
|
||
## 3. 详细操作命令
|
||
|
||
### 3.1 MinIO - 创建 Bucket
|
||
|
||
```bash
|
||
# 在服务器上执行
|
||
mc mb mylocal/snapledger
|
||
```
|
||
|
||
### 3.2 MinIO - 创建 Access Key 并授权
|
||
|
||
```bash
|
||
# 创建策略文件,限制仅访问 snapledger 桶
|
||
cat > /tmp/snapledger-policy.json << 'EOF'
|
||
{
|
||
"Version": "2012-10-17",
|
||
"Statement": [
|
||
{
|
||
"Effect": "Allow",
|
||
"Action": [
|
||
"s3:PutObject",
|
||
"s3:GetObject",
|
||
"s3:DeleteObject",
|
||
"s3:ListBucket"
|
||
],
|
||
"Resource": [
|
||
"arn:aws:s3:::snapledger",
|
||
"arn:aws:s3:::snapledger/*"
|
||
]
|
||
}
|
||
]
|
||
}
|
||
EOF
|
||
|
||
# 创建策略
|
||
mc admin policy create mylocal snapledger-policy /tmp/snapledger-policy.json
|
||
|
||
# 创建服务账号 (Access Key / Secret Key 由 mc 自动生成)
|
||
mc admin user svcacct add mylocal myminioadmin --description 'SnapLedger app service account'
|
||
|
||
# 将策略绑定到新生成的服务账号 (使用上一步输出的 Access Key)
|
||
mc admin policy attach mylocal snapledger-policy --user <生成的AccessKey>
|
||
```
|
||
|
||
### 3.3 PostgreSQL - 创建数据库与用户
|
||
|
||
```bash
|
||
# 在服务器上通过 postgres 系统用户执行
|
||
# 先生成随机密码
|
||
PG_PASS=$(openssl rand -base64 24)
|
||
sudo -u postgres psql
|
||
|
||
# SQL 语句
|
||
CREATE USER snapledger_user WITH PASSWORD '${PG_PASS}';
|
||
CREATE DATABASE snapledger OWNER snapledger_user;
|
||
GRANT ALL PRIVILEGES ON DATABASE snapledger TO snapledger_user;
|
||
```
|
||
|
||
### 3.4 PostgreSQL - 创建基础表
|
||
|
||
```bash
|
||
# 连接到 snapledger 数据库
|
||
sudo -u postgres psql -d snapledger
|
||
```
|
||
|
||
```sql
|
||
-- 授予 schema 权限
|
||
GRANT ALL ON SCHEMA public TO snapledger_user;
|
||
|
||
-- 创建 transactions 表
|
||
CREATE TABLE IF NOT EXISTS transactions (
|
||
-- 原始数据层
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
image_object_key VARCHAR NOT NULL,
|
||
original_filename VARCHAR,
|
||
user_note TEXT,
|
||
upload_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
process_status VARCHAR(20) NOT NULL DEFAULT 'PENDING'
|
||
CHECK (process_status IN ('PENDING','PROCESSING','COMPLETED','FAILED')),
|
||
|
||
-- 核心业务层 (AI 填充)
|
||
transaction_type VARCHAR(20) CHECK (transaction_type IN ('EXPENSE','INCOME','TRANSFER')),
|
||
amount DECIMAL(10,2),
|
||
merchant_name VARCHAR,
|
||
source_app VARCHAR,
|
||
transaction_date TIMESTAMPTZ,
|
||
category VARCHAR,
|
||
order_number VARCHAR,
|
||
|
||
-- 审计运维层
|
||
llm_raw_response JSONB,
|
||
|
||
-- 索引与约束
|
||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX idx_transactions_process_status ON transactions (process_status);
|
||
CREATE INDEX idx_transactions_upload_time ON transactions (upload_time DESC);
|
||
CREATE INDEX idx_transactions_source_app ON transactions (source_app);
|
||
CREATE INDEX idx_transactions_order_number ON transactions (order_number) WHERE order_number IS NOT NULL;
|
||
|
||
-- 授权
|
||
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO snapledger_user;
|
||
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO snapledger_user;
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 预期产出
|
||
|
||
完成以上步骤后,将产出以下资源:
|
||
|
||
### MinIO
|
||
|
||
| 资源 | 名称 | 说明 |
|
||
|---|---|---|
|
||
| Bucket | `snapledger` | 存储支付截图 |
|
||
| Access Key | 服务账号,Access Key / Secret Key 自动生成 | 后端服务专用 |
|
||
| Policy | `snapledger-policy` | 仅限 `snapledger` 桶读写 |
|
||
|
||
### PostgreSQL
|
||
|
||
| 资源 | 名称 | 说明 |
|
||
|---|---|---|
|
||
| Database | `snapledger` | 应用主数据库 |
|
||
| User | `snapledger_user` | 应用专用账号 |
|
||
| Table | `transactions` | 交易记录核心表 |
|
||
| Indexes | 4 个 | 加速状态查询、时间排序、来源筛选、订单去重 |
|
||
|
||
### 连接信息
|
||
|
||
详见 `docs/connections.yaml`(已加入 `.gitignore`,不会提交到仓库)。
|
||
|
||
---
|
||
|
||
## 5. 验证步骤
|
||
|
||
1. **MinIO Bucket:** `mc ls mylocal/snapledger` 确认桶存在
|
||
2. **MinIO Access Key:** 使用新密钥配置 mc alias 并上传测试文件
|
||
3. **PostgreSQL 连接:** `sudo -u postgres psql -d snapledger -c "\dt"` 确认表已创建
|
||
4. **表结构验证:** `\d transactions` 确认字段与索引完整
|