- name
- deploy-prod
- description
- Deploy OpenMMO to production or prepare a production village-data transfer. Use when the user asks to deploy, ship, or apply public village changes to prod; preserve production player data and verify the complete facility, terrain, and vegetation changes.
# Deploy OpenMMO
Use the shared [deployment workflow](../../../.claude/commands/deploy.md).
Read `~/work/notes/DEPLOY_NOTES.md` before preparing a deployment and retain its
production-data preservation rules. Follow the user's requested scope; preparing
or editing deployment instructions does not authorize a production deployment.
## Public village transfers
๊ณต์ฉ ์์ค์ด๋ ๊ตฌ์ญ ํ๋๋ฅผ ์ด๊ด ๋จ์๋ก ์ผ๋๋ค. ๋ฐฐํฌ๋ง๋ค ์์ฒญ๋ ๋ง์ ํธ์ง, ๋ฐฐํฌ ๋ฉ๋ชจ,
๋ง์ง๋ง ์ด๊ด ๊ธฐ๋ก๊ณผ ํด๋น ๊ตฌ์ญ์ ๊ฐ๋ฐยท์ด์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด ์ ๊ทยท์์ ยท์ด๋ยท์ญ์ ๋ฅผ ์ฐพ๋๋ค.
๊ธฐ๋ก์ด ์์ผ๋ฉด ํ์ฌ ์์ชฝ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด ๋ฒ์๋ฅผ ์ ํ๋ค. ๋๋ถ๋ถ Git์์ ์ ์ธ๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก
๊นจ๋ํ ์์
ํธ๋ฆฌ๋ ๊ฐ์ ์์ ์๊ฐ๋ง์ผ๋ก ๋ณ๊ฒฝ ์์์ ํ๋จํ์ง ์๋๋ค.
### ๋ณ๊ฒฝ ๋ชฉ๋ก๊ณผ ๋ณด์กด
๊ฐ ์์ค์ ์ด๋ฆ, ๊ฑด๋ฌผยท์ค๋ธ์ ํธ ID, ์ด๋ ์ ํ ์๋ ๋ฒ์, ๋์ ๊ฒฝ๋กยท์ด์ ํด์ยท์
ยทID๋ฅผ
๊ธฐ๋กํ๋ค. ์๋ ๊ณ์ธต๋ง๋ค `์ถ๊ฐ/์์ /์ด๋/์ญ์ /๋ณ๊ฒฝ ์์/์ ์ธ`์ ๊ทผ๊ฑฐ, ๊ธฐ๋ ์ํ๋ฅผ ์ ํ๋ค.
๊ด๋ จ ๋ณ๊ฒฝ์ ์ค๋ช
์์ด ์ ์ธํ์ง ์๋๋ค. ์ด๊ด์ด ์์ ๋๋ ๋น๊ต ๊ทผ๊ฑฐ๋ฅผ ๋จ๊ธด๋ค.
| ๊ณ์ธต | ํจ๊ป ํ์ธํ ๋ฐ์ดํฐ |
| --- | --- |
| ๊ฑด๋ฌผ | `data/housing/`์ originยท๋ฐฉยท์ธตยท์์ ์ยท์ถ์
๊ตฌ. ์ด์ ๋ฌธ ์ํ์ ๊ฐ์ธ ์ฃผํ์ ๋ณด์กดํ๋ค. |
| ๊ฐ๊ตฌยท์ ์๋ฌผยท๊ฐํ | `data/terrain/objects/`์ IDยท์ข
๋ฅยท์์นยท์ธตยท๋ฌธ๊ตฌ. ํ๋ ์ด์ด ๋ณด๊ดํจยท๋ด์ฉ๋ฌผ์ DB์๋ ์์ผ๋ฏ๋ก ๊ฑด๋ฌผ JSON๋ง์ผ๋ก ํ๋จํ์ง ์๋๋ค. |
| ๋์ด | `data/terrain/height/`์ ๋ฐ๋ฅ ๋์ดยท์ธ๊ณฝ ์ฐ๊ฒฐยท๊ณต์ ๊ฒฝ๊ณ์ ๋ณต์์ฉ `height-original/`. |
| ๋ฐ๋ฅ ์ฌ์ง | `data/terrain/splat/`๊ณผ `landscaping/`. ์กฐ๊ฒฝ์ด ์์ผ๋ฉด ์กฐ๊ฒฝ์ ์ฌ์ง์ด ์ฐ์ ํ๋ค. |
| ํยท๋๋ฌด | `data/terrain/grass/`, `trees/`, ์กฐ๊ฒฝ ์ ๊ฑฐ ๋ง์คํฌ๋ฅผ ํจ๊ป ์ ์ฉํ ๊ฒฐ๊ณผ์ ๋ณต์์ฉ `grass-original/`. |
| ์์ค ์ค์ | ์์ ์ ์ IDยท๊ฐ๊ฒฉ, NPC ์ค์ ยท์ค์ผ์ค, ์ง๋ ํ์, ํ์ํ ์์ฝ ํ ์ง์ ์ค์ ๋ฐฐ์น์ ์ผ์น. |
- ๊ณต์ฉ ๋์์ ์์ฒญยทํธ์ง ๊ธฐ๋กยท์์ค ๋ฌธ์๋ก ์๋ณํ๋ค. ๊ฐ๋ฐ์ `ownerId`๋ ๊ฐ์ ์ง์ญ ํ์ผ์
๋ค์ด ์๋ค๋ ์ด์ ๋ก ๊ฐ์ธ ๊ฑด๋ฌผยท๊ฐ๊ตฌ๋ฅผ ๊ณต์ฉ์ผ๋ก ์ทจ๊ธํ์ง ์๋๋ค.
- ํ์ฌ ์ด์ ๋ฐ์ดํฐ์ ์ ํํ ์
ยทID๋ง ๋ณํฉํ๋ค. ๊ฐ๋ฐ DBยท์์งยท์งยท๊ฐ๊ตฌยท๋ชฉ์ฑ
ยท์งํ์ ์ผ๊ด
๋ณต์ฌํ์ง ์๋๋ค. ํ์ผ ํ๋์๋ ๊ณต์ฉ ๊ตฌ์ญ๊ณผ ์ด์ ๊ฐ์ธ ํธ์ง์ด ์์ผ ์ ์๋ค.
- `tools/sync-terrain.sh`์ ์์ ์๊ฐ ๋น๊ต๋ ํ๋ณด ํ์์ผ ๋ฟ์ด๋ค. ์ ํ ์ด๊ด์ ์ ์ฒด
`--apply`ยท`--delete`๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. ํด์๋ ๋์ ํ์ผ๋ง ๋น๊ตํ๋ค.
- ๊ฐ๋ฐ์ ์๋ค๋ ์ด์ ๋ก ์ด์ ์์ ๋ฌผ์ ์ญ์ ํ์ง ์๋๋ค. ์๋๋ ์ด๋ยท์ฒ ๊ฑฐ๋ ์ ์๋ฆฌ ๋ณต์๋
ํฌํจํ๋ ์ด์ ์์ค๊ณผ ์ดํ ์ด์ ํธ์ง์ ๋ณด์กดํ๋ค.
- ์ง๋ ๋ฐฐํฌ ๋ค ์ด์์์ ๋ณด์ ํ ๋ด์ฉ์ ๊ธฐ์ค์ ํฌํจํ๋ค. ์ค๋๋ ๊ฐ๋ฐ ํ์ผ์ด๋ ์์ชฝ ํธ์ง์
์ถฉ๋์ ๋ฐ๊ฒฌํ๋ฉด ์๋ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ์ค๋จํ๊ณ ํด๋น ๋ฒ์๋ฅผ ๋ค์ ๋ณํฉํ๋ค.
### ์ขํ์ ์ ์ฉ ์ ๊ฒ์ฆ
์งํ์ `tile = floor((world + 32) / 64)`, `tileOrigin = tile * 64 - 32`,
`cellIndex = localZ * 64 + localX`๋ฅผ ์ฌ์ฉํ๋ค. ๋์ด๋งต์ 65ร65 ์ ์ , ์คํ๋ซยทํยท์ ๊ฑฐ
๋ง์คํฌ๋ 64ร64 ์
์ด๋ค. ์์ ์ขํ์ ๊ฒฝ๊ณ ํ์ผ์ [์ขํ ๊ตฌํ](../../../terrain/src/coords.rs)์
๋ฐ๋ฅด๊ณ , ๊ธฐ๋กํ ์๋ ๋ฒ์๋ฅผ ์
์ธ๋ฑ์ค์์ ์ญ์ฐํด ๋์กฐํ๋ค. ํ์ผ ์ค์ฌ๊ณผ ์์ ์ ํผ๋ํ๋ฉด
32m ์ด๊ธ๋ ํจ์น๊ฐ ๋๋ค.
์ด์ ์๋ณธ์ ํจ์น๋ฅผ ์ ์ฉํ ์์ ๊ฒฐ๊ณผ์์ ๋ค์ ์กฐ๊ฑด์ ์์น๋ก ๊ฒ์ฌํ๋ค. ๊ฑด๋ฌผยท๊ฐ๊ตฌ๋ง
๋ฐ๋์๊ฑฐ๋ ๊ฐ๋ฐยท์ด์ ํ์ผ์ด ๊ฐ์๋ ์๋ตํ์ง ์๋๋ค. ๊ฐ๋ฐ ์๋ณธ์๋ ๋ฌธ์ ๊ฐ ๋จ์ ์์ ์ ์๋ค.
- **๋ฐ๋ฅ:** ์ง์์ธต ์งํ์ด ์ค์ ๋ฐ๋ฅ ์๋ฉด๋ณด๋ค ๋ฎ์์ง ๋์ด ์ ์ฅ ๋จ์์ ๋ฐ์ฌ๋ฆผ๊น์ง ์ ์ฉํด
๊ฒ์ฌํ๋ค. ํ์ฌ [๊ฑด์ถ ์ฒ๋ฆฌ](../../../server/src/game_state/house_building.rs)๋ ๊ฑด๋ฌผ
`origin.y`์ ๋ง์ถ๊ณ ์ธ๊ณฝ 4m๋ฅผ ์ฐ๊ฒฐํ๋ค. [ํํํ](../../../terrain/src/height.rs) ์
์ด์ ๊ธฐ์ด๋ฅผ ๋ณดํธํ๊ณ ํ์ผ ๊ณต์ ๊ฒฝ๊ณ ์ ์ ์ ์ผ์น์ํจ๋ค.
- **์์:** ํ์ฌ [๊ฑด์ถ ๋ฒ์](../../../server/src/housing/routes.rs)์ ๋ฐฉ ์ฃผ๋ณ ํ 1mยท๋๋ฌด
2m์ ํ์๋ ์์์ด ์๋์ง ๊ฒ์ฌํ๋ค. GR04๋ ์
๋ณ ๊ฐ์์ด๋ฏ๋ก
[์
๊ต์ฐจ ํ์ ](../../../terrain/src/grass.rs)๊ณผ ์กฐ๊ฒฝ ์ ๊ฑฐ ๋ง์คํฌ๋ฅผ ํจ๊ป ์ ์ฉํ๋ค.
๊ฑด๋ฌผ JSON ์ง์ ๋ณต์ฌ๋ ํํํยท์์ ์ ๊ฑฐ๋ฅผ ์คํํ์ง ์๋๋ค.
- **ํฌ์ฅ:** ๋๊ธธยทํฌ์ฅ์ ์ฌ์ง๊ณผ ์ ๊ฑฐ ๋ง์คํฌ๋ฅผ ํจ๊ป ํ์ธํ๋ค. `vegMeta=0`๋ง์ผ๋ก ๊ธฐ์กด ํ์ด
์ฌ๋ผ์ง์ง ์๋๋ค. `LND1` ๋ง์คํฌ์ ํ ์๋ณธ์ ํฉ์ณ ํ์ ๋์ 0๊ฐ๋ฅผ ํ์ธํ๋ค. ๋ง์คํฌ๋
๋๋ฌด๋ ์จ๊ธฐ๋ฏ๋ก ๋ณด์กดํ ๋๋ฌด๊ฐ ์์ผ๋ฉด ํ ๋ฐ์ดํฐ๋ง ์์ ํ๋ ๋ฑ ๋ฒ์๋ฅผ ์กฐ์ ํ๋ค.
- **๋ฐฐ์น:** ๊ฐ๊ตฌยท๊ฐํยทNPC์ ๊ฑด๋ฌผยท์ธตยท๋์ด์ ์ค์ ์ ์ฐธ์กฐ ID๋ฅผ ํ์ธํ๋ค. ๊ฑด๋ฌผ ๋์ด๋ฅผ
๋ฐ๊พธ๋ฉด ๋ฐฐ์น๋ฌผ ๋์ด๋ ํ์ธํ๋ค.
- **๋ณด์กด:** ๋์ ๋ฐ์ ์
ยท๋ฐฐ์นยท์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๋ค. ๋ณ๊ฒฝํ์ง ์๋ ํ์ผ์ ํด์๋ก,
๊ณต์ ํ์ผ์ ์ ํํ ์
ยทID๋ฅผ ์ ์ธํ ๋ด์ฉ์ผ๋ก ๊ฒ์ฆํ๋ค.
์กฐ๊ฑด์ด ์คํจํ๋ฉด ํด๋น ์ด๊ด์ ๊ณ ์น ๋ค ๋ค์ ๊ฒ์ฌํ๋ค. ์๋๋ ์์ธ๋ ๋ฒ์์ ์ด์ ๋ฅผ ๊ธฐ๋กํ๋ค.
### ์ ์ฉ๊ณผ ์๋ฃ ํ์ธ
1. ์์ ํ ์ด์ ํ์ผยทํ๊ณผ ๋ฒ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ๋ฐฐํฌ ๊ธฐ๋ก ๋๋ ํฐ๋ฆฌ์ ๋ฐฑ์
ํ๋ค. ์ฐ๊ธฐ ์ง์
์๋ณธ ํด์ยทํ ๋ด์ฉ์ด ์ค๋น ์์ ๊ณผ ๋ค๋ฅด๋ฉด ์ต์ ์ด์ ์ํ๋ก ํจ์น๋ฅผ ๋ค์ ๋ง๋ ๋ค.
2. ์ง์๋๋ ํธ์ง API๋ฅผ ์ฐ์ ์ฌ์ฉํ๊ณ ๋ณต์์ฉ ๋์ดยทํ์ ๋ณด์ฅํ๋ค. ํ์ผ ๊ต์ฒด๋ ์์์ ์ผ๋ก
์ํํ๋ค. ๊ฑด๋ฌผยท์ค์ ํ์ผ ๋ณ๊ฒฝ์ ์๋ฒยทNPC ์บ์ ๊ฐฑ์ ๋๋ ๊ณํ๋ ์ฌ์์๊น์ง ์ฒ๋ฆฌํ๋ค.
3. ์งํ ๋ณ๊ฒฝ ํ ํด์ ๋ชฉ๋ก๊ณผ WebSocket ๋ฒ์ ์ ๊ฒ์ํ๋ค. ๋์ด ํธ์ง์ ์๋ฒ ๋์ด ์บ์๋
๊ฐฑ์ ํ๋ค. ์ธ๋ถ ํ์ผ ๋ณ๊ฒฝ๋ง์ผ๋ก ๋ฉ๋ชจ๋ฆฌ manifest๊ฐ ๊ฐฑ์ ๋์ง๋ ์๋๋ค.
[์งํ ์๋น](../../../doc/TERRAIN_STATIC_SERVING.md)์ ์ฒ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ฅธ๋ค.
4. ๊ณต๊ฐ manifestยท์๋ณธ ๋ฐ์ดํธยท์ด์ ๋์คํฌ๋ฅผ ๋์กฐํ๊ณ , ๊ณต๊ฐ ๋ฐ์ดํฐ๋ก ๋ฐ๋ฅยท์์ยทํฌ์ฅ ์กฐ๊ฑด๊ณผ
๋์ ๋ฐ ๋ณด์กด์ ๋ค์ ๊ฒ์ฌํ๋ค. ๋ณต์ฌ ์ฑ๊ณต์ด๋ ํด์ ์ผ์น๋ง์ผ๋ก ์๋ฃํ์ง ์๋๋ค.
5. ๊ฒ์์์ ๋ฐ๋ฅ ๋
ธ์ถ, ๋จ์ ํยท๋๋ฌด, ํฌ์ฅ ๊ฒฝ๊ณ, ์ถ์
๊ตฌยท๊ฐ๊ตฌ์ ๋ณ๊ฒฝํ ์์ค ๊ธฐ๋ฅ์ ํ์ธํ๋ค.
์ ๊ทผํ ์ ์์ผ๋ฉด ๋ฐ์ดํฐ ๊ฒ์ฆ๊ณผ ํ๋ฉด ๋ฏธํ์ธ์ ๋ถ๋ฆฌํด ๊ธฐ๋กํ๊ณ ๋ง์ ๊ฒ์ฆ ์๋ฃ๋ก ํ์ํ์ง ์๋๋ค.
6. ๋ฐฐํฌ ๋ฉ๋ชจ์ ๊ฒฐ๊ณผยท๋ณต๊ตฌ ๊ฒฝ๋กยท๋ฏธํ์ธ ํญ๋ชฉ์ ๊ฐฑ์ ํ๋ค. ์ด์ ๋ณด์ ์ ๊ฐ๋ฐ ๋ฐ์ ์ฌ๋ถ๋ ๊ธฐ๋กํ๋ค.
๊ฐ๋ฐ ๋ฐ์ ์ ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๊ณ , ๋ฏธ๋ฐ์์ด๋ฉด ๋ค์ ๋ฐฐํฌ์ ์ด์ ๋ณด์กด ๋์์ผ๋ก ๋ช
์ํ๋ค.
๋ณต๊ตฌ๋ ๋ณ๊ฒฝํ ์
ยทID๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค. ์ดํ ์ด์ ํธ์ง์ ํ์ธํ์ง ์๊ณ ๋ฐฑ์
์ ์ฒด๋ก ๋ฎ์ด์ฐ์ง ์๋๋ค.
View on GitHub