{"id":20560455,"url":"https://github.com/vodolaz095/purser","last_synced_at":"2026-04-30T20:31:19.971Z","repository":{"id":201936820,"uuid":"701681022","full_name":"vodolaz095/purser","owner":"vodolaz095","description":"Казначей - система для хранения секретов, которые можно сжечь после прочтения","archived":false,"fork":false,"pushed_at":"2023-10-19T21:10:45.000Z","size":280,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-16T19:06:12.825Z","etag":null,"topics":["clean-architecture","example","grpc-server","mysql","postgresql","redis","sql","swagger"],"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/vodolaz095.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"custom":["https://www.tinkoff.ru/rm/ostroumov.anatoliy2/4HFzm76801/"]}},"created_at":"2023-10-07T08:53:10.000Z","updated_at":"2023-10-18T17:08:31.000Z","dependencies_parsed_at":null,"dependency_job_id":"d21794e9-1570-47ac-998f-29659f887620","html_url":"https://github.com/vodolaz095/purser","commit_stats":null,"previous_names":["vodolaz095/purser"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fpurser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fpurser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fpurser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vodolaz095%2Fpurser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vodolaz095","download_url":"https://codeload.github.com/vodolaz095/purser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242168937,"owners_count":20083201,"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","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":["clean-architecture","example","grpc-server","mysql","postgresql","redis","sql","swagger"],"created_at":"2024-11-16T03:54:35.802Z","updated_at":"2026-04-30T20:31:14.951Z","avatar_url":"https://github.com/vodolaz095.png","language":"Go","funding_links":["https://www.tinkoff.ru/rm/ostroumov.anatoliy2/4HFzm76801/"],"categories":[],"sub_categories":[],"readme":"# purser\nКазначей - система для хранения секретов, которые можно сжечь после прочтения.\nПрактической пользы не несёт, но на её основе можно объяснить,\nкак компоновать микросервис систему на Go.\n\nПостановка задачи\n=============================\n\n1. Создать микросервис, который реализует 3 метода\n   - Создать некую запись в базе данных\n   - Получить запись по первичному ключу\n   - Удалить запись по первичному ключу\n2. Использовать чистую архитектуру\n3. Для сохранения данных используется паттерн репозитория и несколько реализаций (sql, nosql и т.д.)\n4. На транспортном уровне использовать HTTP и GRPC (использовать кодогенерацию по готовым описаниям сервиса)\n5. Реализовать логгирование\n6. Реализовать трейсинг с использованием OpenTelemetry\n7. Всё можно запустить локально с помощью docker compose\n\nСтруктура проекта\n==============================\nБизнес логика реализована в `internal/service`.\nЕсть 2 сервиса - CRUD для секретов и счётчики для метрик.\nCRUD для секретов работает с репозиторием секретов (`internal/service/repository/`), который абстрагирует\nвсе взаимодействия с базой данных внутри. Есть несколько реализаций репозитория - `memory`,`redis`,`mysql`,`postgresql`.\nВсе репозитории должны реализовывать интерфейс `internal/service/repository/SecretRepo`.\nИ интерфейс `internal/service/repository/SecretRepo` используется сервисом `internal/service/SecretService` в работе.\nНа транспортном уровне в `internal/transport` реализованы несколько транспортов, дёргающих методы сервиса.\nЭто [grpc](internal%2Ftransport%2Fgrpc), [http](internal%2Ftransport%2Fhttp),\n[prune](internal%2Ftransport%2Fprune) (очистка старых записей по таймеру),\n[watchdog](internal%2Ftransport%2Fwatchdog) (проверка работоспособности сервиса с помощью systemd watchdog).\nТранспортный уровень вызывает методы сервиса, а сервис сделан так, чтобы его методы можно было вызвать из разных контекстов,\nи при этом оно сохраняло бы работоспособность.\n\n\nКак запустить?\n==============================\n\n1. Сделать файл `.env` по аналогии с `env.example` - название ключей окружения можно посмотреть в файле `config/config.go`\n2. Выбрать нужную базу данных - mysql, redis, postgresql.\n3. Запустить сервис с помощью `docker compose up`\n4. На http://localhost:3000/ будет слушать HTTP сервер\n5. На http://localhost:3001/ будет слушать GRPC сервер\n6. Запустите клиенты для генерации секретов\n\n    ```shell\n\n    make cli_curl\n    make cli_grpc\n    make cli_http_client\n\n    ```\n\n7. JWT токен можно сгенерировать тут - https://jwt.io/. Алгоритм - HS512, \"sub\" - любая строка, секрет по умолчанию -\n   `super_secret_for_purser`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvodolaz095%2Fpurser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvodolaz095%2Fpurser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvodolaz095%2Fpurser/lists"}