📦 GitHub
Репозиторий: github.com/dmironovru/todo-manager
🚀 Быстрый старт
git clone git@github.com:dmironovru/todo-manager.git
cd todo-manager
./start.sh
# Открой: http://localhost:3000/lab
Скрипт сам определит, есть ли Docker. Если есть — поднимет контейнеры. Если нет — запустит нативно через go run + npm start.
Что за проект
Я никогда не использовал Go, но тут решил попробовать. Взял связку React + Go + PostgreSQL. React знаю нормально, Go хотел подтянуть, ну а PostgreSQL — стандарт.
Получился todo-менеджер. Сначала развернул его на VPS с HTTPS и systemd. А потом решил довести до ума и упаковать в Docker, чтобы проект запускался одной командой на любой машине.


Что использовал
Frontend: React 19, Axios
Backend: Go 1.22, PostgreSQL 16
Infra: Docker Compose, Nginx (в контейнере), healthcheck
Опционально: нативный запуск через ./start.sh
Пример кода на Go
Обработчик создания задачи:
func createTask(w http.ResponseWriter, r *http.Request) {
var req struct {
Title string `json:"title"`
}
json.NewDecoder(r.Body).Decode(&req)
var task Task
db.QueryRow(
"INSERT INTO tasks (title) VALUES ($1) RETURNING id, title, completed",
req.Title,
).Scan(&task.ID, &task.Title, &task.Completed)
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(task)
}
2. Docker-сборка и версии Go
Когда упаковывал в Docker, столкнулся с тем, что зависимости pgx требовали Go 1.24+, а в Alpine-образах был только 1.22. Решение:
- Сменил базовый образ с
alpineнаbookworm(Debian) - Понизил версию
golang.org/x/syncдо совместимой - Добавил healthcheck для стабильности
3. Блокировка Docker Hub
В РФ Docker Hub заблокирован. Пришлось настраивать зеркало:
// /etc/docker/daemon.json
{
"registry-mirrors": ["https://dockerhub.timeweb.cloud/"]
}
После этого образы стали скачиваться без проблем.
Как устроен запуск
Скрипт start.sh умеет два режима:
Docker-режим (если есть Docker):
docker compose up -d
# Поднимает 3 контейнера: frontend, backend, db
Нативный режим (если Docker недоступен):
# Автоматически запускает:
# - PostgreSQL (если не запущен)
# - go run main.go (бэкенд)
# - npm start (фронтенд)
Это удобно: проект работает и в изолированных контейнерах, и на голой машине.
Планы на развитие
- ✅
Завернуть всё в Docker— сделано - Добавить Redis для кэша
- Настроить автодеплой через GitHub Actions
- Сделать Telegram-бота для уведомлений
- Покрыть тестами бэкенд (Go testing)
Если коротко
Docker — это не страшно. Когда разобрался с multi-stage сборкой и healthcheck'ами, деплой стал предсказуемым.
Главное — не бояться экспериментировать. Сначала API, потом базу, потом фронт. И обязательно заворачивать в контейнеры, чтобы «у меня работает» превращалось в «работает везде».
Совет: попробуй упаковать свой проект в Docker. Результат того стоит.
