From 60ce25e95cbd1b4753a2e8e28728ce08954488c5 Mon Sep 17 00:00:00 2001 From: Leons Aleksandrovs <58330666+Skrazzo@users.noreply.github.com> Date: Sun, 13 Jul 2025 20:44:13 +0300 Subject: [PATCH] feat(prod): optimised backend image --- Dockerfile.backend | 12 +++++-- caddy/{Caddyfile => dev} | 0 caddy/prod | 13 +++++++ development.yml | 2 +- production.yml | 75 ++++++++++++++++++++++++++++++++++++++++ scripts/var.sh | 3 +- 6 files changed, 101 insertions(+), 4 deletions(-) rename caddy/{Caddyfile => dev} (100%) create mode 100644 caddy/prod create mode 100644 production.yml diff --git a/Dockerfile.backend b/Dockerfile.backend index 7b74d34..86162f0 100644 --- a/Dockerfile.backend +++ b/Dockerfile.backend @@ -7,13 +7,21 @@ WORKDIR /app COPY go.mod go.sum ./ RUN go mod download -# ---- Production mode ---- -FROM base AS prod +# ---- Build mode ---- +FROM base AS build +WORKDIR /app # Copy code, and compile COPY . . RUN go build -o server main.go +# ---- Production mode ---- +FROM alpine@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 AS prod +WORKDIR /app + +# Copy built binary +COPY --from=build /app/server . + # Expose 8080 port EXPOSE 8080 diff --git a/caddy/Caddyfile b/caddy/dev similarity index 100% rename from caddy/Caddyfile rename to caddy/dev diff --git a/caddy/prod b/caddy/prod new file mode 100644 index 0000000..bd49dae --- /dev/null +++ b/caddy/prod @@ -0,0 +1,13 @@ +{ + admin off + auto_https off +} + +:8080 { + encode + reverse_proxy frontend:3000 + + handle_path /api* { + reverse_proxy backend:8080 + } +} diff --git a/development.yml b/development.yml index 69a87f5..30f102f 100644 --- a/development.yml +++ b/development.yml @@ -44,7 +44,7 @@ services: networks: - cover-letter-network volumes: - - ./caddy/Caddyfile:/etc/caddy/Caddyfile + - ./caddy/dev:/etc/caddy/Caddyfile ports: - 8000:8080 depends_on: diff --git a/production.yml b/production.yml new file mode 100644 index 0000000..c52e88a --- /dev/null +++ b/production.yml @@ -0,0 +1,75 @@ +services: + backend: + build: + context: ./backend + dockerfile: ../Dockerfile.backend + target: prod # Development mode with hot reload + restart: unless-stopped + container_name: cover-letter-backend + + env_file: + - .env + environment: + # - GIN_MODE=release # For production + - GIN_MODE=release + # - POSTGRES_DB=postgresql://username:password@host:port/database_name + - POSTGRES_DB=postgresql://postgres:postgres@db:5432/cover-letter + # - Environment=prod # For production + - Environment=prod + networks: + - cover-letter-network + depends_on: + db: # Wait for database to be ready (Pass healthcheck) + condition: service_healthy + # frontend: + # build: + # context: ./frontend + # dockerfile: ../Dockerfile.frontend + # target: dev # Development stage + # restart: unless-stopped + # container_name: cover-letter-frontend + # + # volumes: + # - "./frontend:/app" # Mount frontend + # - "/app/node_modules" # Ignore node_modules + # networks: + # - cover-letter-network + # proxy: + # image: caddy:alpine + # restart: unless-stopped + # container_name: cover-letter-proxy + # + # networks: + # - cover-letter-network + # volumes: + # - ./caddy/Caddyfile:/etc/caddy/Caddyfile + # ports: + # - 8000:8080 + # depends_on: + # - frontend + # - backend + db: + image: postgres:13.21-alpine3.22 + restart: unless-stopped + container_name: cover-letter-db + + networks: + - cover-letter-network + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=postgres + # - POSTGRES_HOST_AUTH_METHOD=trust # No password needed + - POSTGRES_DB=cover-letter + ports: + - 5432:5432 + volumes: + - ./data/db:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U postgres"] + interval: 2s + timeout: 2s + retries: 5 + +networks: + cover-letter-network: + driver: bridge diff --git a/scripts/var.sh b/scripts/var.sh index f785af2..445bd76 100755 --- a/scripts/var.sh +++ b/scripts/var.sh @@ -1,2 +1,3 @@ #!/bin/bash -export file="development.yml" +# export file="development.yml" +export file="production.yml"