#!/bin/bash # Email to Discord Monitor - Linux起動スクリプト set -e # エラー時に終了 # 色付きメッセージ用の定数 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # ログ関数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_blue() { echo -e "${BLUE}[INFO]${NC} $1" } # ヘルプメッセージ show_help() { echo "Email to Discord Monitor - 起動スクリプト" echo "" echo "使用方法:" echo " $0 [オプション]" echo "" echo "オプション:" echo " build Dockerイメージをビルド" echo " start コンテナを起動" echo " stop コンテナを停止" echo " restart コンテナを再起動" echo " logs ログを表示" echo " logs-f ログをリアルタイムで表示" echo " status コンテナの状態を確認" echo " clean 停止済みコンテナとイメージを削除" echo " setup 初期セットアップ(.envファイル作成)" echo " compose-up docker-compose で起動" echo " compose-down docker-compose で停止" echo " python Python直接実行" echo " help このヘルプを表示" echo "" echo "例:" echo " $0 setup # 初期セットアップ" echo " $0 build # イメージをビルド" echo " $0 start # コンテナを起動" echo " $0 logs-f # ログをリアルタイム表示" } # 必要なツールの確認 check_requirements() { local missing_tools="" if ! command -v docker >/dev/null 2>&1; then missing_tools="$missing_tools docker" fi if ! command -v docker-compose >/dev/null 2>&1 && ! docker compose version >/dev/null 2>&1; then missing_tools="$missing_tools docker-compose" fi if [ -n "$missing_tools" ]; then log_error "以下のツールがインストールされていません:$missing_tools" log_info "Dockerのインストール: https://docs.docker.com/get-docker/" exit 1 fi } # .envファイルのセットアップ setup_env() { log_info "初期セットアップを開始します..." if [ -f ".env" ]; then log_warn ".envファイルが既に存在します" read -p "上書きしますか? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "セットアップをキャンセルしました" return 0 fi fi if [ ! -f ".env.example" ]; then log_error ".env.exampleファイルが見つかりません" exit 1 fi cp .env.example .env log_info ".envファイルを作成しました" log_blue "以下の設定を.envファイルに入力してください:" echo "" echo "1. EMAIL_USER=your-email@gmail.com" echo "2. EMAIL_PASSWORD=your-app-password" echo "3. DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/YOUR_WEBHOOK_URL" echo "" log_warn "設定完了後、'$0 build' でイメージをビルドしてください" } # Dockerイメージをビルド build_image() { log_info "Dockerイメージをビルドしています..." docker build -t email-to-discord . log_info "ビルドが完了しました" } # コンテナを起動 start_container() { log_info "コンテナを起動しています..." # 既存のコンテナを確認 if docker ps -a --format "table {{.Names}}" | grep -q "^email-monitor$"; then log_warn "既存のコンテナを削除します..." docker rm -f email-monitor 2>/dev/null || true fi # .envファイルの確認 if [ ! -f ".env" ]; then log_error ".envファイルが見つかりません" log_info "'$0 setup' を実行して設定を行ってください" exit 1 fi # 環境変数を読み込み source .env # 必須変数の確認 if [ -z "$EMAIL_USER" ] || [ -z "$EMAIL_PASSWORD" ] || [ -z "$DISCORD_WEBHOOK_URL" ]; then log_error "必須の環境変数が設定されていません" log_info ".envファイルを確認してください" exit 1 fi # コンテナを起動 docker run -d \ --name email-monitor \ --restart unless-stopped \ --env-file .env \ email-to-discord log_info "コンテナが起動しました" log_blue "ログを確認するには: $0 logs-f" } # コンテナを停止 stop_container() { log_info "コンテナを停止しています..." docker stop email-monitor 2>/dev/null || log_warn "コンテナが実行されていません" docker rm email-monitor 2>/dev/null || log_warn "削除するコンテナがありません" log_info "コンテナを停止しました" } # コンテナを再起動 restart_container() { log_info "コンテナを再起動しています..." stop_container sleep 2 start_container } # ログを表示 show_logs() { if [ "$1" = "-f" ]; then log_info "ログをリアルタイムで表示します (Ctrl+C で終了)" docker logs -f email-monitor else log_info "ログを表示します" docker logs email-monitor fi } # コンテナの状態を確認 check_status() { log_info "コンテナの状態を確認しています..." if docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -q "email-monitor"; then log_info "コンテナは実行中です" docker ps --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}" | grep email-monitor else log_warn "コンテナは実行されていません" if docker ps -a --format "table {{.Names}}" | grep -q "email-monitor"; then log_info "停止済みコンテナが存在します" docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.CreatedAt}}" | grep email-monitor fi fi } # クリーンアップ cleanup() { log_info "クリーンアップを実行しています..." # コンテナを停止・削除 docker stop email-monitor 2>/dev/null || true docker rm email-monitor 2>/dev/null || true # イメージを削除 docker rmi email-to-discord 2>/dev/null || log_warn "削除するイメージがありません" # 未使用のリソースを削除 docker system prune -f log_info "クリーンアップが完了しました" } # docker-compose で起動 compose_up() { log_info "docker-compose でサービスを起動しています..." if command -v docker-compose &> /dev/null; then docker-compose up -d else docker compose up -d fi log_info "サービスが起動しました" log_blue "ログを確認するには: $0 compose-logs" } # docker-compose で停止 compose_down() { log_info "docker-compose でサービスを停止しています..." if command -v docker-compose &> /dev/null; then docker-compose down else docker compose down fi log_info "サービスを停止しました" } # Python直接実行 run_python() { log_info "Python環境で直接実行します..." # Python3の確認 if ! command -v python3 &> /dev/null; then log_error "Python3がインストールされていません" exit 1 fi # pipの確認 if ! command -v pip3 &> /dev/null; then log_error "pip3がインストールされていません" exit 1 fi # 依存関係のインストール log_info "依存関係をインストールしています..." pip3 install -r requirements.txt # .envファイルの確認 if [ ! -f ".env" ]; then log_error ".envファイルが見つかりません" log_info "'$0 setup' を実行して設定を行ってください" exit 1 fi # 環境変数を読み込んで実行 log_info "アプリケーションを起動しています..." export $(cat .env | xargs) python3 app.py } # メイン処理 main() { case "$1" in "build") check_requirements build_image ;; "start") check_requirements start_container ;; "stop") stop_container ;; "restart") check_requirements restart_container ;; "logs") show_logs ;; "logs-f") show_logs -f ;; "status") check_status ;; "clean") cleanup ;; "setup") setup_env ;; "compose-up") check_requirements compose_up ;; "compose-down") compose_down ;; "compose-logs") if command -v docker-compose &> /dev/null; then docker-compose logs -f else docker compose logs -f fi ;; "python") run_python ;; "help"|"--help"|"-h") show_help ;; "") log_error "引数が指定されていません" echo "" show_help exit 1 ;; *) log_error "不明なオプション: $1" echo "" show_help exit 1 ;; esac } # スクリプト実行 main "$@"