feat: initial backend structure and minimal server

This commit is contained in:
2025-06-14 20:03:10 +03:00
commit 795f220e90
4 changed files with 79 additions and 0 deletions

43
Dockerfile Normal file
View File

@@ -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"]

29
cmd/server/main.go Normal file
View File

@@ -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)
}
}

5
go.mod Normal file
View File

@@ -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

2
go.sum Normal file
View File

@@ -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=