version: "3.8"
services:
redis:
image: redis:7
container_name: playlist-redis
ports:
- "6379:6379"
command: redis-server
healthcheck:
test: [ "CMD", "redis-cli", "PING" ]
interval: 5s
timeout: 3s
retries: 5
db:
image: postgres:16
container_name: playlist-db
restart: always
environment:
POSTGRES_DB: playlist
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
ports:
- "5432:5432"
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}" ]
interval: 5s
timeout: 3s
retries: 5
volumes:
- pgdata:/var/lib/postgresql/data
kafka:
image: confluentinc/cp-kafka:7.5.0
container_name: playlist-kafka
ports:
- "29092:29092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093'
KAFKA_LISTENERS: >
PLAINTEXT://kafka:9092,
CONTROLLER://kafka:29093,
PLAINTEXT_HOST://0.0.0.0:29092
KAFKA_ADVERTISED_LISTENERS: >
PLAINTEXT://kafka:9092,
PLAINTEXT_HOST://host.docker.internal:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: >
CONTROLLER:PLAINTEXT,
PLAINTEXT:PLAINTEXT,
PLAINTEXT_HOST:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
CLUSTER_ID: 'ciWo7IWazngRchmPES6q5A=='
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
healthcheck:
test: [ "CMD", "bash", "-c", "echo > /dev/tcp/localhost/29092" ]
interval: 5s
timeout: 3s
retries: 10
kafka-ui:
image: provectuslabs/kafka-ui:v0.7.2
container_name: playlist-kafka-ui
ports:
- "8081:8080"
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
depends_on:
kafka:
condition: service_healthy
app:
build: .
container_name: playlist-app
healthcheck:
test: [ "CMD-SHELL", "curl -f http://localhost:8080/actuator/health || exit 1" ]
interval: 10s
timeout: 5s
retries: 5
start_period: 90s
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
kafka:
condition: service_healthy
environment:
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}
REDIS_HOST: ${REDIS_HOST}
REDIS_PORT: ${REDIS_PORT}
JWT_ACCESS_TOKEN_SECRET: ${JWT_ACCESS_TOKEN_SECRET}
JWT_REFRESH_TOKEN_SECRET: ${JWT_REFRESH_TOKEN_SECRET}
JWT_ACCESS_TOKEN_EXPIRATION_MS: ${JWT_ACCESS_TOKEN_EXPIRATION_MS}
JWT_REFRESH_TOKEN_EXPIRATION_MS: ${JWT_REFRESH_TOKEN_EXPIRATION_MS}
SPRING_MAIL_HOST: ${SPRING_MAIL_HOST}
SPRING_MAIL_PORT: ${SPRING_MAIL_PORT}
SPRING_MAIL_USERNAME: ${SPRING_MAIL_USERNAME}
SPRING_MAIL_PASSWORD: ${SPRING_MAIL_PASSWORD}
CONTENT_BUCKET: ${CONTENT_BUCKET}
PROFILE_BUCKET: ${PROFILE_BUCKET}
LOGS_BUCKET: ${LOGS_BUCKET}
AWS_REGION: ${AWS_REGION}
TMDB_API_KEY: ${TMDB_API_KEY}
TMDB_BASE_URL: ${TMDB_BASE_URL}
SPORTSDB_API_KEY: ${SPORTSDB_API_KEY}
SPORTSDB_BASE_URL: ${SPORTSDB_BASE_URL}
SPRING_KAFKA_BOOTSTRAP_SERVERS: ${KAFKA_BOOTSTRAP_SERVERS}
ports:
- "8080:8080"
restart: always
env_file:
- .env
volumes:
pgdata: