344 lines
9.6 KiB
Bash
344 lines
9.6 KiB
Bash
#!/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="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 2>&1; 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 2>&1; then
|
||
docker-compose down
|
||
else
|
||
docker compose down
|
||
fi
|
||
|
||
log_info "サービスを停止しました"
|
||
}
|
||
|
||
# Python直接実行
|
||
run_python() {
|
||
log_info "Python環境で直接実行します..."
|
||
|
||
# Python3の確認
|
||
if ! command -v python3 > /dev/null 2>&1; then
|
||
log_error "Python3がインストールされていません"
|
||
exit 1
|
||
fi
|
||
|
||
# pipの確認
|
||
if ! command -v pip3 > /dev/null 2>&1; 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 2>&1; 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 "$@" |