# ============================================================
# match_12 – Synology NAS Docker Compose
# ============================================================
# 使い方:
#   1. .env.example を .env にコピーして値を設定
#   2. docker compose up -d --build
#   3. http://<NASのIP>:8080 でアクセス
# ============================================================

# Hyperliquid Bot 共通テンプレート（YAML anchor）
# 複数の hyperliquid-bot-* サービスでこの定義を再利用する
x-hyperliquid-bot: &hyperliquid-bot-template
  build:
    context: .
    dockerfile: docker/hyperliquid/Dockerfile
    args:
      TZ: "${HL_BOT_TZ:-Asia/Tokyo}"
  restart: unless-stopped
  profiles:
    - bot
  volumes:
    - ./python:/app/python:ro
    - ./storage:/app/storage

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: match_12
    restart: unless-stopped
    ports:
      - "${APP_PORT:-8080}:80"
      - "${APP_SSL_PORT:-8443}:443"
      - "${REVERB_PORT:-8085}:8080"
    volumes:
      # ソースコード全体をバインドマウント（git pull で即反映、storage含む）
      - .:/var/www/html
      # vendor はコンテナ内のものを優先（ホスト側で上書きされないようにする）
      - vendor_data:/var/www/html/vendor
      # Docker ソケット（メルカリサーバー再起動用）
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      - APP_ENV=production
      - APP_DEBUG=false
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s

  mysql:
    image: mysql:8.0
    container_name: match_12_mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: "${DB_DATABASE:-match_12}"
      MYSQL_USER: "${DB_USERNAME:-match_12}"
      MYSQL_PASSWORD: "${DB_PASSWORD:-secret}"
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD:-rootsecret}"
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "${DB_PORT:-3306}:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  # Redis: キュー / キャッシュ / セッション用
  # MySQL キュー（`jobs` テーブル）で発生していた Deadlock (SQLSTATE[40001] 1213)
  # を回避するため、NAS 環境でも Redis をキューバックエンドとして使用する。
  # ※ デフォルトではホストへポートを公開しない（Docker ネットワーク内の app からのみアクセス）。
  #    LAN から redis-cli したい場合は ports: を有効化 + REDIS_REQUIREPASS を設定すること。
  # ※ Laravel の REDIS_PASSWORD は "null" を「パスワード無し」と解釈するため、
  #    redis-server 起動用には別名 REDIS_REQUIREPASS（空なら認証なし）を使用する。
  redis:
    image: redis:7-alpine
    container_name: match_12_redis
    restart: unless-stopped
    command: redis-server --appendonly yes --maxmemory ${REDIS_MAXMEMORY:-256mb} --maxmemory-policy allkeys-lru ${REDIS_REQUIREPASS:+--requirepass ${REDIS_REQUIREPASS}}
    volumes:
      - redis_data:/data
    # LAN 公開したい場合のみコメントアウト解除:
    # ports:
    #   - "${REDIS_PORT:-6379}:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 10s

  # Hyperliquid 自動売買ボット（複数 Bot 並行稼働対応）
  # - Laravel アプリとは独立した軽量 Python コンテナで稼働
  # - ./python/hyperliquid のスクリプトと ./storage/app を Laravel と共有
  # - profiles: [bot] により `docker compose up -d` では起動しない
  #   明示的に起動するには: `docker compose --profile bot up -d`
  # - HL_BOT_ID ごとに storage/app/hl_bots/{id}/ にファイルが分離される
  # - Bot を追加する場合は以下のサービスをコピーして service 名・container_name・HL_BOT_ID を変更
  # - 銘柄/戦略など bot 固有のパラメータは Web UI または storage/app/hl_bots/{id}/config.json で設定
  # - 秘密鍵は全 Bot 共通（HYPERLIQUID_PRIVATE_KEY）。Bot ごとに分ける場合は
  #   HYPERLIQUID_PRIVATE_KEY_{ID_UPPER} を .env に追加し、下記 environment で参照

  # デフォルト Bot（単独銘柄戦略）
  hyperliquid-bot-default:
    <<: *hyperliquid-bot-template
    container_name: match_12_hl_bot_default
    environment:
      TZ: ${HL_BOT_TZ:-Asia/Tokyo}
      HL_BOT_ID: default
      HL_BOT_TYPE: ${HL_BOT_TYPE:-single}
      HYPERLIQUID_PRIVATE_KEY: ${HYPERLIQUID_PRIVATE_KEY_DEFAULT:-${HYPERLIQUID_PRIVATE_KEY:-}}
      # Agent (API) ウォレット運用時、資金を持つ Master アドレス。未設定なら秘密鍵から導出。
      HYPERLIQUID_WALLET_ADDRESS: ${HYPERLIQUID_WALLET_ADDRESS_DEFAULT:-${HYPERLIQUID_WALLET_ADDRESS:-}}
      HYPERLIQUID_TESTNET: ${HYPERLIQUID_TESTNET:-false}
      ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
      DISCORD_ERROR_WEBHOOK_URL: ${DISCORD_ERROR_WEBHOOK_URL:-}

  # ----- 追加 Bot の例（必要に応じてコメントアウト解除して使う） -----
  #
  # # BTC 単独戦略 Bot
  # hyperliquid-bot-btc:
  #   <<: *hyperliquid-bot-template
  #   container_name: match_12_hl_bot_btc
  #   environment:
  #     TZ: ${HL_BOT_TZ:-Asia/Tokyo}
  #     HL_BOT_ID: btc
  #     HL_BOT_TYPE: single
  #     HYPERLIQUID_PRIVATE_KEY: ${HYPERLIQUID_PRIVATE_KEY_BTC:-${HYPERLIQUID_PRIVATE_KEY:-}}
  #     HYPERLIQUID_WALLET_ADDRESS: ${HYPERLIQUID_WALLET_ADDRESS_BTC:-${HYPERLIQUID_WALLET_ADDRESS:-}}
  #     HYPERLIQUID_TESTNET: ${HYPERLIQUID_TESTNET:-false}
  #     ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
  #     DISCORD_ERROR_WEBHOOK_URL: ${DISCORD_ERROR_WEBHOOK_URL:-}
  #
  # # ETH/SOL ペアトレード Bot
  # hyperliquid-bot-eth-sol-pair:
  #   <<: *hyperliquid-bot-template
  #   container_name: match_12_hl_bot_eth_sol_pair
  #   environment:
  #     TZ: ${HL_BOT_TZ:-Asia/Tokyo}
  #     HL_BOT_ID: eth_sol_pair
  #     HL_BOT_TYPE: pair
  #     HYPERLIQUID_PRIVATE_KEY: ${HYPERLIQUID_PRIVATE_KEY_ETH_SOL_PAIR:-${HYPERLIQUID_PRIVATE_KEY:-}}
  #     HYPERLIQUID_WALLET_ADDRESS: ${HYPERLIQUID_WALLET_ADDRESS_ETH_SOL_PAIR:-${HYPERLIQUID_WALLET_ADDRESS:-}}
  #     HYPERLIQUID_TESTNET: ${HYPERLIQUID_TESTNET:-false}
  #     DISCORD_ERROR_WEBHOOK_URL: ${DISCORD_ERROR_WEBHOOK_URL:-}

  scraper:
    build:
      context: .
      dockerfile: docker/scraper/Dockerfile
      args:
        PUID: "${PUID:-1000}"
        PGID: "${PGID:-1000}"
        TZ: "${SCRAPER_TZ:-Asia/Tokyo}"
    container_name: match_12_scraper
    restart: unless-stopped
    ports:
      - "${SCRAPER_VNC_PORT:-6080}:6080"
      - "${SCRAPER_API_PORT:-8001}:8001"
    volumes:
      - ./python:/app/python
      - ./docker/scraper:/app/docker/scraper:ro
    environment:
      - TZ=${SCRAPER_TZ:-Asia/Tokyo}
      - SCRAPER_VNC_PASSWORD=${SCRAPER_VNC_PASSWORD:-}
      - SCRAPER_VNC_PORT_PUBLIC=${SCRAPER_VNC_PORT:-6080}
      - INTERNAL_API_TOKEN=${INTERNAL_API_TOKEN:-}
      - LARAVEL_BASE_URL=http://app
      - AMAZON_EMAIL=${AMAZON_EMAIL:-}
      - AMAZON_PASSWORD=${AMAZON_PASSWORD:-}
      - DB_HOST=${DB_HOST:-mysql}
      - DB_PORT=${DB_PORT:-3306}
      - DB_DATABASE=${DB_DATABASE:-match_12}
      - DB_USERNAME=${DB_USERNAME:-match_12}
      - DB_PASSWORD=${DB_PASSWORD:-secret}
    depends_on:
      mysql:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8001/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s

volumes:
  mysql_data:
    driver: local
  redis_data:
    driver: local
  vendor_data:
    driver: local
