Init project

This commit is contained in:
2025-10-13 14:20:07 +09:00
commit 9ab919064a
8 changed files with 1436 additions and 0 deletions

343
start.ps1 Normal file
View 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
}
}