From 795f220e909444dbfaa3f706c35633ef05c90895 Mon Sep 17 00:00:00 2001 From: Vladimir Zagainov Date: Sat, 14 Jun 2025 20:03:10 +0300 Subject: [PATCH] feat: initial backend structure and minimal server --- Dockerfile | 43 +++++++++++++++++++++++++++++++++++++++++++ cmd/server/main.go | 29 +++++++++++++++++++++++++++++ go.mod | 5 +++++ go.sum | 2 ++ 4 files changed, 79 insertions(+) create mode 100644 Dockerfile create mode 100644 cmd/server/main.go create mode 100644 go.mod create mode 100644 go.sum diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e9a9dde --- /dev/null +++ b/Dockerfile @@ -0,0 +1,43 @@ +# --- Этап 1: Сборка (Builder) --- +# Используем официальный образ Go в качестве сборочной среды +FROM golang:1.22-alpine AS builder + +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /app + +# Копируем файлы go.mod и go.sum для загрузки зависимостей +COPY go.mod go.sum ./ +# Загружаем зависимости. Этот слой будет кэшироваться, если файлы не менялись +RUN go mod download + +# Копируем весь остальной исходный код +COPY . . + +# Собираем наше приложение. +# -o /app/server: указывает, куда положить скомпилированный бинарный файл. +# -ldflags "-w -s": уменьшает размер бинарника, удаляя отладочную информацию. +# CGO_ENABLED=0: отключает CGO для статической линковки, что важно для Alpine. +RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server -ldflags="-w -s" ./cmd/server + +# --- Этап 2: Финальный образ (Final) --- +# Используем минималистичный образ Alpine. Он не содержит ничего лишнего. +FROM alpine:latest + +# Устанавливаем рабочую директорию +WORKDIR /app + +# Копируем только скомпилированный бинарник из этапа сборки +COPY --from=builder /app/server . + +# (Опционально, но хорошая практика) Добавляем сертификаты для HTTPS-запросов из нашего приложения +RUN apk --no-cache add ca-certificates + +# (Опционально, но хорошая практика) Запускаем приложение от имени непривилегированного пользователя +RUN addgroup -S appgroup && adduser -S appuser -G appgroup +USER appuser + +# Указываем, что контейнер будет слушать порт 8080 +EXPOSE 8080 + +# Команда для запуска нашего приложения при старте контейнера +ENTRYPOINT ["/app/server"] diff --git a/cmd/server/main.go b/cmd/server/main.go new file mode 100644 index 0000000..e3d9222 --- /dev/null +++ b/cmd/server/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "log" + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func main() { + // Создаем новый роутер + r := chi.NewRouter() + + // Используем стандартные middleware для логирования и восстановления после паник + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) + + // Определяем простой маршрут + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("Backend server is running!")) + }) + + // Запускаем сервер на порту 8080, как мы указали в Caddyfile + log.Println("Starting backend server on :8080") + if err := http.ListenAndServe(":8080", r); err != nil { + log.Fatalf("Failed to start server: %v", err) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..9307b39 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module gitea.mrixs.me/minecraft-platform/backend + +go 1.24.1 + +require github.com/go-chi/chi/v5 v5.2.1 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0b69c5c --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/go-chi/chi/v5 v5.2.1 h1:KOIHODQj58PmL80G2Eak4WdvUzjSJSm0vG72crDCqb8= +github.com/go-chi/chi/v5 v5.2.1/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=