# /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"