## 部署与安全设计

- **DDS-Section**: 13.2 安全设计 + 13.5 部署架构
- **DDS-Lines**: L1663-L1732

### Extract

#### 安全措施

| 安全措施 | 说明 |
|----------|------|
| 本地部署 | 默认本地运行，敏感账单数据不上传云端 |
| API Token 加密 | Firefly III API Token 使用 AES 加密存储 |
| 审计日志脱敏 | 日志中账号、订单号局部遮罩（如 `138****1234`） |
| 文件安全 | 上传文件限制类型和大小（默认最大 50MB） |
| CORS 配置 | 仅允许本地来源访问 API |

#### 部署架构

```
Docker 容器 / 本地部署
├── 前端静态资源 (Vue3 Build → /web)
├── 后端服务 (Go Binary :8080)
└── SQLite 数据库 (/data/projectmoneyx.db)

外部依赖（可选）
├── Firefly III (API 推送)
└── Data Importer (API 推送)
```

#### 部署方式

1. **Docker 部署**（推荐）：单容器包含前后端 + SQLite
2. **二进制部署**：交叉编译为单体可执行文件，前端资源使用 Go `embed` 嵌入

#### Dockerfile 示例

```dockerfile
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o projectmoneyx ./cmd/server

FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/projectmoneyx .
COPY --from=builder /app/web ./web
VOLUME /data
EXPOSE 8080
CMD ["./projectmoneyx", "--db", "/data/projectmoneyx.db"]
```

#### 配置管理

```go
type Config struct {
    Server   ServerConfig   `yaml:"server"`
    Database DatabaseConfig `yaml:"database"`
    Firefly  FireflyConfig  `yaml:"firefly"`
    Dedup    DedupConfig    `yaml:"dedup"`
}

type ServerConfig struct {
    Port int    `yaml:"port" default:"8080"`
    Mode string `yaml:"mode" default:"release"`
}

type DatabaseConfig struct {
    Path string `yaml:"path" default:"./data/projectmoneyx.db"`
}

type FireflyConfig struct {
    BaseURL     string `yaml:"base_url"`
    APIToken    string `yaml:"api_token"`       // AES 加密存储
    ImporterURL string `yaml:"importer_url"`
    Enabled     bool   `yaml:"enabled"`
}

type DedupConfig struct {
    FuzzyTimeWindow    int     `yaml:"fuzzy_time_window" default:"5"`
    FuzzyThresholdHigh int     `yaml:"fuzzy_threshold_high" default:"85"`
    FuzzyThresholdLow  int     `yaml:"fuzzy_threshold_low" default:"60"`
    TransferTimeWindow int     `yaml:"transfer_time_window" default:"30"`
    AmountEpsilon      float64 `yaml:"amount_epsilon" default:"0.01"`
}
```
