diff --git a/deploy/dev/docker-compose.yml b/deploy/dev/docker-compose.yml index e4f54ae..9c881bf 100644 --- a/deploy/dev/docker-compose.yml +++ b/deploy/dev/docker-compose.yml @@ -1,25 +1,139 @@ +x-postgres-base: &postgres-base + image: postgres:17-bookworm + restart: unless-stopped + environment: &postgres-env + POSTGRES_USER: ${PD_USERNAME} + POSTGRES_PASSWORD: ${DB_PASSWORD} + POSTGRES_DB: ${DB_NAME} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${PD_USERNAME} -d ${DB_NAME}"] + interval: 5s + timeout: 3s + start_period: 30s + retries: 10 + services: # ==================== 基础设施 ==================== - postgres: - image: postgres:17-bookworm - container_name: juwan-postgres - restart: unless-stopped + users-db: + <<: *postgres-base + container_name: juwan-users-db environment: - POSTGRES_USER: ${PD_USERNAME} - POSTGRES_PASSWORD: ${DB_PASSWORD} - POSTGRES_DB: ${DB_NAME} - ports: - - "15432:5432" + <<: *postgres-env + POSTGRES_DOMAIN: users volumes: - - pgdata:/var/lib/postgresql/data - - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh:ro + - users-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + game-db: + <<: *postgres-base + container_name: juwan-game-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: game + volumes: + - game-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + player-db: + <<: *postgres-base + container_name: juwan-player-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: player + volumes: + - player-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + shop-db: + <<: *postgres-base + container_name: juwan-shop-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: shop + volumes: + - shop-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + order-db: + <<: *postgres-base + container_name: juwan-order-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: order + volumes: + - order-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + wallet-db: + <<: *postgres-base + container_name: juwan-wallet-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: wallet + volumes: + - wallet-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + community-db: + <<: *postgres-base + container_name: juwan-community-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: community + volumes: + - community-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + review-db: + <<: *postgres-base + container_name: juwan-review-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: review + volumes: + - review-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + dispute-db: + <<: *postgres-base + container_name: juwan-dispute-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: dispute + volumes: + - dispute-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + notification-db: + <<: *postgres-base + container_name: juwan-notification-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: notification + volumes: + - notification-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro + - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro + + search-db: + <<: *postgres-base + container_name: juwan-search-db + environment: + <<: *postgres-env + POSTGRES_DOMAIN: search + volumes: + - search-pgdata:/var/lib/postgresql/data + - ./init-domain.sh:/docker-entrypoint-initdb.d/00-init-domain.sh:ro - ../../desc/sql:/docker-entrypoint-initdb.d/sql:ro - healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${PD_USERNAME} -d ${DB_NAME}"] - interval: 5s - timeout: 3s - start_period: 30s - retries: 10 redis: image: redis:8-alpine @@ -173,11 +287,13 @@ services: restart: unless-stopped env_file: .env environment: + DB_HOST: users-db + DB_HOST_RO: users-db ADMIN_USERNAME: ${ADMIN_USERNAME} ADMIN_PASSWORD: ${ADMIN_PASSWORD} ADMIN_EMAIL: ${ADMIN_EMAIL} depends_on: - postgres: + users-db: condition: service_healthy redis: condition: service_healthy @@ -189,8 +305,11 @@ services: container_name: juwan-user-verifications-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: users-db + DB_HOST_RO: users-db depends_on: - postgres: + users-db: condition: service_healthy redis: condition: service_healthy @@ -204,8 +323,11 @@ services: container_name: juwan-player-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: player-db + DB_HOST_RO: player-db depends_on: - postgres: + player-db: condition: service_healthy redis: condition: service_healthy @@ -217,8 +339,11 @@ services: container_name: juwan-game-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: game-db + DB_HOST_RO: game-db depends_on: - postgres: + game-db: condition: service_healthy redis: condition: service_healthy @@ -230,8 +355,11 @@ services: container_name: juwan-shop-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: shop-db + DB_HOST_RO: shop-db depends_on: - postgres: + shop-db: condition: service_healthy redis: condition: service_healthy @@ -245,8 +373,11 @@ services: container_name: juwan-order-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: order-db + DB_HOST_RO: order-db depends_on: - postgres: + order-db: condition: service_healthy redis: condition: service_healthy @@ -258,8 +389,11 @@ services: container_name: juwan-wallet-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: wallet-db + DB_HOST_RO: wallet-db depends_on: - postgres: + wallet-db: condition: service_healthy redis: condition: service_healthy @@ -271,8 +405,11 @@ services: container_name: juwan-community-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: community-db + DB_HOST_RO: community-db depends_on: - postgres: + community-db: condition: service_healthy redis: condition: service_healthy @@ -290,8 +427,11 @@ services: container_name: juwan-review-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: review-db + DB_HOST_RO: review-db depends_on: - postgres: + review-db: condition: service_healthy redis: condition: service_healthy @@ -303,8 +443,11 @@ services: container_name: juwan-dispute-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: dispute-db + DB_HOST_RO: dispute-db depends_on: - postgres: + dispute-db: condition: service_healthy redis: condition: service_healthy @@ -316,8 +459,11 @@ services: container_name: juwan-notification-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: notification-db + DB_HOST_RO: notification-db depends_on: - postgres: + notification-db: condition: service_healthy redis: condition: service_healthy @@ -329,8 +475,11 @@ services: container_name: juwan-search-rpc restart: unless-stopped env_file: .env + environment: + DB_HOST: search-db + DB_HOST_RO: search-db depends_on: - postgres: + search-db: condition: service_healthy redis: condition: service_healthy @@ -527,8 +676,28 @@ services: condition: service_healthy volumes: - pgdata: - name: juwan-pgdata + users-pgdata: + name: juwan-users-pgdata + game-pgdata: + name: juwan-game-pgdata + player-pgdata: + name: juwan-player-pgdata + shop-pgdata: + name: juwan-shop-pgdata + order-pgdata: + name: juwan-order-pgdata + wallet-pgdata: + name: juwan-wallet-pgdata + community-pgdata: + name: juwan-community-pgdata + review-pgdata: + name: juwan-review-pgdata + dispute-pgdata: + name: juwan-dispute-pgdata + notification-pgdata: + name: juwan-notification-pgdata + search-pgdata: + name: juwan-search-pgdata redisdata: name: juwan-redisdata mongodata: diff --git a/deploy/dev/init-db.sh b/deploy/dev/init-db.sh deleted file mode 100755 index 5b835fb..0000000 --- a/deploy/dev/init-db.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -set -e - -SQL_DIR="/docker-entrypoint-initdb.d/sql" - -psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/common/update_updated_at_column.sql" - -ordered=( - users/users.sql - users/user_follows.sql - users/user_preferences.sql - users/user_verifications.sql - game/games.sql - player/players.sql - player/player_services.sql - shop/shop.sql - shop/shop_players.sql - shop/shop_invitations.sql - order/00-orders.sql - order/order_state_log.sql - wallet/00-wallets.sql - wallet/wallet_transactions.sql - community/posts.sql - community/comments.sql - community/post_likes.sql - community/comment_likes.sql - dispute/disputes.sql - dispute/dispute_timeline.sql - review/reviews.sql - notification/notifications.sql - search/favorites.sql -) - -for f in "${ordered[@]}"; do - [ -f "$SQL_DIR/$f" ] || continue - psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$SQL_DIR/$f" -done diff --git a/deploy/dev/init-domain.sh b/deploy/dev/init-domain.sh new file mode 100755 index 0000000..9ada658 --- /dev/null +++ b/deploy/dev/init-domain.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -e + +SQL_DIR="/docker-entrypoint-initdb.d/sql" +DOMAIN="${POSTGRES_DOMAIN:?POSTGRES_DOMAIN env required}" + +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" \ + -f "$SQL_DIR/common/update_updated_at_column.sql" + +for f in "$SQL_DIR/$DOMAIN"/*.sql; do + [ -f "$f" ] || continue + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" -f "$f" +done