Files
EmailToDiscord/start.sh

344 lines
9.6 KiB
Bash
Raw 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.
#!/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 "$@"