Init project
This commit is contained in:
343
start.ps1
Normal file
343
start.ps1
Normal file
@@ -0,0 +1,343 @@
|
||||
# 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user