Files
EmailToDiscord/start.ps1
2025-10-13 14:20:07 +09:00

343 lines
9.8 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
}
}