Files
go-simple-api/docker-compose.yml
2026-07-16 10:13:46 +03:30

63 lines
1.8 KiB
YAML

# Brings up the full stack with one command: the Go API, MySQL, and Redis.
#
# Usage:
# cp .env.example .env # fill in real values, especially Google OAuth
# docker compose up --build
#
# docker compose automatically loads a file literally named ".env" sitting
# next to this file, and substitutes ${VAR} references below from it.
services:
app:
build: .
ports:
- "8070:8080"
depends_on:
- mysql
- redis
environment:
PORT: 8080
ENV: development
# NOTE: these hostnames are NOT "127.0.0.1" - inside the compose
# network, each service's NAME becomes its hostname. Compose runs an
# internal DNS that resolves "mysql" and "redis" to the correct
# container's IP address automatically. This is exactly why
# internal/config reads these from environment variables instead of
# hardcoding 127.0.0.1 - the same compiled binary works unchanged
# both locally and inside Docker, just by changing env vars.
DB_HOST: mysql
DB_PORT: 3306
DB_USER: root
DB_PASSWORD: devpass
DB_NAME: go_simple_api
REDIS_ADDR: redis:6379
GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID}
GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET}
GOOGLE_REDIRECT_URL: http://localhost:8080/auth/google/callback
ALLOWED_ORIGINS: http://localhost:3000
mysql:
image: mysql:9
environment:
MYSQL_ROOT_PASSWORD: devpass
MYSQL_DATABASE: go_simple_api
ports:
- "13306:3306"
volumes:
# Named volume: MySQL's data directory is persisted on the host,
# independent of the container's lifecycle. Without this, all data
# would be lost every time you run `docker compose down`.
- mysql_data:/var/lib/mysql
redis:
image: redis:8
ports:
- "16379:6379"
volumes:
mysql_data: