# /root/projects/rental-system/docker-compose.yml
# 機材予約システム Docker構成ファイル

version: '3.8'

services:
  # メインアプリケーション
  rental-app:
    build: 
      context: ./app
      dockerfile: Dockerfile
      args:
        NODE_ENV: production
    container_name: rental-app
    restart: unless-stopped
    
    # 環境変数
    environment:
      - NODE_ENV=production
      - PORT=3000
    
    # 環境変数ファイル
    env_file:
      - .env.production
    
    # ボリュームマウント
    volumes:
      - ./data:/app/data:rw                    # データベースファイル
      - ./logs:/app/logs:rw                    # アプリケーションログ
      - ./uploads:/app/uploads:rw              # アップロードファイル
      - ./backup:/app/backup:rw                # バックアップファイル
      - /etc/timezone:/etc/timezone:ro         # タイムゾーン設定
      - /etc/localtime:/etc/localtime:ro       # ローカル時刻
    
    # ネットワーク設定
    networks:
      - proxy-network
      - rental-internal
    
    # ヘルスチェック
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    
    # 依存関係
    depends_on:
      rental-db-init:
        condition: service_completed_successfully
    
    # リソース制限
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: '0.5'
        reservations:
          memory: 256M
          cpus: '0.25'
    
    # ラベル（nginx proxy用）
    labels:
      - "traefik.enable=false"
      - "project=rental-system"
      - "environment=production"

  # データベース初期化サービス
  rental-db-init:
    build: 
      context: ./db
      dockerfile: Dockerfile
    container_name: rental-db-init
    
    # ボリュームマウント
    volumes:
      - ./data:/data:rw
      - ./sql:/sql:ro
    
    # ネットワーク設定
    networks:
      - rental-internal
    
    # 初期化コマンド
    command: >
      sh -c "
        echo 'Starting database initialization...';
        
        # データベースファイルの存在確認
        if [ ! -f /data/rental_system.db ]; then
          echo 'Creating new database...';
          
          # スキーマ作成
          sqlite3 /data/rental_system.db < /sql/schema.sql;
          
          # 初期データ投入
          if [ -f /sql/initial_data.sql ]; then
            sqlite3 /data/rental_system.db < /sql/initial_data.sql;
            echo 'Initial data inserted successfully';
          fi;
          
          # 権限設定
          chmod 644 /data/rental_system.db;
          chown 1001:1001 /data/rental_system.db;
          
          echo 'Database created and initialized successfully';
        else
          echo 'Database already exists, checking schema...';
          
          # スキーマバージョンチェック（将来のマイグレーション用）
          SCHEMA_VERSION=$(sqlite3 /data/rental_system.db \"SELECT value FROM bot_settings WHERE setting_key='schema_version' LIMIT 1;\" 2>/dev/null || echo '1.0.0');
          echo \"Current schema version: $SCHEMA_VERSION\";
          
          # 必要に応じてマイグレーション実行
          if [ -f /sql/migrate.sql ]; then
            echo 'Running database migrations...';
            sqlite3 /data/rental_system.db < /sql/migrate.sql;
          fi;
          
          echo 'Database initialization completed';
        fi;
        
        # データベース整合性チェック
        sqlite3 /data/rental_system.db 'PRAGMA integrity_check;' | grep -q 'ok' && echo 'Database integrity: OK' || echo 'Database integrity: ERROR';
        
        exit 0;
      "
    
    # リソース制限
    deploy:
      resources:
        limits:
          memory: 128M
          cpus: '0.1'

  # ログローテーション・メンテナンスサービス
  rental-maintenance:
    image: alpine:3.18
    container_name: rental-maintenance
    restart: unless-stopped
    
    # ボリュームマウント
    volumes:
      - ./data:/data:rw
      - ./logs:/logs:rw
      - ./backup:/backup:rw
      - ./scripts:/scripts:ro
    
    # ネットワーク設定
    networks:
      - rental-internal
    
    # メンテナンスコマンド（cron代替）
    command: >
      sh -c "
        # 必要なパッケージインストール
        apk add --no-cache sqlite curl logrotate;
        
        echo 'Starting maintenance daemon...';
        
        while true; do
          # 現在時刻取得
          CURRENT_HOUR=$(date +%H);
          CURRENT_MINUTE=$(date +%M);
          
          # 毎日2時にバックアップ実行
          if [ \"$CURRENT_HOUR\" = \"02\" ] && [ \"$CURRENT_MINUTE\" = \"00\" ]; then
            echo 'Running daily backup...';
            
            # データベースバックアップ
            BACKUP_FILE=\"/backup/rental_system_$(date +%Y%m%d_%H%M%S).db\";
            sqlite3 /data/rental_system.db \".backup $BACKUP_FILE\";
            
            # 古いバックアップ削除（30日以上）
            find /backup -name \"rental_system_*.db\" -type f -mtime +30 -delete;
            
            echo 'Daily backup completed';
          fi;
          
          # 毎日3時にログローテーション
          if [ \"$CURRENT_HOUR\" = \"03\" ] && [ \"$CURRENT_MINUTE\" = \"00\" ]; then
            echo 'Running log rotation...';
            
            # アプリケーションログローテーション
            if [ -f /logs/application.log ]; then
              mv /logs/application.log "/logs/application_$(date +%Y%m%d).log";
              touch /logs/application.log;
              chmod 644 /logs/application.log;
            fi;
            
            # 古いログファイル削除（7日以上）
            find /logs -name "application_*.log" -type f -mtime +7 -delete;
            
            echo 'Log rotation completed';
          fi;
          
          # 毎時データベース最適化（軽量）
          if [ "$CURRENT_MINUTE" = "30" ]; then
            echo 'Running database optimization...';
            sqlite3 /data/rental_system.db 'PRAGMA optimize;';
          fi;
          
          # 1分間待機
          sleep 60;
        done;
      "
    
    # リソース制限
    deploy:
      resources:
        limits:
          memory: 64M
          cpus: '0.05'

  # 監視・メトリクス収集サービス（オプション）
  rental-monitor:
    image: prom/node-exporter:latest
    container_name: rental-monitor
    restart: unless-stopped
    
    # ポート公開（内部のみ）
    ports:
      - "127.0.0.1:9100:9100"
    
    # ボリュームマウント（システム情報取得用）
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    
    # ネットワーク設定
    networks:
      - rental-internal
    
    # 起動オプション
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($|/)'
    
    # リソース制限
    deploy:
      resources:
        limits:
          memory: 64M
          cpus: '0.05'

# ネットワーク設定
networks:
  # 既存のproxy-networkに接続（nginx経由）
  proxy-network:
    external: true
    name: proxy-network
  
  # 内部通信用ネットワーク
  rental-internal:
    driver: bridge
    internal: true
    ipam:
      config:
        - subnet: 172.20.0.0/16

# ボリューム設定
volumes:
  # データ永続化ボリューム
  rental-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /root/projects/rental-system/data
  
  # ログボリューム
  rental-logs:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /root/projects/rental-system/logs
  
  # バックアップボリューム
  rental-backup:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /root/projects/rental-system/backup

# 設定・シークレット管理
configs:
  nginx-config:
    file: ./nginx/rental.call2arm.com.conf
  
  app-config:
    file: ./.env.production

# ヘルスチェック設定
x-healthcheck-defaults: &healthcheck-defaults
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 60s

# リソース制限のデフォルト
x-resource-defaults: &resource-defaults
  deploy:
    resources:
      limits:
        memory: 256M
        cpus: '0.25'
      reservations:
        memory: 128M
        cpus: '0.1'

# ログ設定のデフォルト
x-logging-defaults: &logging-defaults
  logging:
    driver: "json-file"
    options:
      max-size: "10m"
      max-file: "3"