"React + Go + Docker: упаковал Todo Manager в контейнеры"

29.05.2026
#React#Go#Docker#PostgreSQL#Деплой

📦 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, чтобы проект запускался одной командой на любой машине.

start-terminal.png

app-interface.png

Что использовал

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. Результат того стоит.