Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

24 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

νŒ°μ›”λ“œ 톡합 관리 μ‹œμŠ€ν…œ μ„€μΉ˜ 및 운영 κ°€μ΄λ“œ

ꡬ글 ν΄λΌμš°λ“œ(GCP) VM μΈμŠ€ν„΄μŠ€ 생성 사전 μ€€λΉ„ κ³Όμ •λΆ€ν„° κ²Œμž„ μ„œλ²„ λΉŒλ“œ, λ””μŠ€μ½”λ“œ 관리 봇 연동, μ‹€μ‹œκ°„ ν˜„ν™©νŒ, 1:1 DM 기반 λŒ€ν™”ν˜• μ„€μ • 관리 및 Rclone 기반 ꡬ글 λ“œλΌμ΄λΈŒ 원격 λ°±μ—… μ‹œμŠ€ν…œ μš΄μ˜κΉŒμ§€μ˜ μ „ 과정을 μ •λ¦¬ν•œ λ¬Έμ„œμž…λ‹ˆλ‹€.

(AI μ—μ΄μ „νŠΈλ₯Ό μœ„ν•œ 개발 μ œμ•½ 및 μ»¨λ²€μ…˜μ€ 루트 경둜의 AGENTS.md νŒŒμΌμ„ μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€.)


πŸ“Œ λͺ©μ°¨ (Table of Contents)


1. μ‹œμŠ€ν…œ ꡬ성 및 μ£Όμš” κ°œμ„  κΈ°λŠ₯ μš”μ•½

μ£Όμš” κ°œμ„  및 κΈ°λŠ₯ 상세 μš”μ•½

  • RCON Save 데이터 ν”ŒλŸ¬μ‹œ 유예 λŒ€κΈ° 및 데이터 μ •ν•©μ„± 보μž₯

    • λ°±μ—…, μž¬μ‹œμž‘, μ»¨ν…Œμ΄λ„ˆ μ •μ§€/μ—…λ°μ΄νŠΈ μ‹œ RCON Save μ»€λ§¨λ“œλ₯Ό μ „μ†‘ν•œ ν›„ μ¦‰μ‹œ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ©ˆμΆ”μ§€ μ•Šκ³  3초~10μ΄ˆκ°„μ˜ λ””μŠ€ν¬ ν”ŒλŸ¬μ‹œ 유예 λŒ€κΈ° μ‹œκ°„(asyncio.sleep)을 보μž₯ν•©λ‹ˆλ‹€.
    • λ””μŠ€ν¬ I/O 속도 차이둜 인해 μž„μ‹œ λ©”λͺ¨λ¦¬ μ„Έμ…˜ μž”μ—¬ 데이터가 μœ μ‹€λ˜κ±°λ‚˜ μ„Έμ΄λΈŒ 파일이 κΉ¨μ§€λŠ” ν˜„μƒμ„ μ›μ²œ μ°¨λ‹¨ν•©λ‹ˆλ‹€.
  • 비동기 락(asyncio.Lock) 기반 ν˜„ν™©νŒ 쀑볡 생성 및 κ²½ν•© μƒνƒœ(Race Condition) λ°©μ§€

    • 짧은 주기에 닀쀑 이벀트(μœ μ € μž…ν‡΄μž₯, μ‹œμŠ€ν…œ μ£ΌκΈ° 루틴, μˆ˜λ™ λ²„νŠΌ 클릭)κ°€ λ™μ‹œ 싀행될 λ•Œ ν˜„ν™©νŒμ΄ 쀑볡 μƒμ„±λ˜λŠ” ν˜„μƒμ„ 막기 μœ„ν•΄ self.dashboard_lock = asyncio.Lock() 비동기 락을 μ μš©ν–ˆμŠ΅λ‹ˆλ‹€.
    • ν˜„ν™©νŒ 정보 μˆ˜μ§‘ 및 κ°±μ‹  μž‘μ—…μ„ 였직 단일 순차(Thread-safe)둜만 μˆ˜ν–‰ν•˜μ—¬ λŒ€μ‹œλ³΄λ“œ μž„λ² λ“œμ˜ 엉킴을 μ™„λ²½νžˆ μ˜ˆλ°©ν•©λ‹ˆλ‹€.
  • μ‹€μ‹œκ°„ 물리 λ©”λͺ¨λ¦¬ λͺ¨λ‹ˆν„°λ§ 및 μžλ™ μž¬λΆ€νŒ… (Memory Leak Protection)

    • psutil 라이브러리λ₯Ό 톡해 가상 μ„œλ²„μ˜ RAM μ‚¬μš©λ₯ μ„ μ‹€μ‹œκ°„ μΆ”μ ν•˜λ©°, μž„κ³„μΉ˜(MEMORY_RESTART_THRESHOLD, κΈ°λ³Έ 80%) 초과 μ‹œ μžλ™μœΌλ‘œ μΈκ²Œμž„ μ•ˆλ‚΄ 방솑 및 RCON μ €μž₯을 μˆ˜ν–‰ν•˜κ³  도컀 μ»¨ν…Œμ΄λ„ˆλ₯Ό 재배치(docker-compose up -d --force-recreate)ν•©λ‹ˆλ‹€.
    • μž¬μ‹œμž‘ 직후 연속 μž¬λΆ€νŒ… 루프에 λΉ μ§€μ§€ μ•Šλ„λ‘ 30λΆ„(1800초)의 μž¬μ‹œμž‘ μΏ¨λ‹€μš΄ νƒ€μž„μŠ€νƒ¬ν”„ 보호 둜직이 ν•¨κ»˜ κ΅¬λ™λ©λ‹ˆλ‹€.
  • κ³ μ • λ©”μ‹œμ§€(Pinned Message) 보호 기반 채널 μˆ˜λ™/μ •κΈ° μ •λˆ

    • /clean λͺ…λ Ήμ–΄ μ‹€ν–‰ μ‹œ 및 4μ‹œκ°„λ§ˆλ‹€ μžλ™ κ΅¬λ™λ˜λŠ” μ •κΈ° 채널 μ •λˆ νƒœμŠ€ν¬(scheduled_4hr_clean_task) μˆ˜ν–‰ μ‹œ λ””μŠ€μ½”λ“œ channel.pins() λͺ©λ‘μ„ νŒŒμ‹±ν•©λ‹ˆλ‹€.
    • κ΄€λ¦¬μžκ°€ 채널 상단에 κ³ μ •ν•΄λ‘” κ°€μ΄λ“œ λ©”μ‹œμ§€ 및 ν™œμ„±ν™”λœ λŒ€μ‹œλ³΄λ“œ λ©”μ‹œμ§€λ₯Ό μ§€λŠ₯적으둜 κ°μ§€ν•˜μ—¬ μ‚­μ œ λŒ€μƒμ—μ„œ μ œμ™Έ(Filter)ν•¨μœΌλ‘œμ¨ μ€‘μš” 곡지λ₯Ό μ•ˆμ „ν•˜κ²Œ λ³΄ν˜Έν•©λ‹ˆλ‹€.
  • μŠ€νŒ€ μ§€μ • μ‹œκ°„ μ—…λ°μ΄νŠΈ 체크 및 μœ μ € 퇴μž₯ 연동 μ‹œν€€μŠ€

    • 맀일 μ§€μ •λœ μ‹œκ°„(02:00, 04:00, 09:00, 17:00)에 μŠ€νŒ€ API(AppID: 2394010)λ₯Ό μ •λ°€ μ‘°νšŒν•˜μ—¬ κ²Œμž„ μ΅œμ‹  λΉŒλ“œ μ—…λ°μ΄νŠΈ μ—¬λΆ€λ₯Ό νŒλ³„ν•©λ‹ˆλ‹€.
    • μ—…λ°μ΄νŠΈ 감지 μ‹œ μ ‘μ†μžκ°€ 0λͺ…이면 μ¦‰μ‹œ 1λΆ„ ν›„ μžλ™ μ—…λ°μ΄νŠΈλ₯Ό μ§„ν–‰ν•˜κ³ , ν”Œλ ˆμ΄μ–΄κ°€ μ‘΄μž¬ν•  경우 μ•ˆλ‚΄ 방솑을 μ†‘μΆœν•œ λ’€ update_pending_on_players ν”Œλž˜κ·Έλ₯Ό μˆ˜λ¦½ν•˜μ—¬ λͺ¨λ“  μœ μ €κ°€ 퇴μž₯ν•˜λŠ” μ¦‰μ‹œ μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈ μ‹œν€€μŠ€λ₯Ό κ°€λ™ν•©λ‹ˆλ‹€.
  • λ””μŠ€μ½”λ“œ 1:1 DM 기반 λŒ€ν™”ν˜• .env μ„€μ • 관리 및 μžλ™ λ°±μ—…/λ‘€λ°±

    • κ΄€λ¦¬μžκ°€ λ΄‡μ—κ²Œ 개인 λ©”μ‹œμ§€(DM)둜 .env, μ„€μ • λ©”μ‹œμ§€λ₯Ό 보내면 ν˜„μž¬ 가상 μ„œλ²„μ— 적용된 .env νŒŒμΌμ„ 첨뢀 파일둜 μ¦‰μ‹œ μ „λ‹¬λ°›μŠ΅λ‹ˆλ‹€.
    • μˆ˜μ •λœ .env νŒŒμΌμ„ DM 창에 μ—…λ‘œλ“œν•˜λ©΄ 봇이 이전 μ„€μ •κ³Όμ˜ 차이점(Diff)을 νŒŒμ•…ν•˜μ—¬ μž„λ² λ“œλ‘œ 좜λ ₯ν•˜κ³ , RCON μ €μž₯ βž” 데이터 λ°±μ—… βž” μ»¨ν…Œμ΄λ„ˆ 재배치λ₯Ό μžλ™ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
    • μ»¨ν…Œμ΄λ„ˆ 재배치 μ‹œ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ μžλ™μœΌλ‘œ λ°±μ—…λ³Έ(.env.bak)을 톡해 이전 정상 μž‘λ™ μ„€μ •μœΌλ‘œ μ¦‰μ‹œ μžλ™ λ‘€λ°±(Rollback)ν•©λ‹ˆλ‹€.
  • κ²Œμž„ λ‚΄μž₯ λ°±μ—… 폴더 μ••μΆ• μ œμ™Έ 및 2μ°¨ ꡬ글 λ“œλΌμ΄λΈŒ 비동기 전솑

    • .tar.gz 아카이빙 μ‹œ κ²Œμž„ 자체 λ‚΄μž₯ λ°±μ—… 폴더(SaveGames/0/<world_id>/backup)λ₯Ό μ••μΆ• λŒ€μƒμ—μ„œ 필터링(exclude_internal_backup)ν•˜μ—¬ 이쀑 μ••μΆ•μœΌλ‘œ μΈν•œ μš©λŸ‰ λ‚­λΉ„ 및 파일 증발 μ˜ˆμ™Έ(Errno 2)λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.
    • λ°±μ—… 파일 생성 직후 Rclone 비동기 μ„œλΈŒν”„λ‘œμ„ΈμŠ€λ₯Ό ν˜ΈμΆœν•˜μ—¬ ꡬ글 λ“œλΌμ΄λΈŒ(gdrive:backup)둜 사본을 μ „μ†‘ν•©λ‹ˆλ‹€.
  • μ„œλ²„ λ‚΄μž₯ μž„μ‹œ λ°±μ—… 폴더 및 만료 원격 파일 μžλ™ μ†Œκ±°

    • μ„€μ •λœ 보쑴 κΈ°ν•œ(BACKUP_RETENTION_DAYS)을 μ΄ˆκ³Όν•œ 둜컬 λ°±μ—… 파일(tar.gz)κ³Ό ꡬ글 λ“œλΌμ΄λΈŒ μ›κ²©μ§€μ˜ 였래된 백업을 rclone delete --min-age λͺ…λ ΉμœΌλ‘œ μ†Œκ±°ν•©λ‹ˆλ‹€.
    • μ„Έμ΄λΈŒ 폴더 λ‚΄λΆ€μ˜ λ‚΄μž₯ λ°±μ—… ν΄λ”λ“€κΉŒμ§€ shutil.rmtree둜 좔적 μ†Œκ±°ν•˜μ—¬ 가상 μ„œλ²„ λ””μŠ€ν¬ μš©λŸ‰μ„ μΆ”κ°€λ‘œ ν™•λ³΄ν•©λ‹ˆλ‹€.
  • Fast-Path μ΅œμ ν™” ν˜„ν™©νŒ κ°±μ‹  및 μžκ°€ 치유(Self-Healing) μŠ€μΊ”

    • κΈ°μ‘΄ λ©”μ‹œμ§€ IDλ₯Ό ν™œμš©ν•œ Direct Edit(1회 API 호좜) Fast-Path 방식을 μš°μ„  μ μš©ν•˜λ©°, λ©”μ‹œμ§€κ°€ μœ μ‹€λœ 경우 μƒμœ„ 50개 내역을 μ—­νƒμƒ‰ν•˜μ—¬ λŒ€μ‹œλ³΄λ“œλ₯Ό μžκ°€ λ³΅κ΅¬ν•˜κ³  쀑볡 λ©”μ‹œμ§€λ₯Ό μ²­μ†Œν•©λ‹ˆλ‹€.
  • ν™˜κ²½ μ„€μ • 일괄 λ³€κ²½ 및 이쀑 승인 (/μ„€μ •λ³€κ²½)

    • μ—¬λŸ¬ ν™˜κ²½ λ³€μˆ˜(.env) 값을 μ‰Όν‘œ(,)둜 κ΅¬λΆ„ν•˜μ—¬ ν•œ λ²ˆμ— λ³€κ²½ν•˜κ³ , μž…λ ₯ ν‚€ μœ νš¨μ„± 검증 및 λ³€κ²½ 확인 μž„λ² λ“œμ™€ 승인 λ²„νŠΌμ„ 톡해 μ•ˆμ „ν•œ 이쀑 절차λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • 12μ‹œκ°„ μ£ΌκΈ° λ””μŠ€ν¬ μž”λŸ‰ λͺ¨λ‹ˆν„°λ§ 및 μ‹€μ‹œκ°„ λ””μŠ€ν¬ 쑰회 (/λ””μŠ€ν¬)

    • 12μ‹œκ°„λ§ˆλ‹€ λ””μŠ€ν¬ μ‚¬μš©λ₯ μ„ μ§„λ‹¨ν•˜μ—¬ 80% 초과 μ‹œ μ•Œλ¦Όμ„ μ†‘μΆœν•˜λ©°, /λ””μŠ€ν¬ λͺ…령을 톡해 μ‹€μ‹œκ°„ 전체/μ‚¬μš©/μž”μ—¬ μš©λŸ‰μ„ μ¦‰μ‹œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

2. 전체 μ‹œμŠ€ν…œ ꡬ쑰 및 톡신 흐름

1. μ‹œμŠ€ν…œ κ°œλ… ꡬ쑰도 (System Architecture)

Discord User / Admin (DM & Slash Commands)
              β”‚
              β–Ό
         Discord Bot (main.py)
              β”‚
      β”Œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
      β”‚       β”‚       β”‚              β”‚
      β–Ό       β–Ό       β–Ό              β–Ό
    Backup  Docker  Monitor      Config (DM/Slash)
      β”‚       β”‚       β”‚              β”‚
      β”‚       β”‚       └─► Steam API  └─► .env Read/Write
      β”‚       β”‚
      β–Ό       β–Ό
    Local Backup    Rclone Upload (gdrive:backup)
      β”‚               β”‚
      β–Ό               β–Ό
    [Saved Path]    [Google Drive Remote]

2. 가상 μ„œλ²„ λ‚΄λΆ€ 물리 톡신 흐름

[λ””μŠ€μ½”λ“œ μ‚¬μš©μž / κ΄€λ¦¬μž] ──(μŠ¬λž˜μ‹œ λͺ…λ Ήμ–΄ / DM / UI λ²„νŠΌ)──> [PalworldBot (main.py)]
                                                              β”‚
           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
           β”‚ (MCRcon TCP 25575)                               β”‚ (REST API TCP 8212)                             β”‚ (docker.from_env API / subprocess)
           β–Ό                                                  β–Ό                                                 β–Ό
    [νŒ°μ›”λ“œ μ„œλ²„ μ»¨ν…Œμ΄λ„ˆ]                               [REST API μˆ˜μ§‘ μ—”μ§„]                              [Docker Engine]
           β”‚                                                                                                    β”‚
           β”‚ (RCON Save ν”ŒλŸ¬μ‹œ 및 λ°±μ—…)                                                                          β”‚ (μ»¨ν…Œμ΄λ„ˆ μƒνƒœ μ œμ–΄)
           └───────────────────────────────────────────> [Saved 데이터 폴더]                                    β”‚
                                                                 β”‚                                              β”‚
                                                                 β–Ό (타λ₯΄ μ••μΆ• 아카이빙)                         β–Ό
                                                          [backups/ 디렉토리] <β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                                 β”‚
                                                                 β–Ό (rclone copy 비동기 μ‹€ν–‰)
                                                          [ꡬ글 λ“œλΌμ΄λΈŒ 원격 λ°±μ—…]

3. λ³΄μ•ˆ 및 μ•ˆμ „μ„± 섀계 (Security & Safety)

λ³Έ μ‹œμŠ€ν…œμ€ μ™ΈλΆ€ ν•΄ν‚Ή 곡격 및 ν—ˆκ°€λ˜μ§€ μ•Šμ€ μ‚¬μš©μžμ˜ μ„œλ²„ μ˜€μš©μ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 닀쀑 λ³΄μ•ˆ 섀계가 μ μš©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • 1. νμ‡„ν˜• 내뢀망 톡신 (Localhost Isolation)

    • 봇(main.py)κ³Ό κ²Œμž„ μ„œλ²„ μ»¨ν…Œμ΄λ„ˆλŠ” 동일 가상 μ„œλ²„ 내에 μƒμ£Όν•˜λ©°, REST API 포트(8212)와 RCON 포트(25575)λŠ” μ™ΈλΆ€ IPκ°€ μ•„λ‹Œ 둜컬 루프백 μ£Όμ†Œ(127.0.0.1)λ₯Ό ν†΅ν•΄μ„œλ§Œ λ‚΄λΆ€ ν†΅μ‹ ν•©λ‹ˆλ‹€.
  • 2. 가상 μ„œλ²„ λ°©ν™”λ²½ μ΅œμ†Œν™” (Port Protection)

    • κ²Œμž„ ν”Œλ ˆμ΄λ₯Ό μœ„ν•΄ 열어두어야 ν•˜λŠ” κ²Œμž„ 포트(UDP 8211) μ™Έμ˜ λͺ¨λ“  μ œμ–΄ ν¬νŠΈλŠ” μ™ΈλΆ€λ‘œλΆ€ν„° 차단할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • ꡬ글 ν΄λΌμš°λ“œ λ°©ν™”λ²½ μ„€μ • μ‹œ RCON 및 REST API 포트λ₯Ό 외뢀에 κ°œλ°©ν•˜μ§€ μ•Šμ•„λ„ λ‚΄λΆ€ 톡신망을 톡해 봇이 직접 정보λ₯Ό μ œμ–΄ν•©λ‹ˆλ‹€.
  • 3. λ””μŠ€μ½”λ“œ κ΄€λ¦¬μž ID 검증 (Role Verification)

    • μ£Όμš” μ œμ–΄ λͺ…λ Ή, /μ„€μ •λ³€κ²½, DM을 ν†΅ν•œ .env 파일 μ†‘μˆ˜μ‹  및 적용 κΈ°λŠ₯은 env λ‚΄ μ§€μ •λœ ADMIN_IDS 숫자 ID와 λŒ€μ‘°ν•˜μ—¬ 미인증 μ‚¬μš©μžμ˜ 접근을 μ—„κ²©νžˆ μ°¨λ‹¨ν•©λ‹ˆλ‹€.
  • 4. 사전 ν™˜κ²½ λ³€μˆ˜ 검증 (Fail-Fast Validation)

    • 봇 기동 μ‹œ validator.pyλ₯Ό ν˜ΈμΆœν•˜μ—¬ λ””μŠ€μ½”λ“œ 토큰, 채널 ID, 경둜 쑴재 유무, 포트 λ²”μœ„(1~65535), μ •μˆ˜ν˜• 수치λ₯Ό 사전 κ²€μ¦ν•˜λ©°, μœ νš¨ν•˜μ§€ μ•Šμ€ ν•­λͺ© 발견 μ‹œ 봇 ꡬ동을 즉각 μ€‘λ‹¨ν•˜μ—¬ μ˜€μž‘λ™μ„ μ°¨λ‹¨ν•©λ‹ˆλ‹€.
  • 5. μ•ˆμ „ν•œ Subprocess μ‹€ν–‰ 및 μ‰˜ μΈμ μ…˜ λ°©μ§€

    • μ‰˜ μ£Όμž… 취약점을 μ°¨λ‹¨ν•˜κΈ° μœ„ν•΄ os.system() λŒ€μ‹  subprocess.run() λ˜λŠ” asyncio.create_subprocess_exec()에 리슀트 인자 ν˜•νƒœ(["docker", "exec", ...])λ₯Ό μ μš©ν•˜μ—¬ μ•ˆμ „ν•˜κ²Œ κ΅¬λ™ν•©λ‹ˆλ‹€.
    • RCON μ‹€ν–‰ μ‹œ λ°±κ·ΈλΌμš΄λ“œ ν™˜κ²½ TTY 였λ₯˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ -it μ˜΅μ…˜μ„ λ°°μ œν•˜κ³  비동기 ν”„λ‘œμ„ΈμŠ€λ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • 6. νšŒμ „μ‹ 파일 λ‘œκΉ… 및 μ˜ˆμ™Έ 좔적 (RotatingFileHandler & Traceback)

    • logger.pyλ₯Ό 톡해 palworld_bot.log에 둜그λ₯Ό μ €μž₯ν•˜λ©°, 5MB 달성 μ‹œ μžλ™ μˆœν™˜(μ΅œλŒ€ 3개 파일 보쑴)ν•˜μ—¬ λ””μŠ€ν¬ μ˜€λ²„ν”Œλ‘œμš°λ₯Ό μ˜ˆλ°©ν•©λ‹ˆλ‹€.
    • λͺ¨λ“  μ˜ˆμ™Έ λ°œμƒ μ‹œ μƒμ„Έν•œ μ—λŸ¬ λ‘œκ·Έμ™€ 호좜 μŠ€νƒ(traceback)을 κΈ°λ‘ν•˜λ„λ‘ μ •λΉ„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

4. λ©΄μ±… μ‘°ν•­ 및 μ±…μž„μ˜ ν•œκ³„ (Disclaimer)

  • 제곡 λͺ©μ : λ³Έ ν”„λ‘œμ νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” 슀크립트 및 κ°€μ΄λ“œλŠ” μ„œλ²„ 관리 편의λ₯Ό 돕기 μœ„ν•œ 참고용 μ˜€ν”ˆμ†ŒμŠ€ μžλ£Œμž…λ‹ˆλ‹€.
  • 보증의 λΆ€μž¬: λ³Έ μ‹œμŠ€ν…œμ€ λͺ…μ‹œμ /λ¬΅μ‹œμ  보증 없이 "μžˆλŠ” κ·ΈλŒ€λ‘œ(As-Is)" μ œκ³΅λ©λ‹ˆλ‹€. κ°œλ°œμžλŠ” μ‹œμŠ€ν…œμ˜ 무결성, μ•ˆμ •μ„± 및 νŠΉμ • λͺ©μ μ— λŒ€ν•œ 적합성을 λ³΄μ¦ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ±…μž„μ˜ 귀속: μ‹œμŠ€ν…œ μ„€μΉ˜, 운용 쀑 λ°œμƒν•˜λŠ” 데이터 μœ μ‹€, VM μ˜€μž‘λ™, GCP 과금 λ°œμƒ λ“±μ˜ λͺ¨λ“  결과에 λŒ€ν•œ 법적, μž¬μ •μ , 기술적 μ±…μž„μ€ μ „μ μœΌλ‘œ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜κ³  μš΄μ˜ν•˜λŠ” μ‚¬μš©μž λ³ΈμΈμ—κ²Œ μžˆμŠ΅λ‹ˆλ‹€.
  • ꢌμž₯ 쑰치: μ‹œμŠ€ν…œ λ³€κ²½μ΄λ‚˜ μ„€μ • 적용 μ „ μ€‘μš” μ„Έμ΄λΈŒ λ°μ΄ν„°λŠ” μ™ΈλΆ€ μ €μž₯μ†Œμ— 별도 μˆ˜λ™ 백업을 λ°›μ•„λ‘λŠ” 것을 κ°•λ ₯히 ꢌμž₯ν•©λ‹ˆλ‹€.

5. 디렉토리 ꡬ쑰 및 ꡬ성 파일 상세

가상 μ„œλ²„μ˜ ν”„λ‘œμ νŠΈ 디렉토리 λ‚΄λΆ€ ꡬ쑰와 ν•˜μœ„ ꡬ성 νŒŒμΌλ“€μ˜ 물리적 μ—­ν•  λͺ…μ„Έμž…λ‹ˆλ‹€.

/home/<μ‚¬μš©μž_계정λͺ…>/palworld/
β”œβ”€β”€ AGENTS.md           # AI μ—μ΄μ „νŠΈ(LLM)용 개발 κ·œμΉ™, μ»¨λ²€μ…˜ 및 λͺ¨λ“ˆ μˆ˜μ • μˆœμ„œ κ°€μ΄λ“œ
β”œβ”€β”€ docker-compose.yml   # νŒ°μ›”λ“œ 도컀 μ»¨ν…Œμ΄λ„ˆ 및 TCP ν—¬μŠ€μ²΄ν¬ 검사 μ •μ˜ 파일
β”œβ”€β”€ env                 # λ””μŠ€μ½”λ“œ 봇 ꡬ동 및 가상 μ„œλ²„ 경둜 μ„€μ •μš© ν™˜κ²½ λ³€μˆ˜ (점 μ—†μŒ)
β”œβ”€β”€ .env                # νŒ°μ›”λ“œ κ²Œμž„ λ‚΄λΆ€ λ™μž‘ κ·œμΉ™(κ²½ν—˜μΉ˜, 포획λ₯  λ“±) μ„€μ •μš© ν™˜κ²½ λ³€μˆ˜ (점 있음)
β”œβ”€β”€ main.py             # 봇 μ§„μž…μ , λ°±κ·ΈλΌμš΄λ“œ μŠ€μΌ€μ€„λŸ¬ νƒœμŠ€ν¬ 및 이벀트/μŠ¬λž˜μ‹œ μ»€λ§¨λ“œ ν•Έλ“€λŸ¬
β”œβ”€β”€ setup.sh            # μ˜μ‘΄μ„± νŒ¨ν‚€μ§€ μ„€μΉ˜, κ°€μƒν™˜κ²½ ꡬ좕 및 μ‹œμŠ€ν…œ μ„œλΉ„μŠ€ 등둝 슀크립트
β”œβ”€β”€ status.json         # ν˜„ν™©νŒ λ©”μ‹œμ§€ ID, λΉŒλ“œ 정보 및 μ΅œμ’… μƒνƒœκ°’ 캐싱 파일 (μžλ™ 생성)
β”œβ”€β”€ palworld_bot.log    # 봇 μ‹€ν–‰ 둜그 파일 (μžλ™ 생성, RotatingFileHandler 적용)
β”œβ”€β”€ backups/            # μ„Έμ΄λΈŒ μ••μΆ• 파일이 μ €μž₯λ˜λŠ” λ°±μ—… 폴더 (μžλ™ 생성, ꡬ글 λ“œλΌμ΄λΈŒ 연동)
β”œβ”€β”€ utils/              # μœ ν‹Έλ¦¬ν‹° λͺ¨λ“ˆ μ§‘ν•©
β”‚   β”œβ”€β”€ __init__.py     # utils νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™” 파일
β”‚   β”œβ”€β”€ logger.py       # 5MB μ œν•œ, 3개 파일 보쑴 κΈ°μ€€μ˜ RotatingFileHandler λ‘œκΉ… ꡬ성
β”‚   └── validator.py    # 봇 기동 μ „ ν•„μˆ˜ ν™˜κ²½ λ³€μˆ˜ λˆ„λ½ 및 포트 λ²”μœ„(1~65535) 무결성 검증
β”œβ”€β”€ services/           # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ„œλΉ„μŠ€ λͺ¨λ“ˆ μ§‘ν•©
β”‚   β”œβ”€β”€ __init__.py     # services νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™” 파일
β”‚   β”œβ”€β”€ config_service.py   # env 및 .env 파일 읽기/μ“°κΈ°, DM 파일 λ°œμ†‘/μˆ˜μ‹  적용 및 동적 λ¦¬λ‘œλ“œ
β”‚   β”œβ”€β”€ status_service.py   # status.json ꡬ쑰의 λ‘œλ“œ 및 μ“°κΈ° 무결성 관리
β”‚   β”œβ”€β”€ docker_service.py   # Docker API μ—”μ§„ 연동 및 비동기 RCON λͺ…λ Ήμ–΄ 전솑 처리
β”‚   β”œβ”€β”€ backup_service.py   # RCON Save ν”ŒλŸ¬μ‹œ, μ„Έμ΄λΈŒ μ••μΆ• λ°±μ—…, Rclone μ—…λ‘œλ“œ 및 λ‚΄μž₯/원격 정리
β”‚   └── monitor_service.py  # μŠ€νŒ€ API μ΅œμ‹  λΉŒλ“œ 쑰회, REST API μˆ˜μ§‘ 및 μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§
└── bot/                # λ””μŠ€μ½”λ“œ 봇 UI/UX λͺ¨λ“ˆ μ§‘ν•©
    β”œβ”€β”€ __init__.py     # bot νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™” 파일
    β”œβ”€β”€ embeds.py       # ONLINE/STARTING/OFFLINE μƒνƒœλ³„ λŒ€μ‹œλ³΄λ“œ μž„λ² λ“œ λ””μžμΈ
    └── views.py        # λŒ€μ‹œλ³΄λ“œ μˆ˜λ™ μ—…λ°μ΄νŠΈ λ²„νŠΌ 및 μ„€μ • λ³€κ²½ confirmation λ·° μ •μ˜

6. ν™˜κ²½ λ³€μˆ˜ 이쀑화 κ°€μ΄λ“œ (env vs .env)

λ³Έ μ‹œμŠ€ν…œμ€ 관리 νŽΈμ˜μ„±κ³Ό λ³΄μ•ˆμ„±μ„ κ·ΉλŒ€ν™”ν•˜κΈ° μœ„ν•΄ ν™˜κ²½ λ³€μˆ˜ νŒŒμΌμ„ μ™„μ „νžˆ μ΄μ€‘ν™”ν•˜μ—¬ λ…λ¦½μ μœΌλ‘œ μš΄μ˜ν•©λ‹ˆλ‹€.

파일 이름 점(.) μ—¬λΆ€ μ£Όμš” μ—­ν•  및 λŒ€μƒ μ½”λ“œ ν¬ν•¨λ˜λŠ” μ£Όμš” λ³€μˆ˜ μ˜ˆμ‹œ
env μ—†μŒ λ””μŠ€μ½”λ“œ λ΄‡μ˜ μ‹œμŠ€ν…œ 관리 및 물리 ꡬ동을 μœ„ν•œ 핡심 ν™˜κ²½ μ„€μ • (봇 ꡬ동 μ„œλΉ„μŠ€ μ‹€ν–‰ μ‹œ 직접 λ‘œλ“œ) DISCORD_TOKEN, ADMIN_IDS, CHANNEL_ID, LOG_CHANNEL_ID, BASE_PATH, SAVE_DATA_PATH, BACKUP_PATH, MEMORY_RESTART_THRESHOLD
.env 있음 νŒ°μ›”λ“œ κ²Œμž„ μ„œλ²„ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ λ™μž‘ κ·œμΉ™ μ‘°μ • (도컀 컴포즈 λΉŒλ“œ μ‹œ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€λ‘œ ν™˜κ²½ λ³€μˆ˜ μ£Όμž…) EXP_RATE, CATCH_RATE, PAL_EGG_DEFAULT_HATCHING_TIME, SERVER_PASSWORD, ADMIN_PASSWORD
  • πŸ’‘ μ£Όμ˜μ‚¬ν•­: DM을 ν†΅ν•œ μ„€μ • κ΄€λ¦¬λ‚˜ /μ„€μ •λ³€κ²½ λͺ…λ Ήμ–΄λŠ” κ²Œμž„ λ£° 쑰정을 λͺ©μ μœΌλ‘œ 있음(.env) νŒŒμΌμ„ μˆ˜μ •ν•˜κ³  λ™κΈ°ν™”ν•©λ‹ˆλ‹€. 반면 봇 ꡬ동 ν† ν°μ΄λ‚˜ λ””μŠ€μ½”λ“œ 채널 ID 등을 μˆ˜μ •ν•  λ•ŒλŠ” μ—†μŒ(env) νŒŒμΌμ„ 직접 μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

7. 사전 μ€€λΉ„ 및 ν΄λΌμš°λ“œ μ„ΈνŒ… κ°€μ΄λ“œ

νŒ°μ›”λ“œ μ„œλ²„λ₯Ό μ›ν™œνžˆ κ΅¬λ™ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ 가상 μ„œλ²„ 생성 이전에 μ•„λž˜μ˜ μ„ΈνŒ…μ„ μˆœμ„œλŒ€λ‘œ μ§„ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

1. GCP 무료 ν‹°μ–΄ 계정 κ°€μž… 및 VM μΈμŠ€ν„΄μŠ€ μ€€λΉ„

  1. ꡬ글 ν΄λΌμš°λ“œ ν”Œλž«νΌ(GCP)에 μ ‘μ†ν•˜μ—¬ μ‹ κ·œ 계정을 λ“±λ‘ν•˜κ³  무료 μ²΄ν—˜ ν¬λ ˆλ”§ λ˜λŠ” ν‹°μ–΄ 쑰건을 ν™•μΈν•©λ‹ˆλ‹€.
  2. Compute Engine > VM μΈμŠ€ν„΄μŠ€ λ©”λ‰΄μ—μ„œ 가상 μ„œλ²„ μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜ μƒμ„±ν•©λ‹ˆλ‹€.
    • OS: Ubuntu 22.04 LTS (μ΅œμ‹  x86/64 이미지)
    • ꢌμž₯ ν•˜λ“œμ›¨μ–΄ 사양: e2-standard-4 (4 vCPU, 16GB RAM) 이상

2. GCP 가상 μ„œλ²„ λ°©ν™”λ²½(포트 개방) κ·œμΉ™ ꡬ성

κ²Œμž„ ν΄λΌμ΄μ–ΈνŠΈ 접속을 ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μΈμŠ€ν„΄μŠ€ λ„€νŠΈμ›Œν¬ 섀정에 λ‹€μŒ κ·œμΉ™μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • κ²Œμž„ 접속 포트: UDP 8211 (μ†ŒμŠ€λ‘œλΆ€ν„°μ˜ IP λ²”μœ„: 0.0.0.0/0 - 전체 개방)
  • 주의: λ³΄μ•ˆμ„ μœ„ν•΄ RCON 포트(TCP 25575) 및 REST API 포트(TCP 8212)λŠ” ꡬ글 λ°©ν™”λ²½ μƒμ—μ„œ μ™ΈλΆ€λ‘œ λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ νμ‡„ν•˜κ³  둜컬 λ‚΄λΆ€μ—μ„œλ§Œ ν†΅μ‹ ν•˜λ„λ‘ μ„€μ •ν•˜μ‹­μ‹œμ˜€.

3. λ””μŠ€μ½”λ“œ 개발자 포털 봇 생성 및 토큰 λ°œκΈ‰

  1. Discord Developer Portal(https://discord.com/developers/applications)에 μ ‘μ†ν•˜μ—¬ New Application을 μƒμ„±ν•©λ‹ˆλ‹€.
  2. μ™Όμͺ½ Bot νƒ­μœΌλ‘œ μ΄λ™ν•˜μ—¬ 봇 계정을 μƒμ„±ν•˜κ³  Token을 μ•ˆμ „ν•œ 곳에 볡사해 λ‘‘λ‹ˆλ‹€. (DISCORD_TOKEN)
  3. 같은 Bot νƒ­ ν™”λ©΄ ν•˜λ‹¨μ˜ Privileged Gateway Intents μ„Ήμ…˜μ—μ„œ λ‹€μŒ μ„Έ κ°€μ§€ ν•„μˆ˜ κΆŒν•œμ„ ν™œμ„±ν™”ν•©λ‹ˆλ‹€.
    • Presence Intent
    • Server Members Intent
    • Message Content Intent
  4. μ™Όμͺ½ OAuth2 > URL Generator νƒ­μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€.
    • Scopes: bot, applications.commands 체크
    • Bot Permissions: Administrator (λ˜λŠ” 채널 읽기/μ“°κΈ°, μ—­ν•  μ œμ–΄ κΆŒν•œ ν•„μˆ˜ 체크)
  5. ν•˜λ‹¨μ— μžλ™ μƒμ„±λœ URL μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν•˜μ—¬ λΈŒλΌμš°μ €μ— μ ‘μ†ν•œ λ’€ 본인이 κ΄€λ¦¬ν•˜λŠ” λ””μŠ€μ½”λ“œ μ„œλ²„μ— 봇을 μ΄ˆλŒ€ν•©λ‹ˆλ‹€.

4. MobaKeyGen (λ˜λŠ” puttygen.exe)으둜 SSH ν‚€ 생성

  1. MobaXterm 상단 λ©”λ‰΄μ—μ„œ Tools > MobaKeyGen (SSH Key Generator)을 μ‹€ν–‰ν•©λ‹ˆλ‹€.
  2. ν•˜λ‹¨μ˜ Parameters ν•­λͺ©μ—μ„œ RSAλ₯Ό μ„ νƒν•˜κ³  Generate λ²„νŠΌμ„ ν΄λ¦­ν•©λ‹ˆλ‹€.
  3. μ§„ν–‰ ν‘œμ‹œμ€„μ΄ 차였λ₯΄λŠ” λ™μ•ˆ 마우슀λ₯Ό λ¬΄μž‘μœ„λ‘œ 계속 움직여 μž„μ˜μ˜ λ‚œμˆ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  4. ν‚€ 생성이 μ™„λ£Œλ˜λ©΄ ν™”λ©΄ μ€‘κ°„μ˜ Key comment 뢀뢄을 μ›ν•˜λŠ” <μ‚¬μš©μž_계정λͺ…>으둜 λ³€κ²½ν•©λ‹ˆλ‹€. (예: gcp-user λ“± μ˜μ–΄ μ†Œλ¬Έμž ꢌμž₯)
  5. Save private key λ²„νŠΌμ„ ν΄λ¦­ν•˜μ—¬ μ•ˆμ „ν•œ 둜컬 폴더에 λΉ„κ³΅κ°œ ν‚€ 파일(.ppk)을 μ €μž₯ν•©λ‹ˆλ‹€.
  6. 맨 μœ„ νšŒμƒ‰ ν…μŠ€νŠΈ μƒμž(Public key for pasting into OpenSSH...) μ•ˆμ— μžˆλŠ” κΈ΄ λ¬Έμžμ—΄ 전체λ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€.

5. ꡬ글 ν΄λΌμš°λ“œ μ½˜μ†”μ— 곡개 ν‚€ 등둝

  1. GCP μ½˜μ†”μ˜ Compute Engine > VM μΈμŠ€ν„΄μŠ€ 상세 νŽ˜μ΄μ§€μ—μ„œ μƒλ‹¨μ˜ μˆ˜μ • λ²„νŠΌμ„ ν΄λ¦­ν•©λ‹ˆλ‹€.
  2. 화면을 μ•„λž˜λ‘œ λ‚΄λ € SSH ν‚€ ν•­λͺ©μ„ 찾은 ν›„ ν•­λͺ© μΆ”κ°€λ₯Ό λˆ„λ¦…λ‹ˆλ‹€.
  3. μœ„μ—μ„œ λ³΅μ‚¬ν•œ 곡개 ν‚€ 전체λ₯Ό μž…λ ₯λž€μ— κ·ΈλŒ€λ‘œ λΆ™μ—¬λ„£μŠ΅λ‹ˆλ‹€. (정상 등둝 μ‹œ 끝에 μž…λ ₯ν•œ 계정λͺ…이 κ°μ§€λ©λ‹ˆλ‹€.)
  4. 맨 μ•„λž˜λ‘œ λ‚΄λ € μ €μž₯을 λˆ„λ¦…λ‹ˆλ‹€.

6. MobaXterm μ„Έμ…˜ 생성 및 졜초 접속

  1. MobaXterm μ™Όμͺ½ μœ„ Session λ²„νŠΌμ„ λˆ„λ₯΄κ³  SSH μ„Έμ…˜μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
  2. Remote host: GCPμ—μ„œ ν• λ‹Ήλœ 가상 μ„œλ²„μ˜ μ™ΈλΆ€ IP μ£Όμ†Œλ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.
  3. Specify username: ν‚€ 생성 μ‹œ Key comment에 μž…λ ₯ν–ˆλ˜ <μ‚¬μš©μž_계정λͺ…>을 κ·ΈλŒ€λ‘œ μž…λ ₯ν•©λ‹ˆλ‹€.
  4. Advanced SSH settings 탭을 ν΄λ¦­ν•œ λ’€ Use private key ν•­λͺ©μ„ μ²΄ν¬ν•˜κ³  μ €μž₯ν•΄ λ‘μ—ˆλ˜ λΉ„κ³΅κ°œ ν‚€ 파일(.ppk)을 λ“±λ‘ν•©λ‹ˆλ‹€.
  5. OKλ₯Ό λˆ„λ₯΄λ©΄ 가상 μ„œλ²„μ— μ•”ν˜Έ μž…λ ₯ 없이 μ•ˆμ „ν•˜κ²Œ 졜초 μ ‘μ†λ©λ‹ˆλ‹€.

7. Rclone μ„€μΉ˜ 및 ꡬ글 λ“œλΌμ΄λΈŒ 연동 μ„€μ • (Headless)

가상 μ„œλ²„ λ°±μ—… 데이터λ₯Ό ꡬ글 λ“œλΌμ΄λΈŒ 원격 μ €μž₯μ†Œμ— μ—…λ‘œλ“œν•˜κΈ° μœ„ν•œ 사전 μž‘μ—…μž…λ‹ˆλ‹€.

  1. Rclone μ„€μΉ˜ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰:

    sudo -v && curl https://rclone.org/install.sh | sudo bash

  2. μ„€μ • 생성 λ§ˆλ²•μ‚¬ μ§„μž…:

    rclone config

  3. μ•„λž˜ μž…λ ₯ 단계에 맞게 맀핑을 μ§„ν–‰ν•©λ‹ˆλ‹€:

    • New Remote 선택을 μœ„ν•΄ n μž…λ ₯ ν›„ μ—”ν„°
    • μ €μž₯μ†Œ 식별 이름 μž…λ ₯: gdrive μž…λ ₯ ν›„ μ—”ν„° (λŒ€μ†Œλ¬Έμž 일치 ν•„μˆ˜)
    • μŠ€ν† λ¦¬μ§€ μœ ν˜• 선택: drive λ˜λŠ” λͺ©λ‘μ— μ•ˆλ‚΄λ˜λŠ” ꡬ글 λ“œλΌμ΄λΈŒ 고유 번호 μž…λ ₯ ν›„ μ—”ν„°
    • client_id 및 client_secret: 곡백으둜 μ—”ν„° (κΈ°λ³Έκ°’ μ‚¬μš©)
    • κΆŒν•œ λ²”μœ„(scope): 1 μž…λ ₯ ν›„ μ—”ν„° (전체 μ ‘κ·Ό κΆŒν•œ λΆ€μ—¬)
    • root_folder_id 및 service_account_file: 곡백으둜 μ—”ν„°
    • Edit advanced config?: n μž…λ ₯ ν›„ μ—”ν„°
    • Use auto-config?: n μž…λ ₯ ν›„ μ—”ν„° (가상 μ„œλ²„ ν™˜κ²½μ΄λ―€λ‘œ ν•„μˆ˜ n)
  4. 개인 PCμ—μ„œμ˜ 연동 인증 μ™„λ£Œ 절차:

    • μΈμŠ€ν„΄μŠ€ 화면에 ν‘œμ‹œλ˜λŠ” rclone authorize "drive" ꡬ문을 ν™•μΈν•©λ‹ˆλ‹€.
    • 본인의 개인 둜컬 PC(Windows λ˜λŠ” Mac) 터미널 창을 μ—΄κ³  rclone authorize "drive" λͺ…λ Ήμ–΄λ₯Ό λ˜‘κ°™μ΄ μž…λ ₯ν•˜μ—¬ κ°€λ™ν•©λ‹ˆλ‹€.
    • 연동을 μ›ν•˜λŠ” ꡬ글 계정 λΈŒλΌμš°μ € 승인 창이 열리면 ν—ˆμš©μ„ λ§ˆμΉ©λ‹ˆλ‹€.
    • 둜컬 PC 터미널 상에 좜λ ₯λ˜λŠ” κΈ΄ JSON 토큰 μ½”λ“œ({"access_token": ...})λ₯Ό μ²˜μŒλΆ€ν„° λκΉŒμ§€ μ •λ°€ν•˜κ²Œ λ³΅μ‚¬ν•©λ‹ˆλ‹€.
    • λ‹€μ‹œ ꡬ글 가상 μ„œλ²„ SSH ν„°λ―Έλ„λ‘œ λŒμ•„μ™€ λ³΅μ‚¬ν•œ μ½”λ“œ λ¬Έμžμ—΄ 전체λ₯Ό result> 창에 λΆ™μ—¬λ„£κ³  μ—”ν„°λ₯Ό ν΄λ¦­ν•©λ‹ˆλ‹€.
    • Shared Drive ꡬ성 μ—¬λΆ€: n μž…λ ₯ ν›„ μ—”ν„°
    • 정상 μž…λ ₯ κ²°κ³Ό 확인 ν›„ y μž…λ ₯으둜 μ΅œμ’… λ§ˆλ¬΄λ¦¬ν•˜κ³  qλ₯Ό 눌러 λ§ˆλ²•μ‚¬λ₯Ό μ’…λ£Œν•©λ‹ˆλ‹€.
  5. ν…ŒμŠ€νŠΈλ‘œ 연동 확인:

    rclone lsd gdrive:


8. 단계별 ꡬ좕 κ°€μ΄λ“œ

[단계 1] 졜초 접속 및 κΆŒν•œ μ΅œμ ν™” 폴더 생성

GCP 터미널(μ‚¬μš©μž@호슀트λͺ…:~$)에 μ ‘μ†ν•˜μžλ§ˆμž μ‹€ν–‰ν•©λ‹ˆλ‹€. 파일 μ—…λ‘œλ“œ 및 도컀 ꡬ동 κ³Όμ •μ—μ„œ κΆŒν•œ 좩돌이 μΌμ–΄λ‚˜μ§€ μ•Šλ„λ‘ 폴더 μ†Œμœ κΆŒμ„ 사전에 μ§€μ •ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

mkdir -p ~/palworld
sudo chown -R $USER:$USER ~/palworld
chmod 755 ~/palworld
cd ~/palworld

[단계 2] ν”„λ‘œμ νŠΈ 파일 ꡬ성 (PCμ—μ„œ 생성 ν›„ μ—…λ‘œλ“œ)

MobaXterm μ™Όμͺ½ 파일 탐색 νŒ¨λ„μ„ μƒˆλ‘œκ³ μΉ¨ν•˜μ—¬ μƒμ„±λœ /home/<μ‚¬μš©μž_계정λͺ…>/palworld ν΄λ”λ‘œ μ§„μž…ν•œ ν›„ μ€€λΉ„λœ νŒŒμΌλ“€κ³Ό 폴더듀을 μ—…λ‘œλ“œν•©λ‹ˆλ‹€.

πŸ’‘ env μ„€μ • 파일 μž‘μ„± μ˜ˆμ‹œ (점이 μ—†λŠ” 파일)

env νŒŒμΌμ€ λ””μŠ€μ½”λ“œ 봇 및 경둜 맀핑을 μœ„ν•œ νŒŒμΌμž…λ‹ˆλ‹€. μ•„λž˜ 포맷 μ˜ˆμ‹œμ— λ§žμΆ”μ–΄ 정보λ₯Ό μž…λ ₯ν•˜μ—¬ μ—…λ‘œλ“œν•˜μ‹­μ‹œμ˜€.

# --- λ””μŠ€μ½”λ“œ μ„€μ • ---
DISCORD_TOKEN=λ°œκΈ‰λ°›μ€_λ””μŠ€μ½”λ“œ_봇_토큰
ADMIN_IDS=κ΄€λ¦¬μž_λ””μŠ€μ½”λ“œ_숫자_ID (μ—¬λŸ¬ λͺ…일 μ‹œ 콀마 ꡬ뢄 예: 1234,5678)
CHANNEL_ID=ν˜„ν™©νŒ_좜λ ₯용_λ””μŠ€μ½”λ“œ_채널_숫자_ID
LOG_CHANNEL_ID=λ°±μ—… 및 μ‹œμŠ€ν…œ_둜그_μˆ˜μ‹ μš©_채널_숫자_ID

# --- μ„œλ²„ 정보 ---
SERVER_NAME=Palworld Korea
SERVER_IP=μžμ‹ μ˜_GCP_μ™ΈλΆ€_IP_μ£Όμ†Œ
SERVER_PORT=8211

# --- κ²Œμž„ λ‚΄λΆ€ μ„€μ • ---
ADMIN_PASSWORD=μ›ν•˜λŠ”_RCON_λΉ„λ°€λ²ˆν˜Έ
RCON_PORT=25575
REST_API_PORT=8212

# --- 경둜 μ„€μ • (<μ‚¬μš©μž_계정λͺ…> μžλ¦¬μ—λŠ” 본인의 μ‹€μ œ 계정λͺ…을 μž…λ ₯ν•˜μ‹­μ‹œμ˜€) ---
BASE_PATH=/home/<μ‚¬μš©μž_계정λͺ…>/palworld
SAVE_DATA_PATH=/home/<μ‚¬μš©μž_계정λͺ…>/palworld/palworld/Pal/Saved
BACKUP_PATH=/home/<μ‚¬μš©μž_계정λͺ…>/palworld/backups

# --- 운영 μ •μ±… ---
BACKUP_RETENTION_DAYS=2                 # λ°±μ—… 파일 보쑴 κΈ°κ°„ (일 λ‹¨μœ„)
MEMORY_RESTART_THRESHOLD=80             # RAM μ‚¬μš©λŸ‰ n% 초과 μ‹œ μžλ™ μž¬μ‹œμž‘
RESTART_TIME=04:00                      # 맀일 μ„œλ²„ μžλ™ μž¬μ‹œμž‘ μ‹œκ°„ (HH:MM)

πŸ’‘ docker-compose.yml 파일 μž‘μ„± μ˜ˆμ‹œ

도컀 μ»¨ν…Œμ΄λ„ˆκ°€ λ‹¨μˆœνžˆ μž‘λ™ 쀑인 것과 μ‹€μ œ κ²Œμž„ μ„œλ²„ λ‚΄λΆ€ ν”„λ‘œμ„ΈμŠ€κ°€ μ •μƒμ μœΌλ‘œ 톡신을 받아듀일 수 μžˆλŠ” μƒνƒœμΈ 것은 λ‹€λ¦…λ‹ˆλ‹€. 이λ₯Ό μ •λ°€ν•˜κ²Œ κ²€μ¦ν•˜κΈ° μœ„ν•΄ RCON 포트 감지 기반의 ν—¬μŠ€μ²΄ν¬ 섀정을 ν¬ν•¨ν•˜μ—¬ κ΅¬μ„±ν•©λ‹ˆλ‹€.

version: '3.8'

services:
  palworld:
    image: thijsvanloef/palworld-server-docker:latest
    container_name: palworld-server
    stop_grace_period: 30s
    ports:
      - 8211:8211/udp
      - 27015:27015/udp
      - 25575:25575/tcp
      - 8212:8212/tcp
    environment:
      - TZ=Asia/Seoul
      - PUID=1000
      - PGID=1000
    env_file:
      - .env
    volumes:
      - ./palworld:/palworld/

    healthcheck:
      test: ["CMD-SHELL", "timeout 5s bash -c 'cat < /dev/null > /dev/tcp/127.0.0.1/25575' || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s
  • test (진단 λͺ…λ Ή): μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ˜ 둜컬 루프백 μ£Όμ†Œ(127.0.0.1)와 RCON μ œμ–΄ 포트(25575) κ°„μ˜ TCP 연결이 μœ νš¨ν•œμ§€ κ²€μ‚¬ν•©λ‹ˆλ‹€. Bash λ‚΄μž₯ /dev/tcp 채널을 톡해 빈 데이터(cat < /dev/null)λ₯Ό μ „μ†‘ν•˜μ—¬ λ¦¬μ†ŒμŠ€ μ†Œλͺ¨λ₯Ό μ΅œμ†Œν™”ν•©λ‹ˆλ‹€.
  • interval: μ»¨ν…Œμ΄λ„ˆ ꡬ동 이후 λ§€ 10초 κ°„κ²©μœΌλ‘œ 진단 λͺ…령을 반볡 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • timeout: 진단 λͺ…λ Ή μ§€μ‹œ ν›„ 5초 이내에 정상적인 TCP 응닡이 λ„λ‹¬ν•˜μ§€ μ•ŠμœΌλ©΄ μ‹€νŒ¨ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • retries: 연속 3회 이상 검증 μ‹€νŒ¨ μ‹œ 도컀 엔진은 μ»¨ν…Œμ΄λ„ˆμ˜ 건강 μƒνƒœλ₯Ό unhealthy둜 μ΅œμ’… κ²©ν•˜ν•©λ‹ˆλ‹€.
  • start_period: μ»¨ν…Œμ΄λ„ˆ 기동 직후 첫 60초 λ™μ•ˆμ€ μƒνƒœ 검사가 μ‹€νŒ¨ν•˜λ”λΌλ„ λˆ„μ  μ‹€νŒ¨ νšŸμˆ˜μ—μ„œ λ°°μ œν•˜μ—¬ 초기 λ‘œλ”© 쀑 μž¬μ‹œμž‘ 루프에 λΉ μ§€λŠ” ν˜„μƒμ„ λ°©μ§€ν•©λ‹ˆλ‹€.

[단계 3] μžλ™ λΉŒλ“œ 슀크립트 μ‹€ν–‰

μ—…λ‘œλ“œκ°€ μ™„λ£Œλ˜μ—ˆλ‹€λ©΄ 터미널 μ°½μ—μ„œ μœˆλ„μš° μŠ€νƒ€μΌ μ€„λ°”κΏˆ 문자(CRLF) μ •ν™” μž‘μ—…μ„ 거친 λ’€ μ„€μΉ˜ 슀크립트λ₯Ό κ΅¬λ™ν•©λ‹ˆλ‹€.

sed -i 's/\r$//' setup.sh env .env
chmod +x setup.sh
./setup.sh

[단계 4] 봇 계정에 Docker κΆŒν•œ 영ꡬ 등둝 (ν•„μˆ˜)

μ„€μΉ˜ μŠ€ν¬λ¦½νŠΈκ°€ μ™„μ „νžˆ λλ‚˜λ©΄ μƒμ‹œ 가동 쀑인 λ””μŠ€μ½”λ“œ 봇이 sudo 없이도 도컀 λ°±μ—… λͺ…λ Ήμ–΄(docker exec)λ₯Ό μ•ˆμ „ν•˜κ²Œ μ§€μ‹œν•  수 μžˆλ„λ‘ κΆŒν•œμ„ λ³΄μ™„ν•©λ‹ˆλ‹€.

sudo usermod -aG docker $USER
newgrp docker
sudo systemctl restart palbot.service

9. μ‹€μ‹œκ°„ ν˜„ν™©νŒ λŒ€μ‹œλ³΄λ“œ 및 μ§€λŠ₯ν˜• μ—”μ§„ 상세 λ©”μ»€λ‹ˆμ¦˜

1. μƒνƒœ λ¨Έμ‹  흐름도 (State Machine Flow)

[OFFLINE] (도컀 μ»¨ν…Œμ΄λ„ˆ μ •μ§€ μƒνƒœ)
   β”‚
   β–Ό (μ»¨ν…Œμ΄λ„ˆ 기동 / docker-compose up)
[STARTING] (도컀 running / ν—¬μŠ€μ²΄ν¬ starting)
   β”‚
   β–Ό (REST API /v1/api/info 성곡)
[ONLINE] (ν˜„ν™©νŒ 녹색 κ°±μ‹  및 정상 ꡬ동)
   β”‚
   β”œβ”€β–Ί [0λͺ… μœ μ§€ 15λΆ„ κ²½κ³Ό / 동적 λ°±μ—…] ───────────► [BACKUP & GDRIVE COPY]
   β”œβ”€β–Ί [λ©”λͺ¨λ¦¬ μž„κ³„μΉ˜ 초과 (80%) / μΏ¨λ‹€μš΄ 30λΆ„] ────► [AUTO REBOOT]
   └─► [μŠ€νŒ€ API λΉŒλ“œ 뢈일치 감지] ───────────────► [UPDATING PENDING]

2. 톡계 정보 μˆ˜μ§‘ 및 μ§€λŠ₯ν˜• μ—”μ§„

  • 이쀑 단계 μƒνƒœ 검증: 도컀 μ—”μ§„ μƒνƒœκ°€ starting이면 λŒ€μ‹œλ³΄λ“œλ₯Ό STARTING으둜 λ§€ν•‘ν•˜κ³  μ ‘μ†μž ν…μŠ€νŠΈλ₯Ό "λ‘œλ”© 쀑..."으둜 ν‘œκΈ°ν•©λ‹ˆλ‹€. REST API 정상 응닡 μ‹œ ONLINE으둜 μ „ν™˜λ©λ‹ˆλ‹€.
  • 비동기 락(asyncio.Lock) 보호: refresh_dashboard 호좜 μ‹œ dashboard_lock을 νšλ“ν•˜μ—¬ λ™μ‹œ κ°±μ‹  λͺ…령이 κ²ΉμΉ˜λ”λΌλ„ λŒ€μ‹œλ³΄λ“œ λ©”μ‹œμ§€κ°€ 쀑볡 λ°œν–‰λ˜λŠ” ν˜„μƒμ„ μ°¨λ‹¨ν•©λ‹ˆλ‹€.
  • Fast-Path 및 μžκ°€ 치유(Self-Healing): status.json에 μ €μž₯된 msg_id둜 get_partial_messageλ₯Ό μˆ˜ν–‰ν•΄ 1회 API 호좜둜 μ¦‰μ‹œ μˆ˜μ •ν•©λ‹ˆλ‹€. λ©”μ‹œμ§€κ°€ μœ μ‹€λœ 경우 졜근 50개 내역을 μŠ€μΊ”ν•˜μ—¬ λ³΅κ΅¬ν•˜λ©° 쀑볡 λŒ€μ‹œλ³΄λ“œλŠ” μ‚­μ œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • μ‹€μ‹œκ°„ λ©”λͺ¨λ¦¬ λͺ¨λ‹ˆν„°λ§ 및 30λΆ„ μΏ¨λ‹€μš΄: psutil.virtual_memory()둜 μ μœ μœ¨μ„ κ³„μ‚°ν•˜λ©° 80% 초과 μ‹œ RCON μ €μž₯을 거쳐 μ»¨ν…Œμ΄λ„ˆλ₯Ό μž¬λ°°μΉ˜ν•©λ‹ˆλ‹€. last_restart_time νƒ€μž„μŠ€νƒ¬ν”„λ₯Ό λŒ€μ‘°ν•˜μ—¬ μž¬μ‹œμž‘ ν›„ 30λΆ„(1800초)간은 μΆ”κ°€ μžλ™ μž¬λΆ€νŒ…μ„ μœ μ˜ˆν•©λ‹ˆλ‹€.
  • μ§€μ • μ‹œκ°„ μŠ€νŒ€ μ—…λ°μ΄νŠΈ λŒ€μ‘° μŠ€μΌ€μ€„λŸ¬: 맀일 02:00, 04:00, 09:00, 17:00에 μŠ€νŒ€ APIλ₯Ό μ‘°νšŒν•˜λ©° μ΅œμ‹  λΉŒλ“œ λ³€κ²½ μ‹œ μ ‘μ†μžκ°€ 0λͺ…이면 μ¦‰μ‹œ μ—…λ°μ΄νŠΈλ₯Ό μ‹€ν–‰ν•˜κ³ , μœ μ €κ°€ μ‘΄μž¬ν•˜λ©΄ 퇴μž₯ λŒ€κΈ°(update_pending_on_players) λͺ¨λ“œλ‘œ μ „ν™˜ν•©λ‹ˆλ‹€.

10. μ•Œλ¦Ό, 둜그 및 μ •κΈ° 채널 μ •λˆ μ‹œμŠ€ν…œ

1. λ¦¬μ†ŒμŠ€ μž„κ³„μΉ˜(λ©”λͺ¨λ¦¬ 80%) 초과 μ‹œ μ‹€ν–‰ 흐름

[가상 μ„œλ²„ 물리 RAM 80% 점유율 초과 감지]
                    β”‚
                    β–Ό
[μΈκ²Œμž„ RCON κ²½κ³  방솑] ("Server is stopping for maintenance" 곡지)
                    β”‚
                    β–Ό
[μ„Έμ΄λΈŒ ν”ŒλŸ¬μ‹œ (Force Flush)] (RCON Save μ»€λ§¨λ“œ μ‹€ν–‰ 및 유예 λŒ€κΈ°)
                    β”‚
                    β–Ό
[μ»¨ν…Œμ΄λ„ˆ κ°•μ œ μ™„μ „ 쀑지 및 재배치] (docker-compose up -d --force-recreate)
                    β”‚
                    β–Ό
[REST API ν—¬μŠ€ 폴링 μ‹€ν–‰] (API 정상 응닡 감지 μ‹œκΉŒμ§€ STARTING μƒνƒœ κ³ μ •)
                    β”‚
                    β–Ό
[ONLINE μ „ν™˜ 및 30λΆ„ μΏ¨λ‹€μš΄ μ„€μ •] (ν˜„ν™©νŒ κ°±μ‹  및 λ””μŠ€μ½”λ“œ 둜그 전솑 μ™„λ£Œ)

2. 채널 이원화 섀계

  • λŒ€μ‹œλ³΄λ“œ 채널 (CHANNEL_ID): ν˜„ν™©νŒ λŒ€μ‹œλ³΄λ“œ μž„λ² λ“œμ™€ μ—…λ°μ΄νŠΈ μˆ˜λ™ μ‹€ν–‰ λ²„νŠΌλ§Œ κ³ μ • κ°€λ™λ©λ‹ˆλ‹€. 이 채널에 λ°œν–‰λ˜λŠ” μ œμ–΄ 곡지 λ“± μž„μ‹œ λ©”μ‹œμ§€λŠ” 15λΆ„(900초) ν›„ μžλ™ 자폭 μ‚­μ œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  • λ°±μ—…/둜그 μ „μš© 채널 (LOG_CHANNEL_ID): μ„Έμ΄λΈŒ λ°±μ—… κ²°κ³Ό, ꡬ글 λ“œλΌμ΄λΈŒ μ—…λ‘œλ“œ 보고, 만료 λ°±μ—… 정리, λ””μŠ€ν¬ μš©λŸ‰ κ²½κ³  λ“±μ˜ 기둝이 영ꡬ λ³΄κ΄€λ©λ‹ˆλ‹€.

3. μ„ΈλΆ€ μ΄λ²€νŠΈλ³„ 상황 μ „νŒŒ μ‹œν€€μŠ€

  • β‘  μ •κΈ° 점검/μ—…λ°μ΄νŠΈ 루틴: 점검 5λΆ„ μ „, 1λΆ„ μ „, 30초 μ „ RCON 방솑 및 곡지 μ†‘μΆœ βž” RCON Save 전솑 ν›„ 3~10초 ν”ŒλŸ¬μ‹œ λŒ€κΈ° βž” μ»¨ν…Œμ΄λ„ˆ μ •μ§€ βž” 둜컬 및 ꡬ글 λ“œλΌμ΄λΈŒ λ°±μ—… βž” docker-compose pull 및 up -d --force-recreate μ‹€ν–‰.
  • β‘‘ μ„Έμ΄λΈŒ λ°±μ—… 및 ꡬ글 λ“œλΌμ΄λΈŒ 볡사 보고: 둜컬 .tar.gz 생성 μ™„λ£Œ ν›„ Rclone μ—…λ‘œλ“œ κ²°κ³Όλ₯Ό ν•˜λ‚˜μ˜ 톡합 λ©”μ‹œμ§€λ‘œ λ°œμ†‘.
  • β‘’ μ„œλ²„ λ””μŠ€ν¬ 슀페이슀 초과 μ‘°κΈ° 경보: 12μ‹œκ°„ 주기둜 λ””μŠ€ν¬ μ‚¬μš©λ₯  진단 βž” 80% 초과 μ‹œ 적색 κ²½κ³  μž„λ² λ“œ μ†‘μΆœ.
  • β‘£ μ„€μ •κ°’ μˆ˜λ™ 일괄 λ³€κ²½ 이쀑 검증 (/μ„€μ •λ³€κ²½): μž…λ ₯ ν‚€ μœ νš¨μ„± 검증 βž” 승인 λ²„νŠΌ νŒ¨λ„ μ†‘μΆœ βž” 승인 μ‹œ μ„Έμ΄λΈŒ μ €μž₯, λ°±μ—…, μž¬κΈ°λ™ μ‹€ν–‰.
  • β‘€ 4μ‹œκ°„ μ •κΈ° 채널 μ •λˆ νƒœμŠ€ν¬ (scheduled_4hr_clean_task): 4μ‹œκ°„λ§ˆλ‹€ channel.pins() νŒŒμ‹± βž” κ³ μ • λ©”μ‹œμ§€ 및 ν™œμ„±ν™”λœ λŒ€μ‹œλ³΄λ“œλ₯Ό μ œμ™Έν•œ μž„μ‹œ λ©”μ‹œμ§€ 일괄 μ²­μ†Œ.

11. 1:1 DM 기반 λŒ€ν™”ν˜• .env μ„€μ • 관리 및 λ‘€λ°± μ‹œμŠ€ν…œ

λ””μŠ€μ½”λ“œ λ΄‡κ³Όμ˜ 1:1 개인 λ©”μ‹œμ§€(DM)λ₯Ό μ‚¬μš©ν•˜μ—¬ 가상 μ„œλ²„μ˜ κ²Œμž„ μ„€μ •(.env)을 μ•ˆμ „ν•˜κ²Œ μ‘°νšŒν•˜κ³  직접 ꡐ체 및 λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

[κ΄€λ¦¬μž DM] ───(".env" / "μ„€μ •" λ©”μ‹œμ§€ 전솑)───► [PalworldBot]
                                                    β”‚
[κ΄€λ¦¬μž DM] ◄───(ν˜„μž¬ 적용 쀑인 .env 파일 λ°œμ†‘)β”€β”€β”€β”€β”€β”˜
     β”‚
     β–Ό (μˆ˜μ •λœ .env νŒŒμΌμ„ DM 창에 λ“œλž˜κ·Έ μ•€ λ“œλ‘­ μ—…λ‘œλ“œ)
[PalworldBot]
     β”‚
     β”œβ”€β–Ί 1. κΈ°μ‘΄ .envλ₯Ό .env.bak으둜 μž„μ‹œ λ°±μ—… 보관
     β”œβ”€β–Ί 2. 이전 μ„€μ •κ³Ό μ‹ κ·œ μ„€μ • 변경점(Diff) μ •λ°€ λŒ€μ‘° 및 μž„λ² λ“œ 좜λ ₯
     β”œβ”€β–Ί 3. RCON "Broadcast" 및 "Save" λͺ…λ Ή 전솑 (ν”ŒλŸ¬μ‹œ 유예 λŒ€κΈ°)
     β”œβ”€β–Ί 4. μ•ˆμ „ λ°±μ—…(run_backup) μ‹€ν–‰ 및 ꡬ글 λ“œλΌμ΄λΈŒ 전솑
     β”œβ”€β–Ί 5. docker-compose up -d --force-recreate 무쀑단 재배치
     └─► 6. 재배치 μ—λŸ¬ λ°œμƒ μ‹œ .env.bak 파일둜 μžλ™ λ‘€λ°± (Rollback)

12. μ‹€μ‹œκ°„ 운영 및 λͺ¨λ‹ˆν„°λ§ λͺ…λ Ήμ–΄ κ°€μ΄λ“œ

1. 봇 μ„œλΉ„μŠ€ κ΄€λ ¨ μ œμ–΄ λͺ…λ Ήμ–΄

λ””μŠ€μ½”λ“œ 봇은 가상 μ„œλ²„κ°€ 켜질 λ•Œ μžλ™ μ‹€ν–‰λ˜λŠ” systemd μ„œλΉ„μŠ€λ‘œ λ“±λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

  • 봇 μƒνƒœ 확인:

    sudo systemctl status palbot.service

  • 봇 μž¬μ‹œμž‘:

    sudo systemctl restart palbot.service

2. 봇 둜그 μ‹€μ‹œκ°„ 좔적 (λͺ¨λ‹ˆν„°λ§)

λ°±μ—… μ§„ν–‰ 상황, Rclone 연동 μƒνƒœ, μ ‘μ†μž λ³€κ²½ 감지, λ©”λͺ¨λ¦¬/λ””μŠ€ν¬ κ²½κ³  둜그λ₯Ό λͺ¨λ‹ˆν„°λ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ‹€μ‹œκ°„ 둜그 μ§€μΌœλ³΄κΈ° (μ’…λ£Œ: Ctrl + C):

    tail -f /home/<μ‚¬μš©μž_계정λͺ…>/palworld/palworld_bot.log

3. 도컀 μ»¨ν…Œμ΄λ„ˆ μ œμ–΄ λͺ…λ Ήμ–΄

  • μ‹€ν–‰ 쀑인 μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘ 확인:

    docker ps

  • κ²Œμž„ μ„œλ²„ κ°•μ œ μ •μ§€:

    cd ~/palworld && docker-compose down

  • κ²Œμž„ μ„œλ²„ μž¬μƒμ„± μž¬κΈ°λ™:

    cd ~/palworld && docker-compose up -d --force-recreate


13. λ””μŠ€μ½”λ“œ μŠ¬λž˜μ‹œ λͺ…λ Ήμ–΄ κ°€μ΄λ“œ

봇을 μ„œλ²„μ— μ΄ˆλŒ€ν•  λ•Œ botκ³Ό applications.commands κΆŒν•œμ„ μ²΄ν¬ν–ˆλ‹€λ©΄ λ””μŠ€μ½”λ“œ μ±„λ„μ—μ„œ μŠ¬λž˜μ‹œ(/)λ₯Ό μž…λ ₯ν•΄ 관리 λͺ…λ Ήμ–΄λ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. (ADMIN_IDS에 λ“±λ‘λœ κ΄€λ¦¬μž μ „μš©)

  • /start: μ •μ§€λœ νŒ°μ›”λ“œ μ„œλ²„λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.
  • /stop: μΈκ²Œμž„ μ•ˆλ‚΄ 방솑 μ†‘μΆœ ν›„ μ €μž₯을 거쳐 μ„œλ²„λ₯Ό μ•ˆμ „ν•˜κ²Œ μ •μ§€ν•©λ‹ˆλ‹€. (μ•½ 10초 μ†Œμš”)
  • /restart: μΈκ²Œμž„ 방솑 βž” μ €μž₯을 거쳐 μ•ˆμ „ 백업을 μˆ˜ν–‰ν•œ ν›„ 도컀 μ»¨ν…Œμ΄λ„ˆλ₯Ό μž¬λ°°μΉ˜ν•˜μ—¬ μž¬μ‹œμž‘ν•©λ‹ˆλ‹€.
  • /backup: νŒ°μ›”λ“œ μ„Έμ΄λΈŒ 데이터λ₯Ό μ¦‰μ‹œ μ €μž₯을 거쳐 타λ₯΄ μ••μΆ•ν•œ ν›„ 둜컬 λ°±μ—… 폴더 및 ꡬ글 λ“œλΌμ΄λΈŒλ‘œ λ™μ‹œ μˆ˜λ™ λ°±μ—…ν•©λ‹ˆλ‹€.
  • /clean: 채널 상단 κ³ μ •(Pinned) λ©”μ‹œμ§€ 및 λŒ€μ‹œλ³΄λ“œλ₯Ό μ œμ™Έν•œ μž„μ‹œ λ©”μ‹œμ§€λ“€μ„ μ‚­μ œ μ •λ¦¬ν•©λ‹ˆλ‹€.
  • /λ””μŠ€ν¬: ν˜„μž¬ μ„œλ²„μ˜ 전체 λ””μŠ€ν¬ μš©λŸ‰, μ‚¬μš© 쀑인 μš©λŸ‰, μ‚¬μš©λ₯ (%)을 μ‹€μ‹œκ°„ μž„λ² λ“œλ‘œ μ‘°νšŒν•©λ‹ˆλ‹€.
  • /μ„€μ •λ³€κ²½ :
    • μ‚¬μš© 예: /μ„€μ •λ³€κ²½ query:EXP_RATE=2.0, CATCH_RATE=1.5
    • .env 섀정값을 λ³€κ²½ν•˜κ³  λ³€κ²½ λ‚΄μ—­ 확인 μž„λ² λ“œ 및 승인 λ²„νŠΌμ„ 톡해 μ•ˆμ „ν•˜κ²Œ 반영 ν›„ μ„œλ²„λ₯Ό μž¬μ‹œμž‘ν•©λ‹ˆλ‹€.

지원

버그 μ‹ κ³  및 κΈ°λŠ₯ κ°œμ„  μ œμ•ˆμ€ GitHub Issueλ₯Ό μ΄μš©ν•΄ μ£Όμ„Έμš”.
μ„€μΉ˜ λ˜λŠ” 운용 쀑 λ¬Έμ œκ°€ λ°œμƒν•  경우 palworld_bot.log 파일의 μ˜ˆμ™Έ 둜그 내역을 ν•¨κ»˜ 첨뢀해 μ£Όμ‹œλ©΄ μ‹ μ†ν•œ 뢄석이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages