{"id":31793531,"url":"https://github.com/egorlis/my-docs","last_synced_at":"2026-05-02T17:35:03.413Z","repository":{"id":316805143,"uuid":"1064596057","full_name":"EgorLis/my-docs","owner":"EgorLis","description":"Учебный проект: сервис для хранения и раздачи электронных документов (Go + PostgreSQL + MinIO + Redis). REST API с аутентификацией, кэшем и Swagger-документацией.","archived":false,"fork":false,"pushed_at":"2025-09-26T19:42:13.000Z","size":87,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-26T21:14:04.748Z","etag":null,"topics":["docker","go","jwt","minio","postgres","redis","rest-api","s3","swagger","taskfile"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EgorLis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-26T09:11:54.000Z","updated_at":"2025-09-26T19:50:01.000Z","dependencies_parsed_at":"2025-09-28T14:03:24.577Z","dependency_job_id":null,"html_url":"https://github.com/EgorLis/my-docs","commit_stats":null,"previous_names":["egorlis/my-docs"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/EgorLis/my-docs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EgorLis%2Fmy-docs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EgorLis%2Fmy-docs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EgorLis%2Fmy-docs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EgorLis%2Fmy-docs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EgorLis","download_url":"https://codeload.github.com/EgorLis/my-docs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EgorLis%2Fmy-docs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279004913,"owners_count":26083802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","go","jwt","minio","postgres","redis","rest-api","s3","swagger","taskfile"],"created_at":"2025-10-10T18:19:30.488Z","updated_at":"2025-10-10T18:19:32.922Z","avatar_url":"https://github.com/EgorLis.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# My Docs\n\n![Go](https://img.shields.io/badge/Go-1.25.0-blue)  \n![Postgres](https://img.shields.io/badge/Postgres-16-blue)  \n![Redis](https://img.shields.io/badge/Redis-ready-red)  \n![MinIO](https://img.shields.io/badge/S3-MinIO-orange)  \n![Docker](https://img.shields.io/badge/Docker-ready-blue)\n\n**My Docs** — учебный проект для хранения и управления документами с использованием Go, PostgreSQL, Redis (для кэша и black-list токенов) и MinIO (хранение файлов).  \nПроект построен с учётом лучших практик: миграции БД, авторизация через JWT, работа с ACL и кешем, документация через Swagger.\n\n---\n\n## 🚀 Стек технологий\n\n- **Язык:** Go 1.25.0  \n- **База данных:** PostgreSQL  \n  - [pgxpool](https://pkg.go.dev/github.com/jackc/pgx/v5/pgxpool) — пул соединений  \n  - [golang-migrate](https://github.com/golang-migrate/migrate) — миграции  \n- **Хранилище файлов:** MinIO (S3 совместимое API)  \n- **Кэш и Blacklist токенов:** Redis  \n- **Инфраструктура:** Docker, docker-compose  \n- **Веб-сервер:** стандартный `net/http`  \n- **Логгирование:** встроенный логгер Go  \n- **Taskfile:** автоматизация рутинных задач  \n- **Документация:** Swagger (через swaggo/swag)\n\n---\n\n## 📂 Структура проекта\n\n```bash\nmy-docs/\n├── cmd/my-docs/       # Точка входа (main.go)\n├── configs/           # Конфиги (.env, .env.docker)\n├── deployments/docker # Dockerfile, docker-compose.yml\n├── internal/          # Внутренняя логика\n│   ├── app/           # Builder приложения\n│   ├── config/        # Конфиги и ENV\n│   ├── docs/          # Swagger (генерируется)\n│   ├── domain/        # Доменные сущности и интерфейсы\n│   ├── infra/         # Репозитории (Postgres, Redis, S3)\n│   └── transport/     # HTTP API (handlers, middleware, v1)\n├── Taskfile.yml       # Автоматизация задач\n├── README.md          # Документация\n└── go.mod / go.sum    # Зависимости\n```\n\n---\n\n## ⚙️ Запуск проекта\n\n### 1. Подготовка окружения\n\n```bash\ntask env\n```\n\nСкопирует `.env.docker` и `.env` в проект.\n\n### 2. Сборка и запуск приложения\n\n```bash\ntask up          # запуск в форграунде\ntask up:detached # запуск в фоне\n```\n\nПосле запуска сервер доступен на:  \n📍 `http://localhost:8001`\n\nMinIO доступен на:  \n📍 API: `http://localhost:9000`  \n📍 WebUI: `http://localhost:9001`\n\nRedis доступен на `localhost:6379`.\n\n### 3. Swagger-документация\n\n```bash\ntask swagger\n```\n\nОткрыть:  \n📍 `http://localhost:8001/swagger/index.html`\n\n### 4. Управление контейнерами\n\n```bash\ntask logs        # логи\ntask ps          # статус\ntask stop        # остановить контейнеры\ntask down        # удалить контейнеры (volume сохраняется)\ntask down:volumes # снести контейнеры и volumes\n```\n\n---\n\n## 📡 REST API\n\nВсе ответы обёрнуты в конверт:\n\n```jsonc\n{\n  \"error\": { \"code\": 401, \"text\": \"unauthorized\" },\n  \"response\": { ... },\n  \"data\": { ... }\n}\n```\n\n### Основные ручки\n\n#### 🔑 Аутентификация\n\n- `POST /api/register` — регистрация нового пользователя (только админ-токен)  \n- `POST /api/auth` — вход, выдача JWT  \n- `DELETE /api/auth/\u003ctoken\u003e` — logout (blacklist через Redis)\n\n#### 📄 Документы\n\n- `POST /api/docs` — загрузка документа (meta + json + файл)  \n- `GET /api/docs` — список документов (свои / публичные / доступные по ACL)  \n- `GET /api/docs/{id}` — получить документ (JSON или файл)  \n- `DELETE /api/docs/{id}` — удалить документ  \n\n#### 🔒 ACL\n\n- Документы можно делиться через `doc_shares` (grant на чтение).  \n- Владелец управляет доступами.\n\n---\n\n## 📖 Примеры http-запросов\n\nПримеры запросов можно посмотреть в файле [requests.http](./requests.http)\n\n## 📖 Примеры cURL-запросов\n\n### 1. Регистрация пользователя (админ-токен)\n\n```bash\ncurl -X POST http://localhost:8001/api/register   -H \"Content-Type: application/json\"   -d '{\"token\":\"ADMIN_TOKEN\",\"login\":\"testuser1\",\"pswd\":\"Qwerty123!\"}'\n```\n\n### 2. Авторизация\n\n```bash\ncurl -X POST http://localhost:8001/api/auth   -H \"Content-Type: application/json\"   -d '{\"login\":\"testuser1\",\"pswd\":\"Qwerty123!\"}'\n```\n\nОтвет:\n\n```json\n{\n  \"response\": {\n    \"token\": \"JWT_TOKEN\"\n  }\n}\n```\n\n### 3. Загрузка документа\n\n```bash\ncurl -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\"}'\n```\n\n### 4. Получение списка документов\n\n```bash\ncurl -X GET http://localhost:8001/api/docs   -H \"Authorization: Bearer JWT_TOKEN\"\n```\n\n### 5. Получение документа по ID\n\n```bash\ncurl -X GET http://localhost:8001/api/docs/DOC_UUID   -H \"Authorization: Bearer JWT_TOKEN\"\n```\n\n### 6. Удаление документа\n\n```bash\ncurl -X DELETE http://localhost:8001/api/docs/DOC_UUID   -H \"Authorization: Bearer JWT_TOKEN\"\n```\n\n### 7. Logout (ревокация токена)\n\n```bash\ncurl -X DELETE http://localhost:8001/api/auth/JWT_TOKEN\n```\n\n---\n\n## 📖 Полезные команды\n\n```bash\ntask help        # список задач\ntask clean       # очистка dangling образов\ntask swagger     # генерация Swagger доков\n```\n\n---\n\n## 📌 Репозиторий\n\n[🔗 GitHub: EgorLis/my-docs](https://github.com/EgorLis/my-docs)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fegorlis%2Fmy-docs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fegorlis%2Fmy-docs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fegorlis%2Fmy-docs/lists"}