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

344
start.sh Normal file
View File

@@ -0,0 +1,344 @@
#!/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; then
missing_tools+=("docker")
fi
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
missing_tools+=("docker-compose")
fi
if [ ${#missing_tools[@]} -ne 0 ]; 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 "$@"