๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
๊ฒฝ๊ณ 

์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ๋กœ ์ œ๊ณต๋˜๋ฉฐ Open WebUI ํŒ€์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๊ฒŒ Open WebUI๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ๊ธฐ์—ฌ ํŠœํ† ๋ฆฌ์–ผ์„ ํ™•์ธํ•˜์„ธ์š”.

[!WARNING]
์ด ๋ฌธ์„œ๋Š” ํ˜„์žฌ ๋ฒ„์ „(0.5.11)์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Open-WebUI ๋‚ด๋ถ€ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

Open-WebUI์˜ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ, ์ฑ„ํŒ… ๊ธฐ๋ก, ํŒŒ์ผ ์ €์žฅ ๋ฐ ๋‹ค์–‘ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์˜ ๊ทผ๊ฐ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์— ํšจ๊ณผ์ ์œผ๋กœ ๊ธฐ์—ฌํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

๋‚ด๋ถ€ SQLite ์œ„์น˜โ€‹

SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” root -> data -> webui.db์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ Root (/)
โ”œโ”€โ”€ ๐Ÿ“ data
โ”‚ โ”œโ”€โ”€ ๐Ÿ“ cache
โ”‚ โ”œโ”€โ”€ ๐Ÿ“ uploads
โ”‚ โ”œโ”€โ”€ ๐Ÿ“ vector_db
โ”‚ โ””โ”€โ”€ ๐Ÿ“„ webui.db
โ”œโ”€โ”€ ๐Ÿ“„ dev.sh
โ”œโ”€โ”€ ๐Ÿ“ open_webui
โ”œโ”€โ”€ ๐Ÿ“„ requirements.txt
โ”œโ”€โ”€ ๐Ÿ“„ start.sh
โ””โ”€โ”€ ๐Ÿ“„ start_windows.bat

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋กœ์ปฌ ๋ณต์‚ฌโ€‹

์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ ์ค‘์ธ Open-WebUI SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋กœ์ปฌ ์ปดํ“จํ„ฐ๋กœ ๋ณต์‚ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker cp open-webui:/app/backend/data/webui.db ./webui.db

๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker exec -it open-webui /bin/sh

ํ…Œ์ด๋ธ” ๊ฐœ์š”โ€‹

Open-WebUI์˜ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ํ…Œ์ด๋ธ” ์ „์ฒด ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์€ ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ์œผ๋ฉฐ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ฒˆํ˜ธ๊ฐ€ ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

No.ํ…Œ์ด๋ธ” ์ด๋ฆ„์„ค๋ช…
01auth์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์™€ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
02channel์ฑ„ํŒ… ์ฑ„๋„ ๋ฐ ํ•ด๋‹น ๊ตฌ์„ฑ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
03channel_member์ฑ„๋„ ๋‚ด ์‚ฌ์šฉ์ž ๋ฉค๋ฒ„์‹ญ ๋ฐ ๊ถŒํ•œ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค
04chat์ฑ„ํŒ… ์„ธ์…˜๊ณผ ํ•ด๋‹น ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
05chatidtag์ฑ„ํŒ…๊ณผ ๊ด€๋ จ๋œ ํƒœ๊ทธ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค
06config์‹œ์Šคํ…œ ์ „์ฒด ๊ตฌ์„ฑ ์„ค์ •์„ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค
07document์ง€์‹ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฌธ์„œ ๋ฐ ํ•ด๋‹น ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
08feedback์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ๋ฐ ํ‰๊ฐ€๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค
09file์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฐ ํ•ด๋‹น ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค
10folderํŒŒ์ผ๊ณผ ์ฝ˜ํ…์ธ ๋ฅผ ๊ณ„์ธต์  ๊ตฌ์กฐ๋กœ ์กฐ์งํ•ฉ๋‹ˆ๋‹ค
11function์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜์™€ ํ•ด๋‹น ๊ตฌ์„ฑ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
12group์‚ฌ์šฉ์ž ๊ทธ๋ฃน ๋ฐ ํ•ด๋‹น ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค
13knowledge์ง€์‹ ๋ฒ ์ด์Šค ํ•ญ๋ชฉ ๋ฐ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
14memory์ฑ„ํŒ… ๊ธฐ๋ก ๋ฐ ์ปจํ…์ŠคํŠธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค
15message๊ฐœ๋ณ„ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ๋ฐ ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
16message_reaction๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ๋ฐ˜์‘(์ด๋ชจํ‹ฐ์ฝ˜/์‘๋‹ต)์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค
17migrate_history๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๋ฒ„์ „ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ธฐ๋ก์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค
18modelAI ๋ชจ๋ธ ๊ตฌ์„ฑ ๋ฐ ์„ค์ •์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค
19promptAI ํ”„๋กฌํ”„ํŠธ์šฉ ํ…œํ”Œ๋ฆฟ ๋ฐ ๊ตฌ์„ฑ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
20tag์ฝ˜ํ…์ธ  ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•œ ํƒœ๊ทธ/๋ ˆ์ด๋ธ”์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค
21tool์‹œ์Šคํ…œ ๋„๊ตฌ ๋ฐ ํ†ตํ•ฉ ๊ตฌ์„ฑ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
22user์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๋ฐ ๊ณ„์ • ์ •๋ณด๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค

์ฐธ๊ณ : Open-WebUI์˜ SQLite ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” Open-WebUI์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋˜์ง€ ์•Š์€ ๋‘ ๊ฐœ์˜ ์ถ”๊ฐ€ ํ…Œ์ด๋ธ”์ด ์žˆ์œผ๋ฉฐ, ์ œ์™ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • Alembic ๋ฒ„์ „ ํ…Œ์ด๋ธ”
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ธฐ๋ก ํ…Œ์ด๋ธ”

์ด์ œ ๋ชจ๋“  ํ…Œ์ด๋ธ”์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ๊ฐ ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.

Auth ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž
emailString-์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ
passwordText-ํ•ด์‹œ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ
activeBoolean-๊ณ„์ • ์ƒํƒœ

Auth ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ๋“ค:

  • ๊ธฐ๋ณธ ํ‚ค๋กœ UUID ์‚ฌ์šฉ
  • users ํ…Œ์ด๋ธ”๊ณผ ์ผ๋Œ€์ผ ๊ด€๊ณ„ (๊ณต์œ  id)

Channel ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idText-์ฑ„๋„์˜ ์†Œ์œ ์ž/์ƒ์„ฑ์ž
typeTextnullable์ฑ„๋„ ์œ ํ˜•
nameText-์ฑ„๋„ ์ด๋ฆ„
descriptionTextnullable์ฑ„๋„ ์„ค๋ช…
dataJSONnullable์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ
metaJSONnullable์ฑ„๋„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
access_controlJSONnullable๊ถŒํ•œ ์„ค์ •
created_atBigInteger-์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„ (๋‚˜๋…ธ์ดˆ ๋‹จ์œ„)
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„ (๋‚˜๋…ธ์ดˆ ๋‹จ์œ„)

auth ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ:

  • ๊ธฐ๋ณธ ํ‚ค๋กœ UUID ์‚ฌ์šฉ
  • ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ์ฑ„๋„ ์ด๋ฆ„ (์†Œ๋ฌธ์ž๋กœ ์ €์žฅ๋จ)

Channel Member ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTEXTNOT NULL์ฑ„๋„ ํšŒ์› ๊ณ ์œ  ์‹๋ณ„์ž
channel_idTEXTNOT NULL์ฑ„๋„ ์ฐธ์กฐ
user_idTEXTNOT NULL์‚ฌ์šฉ์ž ์ฐธ์กฐ
created_atBIGINT-๋ฉค๋ฒ„์‹ญ ์ƒ์„ฑ ์‹œ์  ํƒ€์ž„์Šคํƒฌํ”„

Chat ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idString-์ฑ„ํŒ… ์†Œ์œ ์ž
titleText-์ฑ„ํŒ… ์ œ๋ชฉ
chatJSON-์ฑ„ํŒ… ๋‚ด์šฉ ๋ฐ ๊ธฐ๋ก
created_atBigInteger-์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„
share_idTextUNIQUE, nullable๊ณต์œ  ์‹๋ณ„์ž
archivedBooleandefault=False์•„์นด์ด๋ธŒ ์ƒํƒœ
pinnedBooleandefault=False, nullable๊ณ ์ • ์ƒํƒœ
metaJSONserver_default=""ํƒœ๊ทธ ํฌํ•จ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
folder_idTextnullable๋ถ€๋ชจ ํด๋” ID

Chat ID Tag ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idVARCHAR(255)NOT NULL๊ณ ์œ  ์‹๋ณ„์ž
tag_nameVARCHAR(255)NOT NULLํƒœ๊ทธ ์ด๋ฆ„
chat_idVARCHAR(255)NOT NULL์ฑ„ํŒ… ์ฐธ์กฐ
user_idVARCHAR(255)NOT NULL์‚ฌ์šฉ์ž ์ฐธ์กฐ
timestampINTEGERNOT NULL์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„

Configโ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด๊ธฐ๋ณธ๊ฐ’์„ค๋ช…
idINTEGERNOT NULL-๊ธฐ๋ณธ ํ‚ค ์‹๋ณ„์ž
dataJSONNOT NULL-๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ
versionINTEGERNOT NULL-๊ตฌ์„ฑ ๋ฒ„์ „ ๋ฒˆํ˜ธ
created_atDATETIMENOT NULLCURRENT_TIMESTAMP์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„
updated_atDATETIME-CURRENT_TIMESTAMP๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„

Feedback ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idText-ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•œ ์‚ฌ์šฉ์ž
versionBigIntegerdefault=0ํ”ผ๋“œ๋ฐฑ ๋ฒ„์ „ ๋ฒˆํ˜ธ
typeText-ํ”ผ๋“œ๋ฐฑ ์œ ํ˜•
dataJSONnullable๋“ฑ๊ธ‰์„ ํฌํ•จํ•œ ํ”ผ๋“œ๋ฐฑ ๋ฐ์ดํ„ฐ
metaJSONnullable๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (arena, chat_id ๋“ฑ)
snapshotJSONnullable๊ด€๋ จ ์ฑ„ํŒ… ์Šค๋ƒ…์ƒท
created_atBigInteger-์ƒ์„ฑ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„

ํŒŒ์ผ ํ…Œ์ด๋ธ”

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž
user_idString-ํŒŒ์ผ ์†Œ์œ ์ž
hashTextnullableํŒŒ์ผ ํ•ด์‹œ/์ฒดํฌ์„ฌ
filenameText-ํŒŒ์ผ ์ด๋ฆ„
pathTextnullableํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ
dataJSONnullableํŒŒ์ผ ๊ด€๋ จ ๋ฐ์ดํ„ฐ
metaJSONnullableํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
access_controlJSONnullable๊ถŒํ•œ ์„ค์ •
created_atBigInteger-์ƒ์„ฑ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„

meta ํ•„๋“œ์˜ ์˜ˆ์ƒ ๊ตฌ์กฐ:

{
"name": string, # ์„ ํƒ์  ํ‘œ์‹œ ์ด๋ฆ„
"content_type": string, # MIME ํƒ€์ž…
"size": integer, # ํŒŒ์ผ ํฌ๊ธฐ (๋ฐ”์ดํŠธ)
# ์ถ”๊ฐ€์ ์ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ConfigDict(extra="allow")๋กœ ์ง€์›๋จ
}

ํด๋” ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž (UUID)
parent_idTextnullable๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ถ€๋ชจ ํด๋” ID
user_idText-ํด๋” ์†Œ์œ ์ž
nameText-ํด๋” ์ด๋ฆ„
itemsJSONnullableํด๋” ์ฝ˜ํ…์ธ 
metaJSONnullableํด๋” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
is_expandedBooleandefault=FalseUI ํ™•์žฅ ์ƒํƒœ
created_atBigInteger-์ƒ์„ฑ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„

ํด๋” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ:

  • ํด๋”๋Š” ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Œ (parent_id ์ฐธ์กฐ)
  • ๋ฃจํŠธ ํด๋”๋Š” parent_id๊ฐ€ null์ž„
  • ๋™์ผํ•œ ๋ถ€๋ชจ ๋‚ด์—์„œ ํด๋” ์ด๋ฆ„์€ ๊ณ ์œ ํ•ด์•ผ ํ•จ

ํ•จ์ˆ˜ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž
user_idString-ํ•จ์ˆ˜ ์†Œ์œ ์ž
nameText-ํ•จ์ˆ˜ ์ด๋ฆ„
typeText-ํ•จ์ˆ˜ ์œ ํ˜•
contentText-ํ•จ์ˆ˜ ๋‚ด์šฉ/์ฝ”๋“œ
metaJSON-ํ•จ์ˆ˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
valvesJSON-ํ•จ์ˆ˜ ์ œ์–ด ์„ค์ •
is_activeBoolean-ํ•จ์ˆ˜ ํ™œ์„ฑ ์ƒํƒœ
is_globalBoolean-์ „์—ญ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ํ”Œ๋ž˜๊ทธ
created_atBigInteger-์ƒ์„ฑ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„

ํด๋” ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ:

  • type์€ ๋‹ค์Œ๋งŒ ๊ฐ€๋Šฅ: ["filter", "action"]

๊ทธ๋ฃน ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY, UNIQUE๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idText-๊ทธ๋ฃน ์†Œ์œ ์ž/์ƒ์„ฑ์ž
nameText-๊ทธ๋ฃน ์ด๋ฆ„
descriptionText-๊ทธ๋ฃน ์„ค๋ช…
dataJSONnullable์ถ”๊ฐ€ ๊ทธ๋ฃน ๋ฐ์ดํ„ฐ
metaJSONnullable๊ทธ๋ฃน ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
permissionsJSONnullable๊ถŒํ•œ ์„ค์ •
user_idsJSONnullable๊ตฌ์„ฑ์› ์‚ฌ์šฉ์ž ID ๋ชฉ๋ก
created_atBigInteger-์ƒ์„ฑ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„

์ง€์‹ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY, UNIQUE๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idText-์ง€์‹ ๋ฒ ์ด์Šค ์†Œ์œ ์ž
nameText-์ง€์‹ ๋ฒ ์ด์Šค ์ด๋ฆ„
descriptionText-์ง€์‹ ๋ฒ ์ด์Šค ์„ค๋ช…
dataJSONnullable์ง€์‹ ๋ฒ ์ด์Šค ์ฝ˜ํ…์ธ 
metaJSONnullable์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
access_controlJSONnullable์ ‘๊ทผ ์ œ์–ด ๊ทœ์น™
created_atBigInteger-์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„

access_control ํ•„๋“œ ์˜ˆ์ƒ ๊ตฌ์กฐ:

{
"read": {
"group_ids": ["group_id1", "group_id2"],
"user_ids": ["user_id1", "user_id2"]
},
"write": {
"group_ids": ["group_id1", "group_id2"],
"user_ids": ["user_id1", "user_id2"]
}
}

๋ฉ”๋ชจ๋ฆฌ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ํƒ€์ž…์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idString-๋ฉ”๋ชจ ์†Œ์œ ์ž
contentText-๋ฉ”๋ชจ ๋‚ด์šฉ
created_atBigInteger-์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„

๋ฉ”์‹œ์ง€ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ํƒ€์ž…์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idText-๋ฉ”์‹œ์ง€ ์ž‘์„ฑ์ž
channel_idTextnullable๊ด€๋ จ ์ฑ„๋„
parent_idTextnullable์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ ๋ถ€๋ชจ ๋ฉ”์‹œ์ง€
contentText-๋ฉ”์‹œ์ง€ ๋‚ด์šฉ
dataJSONnullable์ถ”๊ฐ€ ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ
metaJSONnullable๋ฉ”์‹œ์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
created_atBigInteger-์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„ (๋‚˜๋…ธ์ดˆ)
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„ (๋‚˜๋…ธ์ดˆ)

๋ฉ”์‹œ์ง€ ๋ฐ˜์‘ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ํƒ€์ž…์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž (UUID)
user_idText-๋ฐ˜์‘ํ•œ ์‚ฌ์šฉ์ž
message_idText-๊ด€๋ จ ๋ฉ”์‹œ์ง€
nameText-๋ฐ˜์‘ ์ด๋ฆ„/์ด๋ชจ์ง€
created_atBigInteger-๋ฐ˜์‘ ํƒ€์ž„์Šคํƒฌํ”„

๋ชจ๋ธ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ํƒ€์ž…์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idTextPRIMARY KEY๋ชจ๋ธ ์‹๋ณ„์ž
user_idText-๋ชจ๋ธ ์†Œ์œ ์ž
base_model_idTextnullable๋ถ€๋ชจ ๋ชจ๋ธ ์ฐธ์กฐ
nameText-๋””์Šคํ”Œ๋ ˆ์ด ์ด๋ฆ„
paramsJSON-๋ชจ๋ธ ๋งค๊ฐœ๋ณ€์ˆ˜
metaJSON-๋ชจ๋ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
access_controlJSONnullable์ ‘๊ทผ ๊ถŒํ•œ
is_activeBooleandefault=Trueํ™œ์„ฑ ์ƒํƒœ
created_atBigInteger-์ƒ์„ฑ ํƒ€์ž„์Šคํƒฌํ”„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„

ํ”„๋กฌํ”„ํŠธ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ํƒ€์ž…์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
commandStringPRIMARY KEY๊ณ ์œ  ์ปค๋งจ๋“œ ์‹๋ณ„์ž
user_idString-ํ”„๋กฌํ”„ํŠธ ์†Œ์œ ์ž
titleText-ํ”„๋กฌํ”„ํŠธ ์ œ๋ชฉ
contentText-ํ”„๋กฌํ”„ํŠธ ๋‚ด์šฉ/ํ…œํ”Œ๋ฆฟ
timestampBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ํƒ€์ž„์Šคํƒฌํ”„
access_controlJSONnullable์ ‘๊ทผ ๊ถŒํ•œ

ํƒœ๊ทธ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPK (๋ณตํ•ฉ ํ‚ค)์ •๊ทœํ™”๋œ ํƒœ๊ทธ ์‹๋ณ„์ž
nameString-ํ‘œ์‹œ ์ด๋ฆ„
user_idStringPK (๋ณตํ•ฉ ํ‚ค)ํƒœ๊ทธ ์†Œ์œ ์ž
metaJSONnullableํƒœ๊ทธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

ํƒœ๊ทธ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ฃผ์˜์‚ฌํ•ญ:

  • ๊ธฐ๋ณธ ํ‚ค๋Š” ๋ณตํ•ฉ ํ‚ค (id, user_id) ์ž…๋‹ˆ๋‹ค.

๋„๊ตฌ ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž
user_idString-๋„๊ตฌ ์†Œ์œ ์ž
nameText-๋„๊ตฌ ์ด๋ฆ„
contentText-๋„๊ตฌ ๋‚ด์šฉ/์ฝ”๋“œ
specsJSON-๋„๊ตฌ ์‚ฌ์–‘
metaJSON-๋„๊ตฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
valvesJSON-๋„๊ตฌ ์ œ์–ด ์„ค์ •
access_controlJSONnullable์ ‘๊ทผ ๊ถŒํ•œ
created_atBigInteger-์ƒ์„ฑ ์‹œ๊ฐ„ๆˆ“
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„

์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”โ€‹

์—ด ์ด๋ฆ„๋ฐ์ดํ„ฐ ์œ ํ˜•์ œ์•ฝ ์กฐ๊ฑด์„ค๋ช…
idStringPRIMARY KEY๊ณ ์œ  ์‹๋ณ„์ž
nameString-์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„
emailString-์‚ฌ์šฉ์ž์˜ ์ด๋ฉ”์ผ
roleString-์‚ฌ์šฉ์ž์˜ ์—ญํ• 
profile_image_urlText-ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ
last_active_atBigInteger-๋งˆ์ง€๋ง‰ ํ™œ๋™ ์‹œ๊ฐ„
updated_atBigInteger-๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„
created_atBigInteger-์ƒ์„ฑ ์‹œ๊ฐ„ๆˆ“
api_keyStringUNIQUE, nullableAPI ์ธ์ฆ ํ‚ค
settingsJSONnullable์‚ฌ์šฉ์ž ์„ ํ˜ธ ์„ค์ •
infoJSONnullable์ถ”๊ฐ€ ์‚ฌ์šฉ์ž ์ •๋ณด
oauth_subTextUNIQUEOAuth ์ฃผ์ œ ์‹๋ณ„์ž

์—”ํ‹ฐํ‹ฐ ๊ด€๊ณ„ ๋‹ค์ด์–ด๊ทธ๋žจ

ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋ ค๋ฉด ์•„๋ž˜์˜ Mermaid๋กœ ์ƒ์„ฑ๋œ ์—”ํ‹ฐํ‹ฐ ๊ด€๊ณ„ ๋‹ค์ด์–ด๊ทธ๋žจ(ERD)์„ ์ฐธ์กฐํ•˜์„ธ์š”.