feat(prod): optimised backend image

This commit is contained in:
Leons Aleksandrovs
2025-07-13 20:44:13 +03:00
parent b4e4f3e53f
commit 60ce25e95c
6 changed files with 101 additions and 4 deletions

View File

@@ -7,13 +7,21 @@ WORKDIR /app
COPY go.mod go.sum ./ COPY go.mod go.sum ./
RUN go mod download RUN go mod download
# ---- Production mode ---- # ---- Build mode ----
FROM base AS prod FROM base AS build
WORKDIR /app
# Copy code, and compile # Copy code, and compile
COPY . . COPY . .
RUN go build -o server main.go 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 port
EXPOSE 8080 EXPOSE 8080

13
caddy/prod Normal file
View File

@@ -0,0 +1,13 @@
{
admin off
auto_https off
}
:8080 {
encode
reverse_proxy frontend:3000
handle_path /api* {
reverse_proxy backend:8080
}
}

View File

@@ -44,7 +44,7 @@ services:
networks: networks:
- cover-letter-network - cover-letter-network
volumes: volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile - ./caddy/dev:/etc/caddy/Caddyfile
ports: ports:
- 8000:8080 - 8000:8080
depends_on: depends_on:

75
production.yml Normal file
View File

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

View File

@@ -1,2 +1,3 @@
#!/bin/bash #!/bin/bash
export file="development.yml" # export file="development.yml"
export file="production.yml"