Synology๐ณ + OpenClaw๐ฆ
"์คํํด๋ก๋ฅผ ์๋๋ก์ง์ ์ค์นํด์ API์ Discord๊น์ง ์ฐ๋ํ๊ธฐ" ์ ๋๋ค ๐
์๋๋ก์ง๋ ๋ก์ปฌ llm์ ๋๋ฆฌ๊ธฐ์ HW ์ฌ์์ด ๋ถ์กฑํ๊ธฐ์ ์์ ๋ก Gemini API๋ฅผ ์ฐ๊ฒฐํ์ฌ OpenClaw๋ฅผ ๋์ ํด๋ณด๊ฒ ์ต๋๋ค.
์ปจํ ์ด๋ ๋งค๋์ - ๋ ์ง์คํธ๋ฆฌ ๊ธฐ๋ณธ ์ค์น
1. ์๋๋ก์ง - ์ปจํ ์ด๋ ๋งค๋์ - ๋ ์ง์คํธ๋ฆฌ

2. OpenClaw ์ด๋ฏธ์ง ๋ค์ด๋ก๋
๊ฒ์์ฐฝ์์ OpenClaw๋ฅผ ๊ฒ์ํ๋ฉด ๋ง์ ์ด๋ฏธ์ง๋ค์ด ๋์ต๋๋ค.
๊ฐ์ฅ ๋ณํ๊ฐ ๋ง์ alpine/openclaw๋ฅผ ๋ค์ด ๋ฐ๊ฒ ์ต๋๋ค.

3. ์ปจํ ์ด๋ ์์ฑ
์ด๋ฏธ์ง ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋๋ฉด ์ปจํ ์ด๋ ์์ฑ์ ํฉ๋๋ค.
์ปจํ ์ด๋ -> ์์ฑ ๋ฒํผ ํด๋ฆญ

๋ฆฌ์์ค ์ ํ์ ์๋๋ก์ง ์ฌ์ ๋ฐ ์คํํด๋ก ์ฉ๋์ ๋ง๊ฒ ์ ์ ํ ์ ํํด์ค๋๋ค.
OpenClaw๋ ๊ธฐ๋ณธ์ ์ผ๋ก 18789 ํฌํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ก์ปฌํฌํธ์ ์ปจํ ์ด๋ ํฌํธ(18789)๋ฅผ ๋ง์ถฐ์ค๋๋ค.

๋ค์ด ๋ฐ์ alpine/openclaw์ ๊ฒฝ์ฐ /home/node๋ฅผ ์๋๋ก์ง์์ ์์ฑํ /docker/openclaw ํด๋์ ๋งคํํฉ๋๋ค.

ํ๊ฒฝ๋ณ์๋ก PUID(1026), GUI(100)๋ฅผ ์ถ๊ฐํฉ๋๋ค.

์ปจํ ์ด๋ ์์ฑ์ ์๋ฃํฉ๋๋ค.


4. OpenClaw ์ค์ ํธ์ง
์์ง OpenClaw ์ค์ ์ด ๋ง์ณ์ง ์ํ๊ฐ ์๋๋ฏ๋ก ๋น๋ ํ ์คํ ์, ๊ฐ์ ์ข ๋ฃ ๋ฉ๋๋ค.
์ปจํ ์ด๋๋ฅผ ์ค๋จํ๊ณ ์ค์ ํ๊ธฐ ์ํด, ์๋๋ก์ง ํฐ๋ฏธ๋์ ์คํํ๊ณ SSH์ ์ ์ํฉ๋๋ค.
sudo -i
cd /volume1/docker/openclaw/.openclaw/
vim openclaw.json
openclaw.json์ OpenClaw์ ์ธ๋ถ ์ ์ ๊ด๋ จํ์ฌ ์ค์ ์ ๊ด๋ฆฌํฉ๋๋ค.
vim์์ iํค๋ก ํธ์ง๋ชจ๋๋ก ์ ํํ์ฌ ์ค์ ์ ์งํํฉ๋๋ค.
{
"gateway": {
"auth": {
"mode": "token",
"token": "{OpenClaw Token}"
},
"mode":"local",
"bind":"lan",
"controlUi": {
"allowedOrigins": [
"http://localhost:18789",
"http://127.0.0.1:18789",
"https://{URL}:18789"
]
}
},
"meta": {
"lastTouchedVersion": "2026.5.4",
"lastTouchedAt": "2026-05-06T08:11:39.681Z"
}
} OpenClaw๋ ๋ณด์ ๋๋ฌธ์ ์ธ๋ถ์ ๊ทผ์ ๋ํด ๋งค์ฐ ์๊ฒฉํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ localhost์ https๋ฅผ ํตํ ์ ๊ทผ๋ง์ด ํ์ฉ๋ฉ๋๋ค.
๋ง์ฝ, ๋ด๋ถ๋ง์์ http๋ก ์ ๊ทผ ์์๋
OpenClaw Gateway์ HTTP API๋ฅผ ์ด์ด์ฃผ๋ ์ค์ ์ธ
"http": {
"endpoints": {
"chatCompletions": { "enabled": true },
"responses": { "enabled": true }
}
}"dangerouslyDisableDeviceAuth": true
"allowInsecureAuth": true๋ฅผ ์ ์ฉํด์ค์ผ ํฉ๋๋ค.
๋ชจ๋ ์ ์ฉํ ์์๋ ์๋์ ๊ฐ์ต๋๋ค.
{
"gateway": {
"auth": {
"mode": "token",
"token": "{OpenClaw Token}"
},
"mode":"local",
"bind":"lan",
"http": {
"endpoints": {
"chatCompletions": {
"enabled": true
},
"responses": {
"enabled": true
}
}
},
"controlUi": {
"dangerouslyDisableDeviceAuth": true,
"dangerouslyAllowHostHeaderOriginFallback": true,
"allowedOrigins": [
"http://localhost:18789",
"http://127.0.0.1:18789",
"http://{IP}:18789",
"http://{URL}:18789"
]
}
},
"meta": {
"lastTouchedVersion": "2026.5.4",
"lastTouchedAt": "2026-05-06T08:11:39.681Z"
}
} ๋ณธ์ธ์ ๋คํธ์ํฌ ์ค์ ์ ๋ง๊ฒ ๊ตฌ์ฑํ์๋ฉด ๋ฉ๋๋ค.
vim์์ ์ ์ฅ ํ ๋๊ฐ๊ธฐ๋
:qw์ ๋๋ค.
chown -R 1000:1000 /volume1/docker/openclaw
์ต์ข ์ ์ผ๋ก ํด๋ ๊ถํ์ ๋ณ๊ฒฝํฉ๋๋ค.
Docker-Compose ํ๋ฐฉ์ ์ค์นํ๊ธฐ
1. NAS์ ํด๋ ๋ง๋ค๊ธฐ
File Station์ด๋ SSH์ ์ ์ํ์ฌ /volume1/docker์ openclaw ํด๋๋ฅผ ์์ฑํฉ๋๋ค.
/volume1
โโโ docker
โโโ openclaw
โโโ config
โโโ workspace
โโโ auth-secrets
mkdir -p /volume1/docker/openclaw/config
mkdir -p /volume1/docker/openclaw/workspace
mkdir -p /volume1/docker/openclaw/auth-secrets
OpenClaw ์ปจํ
์ด๋๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก node ์ฌ์ฉ์, uid 1000์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ๊ถํ์ ์์ ํด์ค๋๋ค.
(๊ณต์ ๋ฌธ์๋ bind mount ๊ถํ ๋ฌธ์ ์ uid 1000 ์์ ๊ถ์ ๋ง์ถ๋ผ๊ณ ์๋ดํฉ๋๋ค.)

chown -R 1000:1000 /volume1/docker/openclaw
2. /volume1/docker/openclaw/.env ๋ง๋ค๊ธฐ
OpenClaw ํด๋์ .env ํ์ผ์ ๋ง๋ญ๋๋ค.
Docker-Compose ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ์ฉ๋์ ๋๋ค.
๋จผ์ OpenClaw์ ์ฌ์ฉํ ํ ํฐ์ ์์ฑํฉ๋๋ค.
ํ ํฐ์ ๊ณ ์ ์ ๋ณด์ด๋ ์ ๋ ๊น๋จน๊ฑฐ๋ ํ์ธ์๊ฒ ๋ณด์ฌ์ฃผ๋ฉด ์ ๋ฉ๋๋ค! ๐จ
ํ ํฐ ์์ฑ์ ์ํด์ ์๋๋ก์ง ์ ์ดํ์์ ํฐ๋ฏธ๋์ ์ด์ด์ฃผ๊ณ SSH์ ์ ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ SSH์์ openssl ๋์ ์์ฑ์ ์ด์ฉํด ํ ํฐ์ ์์ฑํฉ๋๋ค.
cd /volume1/docker/openclaw
openssl rand -hex 32
๋์จ ๊ฐ์ .env ํ์ผ์ OPENCLAW_GATEWAY_TOKEN์ ๋ฃ์ด ์ ์ฅํฉ๋๋ค.
OPENCLAW_GATEWAY_TOKEN=์ฌ๊ธฐ์_๋๋ค_ํ ํฐ_๋ถ์ฌ๋ฃ๊ธฐ
OPENCLAW_TZ=Asia/Seoul
OPENCLAW_DISABLE_BONJOUR=1
OPENCLAW_GATEWAY_BIND=lan
(OpenClaw ๊ณต์ Docker ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด Docker ์ค์น์์๋ .env์ Gateway ํ ํฐ์ ์ฐ๊ณ , OPENCLAW_DISABLE_BONJOUR ๊ฐ์ Docker์ฉ ํ๊ฒฝ๋ณ์๋ ์ฌ์ฉํฉ๋๋ค.)
3. Container Manager์์ Project ์์ฑ
DSM์์ Container Manger ์ฑ์ ์คํํฉ๋๋ค.
Container Manager โ Project โ Create
ํ๋ก์ ํธ ์ด๋ฆ, ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ Docker-Compose(YAML)๋ ์ง์ ์์ฑํฉ๋๋ค.
Project name: openclaw
Path: /volume1/docker/openclaw
Source: Create docker-compose.yml
๊ทธ๋ฆฌ๊ณ ์๋ compose๋ฅผ ํธ์ง์ฐฝ์ ๋ณต์ฌํด์ค๋๋ค.๐ฐ
์ด compose๋ ๊ณต์ compose์ ํต์ฌ ๊ตฌ์กฐ๋ง Synology์ฉ์ผ๋ก ์ค์ธ ๊ฒ์ ๋๋ค.
๊ณต์ compose์ ghcr.io/openclaw/openclaw:latest ๊ฐ์ pre-built ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , config/workspace/auth secret ๋๋ ํฐ๋ฆฌ๋ฅผ ์ปจํ
์ด๋ ์์ OpenClaw ๊ฒฝ๋ก๋ก bind mount, 18789, 18790 ํฌํธ๋ฅผ ๊ฒ์ํฉ๋๋ค.
๋ฐ์ ์์๋ ๋์ปค image๋ alpine/openclaw:latest๋ก ์ ํํ๋๋ฐ ๋ค๋ฅธ ๊ณต์์ด๋ ์๋๋ก์ง์ ๋ง๋ ์คํํด๋ก ์ด๋ฏธ์ง๊ฐ ์๋ค๋ฉด ๋ฐ๊พธ์ ๋ ๊ด์ฐฎ์ ๊ฒ๋๋ค.?
services:
openclaw:
#image: ghcr.io/openclaw/openclaw:latest
image: alpine/openclaw:latest
env_file:
- .env
environment:
HOME: /home/node
OPENCLAW_HOME: /home/node
TERM: xterm-256color
OPENCLAW_STATE_DIR: /home/node/.openclaw
OPENCLAW_CONFIG_PATH: /home/node/.openclaw/openclaw.json
OPENCLAW_CONFIG_DIR: /home/node/.openclaw
OPENCLAW_WORKSPACE_DIR: /home/node/.openclaw/workspace
OPENCLAW_GATEWAY_TOKEN: ${OPENCLAW_GATEWAY_TOKEN}
OPENCLAW_DISABLE_BONJOUR: ${OPENCLAW_DISABLE_BONJOUR:-1}
TZ: ${OPENCLAW_TZ:-Asia/Seoul}
volumes:
- /volume1/docker/openclaw/config:/home/node/.openclaw
- /volume1/docker/openclaw/workspace:/home/node/.openclaw/workspace
- /volume1/docker/openclaw/auth-secrets:/home/node/.config/openclaw
ports:
- "127.0.0.1:18789:18789"
- "127.0.0.1:18790:18790"
extra_hosts:
- "host.docker.internal:host-gateway"
cap_drop:
- NET_RAW
- NET_ADMIN
security_opt:
- no-new-privileges:true
init: true
restart: unless-stopped
command:
[
"node",
"dist/index.js",
"gateway",
"--bind",
"lan",
"--port",
"18789"
]
healthcheck:
test:
[
"CMD",
"node",
"-e",
"fetch('http://127.0.0.1:18789/healthz').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s4. ํ๋ก์ ํธ๋ ์ผ๋จ ๋ง๋ค๊ณ , ์คํ๋์ผ๋ฉด ์ค์ง
Container Manager๊ฐ ํ๋ก์ ํธ ์์ฑ ํ ์ปจํ ์ด๋๋ฅผ ๋น๋ํ๋ฉด ๋ฐ๋ก ์คํ๋ ์ ์์ต๋๋ค. ์คํ๋๋ค๋ฉด ๋ฐ๋ก ์ค์งํด์ค๋๋ค.
Container Manager โ Project โ openclaw โ Stop

OpenClaw๋ ์ด๊ธฐ Onboard๋ผ๋ ์ธํ ์์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์คํํด๋ ์ ์๋์ํ์ง ์์ ๊ฒ๋๋ค.๐ฆ
SSH๋ฅผ ์ด์ฉํด์ Docker-Compose ์ด๋ฏธ์ง๋ฅผ ๋จผ์ ๋ฐ์ต๋๋ค.
cd /volume1/docker/openclaw/
docker compose pull
Compose๋ฅผ ์คํํ์ฌ OpenClaw ๋ช ๋ น์ด๋ก Onboard๋ฅผ ์คํํฉ๋๋ค.
docker compose run --rm --no-deps --entrypoint node openclaw \
dist/index.js onboard --mode local --no-install-daemon
๊ทธ๋ค์ Gateway ๊ธฐ๋ณธ ์ค์ ์ ํฉ๋๋ค.
docker compose run --rm --no-deps --entrypoint node openclaw \
dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789","https://OpenClaw ๋์๋ณด๋ URL:18789"]}]'
OpenClaw๋ ๋ณด์์ ๋๋ฌธ์ Gateway ์ ๊ทผ์ด ๋งค์ฐ ์๊ฒฉ? ํฉ๋๋ค.
๋จผ์ ์ฌ๊ธฐ์ NAS_IP๋ ์ค์ NAS IP ํน์ URL๋ ์ค์ ssl URL ์ด์ด์ผ ํฉ๋๋ค.
์์:
docker compose run --rm --no-deps --entrypoint node openclaw \
dist/index.js config set --batch-json '[{"path":"gateway.mode","value":"local"},{"path":"gateway.bind","value":"lan"},{"path":"gateway.controlUi.allowedOrigins","value":["http://localhost:18789","http://127.0.0.1:18789","https://synoclaw.pinblog.me"]}]'
๋์๋ณด๋ ํ๋ฉด ๊ฒฐ๊ณผ
openclaw.json ์ค์ ์ด ์๋ฃ๋์์ผ๋ฉด, ์ปจํ ์ด๋ ๋งค๋์ ์์ ๋ค์ openclaw ์ปจํ ์ด๋๋ฅผ ์คํํด์ค๋๋ค.

๊ทธ๋ฆฌ๊ณ ๋ธ๋ผ์ฐ์ ์ ์๋๋ก์ง IP(๋ด๋ถ๋ง) or URL(https) ์ ๋ ฅํ์ฌ ๋์๋ณด๋์ ์ ์ํฉ๋๋ค.

์์ .env์ ์ ์ฅํ๋ Gateway ํ ํฐ์ ์ ๋ ฅํ๊ณ ์ฐ๊ฒฐํด์ค๋๋ค.

๋ง์ฝ, ์์ฒ๋ผ https, localhost๋ฅผ ์ฐ๊ฒฐํ๋ผ๊ณ ๋์จ๋ค๋ฉด OpenClaw์์ ๋ณด์๋ฌธ์ ๋ก ๋ง๊ณ ์๋ ์ํ์ ๋๋ค.
์์ openclaw.json ์ค์ ์ ํ์ธํ๊ณ ํ์ฌ ๋คํธ์ํฌ๋ง ์ํ์ ๋ง๊ฒ ์ค์ ํ์๊ธฐ ๋ฐ๋๋๋ค.
๊ฐ์ฅ ๊ฐํธํ ๋ฐฉ๋ฒ์ OpenClaw ๋ฉ์์ง์ฒ๋ผ localhost๋ https์์์ ์ ์์ ํด์ผํฉ๋๋ค.
๋ณต์กํ์ง๋ง, OpenClaw ๊ณต์ ๋ฌธ์๋ ์๋ ์ค์น ํ๋ฆ์์ openclaw์ --entrypoint node๋ฅผ ์ค์ onboarding๊ณผ config set์ ๋จผ์ ์คํํ ๋ค gateway๋ฅผ ์ฌ๋ฆฌ๋ ๋ฐฉ์์ ์๋ดํฉ๋๋ค.
์ ์์ ์ผ๋ก ์ ๊ทผํ์๋ค๋ฉด,

์ด์ฒ๋ผ device ํ์ด๋ง์ ํ๋ผ๋ ์๋์ฐฝ์ด ๋ํ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก OpenClaw์ ๋ฑ๋ก๋์ง ์์ Device (์ ์ํ ์น ๋ธ๋ผ์ฐ์ , PC, ์ค๋งํธํฐ, ํ๋ธ๋ฆฟ ๋ฑ)์์๋ ํ์ด๋ง์ ํด์ผ๋๋ค๋ ์๋ฌ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค.๐ฅ
์ด๋, ๋ํ๋๋ RequiredID๊ฐ ์ค์ํฉ๋๋ค. ํ์ฌ OpenClaw์ ์ ์ํ Device์ ๋ํ ์๋ณID์ ๋๋ค.
์๋์ฐฝ์์ ์๋ดํ๋ ํ์ด๋ง ๋ฐฉ๋ฒ์ ์์ฐจ์ ์ผ๋ก ์คํํ๋ฉด ํ์ด๋ง์ด ์๋ฃ๋ฉ๋๋ค.
์ฌ๊ธฐ์๋ Docker-Compose ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค.
SSH์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ํ์ฌ OpenClaw์ ๋ฑ๋ก/๋๊ธฐ ์ค์ธ Device ๋ฆฌ์คํธ๊ฐ ๋ํ๋ฉ๋๋ค.
docker compose exec openclaw openclaw devices list๋๊ธฐ์ค์ธ Device๊ฐ ํ์ฌ ๋์๋ณด๋์ ์ ์ํ ์ฅ์น๊ฐ ๋ง๋์ง ํ์ธํฉ๋๋ค.
๋์๋ณด๋ ์๋์ฐฝ์ RequiredID๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค! ๐จ
docker compose exec openclaw openclaw devices approve [Required ID]๋ฅผ ์ ๋ ฅํด์ OpenClaw๊ฐ ์น์ธํ๋ค๋ ๋ก๊ทธ๊ฐ ๋ํ๋๋ฉด ์ฑ๊ณต์ ๋๋ค!
๋ค์ ํ๋ฒ,
docker compose exec openclaw openclaw devices list๋ฅผ ์ฌ์ฉํด๋ณด๋ฉด ๋๊ธฐ ์ค์ด๋ Device๊ฐ ์น์ธ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ ๋ธ๋ผ์ฐ์ ์ ์ ์ํด๋ณด๋ฉด ์ ์์ ์ผ๋ก OpenClaw ๋์๋ณด๋์ ์ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค! ๐

์ด์ Device ํ์ด๋ง์ ๋๋ฌ์ผ๋ Onboard๋ฅผ ํตํด OpenClaw์ ๊ธฐ๋ณธ ์ค์ ๋ง ๋ง์น๋ฉด ๋ฉ๋๋ค! :)
5. OpenClaw Onboard
์ฌ๊ธฐ๋ถํฐ๋ ssh ํฐ๋ฏธ๋์ ์ ์ํด์ ์ข ์์์ ์ด ํ์ํฉ๋๋ค.
OpenClaw์ ์ด๊ธฐํ์์ ์ธ onboard ๋ช ๋ น์ด๋ก ์ค์ ์ ์งํํฉ๋๋ค.
๋ฐฉ๋ฒ1. ์ปจํ ์ด๋ ๋งค๋์ ์ ํฐ๋ฏธ๋ ์ฌ์ฉ
์ปจํ ์ด๋ ๋งค๋์ ์์ OpenClaw ์ปจํ ์ด๋์ ์์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ํฐ๋ฏธ๋์ ์ด์ด์ค๋๋ค.

ํฐ๋ฏธ๋ ์ฐฝ์์ ์์ฑ๋ฒํผ์ ํด๋ฆญํ์ฌ bash๋ฅผ ์ฝ๋๋ค.

openclaw onboard
OpenClaw์ Onboard ํ๋ฉด์ด ๋ํ๋๋ฉด ์ฑ๊ณต์ ๋๋ค.
๋ฐฉ๋ฒ2. SSH๋ก Docker/Docker-Compose์์ ์คํ
์๋๋ก์ง SSH๋ก ์ ์ํ์ฌ /docker/openclaw ๋งตํ ํด๋๋ก ์ด๋ํ์ฌ ๋์ปค์์ openclaw onboard ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
์์) Docker-Compose๋ก ์งํํ ๊ฒฝ์ฐ,
sudo -i
cd /volume1/docker/openclaw
docker compose exec openclaw openclaw onboard
์ด๋ ๊ฒ OpenClaw setup ํ๋ฉด์ด ๋ํ๋๋ค๋ฉด ์ฑ๊ณต์ ๋๋ค.
6. Onboard ์ธํ

์ดํ OpenClaw Onboard ์ค์ ๋ฐฉ๋ฒ์ ์ ๊ฒ์๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๊ฐ์ฌํฉ๋๋ค. :)