---
title: "erpc worker로 첫 앱을 서버에 배포하기"
description: "erpc worker로 HelloWorld 앱을 만들어 이 머신에서 실행하고, ERPC VPS 또는 직접 보유한 서버에 배포합니다."
canonical: "https://erpc.global/ko/doc/erpc-cli/worker-quickstart/"
locale: "ko"
---

# erpc worker로 첫 앱을 서버에 배포하기

`erpc worker`를 사용해 Rust로 작은 HTTP API를 만들어 이 머신에서 실행하고, 명령 네 개로 서버에 배포합니다.

이 페이지는 프리릴리스인 ERPC CLI `v0.1.0-rc.4`를 설명합니다.

`erpc worker`(별칭 `erpc w`)는 앱을 네이티브 Linux 바이너리로 컴파일해 ERPC VPS, 새 시간별 과금 VPS, 또는 직접 보유한 서버에서 보안이 강화된 systemd 유닛으로 실행합니다. 그 사이에 Docker도 런타임도 두지 않습니다.

정상 상태로 올라오지 않는 릴리스는 이전 릴리스로 롤백되며, 여러 앱이 각자의 포트를 사용해 서버 하나를 함께 쓸 수 있습니다. 앱에 관한 모든 것은 앱 루트의 `erpc.toml`에 있습니다. 이 파일은 시크릿을 담지 않으며 커밋할 수 있습니다.

## 사전 요구 사항

- **ERPC 계정**: 이 머신에서 `erpc login`으로 로그인되어 있어야 합니다([로그인 및 키](https://erpc.global/ko/doc/erpc-cli/sign-in-and-keys/)).
- **ERPC Credit**: 새 시간별 과금 VPS에 필요합니다. 시간별 과금 상품은 미리 구매한 ERPC Credit으로 결제되며, Credit으로 충당할 수 없으면 시작이 거부됩니다. 가격은 [요금제](https://erpc.global/ko/price/)와 [ERPC Web Dashboard](https://dashboard.erpc.global/ko)에 나와 있습니다.
- **SSH 키**: 이 머신에 있어야 합니다. `ssh-keygen -t ed25519`로 만들거나, 가지고 있는 키는 `erpc config set ssh_key <path>.pub`로 지정하세요.
- **Linux용으로 빌드할 수단.** Mac이나 Windows에서는 서버용 Rust 타깃(`rustup target add x86_64-unknown-linux-gnu`), `zig`(macOS에서는 `brew install zig`), `cargo-zigbuild`(`cargo install cargo-zigbuild --locked`)가 필요합니다. 서버와 같은 종류의 Linux 머신(ERPC 서버는 모두 x86-64)에서는 cargo 외에 아무것도 필요 없습니다. 크로스 빌드 도구가 없으면 앱은 이 머신의 툴체인으로 빌드되며, 이때 바이너리는 링크될 때 사용한 glibc를 필요로 합니다. 그 glibc는 `build`와 `deploy`가 알려 줍니다. 크로스 빌드 도구가 있으면 glibc 2.31 이상용으로 빌드됩니다.

## HelloWorld 배포하기

HelloWorld는 키도, 시크릿도, 데이터 회선도 필요 없는, Rust로 작성한 작은 HTTP API입니다. `GET /`, `GET /hello/{name}`, `GET /healthz`에 응답합니다.

```bash
erpc worker init --template helloworld   # makes ./hello-world
erpc worker run hello-world              # here: curl http://127.0.0.1:3000/
erpc worker deploy hello-world           # your VPS, or a new hourly one (price asked first)
erpc worker api / --dir hello-world      # {"message":"Hello, World!",…} from the server
```

1. `init`은 `./hello-world`에 앱을 만들고, 그 `erpc.toml`도 함께 만듭니다.
2. `run`은 앱을 빌드해 이 머신에서 실행하므로, 먼저 curl로 호출해 볼 수 있습니다.
3. `deploy`는 앱을 서버용으로 빌드해 배포합니다. 비용이 드는 것은 모두 시간당 가격, 잔액, Credit으로 얼마 동안 쓸 수 있는지와 함께 먼저 표시되며, 터미널에서는 yes로 답한 뒤에만 시작합니다.
4. `api`는 API를 서버의 loopback에 그대로 둔 채, 배포된 앱의 API를 이 머신에서 호출합니다.

`erpc worker check`는 앱에 빠진 것을 나열하며, 빠진 것이 있으면 `deploy`는 무엇이든 구매하기 전에 거부합니다. `erpc worker build`는 빌드만 실행합니다. 서버를 구매하기 전에 빌드가 실패하는지 확인하는 방법입니다.

## 템플릿 선택하기

`erpc worker init`이 묻는 것은 무엇을 만들지 하나뿐이며, 화살표 키로 고릅니다.

- **HelloWorld**는 처음 시작하기에 알맞은 템플릿입니다.
- **HFT**와 **pumpfun-bot**은 현재로서는 둘 다 pumpfun 템플릿으로 만들어집니다. ValidatorsDAO/solana-stream에서 이식한 pump.fun(PumpSwap) 트레이딩 봇입니다.

`--template hft`(또는 `helloworld`, `pumpfun-bot`, 템플릿 id)를 지정하면 선택 화면을 건너뛰며, `--name`은 앱의 이름을 정합니다. 이름이 없으면 앱은 선택한 항목의 이름(`hello-world`, `hft-bot`, `pumpfun-bot`)을 따릅니다. 같은 이름의 디렉터리가 이미 있으면 사람이 고르는 경우에는 `-2`, `-3` 등이 붙고, 스크립트(`--yes`, `--json`, 터미널 없음)에서는 오류가 발생합니다. 물어볼 사람이 없고 `--template`도 없으면 HelloWorld가 만들어집니다.

트레이딩 봇은 실행하기 전에 키와 몇 가지 설정이 필요합니다. 순서는 다음과 같습니다.

```bash
erpc login                             # once per machine: the session in 1Password or the keychain
erpc worker init                       # pick with the arrow keys; makes ./<name> with erpc.toml
cd <name>
erpc worker key new                    # the trading key, in 1Password, the keychain or the keystore; prints the public key to fund
erpc worker secret put API_TOKEN --generate          # the bot's own API token, made for you and shown to nobody
erpc worker secret put ERPC_API_KEY --from-account   # the account's RPC key, read from your account (or SOLANA_RPC_ENDPOINT in [vars])
erpc worker check                      # what erpc.toml describes, and what is missing
erpc worker run --grpc --ip <IPV4>     # build and run here, with an hourly gRPC line letting this machine in
erpc worker run --check --grpc --ip <IPV4>   # the same, stopped once healthy
erpc worker deploy --new-vps --grpc    # a new hourly VPS and gRPC line, prices asked first
```

`init`은 만든 앱에 맞춰 이 순서를 출력합니다. 키와 시크릿을 어디에 보관하는지는 [키 및 시크릿](https://erpc.global/ko/doc/erpc-cli/worker-secrets/)에서 다룹니다.

## 서버 선택하기

`deploy`는 다음 중 첫 번째로 해당하는 것을 사용합니다.

1. 앱의 `[env.<name>]`에 이미 지정된 서버
2. `--vps <id>`: 계정의 ERPC VPS
3. `--new-vps`: 이 머신의 시간대로 판단해 가장 가까운 리전에서 가장 저렴한 시간별 과금 VPS(`--region`과 `--plan`으로 다르게 고를 수 있습니다)
4. `--host <address>`: 직접 보유한 서버. systemd, nftables, `sudo`, 그리고 `/usr/bin/python3`의 Python 3이 있는 Ubuntu 또는 Debian이어야 하며, root 또는 비밀번호 없이 sudo를 쓸 수 있는 사용자로 접속합니다.
5. 그 밖의 경우, 터미널에서는 계정에서 실행 중인 VPS 목록이 표시되고 맨 끝에 "start a new one"이 있습니다.

직접 보유한 서버에서는 worker의 방화벽이 SSH와 앱의 포트를 제외한 모든 들어오는 연결을 드롭하므로, 그 밖의 서비스를 제공하는 서버는 사용하기에 적합하지 않습니다.

## 터미널 앞에 사람이 없을 때 배포하기

스크립트나 `erpc ai` 같은 에이전트에는 응답할 터미널이 없습니다. 그래도 플래그 두 개로 작업을 진행할 수 있습니다.

```bash
erpc worker deploy hello-world --new-vps --yes                     # no key: all the way, unattended
erpc worker deploy pump-sniper --new-vps --grpc --yes --prepare    # a bot: everything but its key
erpc worker deploy pump-sniper                                     # then you, at a terminal: the key, and the start
```

- **`--yes`는** 명령이 지정한 각 시간별 과금 상품(`--new-vps`, `--grpc`, `--shreds`, `--unlimited`)의 가격에 응답합니다. erpc가 아직 키 전용으로 만들지 않은 서버, 즉 새 서버나 `--vps <ID>`로 지정한 서버에 대한 첫 로그인에도 응답합니다. erpc는 서버의 비밀번호로 한 번 로그인해 사용자의 키를 넣고 비밀번호 로그인을 끕니다. `--yes`도 터미널도 없으면 무엇이든 구매하기 전에 시작이 거부되며, 종료 상태는 3입니다.
- **여러 서버 중에서 고르는 일에는 여전히 사람이 필요합니다.** `--new-vps`, `--vps <ID>`, `--host`로 서버를 지정하세요.
- **`--prepare`는** 트레이딩 키도 시크릿도 필요 없는 작업을 모두 수행하며, 아무것도 시작·중지·재시작하지 않습니다. 다음에 터미널에서 `erpc worker deploy`를 실행하면 키와 시크릿을 넘기고 앱을 시작합니다. 트레이딩 키는 터미널 앞에 사람이 있을 때만 읽습니다.

## 앱을 gRPC, Shreds, Unlimited RPC에 연결하기

ERPC의 시간별 회선은 서버를 주소로 허용하며 토큰을 받지 않습니다. 회선마다 `deploy`의 플래그가 하나씩 있어 그 플래그로 해당 서버용 회선이 시작되고, 앱은 그 엔드포인트를 설정으로 받습니다.

| 플래그 | 회선 | 앱이 받는 설정 |
| --- | --- | --- |
| `--grpc` | Geyser gRPC | `GRPC_ENDPOINT` |
| `--shreds` | Shreds (Shredstream gRPC) | `SHREDS_ENDPOINT` |
| `--unlimited` | 서버 리전의 Unlimited RPC | `SOLANA_SEND_RPC_ENDPOINT` |

- `--grpc-plan`, `--shreds-plan`, `--unlimited-plan`으로 요금제를 지정하지 않는 한, 각 회선에는 같은 계열에서 가장 저렴한 것이 사용됩니다.
- Unlimited RPC는 준비되기까지 최대 45분이 걸리는 전용 서버에서 실행됩니다. `sendTransaction`과 소수의 읽기 메서드를 제공하며, `getProgramAccounts`나 `getTokenAccountsByOwner`는 제공하지 않습니다. 엔드포인트는 일반 HTTP(TLS 없음)이며, 화이트리스트에 등록된 주소만 허용합니다.

### 이 머신에서 실행할 때의 회선

`erpc worker run`도 `--grpc`와 `--shreds`를 받으므로, 앱을 서버로 보내기 전에 여기서 실제 데이터로 시험해 볼 수 있습니다.

- **주소:** 회선은 이 머신의 공인 IPv4 주소를 허용하며, 그 주소는 `--ip`로 전달합니다. erpc가 직접 조회하지는 않습니다.
- **구매:** 새 회선은 가격이 표시된 뒤 터미널에서만 구매됩니다. `run`에는 `--yes`가 없습니다.
- **종료:** 실행이 끝나면 각 시간별 회선은 확인을 거친 뒤 종료됩니다. `--keep-lines`를 주면 회선이 유지되며 계속 과금됩니다. 실행이 다른 방식으로 끝나면(터미널을 닫거나 Ctrl-C를 한 번 더 누른 경우) 회선은 남아 있고 과금됩니다.
- **수치:** 여기서 앱이 측정하는 값에는 이 머신에서 회선까지의 거리가 포함되므로, 회선 가까이에 있는 서버에서 실행하는 같은 앱보다 느립니다.

## 다음 단계

- [앱 가져오기](https://erpc.global/ko/doc/erpc-cli/worker-import/): 이미 가지고 있는 앱을 언어에 관계없이 배포합니다.
- [키 및 시크릿](https://erpc.global/ko/doc/erpc-cli/worker-secrets/): 트레이딩 키와 시크릿을 서버의 디스크에 두지 않습니다.
- [방화벽 및 WAF](https://erpc.global/ko/doc/erpc-cli/worker-firewall-and-waf/): 공개 API를 WAF 뒤에 둡니다.
- [상태 및 요금 청구](https://erpc.global/ko/doc/erpc-cli/worker-status-and-billing/): 앱을 지켜보고 시간당 비용을 확인합니다.
