Skip to content

Latest commit

 

History

History
527 lines (310 loc) · 7.18 KB

File metadata and controls

527 lines (310 loc) · 7.18 KB

Roadmap проекта

Я разбил его на этапы (эпики), внутри каждого — небольшие задачи. После каждого этапа проект уже остается рабочим.


Этап 0. Подготовка

Цель: создать фундамент проекта.

Задачи

  • создать репозиторий Git
  • настроить .gitignore
  • создать README
  • выбрать лицензию (MIT)
  • настроить Makefile
  • docker-compose
  • конфигурацию через .env
  • базовую структуру проекта

Например

image-host/

cmd/
    server/

internal/
    config/
    handler/
    service/
    repository/
    storage/
    model/

pkg/

web/

migrations/

deploy/

docker-compose.yml

Makefile

Этап 1. HTTP API

Цель:

Получить работающий сервер.

Задачи

✔ запуск Gin

✔ health endpoint

GET /health

ответ

OK

сделать роутер

POST /upload

GET /image/:id

пока пусть возвращают

Not implemented

Что изучишь

  • Gin
  • middleware
  • роутинг

Этап 2. Загрузка файлов

Теперь сервер реально принимает изображения.

Задачи

принимать

multipart/form-data

сохранять файл

пока

storage/

abc123.png

генерировать id

KSUID

возвращать

{
    "id":"abc123",
    "url":"http://localhost/image/abc123"
}

GET

/image/:id

отдает картинку.

После этого MVP уже работает.


Этап 3. PostgreSQL

Теперь перестаем надеяться на файловую систему.

Создаем таблицу

images

например

id

filename

mime_type

size

storage_key

created_at

expires_at

После загрузки

1 сохраняем файл

2 записываем метаданные


GET

ищет запись в Postgres.


Изучишь

  • pgx
  • миграции
  • repository pattern

Этап 4. Frontend

Самый простой.

Страница

+

Перетащи файл

или

Выбери файл

кнопка

Upload

после загрузки

Скопировать ссылку

Все.

Никаких React.

Обычный HTML.

Максимум Alpine.js.


Этап 5. Telegram Bot

Отдельный модуль.

Команды

/start

/help

если прислали фото

↓

бот скачивает файл

↓

загружает

↓

отвечает

Готово

https://...

После этого сервис уже реально можно использовать.


Этап 6. MinIO

Теперь избавляемся от хранения файлов на диске.

Вместо

storage/

используем

MinIO

Меняется только Storage слой.

Все остальные слои ничего не замечают.

Это хороший показатель правильной архитектуры.


Этап 7. Обработка изображений

При загрузке

  • проверить MIME
  • проверить размер

если JPEG

↓

конвертация

↓

WebP

если слишком большое

↓

resize

↓

сохранить


Добавить

thumbnail

например

400px

Этап 8. TTL

Добавляем

expires_at

Можно выбрать

10 минут

1 час

1 день

7 дней

никогда

Фоновый worker

каждую минуту

ищет

expires_at < now()

↓

удаляет файл

↓

удаляет запись.


Этап 9. Безопасность

Добавить

Rate Limit

Максимальный размер файла

MIME Validation

Magic Bytes

CORS

Security Headers


Этап 10. Логи

Переходим на

log/slog

Добавляем

request id

время обработки

ip

user agent


Этап 11. Swagger

Добавляем

/swagger

Этап 12. GitHub Actions

Автоматически

go test

go fmt

golangci-lint

docker build

при push.


Этап 13. VPS

Ubuntu

Docker Compose

Nginx

HTTPS

Домен


Этап 14. Полировка

Красивый README

Архитектурная схема

Скриншоты

Диаграмма


Этап 15. Если захочется сделать проект уровня Middle

Не раньше.

Добавить

  • авторизацию
  • личный кабинет
  • папки
  • drag&drop нескольких файлов
  • API-ключи
  • Prometheus
  • Grafana
  • OpenTelemetry
  • S3 (AWS)
  • Cloudflare R2
  • удаление по секретной ссылке
  • одноразовые ссылки
  • ограничение количества просмотров
  • фоновые очереди

Что я предлагаю дополнительно

Я бы хотел вести проект так же, как это делают в командах.

Для каждой задачи мы будем соблюдать одинаковый цикл:

  1. Обсуждаем, что реализуем и почему именно так.
  2. Проектируем интерфейсы и структуру каталогов.
  3. Ты реализуешь функциональность.
  4. Я делаю code review и предлагаю улучшения.
  5. Если нужно — рефакторим.
  6. Только после этого переходим к следующей задаче.

Такой подход научит тебя не только писать код, но и принимать архитектурные решения.

Первое правило проекта

Я бы сразу ввел одно важное правило:

Не использовать ИИ для генерации больших кусков кода.

Лучше писать самостоятельно, а меня использовать как тимлида: обсудить архитектуру, проверить реализацию, найти баги, объяснить ошибки и предложить улучшения. Такой подход дает гораздо более прочные навыки и позволяет уверенно рассказывать о проекте на собеседовании.

Мне нравится эта идея, и я готов вести проект до полноценного релиза. В итоге у тебя получится не просто пет-проект, а сервис, который можно развернуть на VPS, пользоваться самому и показывать работодателям как пример качественной Go-разработки.