# Email to Discord Monitor - Windows起動スクリプト param( [Parameter(Mandatory=$false)] [string]$Action = "" ) # 色付きメッセージ用の関数 function Write-ColoredText { param( [string]$Text, [string]$Color = "White" ) Write-Host $Text -ForegroundColor $Color } function Log-Info { param([string]$Message) Write-ColoredText "[INFO] $Message" "Green" } function Log-Warn { param([string]$Message) Write-ColoredText "[WARN] $Message" "Yellow" } function Log-Error { param([string]$Message) Write-ColoredText "[ERROR] $Message" "Red" } function Log-Blue { param([string]$Message) Write-ColoredText "[INFO] $Message" "Blue" } # ヘルプメッセージ function Show-Help { Write-Host "Email to Discord Monitor - Windows起動スクリプト" Write-Host "" Write-Host "使用方法:" Write-Host " .\start.ps1 [オプション]" Write-Host "" Write-Host "オプション:" Write-Host " build Dockerイメージをビルド" Write-Host " start コンテナを起動" Write-Host " stop コンテナを停止" Write-Host " restart コンテナを再起動" Write-Host " logs ログを表示" Write-Host " logs-f ログをリアルタイムで表示" Write-Host " status コンテナの状態を確認" Write-Host " clean 停止済みコンテナとイメージを削除" Write-Host " setup 初期セットアップ(.envファイル作成)" Write-Host " compose-up docker-compose で起動" Write-Host " compose-down docker-compose で停止" Write-Host " python Python直接実行" Write-Host " help このヘルプを表示" Write-Host "" Write-Host "例:" Write-Host " .\start.ps1 setup # 初期セットアップ" Write-Host " .\start.ps1 build # イメージをビルド" Write-Host " .\start.ps1 start # コンテナを起動" Write-Host " .\start.ps1 logs-f # ログをリアルタイム表示" } # 必要なツールの確認 function Test-Requirements { $missingTools = @() if (!(Get-Command docker -ErrorAction SilentlyContinue)) { $missingTools += "docker" } if (!(Get-Command docker-compose -ErrorAction SilentlyContinue)) { $missingTools += "docker-compose" } if ($missingTools.Count -gt 0) { Log-Error "以下のツールがインストールされていません: $($missingTools -join ', ')" Log-Info "Dockerのインストール: https://docs.docker.com/desktop/windows/" exit 1 } } # .envファイルのセットアップ function Setup-Environment { Log-Info "初期セットアップを開始します..." if (Test-Path ".env") { Log-Warn ".envファイルが既に存在します" $response = Read-Host "上書きしますか? (y/N)" if ($response -ne "y" -and $response -ne "Y") { Log-Info "セットアップをキャンセルしました" return } } if (!(Test-Path ".env.example")) { Log-Error ".env.exampleファイルが見つかりません" exit 1 } Copy-Item ".env.example" ".env" Log-Info ".envファイルを作成しました" Log-Blue "以下の設定を.envファイルに入力してください:" Write-Host "" Write-Host "1. EMAIL_USER=your-email@gmail.com" Write-Host "2. EMAIL_PASSWORD=your-app-password" Write-Host "3. DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_WEBHOOK_URL" Write-Host "" Log-Warn "設定完了後、'.\start.ps1 build' でイメージをビルドしてください" } # Dockerイメージをビルド function Build-Image { Log-Info "Dockerイメージをビルドしています..." docker build -t email-to-discord . if ($LASTEXITCODE -eq 0) { Log-Info "ビルドが完了しました" } else { Log-Error "ビルドに失敗しました" exit 1 } } # コンテナを起動 function Start-Container { Log-Info "コンテナを起動しています..." # 既存のコンテナを確認・削除 $existingContainer = docker ps -a --format "table {{.Names}}" | Select-String "^email-monitor$" if ($existingContainer) { Log-Warn "既存のコンテナを削除します..." docker rm -f email-monitor 2>$null } # .envファイルの確認 if (!(Test-Path ".env")) { Log-Error ".envファイルが見つかりません" Log-Info "'.\start.ps1 setup' を実行して設定を行ってください" exit 1 } # コンテナを起動 docker run -d ` --name email-monitor ` --restart unless-stopped ` --env-file .env ` email-to-discord if ($LASTEXITCODE -eq 0) { Log-Info "コンテナが起動しました" Log-Blue "ログを確認するには: .\start.ps1 logs-f" } else { Log-Error "コンテナの起動に失敗しました" exit 1 } } # コンテナを停止 function Stop-Container { Log-Info "コンテナを停止しています..." docker stop email-monitor 2>$null docker rm email-monitor 2>$null Log-Info "コンテナを停止しました" } # コンテナを再起動 function Restart-Container { Log-Info "コンテナを再起動しています..." Stop-Container Start-Sleep -Seconds 2 Start-Container } # ログを表示 function Show-Logs { param([bool]$Follow = $false) if ($Follow) { Log-Info "ログをリアルタイムで表示します (Ctrl+C で終了)" docker logs -f email-monitor } else { Log-Info "ログを表示します" docker logs email-monitor } } # コンテナの状態を確認 function Get-Status { Log-Info "コンテナの状態を確認しています..." $runningContainer = docker ps --format "table {{.Names}}" | Select-String "email-monitor" if ($runningContainer) { Log-Info "コンテナは実行中です" docker ps --format "table {{.Names}}`t{{.Status}}`t{{.CreatedAt}}" | Select-String "email-monitor" } else { Log-Warn "コンテナは実行されていません" $stoppedContainer = docker ps -a --format "table {{.Names}}" | Select-String "email-monitor" if ($stoppedContainer) { Log-Info "停止済みコンテナが存在します" docker ps -a --format "table {{.Names}}`t{{.Status}}`t{{.CreatedAt}}" | Select-String "email-monitor" } } } # クリーンアップ function Invoke-Cleanup { Log-Info "クリーンアップを実行しています..." # コンテナを停止・削除 docker stop email-monitor 2>$null docker rm email-monitor 2>$null # イメージを削除 docker rmi email-to-discord 2>$null # 未使用のリソースを削除 docker system prune -f Log-Info "クリーンアップが完了しました" } # docker-compose で起動 function Start-Compose { Log-Info "docker-compose でサービスを起動しています..." docker-compose up -d if ($LASTEXITCODE -eq 0) { Log-Info "サービスが起動しました" Log-Blue "ログを確認するには: .\start.ps1 compose-logs" } else { Log-Error "サービスの起動に失敗しました" exit 1 } } # docker-compose で停止 function Stop-Compose { Log-Info "docker-compose でサービスを停止しています..." docker-compose down Log-Info "サービスを停止しました" } # Python直接実行 function Start-Python { Log-Info "Python環境で直接実行します..." # Python3の確認 if (!(Get-Command python -ErrorAction SilentlyContinue)) { Log-Error "Pythonがインストールされていません" exit 1 } # pipの確認 if (!(Get-Command pip -ErrorAction SilentlyContinue)) { Log-Error "pipがインストールされていません" exit 1 } # 依存関係のインストール Log-Info "依存関係をインストールしています..." pip install -r requirements.txt # .envファイルの確認 if (!(Test-Path ".env")) { Log-Error ".envファイルが見つかりません" Log-Info "'.\start.ps1 setup' を実行して設定を行ってください" exit 1 } # 環境変数を読み込んで実行 Log-Info "アプリケーションを起動しています..." # .envファイルから環境変数を読み込み Get-Content ".env" | ForEach-Object { if ($_ -match "^([^=]+)=(.*)$") { [Environment]::SetEnvironmentVariable($matches[1], $matches[2], "Process") } } python app.py } # メイン処理 switch ($Action.ToLower()) { "build" { Test-Requirements Build-Image } "start" { Test-Requirements Start-Container } "stop" { Stop-Container } "restart" { Test-Requirements Restart-Container } "logs" { Show-Logs } "logs-f" { Show-Logs -Follow $true } "status" { Get-Status } "clean" { Invoke-Cleanup } "setup" { Setup-Environment } "compose-up" { Test-Requirements Start-Compose } "compose-down" { Stop-Compose } "compose-logs" { docker-compose logs -f } "python" { Start-Python } "help" { Show-Help } "" { Log-Error "引数が指定されていません" Write-Host "" Show-Help } default { Log-Error "不明なオプション: $Action" Write-Host "" Show-Help } }