#!/bin/bash # pyenv 초기화 (Warp/iTerm 등 비-인터랙티브 셸에서도 작동하도록) export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" if command -v pyenv &> /dev/null; then eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" 2>/dev/null fi # Python 3.14 + gevent fork 경고 억제 export GEVENT_NOWAITPID=1 export PYTHONWARNINGS="ignore::DeprecationWarning" # Ctrl+C (SIGINT) 한 번에 종료되도록 설정 cleanup() { echo "" echo "Stopping FlaskFarm..." # Python 프로세스 종료 if [ -n "$PYTHON_PID" ]; then kill -TERM $PYTHON_PID 2>/dev/null sleep 0.5 kill -9 $PYTHON_PID 2>/dev/null fi # 모든 자식 프로세스 종료 pkill -P $$ 2>/dev/null exit 0 } trap cleanup SIGINT SIGTERM CONFIGFILE="data/config_mac.yaml" COUNT=0 # 🌐 Camoufox 브라우저 캐시 경로 설정 및 유지 # macOS에서는 /Users/yommi/Library/Caches/camoufox가 기본값이나, 프로젝트 data 폴더로 강제 리다이렉션 CAMOUFOX_DEFAULT_DIR="$HOME/Library/Caches/camoufox" CAMOUFOX_PERSISTENT_DIR="$(pwd)/data/.camoufox" # 심볼릭 링크를 통해 data 폴더와 동기화 if [ ! -L "$CAMOUFOX_DEFAULT_DIR" ]; then echo "Configuring Camoufox persistence link..." mkdir -p "$CAMOUFOX_PERSISTENT_DIR" if [ -d "$CAMOUFOX_DEFAULT_DIR" ] && [ ! -L "$CAMOUFOX_DEFAULT_DIR" ]; then cp -R "$CAMOUFOX_DEFAULT_DIR/" "$CAMOUFOX_PERSISTENT_DIR/" 2>/dev/null rm -rf "$CAMOUFOX_DEFAULT_DIR" fi mkdir -p "$(dirname "$CAMOUFOX_DEFAULT_DIR")" ln -s "$CAMOUFOX_PERSISTENT_DIR" "$CAMOUFOX_DEFAULT_DIR" fi # 🔧 서버 시작 전에 플러그인 업데이트 및 브라우저 확인 update_plugins() { # Camoufox 브라우저 체크 (실제 설치된 폴더 확인) if [ ! -d "$CAMOUFOX_DEFAULT_DIR/Camoufox.app" ]; then echo "Fetching Camoufox binaries to $CAMOUFOX_PERSISTENT_DIR..." camoufox fetch fi PLUGINS_DIR="data/plugins" if [ -d "$PLUGINS_DIR" ]; then for dir in "$PLUGINS_DIR"/*/; do if [ -d "$dir/.git" ]; then echo "Updating plugin: $dir" git -C "$dir" reset --hard HEAD 2>/dev/null git -C "$dir" pull 2>/dev/null & # 병렬 실행 fi done wait # 모든 git pull 완료 대기 fi } # 첫 실행 시 또는 --update 옵션일 때만 if [ "$COUNT" = "0" ]; then update_plugins fi while true; do echo "------------------------------------------------" echo "Starting FlaskFarm Python Process (COUNT: ${COUNT})" echo "Config: ${CONFIGFILE}" echo "------------------------------------------------" python main.py --repeat ${COUNT} --config ${CONFIGFILE} & PYTHON_PID=$! wait $PYTHON_PID RESULT=$? echo "------------------------------------------------" echo "PYTHON EXIT CODE : ${RESULT}" echo "------------------------------------------------" if [ "$RESULT" = "1" ]; then echo 'Restarting... (RESULT=1)' update_plugins else echo "Exiting... (RESULT=${RESULT})" break fi COUNT=$(expr $COUNT + 1) done