プロジェクト

全般

プロフィール

機能 #585 » rental-docker-compose.txt

www user, 2025-06-18 15:23

 
# /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"
(2-2/6)