110 lines
4.1 KiB
Markdown
110 lines
4.1 KiB
Markdown
# AEVS CLI — Simplified Specification
|
||
|
||
## Overview
|
||
|
||
CLI-инструмент для синхронизации `.env` файлов между машинами одного пользователя.
|
||
|
||
- **Язык:** Go (golang)
|
||
- **Storage:** S3-совместимое хранилище (AWS S3, MinIO, Cloudflare R2, DigitalOcean Spaces)
|
||
- **Целевой сценарий:** Один пользователь, несколько машин
|
||
|
||
---
|
||
|
||
## Проблема
|
||
|
||
Разработчик работает над проектами на нескольких машинах (ноутбук, рабочий ПК, сервер). Код синхронизируется через Git, но `.env` файлы:
|
||
- Не должны попадать в Git (секреты)
|
||
- Нужно как-то переносить между машинами
|
||
- Ручное копирование — неудобно и ненадёжно
|
||
|
||
---
|
||
|
||
## Решение
|
||
|
||
Простой CLI с двумя основными командами:
|
||
- `aevs push` — загрузить локальные `.env` файлы в облачное хранилище
|
||
- `aevs pull` — скачать `.env` файлы из хранилища
|
||
|
||
Проекты идентифицируются по имени. Никаких версий, merge, конфликтов между пользователями.
|
||
|
||
---
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
┌──────────────┐ ┌──────────────┐
|
||
│ Machine A │ │ Machine B │
|
||
│ (laptop) │ │ (office) │
|
||
│ │ ┌─────────┐ │ │
|
||
│ project/ │ │ Storage │ │ project/ │
|
||
│ .env.prod │ ───► │ (S3) │ ◄── │ (empty) │
|
||
│ .env.dev │ │ │ │ │
|
||
│ aevs.yaml │ └─────────┘ │ │
|
||
└──────────────┘ └──────────────┘
|
||
│ │
|
||
▼ ▼
|
||
aevs push aevs pull
|
||
```
|
||
|
||
---
|
||
|
||
## Структура данных в Storage
|
||
|
||
```
|
||
s3://my-aevs-bucket/
|
||
├── my-awesome-project/
|
||
│ ├── envs.tar.gz # архив с .env файлами
|
||
│ └── metadata.json # метаданные (время, список файлов)
|
||
├── another-project/
|
||
│ ├── envs.tar.gz
|
||
│ └── metadata.json
|
||
└── old-project/
|
||
├── envs.tar.gz
|
||
└── metadata.json
|
||
```
|
||
|
||
---
|
||
|
||
## Ключевые принципы
|
||
|
||
1. **Простота** — минимум команд, минимум конфигурации
|
||
2. **Один владелец** — нет конфликтов между пользователями
|
||
3. **Последний push побеждает** — нет merge, нет версий
|
||
4. **S3 как источник правды** — если нужна история, используй S3 versioning
|
||
5. **Безопасность через S3** — приватный bucket, IAM, encryption at rest
|
||
|
||
---
|
||
|
||
## Scope
|
||
|
||
### В scope
|
||
|
||
- ✅ Инициализация проекта (`init`)
|
||
- ✅ Загрузка файлов в storage (`push`)
|
||
- ✅ Скачивание файлов из storage (`pull`)
|
||
- ✅ Просмотр списка проектов (`list`)
|
||
- ✅ Настройка credentials (`config`)
|
||
- ✅ Автоматическое сканирование `.env*` файлов
|
||
|
||
### Вне scope
|
||
|
||
- ❌ Версионирование (полагаемся на S3 versioning)
|
||
- ❌ Merge конфликтов
|
||
- ❌ Многопользовательский доступ
|
||
- ❌ REST API сервер
|
||
- ❌ Шифрование на клиенте
|
||
- ❌ Интерактивное разрешение конфликтов
|
||
|
||
---
|
||
|
||
## Зависимости
|
||
|
||
```go
|
||
require (
|
||
github.com/aws/aws-sdk-go-v2/config
|
||
github.com/aws/aws-sdk-go-v2/service/s3
|
||
github.com/spf13/cobra
|
||
gopkg.in/yaml.v3
|
||
)
|
||
```
|