https://github.com/egorlis/my-docs
Учебный проект: сервис для хранения и раздачи электронных документов (Go + PostgreSQL + MinIO + Redis). REST API с аутентификацией, кэшем и Swagger-документацией.
https://github.com/egorlis/my-docs
docker go jwt minio postgres redis rest-api s3 swagger taskfile
Last synced: 3 months ago
JSON representation
Учебный проект: сервис для хранения и раздачи электронных документов (Go + PostgreSQL + MinIO + Redis). REST API с аутентификацией, кэшем и Swagger-документацией.
- Host: GitHub
- URL: https://github.com/egorlis/my-docs
- Owner: EgorLis
- Created: 2025-09-26T09:11:54.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2025-09-26T19:42:13.000Z (4 months ago)
- Last Synced: 2025-09-26T21:14:04.748Z (4 months ago)
- Topics: docker, go, jwt, minio, postgres, redis, rest-api, s3, swagger, taskfile
- Language: Go
- Homepage:
- Size: 85 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# My Docs





**My Docs** — учебный проект для хранения и управления документами с использованием Go, PostgreSQL, Redis (для кэша и black-list токенов) и MinIO (хранение файлов).
Проект построен с учётом лучших практик: миграции БД, авторизация через JWT, работа с ACL и кешем, документация через Swagger.
---
## 🚀 Стек технологий
- **Язык:** Go 1.25.0
- **База данных:** PostgreSQL
- [pgxpool](https://pkg.go.dev/github.com/jackc/pgx/v5/pgxpool) — пул соединений
- [golang-migrate](https://github.com/golang-migrate/migrate) — миграции
- **Хранилище файлов:** MinIO (S3 совместимое API)
- **Кэш и Blacklist токенов:** Redis
- **Инфраструктура:** Docker, docker-compose
- **Веб-сервер:** стандартный `net/http`
- **Логгирование:** встроенный логгер Go
- **Taskfile:** автоматизация рутинных задач
- **Документация:** Swagger (через swaggo/swag)
---
## 📂 Структура проекта
```bash
my-docs/
├── cmd/my-docs/ # Точка входа (main.go)
├── configs/ # Конфиги (.env, .env.docker)
├── deployments/docker # Dockerfile, docker-compose.yml
├── internal/ # Внутренняя логика
│ ├── app/ # Builder приложения
│ ├── config/ # Конфиги и ENV
│ ├── docs/ # Swagger (генерируется)
│ ├── domain/ # Доменные сущности и интерфейсы
│ ├── infra/ # Репозитории (Postgres, Redis, S3)
│ └── transport/ # HTTP API (handlers, middleware, v1)
├── Taskfile.yml # Автоматизация задач
├── README.md # Документация
└── go.mod / go.sum # Зависимости
```
---
## ⚙️ Запуск проекта
### 1. Подготовка окружения
```bash
task env
```
Скопирует `.env.docker` и `.env` в проект.
### 2. Сборка и запуск приложения
```bash
task up # запуск в форграунде
task up:detached # запуск в фоне
```
После запуска сервер доступен на:
📍 `http://localhost:8001`
MinIO доступен на:
📍 API: `http://localhost:9000`
📍 WebUI: `http://localhost:9001`
Redis доступен на `localhost:6379`.
### 3. Swagger-документация
```bash
task swagger
```
Открыть:
📍 `http://localhost:8001/swagger/index.html`
### 4. Управление контейнерами
```bash
task logs # логи
task ps # статус
task stop # остановить контейнеры
task down # удалить контейнеры (volume сохраняется)
task down:volumes # снести контейнеры и volumes
```
---
## 📡 REST API
Все ответы обёрнуты в конверт:
```jsonc
{
"error": { "code": 401, "text": "unauthorized" },
"response": { ... },
"data": { ... }
}
```
### Основные ручки
#### 🔑 Аутентификация
- `POST /api/register` — регистрация нового пользователя (только админ-токен)
- `POST /api/auth` — вход, выдача JWT
- `DELETE /api/auth/` — logout (blacklist через Redis)
#### 📄 Документы
- `POST /api/docs` — загрузка документа (meta + json + файл)
- `GET /api/docs` — список документов (свои / публичные / доступные по ACL)
- `GET /api/docs/{id}` — получить документ (JSON или файл)
- `DELETE /api/docs/{id}` — удалить документ
#### 🔒 ACL
- Документы можно делиться через `doc_shares` (grant на чтение).
- Владелец управляет доступами.
---
## 📖 Примеры http-запросов
Примеры запросов можно посмотреть в файле [requests.http](./requests.http)
## 📖 Примеры cURL-запросов
### 1. Регистрация пользователя (админ-токен)
```bash
curl -X POST http://localhost:8001/api/register -H "Content-Type: application/json" -d '{"token":"ADMIN_TOKEN","login":"testuser1","pswd":"Qwerty123!"}'
```
### 2. Авторизация
```bash
curl -X POST http://localhost:8001/api/auth -H "Content-Type: application/json" -d '{"login":"testuser1","pswd":"Qwerty123!"}'
```
Ответ:
```json
{
"response": {
"token": "JWT_TOKEN"
}
}
```
### 3. Загрузка документа
```bash
curl -X POST http://localhost:8001/api/docs -H "Authorization: Bearer JWT_TOKEN" -F 'meta={"name":"note.json","file":false,"public":false}' -F 'json={"hello":"world"}'
```
### 4. Получение списка документов
```bash
curl -X GET http://localhost:8001/api/docs -H "Authorization: Bearer JWT_TOKEN"
```
### 5. Получение документа по ID
```bash
curl -X GET http://localhost:8001/api/docs/DOC_UUID -H "Authorization: Bearer JWT_TOKEN"
```
### 6. Удаление документа
```bash
curl -X DELETE http://localhost:8001/api/docs/DOC_UUID -H "Authorization: Bearer JWT_TOKEN"
```
### 7. Logout (ревокация токена)
```bash
curl -X DELETE http://localhost:8001/api/auth/JWT_TOKEN
```
---
## 📖 Полезные команды
```bash
task help # список задач
task clean # очистка dangling образов
task swagger # генерация Swagger доков
```
---
## 📌 Репозиторий
[🔗 GitHub: EgorLis/my-docs](https://github.com/EgorLis/my-docs)