1μΈμ© Claude Code λ°μ΄λΈ μ½λ© μλν λꡬ
Claude Codeλ‘ μ½λλ₯Ό μμ±νκ³ AWS EC2μ λ°°ν¬Β·μ§λ¨Β·μμ νλ λ°λ³΅ μ¬μ΄ν΄μ ν νλ©΄μμ μ²λ¦¬νκΈ° μν λ°μ€ν¬ν± λꡬ.
μ΄ λꡬλ νμ¬ nullnull.co.kr β μ¨λΌμΈ κ°μ μμ νλ§€ μλΉμ€ β μ AWS EC2 λ°±μλ μ΄μμ μ€μ λ‘ μ¬μ©λκ³ μμ΅λλ€. λΉλ β SFTP μ
λ‘λ β deploy.sh μ¬κΈ°λ β journalctl λ‘κ·Έ λͺ¨λν°λ§ β ERROR λ°μ μ Claude λΆμ μμ²κΉμ§μ μΌμ μ΄μ 루νλ₯Ό Sidabari ν νλ©΄μμ μ²λ¦¬ν©λλ€. λ°λͺ¨/μ€νμ©μ΄ μλ νλ‘λμ
μ΄μ λκ΅¬λ‘ λ§€μΌ μ¬μ© μ€μ
λλ€.
ν νλ©΄μ λ©μΈ Claude Code Β· EC2 SSH Β· μμ€ν μ§λ¨ λμ보λ Β· λꡬ μ½μμ΄ ν¨κ». λΉλΒ·μ λ‘λΒ·λ°°ν¬ μλνμ ERROR κ°μ§ ν μ§λ¨ 루νκΉμ§ λκΉ μμ΄ μ§ν. (μ μ€ν¬λ¦°μ·μ nullnull.co.kr LMS λ°±μλ μ΄μ μ€ μΊ‘μ²)
μ΄ νλ‘μ νΈμ λͺ¨λ μ½λμ λ¬Έμλ Claude Codeκ° 100% μμ±Β·μ μ§λ³΄μν©λλ€. μΈκ° νμ μ(
cx8537)λ μꡬμ¬ν μ μΒ·μ¬μ κ²°μ Β·μ¬μ©μ ν μ€νΈΒ·λ°©ν₯ κ²ν λ₯Ό λ΄λΉνμΌλ©°, λ¨ ν μ€μ μ½λλ μ§μ μλμ§ μμμ΅λλ€.
| μν | λ΄λΉ |
|---|---|
| μ½λ μμ± / 리ν©ν λ§ / μ μ§λ³΄μ | Claude Code (μ£Όλ‘ Claude Opus 4.7 1M context, μΌλΆ Sonnet) |
λͺ¨λ λ¬Έμ (README.md, SIDABARI_SPEC.md, CLAUDE.md, docs/**) |
Claude Code |
| μ¬μ κ²°μ Β· μꡬμ¬ν Β· UX νλ¨ Β· κ²μ | cx8537 (μΈκ°) |
| λΌμ΄μ μ€/μ μκΆ λ³΄μ | cx8537 (μ¬μ©μκ° λꡬλ₯Ό ν΅ν΄ μμ±ν κ²°κ³Όλ¬Όμ κΆλ¦¬) |
λ§€ μΈμ
μμ μ CLAUDE.mdκ° μ λ μμΉ(μΆμΈ‘ κΈμ§Β·μλ μ¬μλ κΈμ§Β·λ³΄μ κ·μΉ λ±)μΌλ‘ μ μ©λλ©°, μ κΈ°λ₯ μΆκ°λ λ²κ·Έ μμ λ λͺ¨λ κ°μ κ·μΉ μλ Claude Codeκ° μνν©λλ€. μ»€λ° λ©μμ§μλ Co-Authored-By: Claude νΈλ μΌλ¬λ‘ μΌκ΄ νκΈ°λ©λλ€.
Claude Code β λΉλ β SFTP μ
λ‘λ β deploy.sh β λ‘κ·Έ λͺ¨λν°λ§ β ERROR κ°μ§ β μ§λ¨ β Claudeμ λΆμ μμ², μ΄ μ¬μ΄ν΄μ κΈ°κ³μ μΈ λΆλΆλ§ μλνν©λλ€. λΆμΒ·μ§λ¨Β·μμ κ²°μ μ νμ μ¬λμ΄ ν©λλ€.
ν΅μ¬ μ² ν:
- κΈ°κ³μ μμ μ μλν, νλ¨μ μ¬λ. Claudeλ λΆμΒ·μΆμ²λ§, μ€νμ μ¬λμ΄ κ²°μ .
- μλ μ¬μλ κΈμ§. μ€ν¨ μ μ¦μ λ©μΆκ³ μ¬λμ΄ νλ¨.
- κ°μ μ€λ¨ μ SSH μ±λμ μ μ§. κ°μ μΈμ μμ μμμ μΌλ‘ μ΄μ΄λ°κΈ°.
μμΈν λμ μ¬μμ SIDABARI_SPEC.md, μμ κ·μΉΒ·λ³΄μ μ μ± μ CLAUDE.mdλ₯Ό μ°Έκ³ νμΈμ.
μ²μλΆν° λ³ΈμΈ 1λͺ
μ¬μ©μ κ°μ νκ³ λ§λ λꡬμ
λλ€. κ°μ μν¬νλ‘μ° β Claude Codeλ‘ μ½λ© β JVM/Spring Boot κ°μ λ°±μλλ₯Ό AWS EC2(systemd)μ SFTPλ‘ μ¬λ € deploy.sh μ¬κΈ°λ β journalctl λ‘κ·Έ λͺ¨λν°λ§ β ERROR μ§λ¨ β μ μ°λ λ€λ₯Έ λΆμ΄λΌλ©΄ κ·Έλλ‘ μ°κ±°λ ν¬ν¬ν΄ λ³ΈμΈ νκ²½μ λ§κ² μλ³΄μ€ μ μμ΅λλ€. MIT λΌμ΄μ μ€λ‘ 곡κ°ν©λλ€.
λ£° μμ§ κ°μ μΌλ°ν λ©μ»€λμ¦μ μΌλΆλ¬ λμ§ μμμ΅λλ€. λμμ΄ μ½λμ μ§μ μ μλμ΄ μμ΄ λ³ΈμΈ μν¬νλ‘μ°μ λ§μΆ λ³κ²½μ΄ μ€νλ € μ¬μ΄ νΈμ λλ€ (μ¬μμ Β§1.3 μ°Έμ‘°).
- 4μμ ν¨λ λ μ΄μμ (μ’: λ©μΈ Claude / μ€μ: μΆκ° Claude ν / μ€ν: EC2 SSH λ©μΈ+μ§λ¨ / μ°: λꡬ μ½μ). λΆν Β·νλ‘ν Β·λνΉ μ§μ.
- λ‘컬 PTYλ‘ Claude Code μΈμ€ν΄μ€ μ€ν (
portable-pty+ ConPTY/Unix PTY μΆμ). - SSH/SFTP λ©μΈ+μ§λ¨ μ±λ λΆλ¦¬ (
russh, νΈμ€νΈν€ TOFU κ²μ¦). - λΉλ β μ λ‘λ β λ°°ν¬ μλ μ€ν + λ¨κ³λ³ κ°μ μ€λ¨ (Ctrl+C μ μ‘, μ±λ μ μ§).
- ERROR μλ κ°μ§ (Log4j2
[ERROR]+Caused byμ 체 체μΈ). - EC2 μ§λ¨ ν¨λ [μλ£ μΌκ΄ μμ§] + μμ€ν μ§λ¨ λμ보λ (1λΆ μλκ°±μ ν κΈ).
- μ§λ¨ μ μ© SSH ν€ + μλ² ForceCommand ν¨ν΄μΌλ‘ Claudeμ μμ¨ μ§λ¨μ μμ νκ² (μμ€ν λ³κ²½ 물리μ μΌλ‘ λΆκ°λ₯).
- Claude Code ν ν΅ν© (Stop/Pre/PostToolUse/Notification/SessionStart) β ν¨λλ³ νμ±λ/λꡬ κ°μν, λ°μ€ν¬ν± μλ¦Ό, μν λꡬ κ²μ΄νΈ, κ°μ¬ λ‘κ·Έ(SQLite).
- Tauri command κ²μ¦ +
permissions.deny > permissions.allow+ autoMode λΆλ₯κΈ° ν΅ν©.
μΆκ° λΌμ΄λΈλ¬λ¦¬: xterm.js v6, react-resizable-panels, react-rnd, @fontsource-variable/geist, @tauri-apps/api Β· plugin-clipboard-manager Β· plugin-dialog Β· plugin-notification Β· plugin-window-state.
μΆκ° crate: portable-pty, russh Β· russh-keys Β· russh-sftp, serde Β· serde_json, notify, ssh-key (ed25519), rand_core, sha2, async-trait, uuid.
- Node.js: 20 μ΄μ κΆμ₯ (κ°λ°μ 24.x κ²μ¦λ¨)
- Rust toolchain: stable (
rustupκΆμ₯). Windowsλ MSVC λΉλ λꡬ + WebView2. - OS: 1μ°¨ κ²μ¦μ Windows 11. macOS/Linuxλ μ½λμ νΈνλλ λ―Έκ²μ¦.
- Claude Code CLI:
claudeλͺ λ Ήμ΄ PATHμ μμ΄μΌ λ©μΈ/μΆκ° Claude ν¨λμμ μλ spawn κ°λ₯. - EC2: SSH μ μ κ°λ₯ν μΈμ€ν΄μ€ + (μ ν) μ§λ¨ μ μ© ν€ μ€μΉλ₯Ό μν sudo κΆν.
# 1) μμ‘΄μ± μ€μΉ
npm install
# 2) Rust + WebView2 λ± Tauri μ¬μ μꡬμ¬ν μ κ²
npx @tauri-apps/cli info
# 3) κ°λ° λͺ¨λ μ€ν (vite dev + Rust μ»΄νμΌ + Tauri μλμ°)
npm run tauri devλΉ λ₯Έ λΉλ νμΈλ§ νμνλ©΄:
npm run build # tsc + vite νλ‘ νΈμλ λΉλ
cargo check --manifest-path src-tauri/Cargo.tomlnpm run tauri buildμ°μΆλ¬Ό μμΉ (Windows κΈ°μ€):
src-tauri/target/release/sidabari.exeβ λ¨μΌ μ€ννμΌsrc-tauri/target/release/bundle/β MSI / NSIS μΈμ€ν¨λ¬
Sidabari/
βββ src/ # React νλ‘ νΈμλ
β βββ components/
β β βββ layout/ # MainLayout, MainToolbar
β β βββ panels/ # 4μμ ν¨λ μ»΄ν¬λνΈ
β β βββ terminal/ # PtyTerminal, SshTerminal (xterm λνΌ)
β β βββ modals/ # SettingsModal, GateModal, DiagSetupModal
β β βββ monitor/ # HookBridge (Claude Code ν
λ―Έλ¬λ§)
β β βββ dashboard/ # DiagnosticDashboard
β βββ lib/ # ssh, pty, config, parseDiagnostic λ± IPC λνΌ
β βββ store/ # Zustand μ μ μν
βββ src-tauri/ # Rust λ°±μλ
β βββ src/
β βββ pty.rs # λ‘컬 PTY (portable-pty)
β βββ ssh.rs # SSH μ
Έ (russh)
β βββ ssh_exec.rs # SSH exec / ν€λλ¦¬μ€ collect
β βββ sftp.rs # SFTP μ
λ‘λ (sha256 κ²μ¦)
β βββ build.rs # λ‘컬 λΉλ λͺ
λ Ή spawn
β βββ config.rs # μ€μ load/save (TOML)
β βββ hooks_bus.rs # Claude Code ν
IPC (events.jsonl + req/resp)
β βββ audit_log.rs # SQLite κ°μ¬ λ‘κ·Έ
β βββ claude_safety.rs # .claude/settings.local.json deny κ·μΉ
β βββ diag_setup.rs # μν΄λ¦ μ§λ¨ ν€νμ΄ + ForceCommand μ
μ
β βββ diag_ssh_allow.rs # autoMode allow ν¨ν΄ λ±λ‘
βββ docs/
β βββ ec2-diag-setup/ # μλ² μΈ‘ install.sh, sidabari-collect.sh
βββ branding/
β βββ sidabari-icon-source.png # μμ΄μ½ μλ³Έ (1024Γ1024)
βββ CLAUDE.md # μμ
μ λ μμΉ + 보μ κ°μ΄λ + UI κ°μ΄λ
βββ SIDABARI_SPEC.md # λμ μ¬μμ
βββ README.md
- μμΉ (OS νμ€):
- Windows:
%APPDATA%\sidabari\sidabari.toml - macOS:
~/Library/Application Support/sidabari/sidabari.toml - Linux:
~/.config/sidabari/sidabari.toml
- Windows:
- μ± λ΄ [μ€μ ] λͺ¨λ¬μμ νΈμ§ (ν: μΌλ° / μλ² / λΉλΒ·λ°°ν¬ / λͺ¨λν°λ§ / μμ€ν μ§λ¨).
- PEM ν€λ κ²½λ‘λ§ μ μ₯ β ν€ λ΄μ©μ λ©λͺ¨λ¦¬μλ§ λ‘λ. λ‘κ·Έμ μ격μ¦λͺ μ μ°ν.
- μ€μ λ³κ²½ ν [μ¬μμ] λλ μλ μ¬μμ ν κΈλ‘ λͺ¨λ Claude PTY μΌκ΄ μ¬μμ (
.claude/settings.local.jsonμ¦μ λ°μ).
μ€ν€λ§ λ νΌλ°μ€λ SIDABARI_SPEC.md Β§5.2, μ½λλ src-tauri/src/config.rs / src/lib/config.ts.
μ§λ¨ μ μ© SSH ν€ + μλ² μΈ‘ ForceCommandλ‘ μ κ·Ό μ±λμ λ§λ€λ©΄, Claudeμ [μμ€ν
λ°μ΄ν° μμ§] λͺ
λ Ήμ΄ μμ¨μ μΌλ‘ SSH μ μν΄ μ§λ¨ μλ£λ₯Ό μμ§ν΄λ μμ€ν
λ³κ²½μ΄ 물리μ μΌλ‘ λΆκ°λ₯ν©λλ€.
μ±μ [μ€μ ] β [μμ€ν μ§λ¨] β [μν΄λ¦ μ§λ¨ μ μ ] λ²νΌμΌλ‘ μΌκ΄ μ²λ¦¬:
- λ‘컬μ
~/.ssh/sidabari-diaged25519 ν€νμ΄ μμ±/μ¬μ¬μ© - SFTPλ‘ μλ²μ
install.sh+sidabari-collect.shμ λ‘λ - μλ²μμ sudoers / sshd
Match User/authorized_keyscommand="..."μλ ꡬμ±
μΈλΆ λμμ docs/ec2-diag-setup/README.md μ°Έμ‘°.
- μ격μ¦λͺ /ν€ νμΌ λ΄μ©μ λ©λͺ¨λ¦¬μλ§, λ‘κ·ΈΒ·μ€μ Β·DBμ μ λ€μ΄κ°.
- μ¬μ©μ μ λ ₯μ μ Έ λͺ λ Ή λ¬Έμμ΄λ‘ μ§μ μ‘°ν©νμ§ μμ (λ¬μ ꡬ쑰ν API μ¬μ©).
- SSH νΈμ€νΈ ν€ TOFU κ²μ¦ (μλ μλ½ λͺ¨λ X).
- Tauri command μ λ ₯ κ²μ¦ + μν λꡬ κ²μ΄νΈ λͺ¨λ¬.
- κ°μ¬ λ‘κ·Έ (SQLite) κΆν
0600. - μμΈν μ μ± : CLAUDE.md Β§1.2.
| λ¬Έμ | μ©λ |
|---|---|
| SIDABARI_SPEC.md | λμ μ¬μμ (μν¬νλ‘μ° / UI / μ€μ μ€ν€λ§) |
| CLAUDE.md | μμ κ·μΉΒ·λ³΄μ κ°μ΄λΒ·UI μ€νμΌ κ°μ΄λ (Claude Code μμ μ 1μ°¨ μ°Έμ‘°) |
| docs/ec2-diag-setup/README.md | EC2 μ§λ¨ ν€ + ForceCommand μ μ μμΈ |
- 1μ°¨ UI + ν΅μ¬ μν¬νλ‘μ° + Claude Code ν ν΅ν© + μ§λ¨ λμ보λκΉμ§ ꡬν μλ£.
- νλ‘μ νΈλ νλ°ν λ³κ²½ μ€ β μ¬μμκ° 1μ°¨ μ°Έμ‘°, μ΄ READMEλ μμ½.
MIT License. LICENSE νμΌ μ°Έμ‘°.
μ΄ νλ‘μ νΈκ° μ μ©νμ ¨λ€λ©΄ κ·Έλλ‘ μ°μ λ, ν¬ν¬ν΄μ λ³ΈμΈ νκ²½μ λ§κ² μ보μ λ, μμ μ μΌλ‘ νμ©νμ λ μμ λ‘μ΅λλ€. λ€λ§ μν κ°λ₯μ±μ΄ μλ λꡬ(SSH/SFTP/μ격 λͺ λ Ή μ€ν)μ΄λ―λ‘ λ¬΄λ³΄μ¦(AS IS) μ‘°νμ μΆ©λΆν μΈμ§νκ³ μ¬μ©ν΄ μ£ΌμΈμ.





