{
  "python_exe": "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
  "project_root": "D:\\honghee\\blog_api",
  "manager_host": "0.0.0.0",
  "manager_port": 9200,
  "open_browser_on_start": true,
  "check_interval_seconds": 10,
  "external_ports": [
    {
      "key": "apache",
      "name": "Apache 웹서버",
      "host": "127.0.0.1",
      "port": 80,
      "protocol": "http",
      "url": "http://127.0.0.1/"
    },
    {
      "key": "filezilla",
      "name": "FileZilla FTP",
      "host": "127.0.0.1",
      "port": 21,
      "protocol": "tcp",
      "url": ""
    }
  ],
  "services": [
    {
      "key": "blog_analysis_api",
      "name": "블로그 분석 API",
      "script": "D:\\honghee\\blog_api\\app.py",
      "port": 5000,
      "auto_start": true,
      "cwd": "D:\\honghee\\blog_api",
      "health_url": "http://127.0.0.1:5000/"
    },
    {
      "key": "shorts_ai_api",
      "name": "숏츠 생성 API",
      "script": "D:\\honghee\\blog_api\\shorts_ai_api.py",
      "port": 9000,
      "auto_start": true,
      "cwd": "D:\\honghee\\blog_api",
      "health_url": "http://127.0.0.1:9000/health"
    },
    {
      "key": "realestate_content_api",
      "name": "부동산 콘텐츠 API",
      "script": "D:\\honghee\\blog_api\\realestate_api.py",
      "port": 9100,
      "auto_start": true,
      "cwd": "D:\\honghee\\blog_api",
      "health_url": "http://127.0.0.1:9100/health"
    },
    {
      "key": "multi_shorts_daemon",
      "name": "웹진 숏츠 자동생성·YouTube 업로드",
      "script": "D:\\honghee\\blog_api\\jobs\\multi_shorts_daemon.py",
      "port": 9300,
      "auto_start": true,
      "cwd": "D:\\honghee\\blog_api",
      "health_url": "http://127.0.0.1:9300/"
    }
  ],
  "jobs": {
    "day_pipeline": [
      {
        "name": "수집/상세/초안/비공개대기 18:05~09:55",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "jobs\\daily_pipeline_runner.py",
          "--draft-buffer",
          "1",
          "--replenish-count",
          "1",
          "--fast-max-pages",
          "5",
          "--end-hour",
          "9",
          "--end-minute",
          "55"
        ],
        "cwd": "D:\\honghee\\blog_api"
      }
    ],
    "night_publish": [
      {
        "name": "서버 발행 10:00~18:00",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "workers\\publish_worker.py",
          "--limit",
          "1000",
          "--sleep",
          "30",
          "--until-time",
          "18:00",
          "--smart-sleep",
          "--per-realtor-daily-limit",
          "1"
        ],
        "cwd": "D:\\honghee\\blog_api"
      }
    ],
    "night_private": [
      {
        "name": "비공개 처리 04:30~06:45",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "workers\\private_queue_worker.py",
          "--limit-realtors",
          "1000",
          "--per-realtor-limit",
          "20",
          "--headless",
          "1"
        ],
        "cwd": "D:\\honghee\\blog_api"
      }
    ],
    "test_2_realtors": [
      {
        "name": "2개 중개사 파이프라인 테스트",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "jobs\\daily_pipeline_runner.py",
          "--limit-realtors",
          "2",
          "--fetch-limit",
          "50",
          "--draft-limit",
          "30",
          "--draft-buffer",
          "1",
          "--replenish-count",
          "1",
          "--fast-max-pages",
          "5"
        ],
        "cwd": "D:\\honghee\\blog_api"
      },
      {
        "name": "테스트 블로그 발행",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "workers\\publish_worker.py",
          "--limit",
          "2",
          "--sleep",
          "60",
          "--per-realtor-daily-limit",
          "1"
        ],
        "cwd": "D:\\honghee\\blog_api"
      }
    ],
    "webzine_round_1": [
      {
        "name": "웹진 전체 중개사 최신 매물 최대 20건",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "-B",
          "jobs\\multi_webzine_safe_step.py"
        ],
        "cwd": "D:\\honghee\\blog_api"
      },
      {
        "name": "서버 발행 1회차 10:00~12:20",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "workers\\publish_worker.py",
          "--limit",
          "1000",
          "--sleep",
          "30",
          "--until-time",
          "12:20",
          "--smart-sleep",
          "--per-realtor-daily-limit",
          "1"
        ],
        "cwd": "D:\\honghee\\blog_api"
      }
    ],
    "webzine_round_2": [
      {
        "name": "웹진 전체 중개사 최신 매물 최대 20건",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "-B",
          "jobs\\multi_webzine_safe_step.py"
        ],
        "cwd": "D:\\honghee\\blog_api"
      },
      {
        "name": "서버 발행 2회차 12:30~15:20",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "workers\\publish_worker.py",
          "--limit",
          "1000",
          "--sleep",
          "30",
          "--until-time",
          "15:20",
          "--smart-sleep",
          "--per-realtor-daily-limit",
          "1"
        ],
        "cwd": "D:\\honghee\\blog_api"
      }
    ],
    "webzine_round_3": [
      {
        "name": "웹진 전체 중개사 최신 매물 최대 20건",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "-B",
          "jobs\\multi_webzine_safe_step.py"
        ],
        "cwd": "D:\\honghee\\blog_api"
      },
      {
        "name": "서버 발행 3회차 15:30~18:00",
        "cmd": [
          "C:\\Users\\owner\\AppData\\Local\\Programs\\Python\\Python313\\python.exe",
          "workers\\publish_worker.py",
          "--limit",
          "1000",
          "--sleep",
          "30",
          "--until-time",
          "18:00",
          "--smart-sleep",
          "--per-realtor-daily-limit",
          "1"
        ],
        "cwd": "D:\\honghee\\blog_api"
      }
    ]
  },
  "schedules": [
    {
      "key": "webzine_round_1",
      "name": "웹진 1회차 + 서버 발행 10:00~12:20",
      "enabled": true,
      "times": [
        "10:00"
      ],
      "max_run_minutes": 150
    },
    {
      "key": "webzine_round_2",
      "name": "웹진 2회차 + 서버 발행 12:30~15:20",
      "enabled": true,
      "times": [
        "12:30"
      ],
      "max_run_minutes": 170
    },
    {
      "key": "webzine_round_3",
      "name": "웹진 3회차 + 서버 발행 15:30~18:00",
      "enabled": true,
      "times": [
        "15:30"
      ],
      "max_run_minutes": 150
    },
    {
      "key": "day_pipeline",
      "name": "수집/상세/초안/비공개대기 18:05~09:55",
      "enabled": true,
      "times": [
        "18:05"
      ],
      "max_run_minutes": 950
    },
    {
      "key": "night_private",
      "name": "비공개 처리 04:30~06:45",
      "enabled": true,
      "times": [
        "04:30"
      ],
      "max_run_minutes": 135
    }
  ],
  "scheduler_tick_seconds": 20,
  "blog_exposure_check": {
    "enabled": true,
    "url": "http://blog-manager.hongheemarketing.com/client-api/check_blog_exposure.php",
    "token": "hongheemarketing_blog_exposure_check_61_32_69_107",
    "interval_minutes": 60,
    "timeout_seconds": 120,
    "batch_size": 20
  }
}
