add deployment stuff :d

+3
.gitignore
···
+
.env
+
api
+
mirror
+34
Dockerfile
···
+
FROM golang:1.24.4-alpine as builder
+
+
RUN apk add --no-cache git just
+
+
WORKDIR /app
+
+
COPY go.mod go.sum ./
+
+
RUN go mod download
+
+
COPY . .
+
+
RUN just api
+
RUN just mirror
+
+
FROM alpine:latest
+
+
RUN apk --no-cache add ca-certificates tzdata
+
+
RUN addgroup -g 1001 appgroup && \
+
adduser -D -u 1001 -G appgroup appuser
+
+
WORKDIR /app
+
+
COPY --from=builder /app/api /app/mirror ./
+
+
RUN mkdir -p /app/config && \
+
chown -R appuser:appgroup /app
+
+
USER appuser
+
+
EXPOSE 3000
+
+
CMD ["./api"]
+2 -2
Justfile
···
pre:
go generate ./ent
-
mirror:
+
mirror: pre
go build -o mirror ./cmd/mirror/main.go
-
api:
+
api: pre
go build -o api ./cmd/api/main.go
api

This is a binary file and will not be displayed.

+46 -8
docker-compose.yml
···
-
version: '3.8'
-
services:
postgres:
image: postgres:16-alpine
container_name: plc-mirror-db
restart: unless-stopped
-
network_mode: host
-
environment:
-
POSTGRES_DB: plc_mirror
-
POSTGRES_USER: plc_user
-
POSTGRES_PASSWORD: plc_password
ports:
- "5432:5432"
+
environment:
+
- POSTGRES_DB=${POSTGRES_DB}
+
- POSTGRES_USER=${POSTGRES_USER}
+
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
+
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U plc_user -d plc_mirror"]
interval: 10s
···
command: [
"postgres",
"-c", "log_statement=all",
-
"-c", "log_duration=on",
+
"-c", "log_duration=on",
"-c", "log_min_duration_statement=0",
"-c", "max_connections=200",
"-c", "shared_preload_libraries=pg_stat_statements"
]
+
networks:
+
- plc-network
+
+
api:
+
build: .
+
container_name: plc-api
+
restart: unless-stopped
+
command: ["./api"]
+
ports:
+
- "3000:3000"
+
volumes:
+
- ./plc.toml:/app/plc.toml:ro
+
depends_on:
+
postgres:
+
condition: service_healthy
+
healthcheck:
+
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/_health"]
+
interval: 30s
+
timeout: 10s
+
retries: 3
+
start_period: 40s
+
networks:
+
- plc-network
+
+
mirror:
+
build: .
+
container_name: plc-mirror
+
restart: unless-stopped
+
command: ["./mirror"]
+
volumes:
+
- ./plc.toml:/app/plc.toml:ro
+
depends_on:
+
postgres:
+
condition: service_healthy
+
networks:
+
- plc-network
volumes:
postgres_data:
driver: local
+
+
networks:
+
plc-network:
+
driver: bridge
mirror

This is a binary file and will not be displayed.

+3
plc.toml
···
+
database_url = "postgresql://plc_user:plc_password@postgres:5432/plc_mirror?sslmode=disable"
+
log_level = "INFO"
+
port = 3000