์์ ๋ด์ฑ ์ด๋ฉ์ผ: ์ํธํ๋ SQLite ๋ฉ์ผ๋ฐ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฉ์ผ์ ์์ ํ๊ฒ ๋ณดํธํ๋ ๋ฐฉ๋ฒ
์๋ฌธ
Important
์ ํฌ ์ด๋ฉ์ผ ์๋น์ค๋ 100% ์คํ์์ค์ด๋ฉฐ ์์ ํ๊ณ ์ํธํ๋ SQLite ๋ฉ์ผ๋ฐ์ค๋ฅผ ํตํด ํ๋ผ์ด๋ฒ์๋ฅผ ์ค์ํฉ๋๋ค.
IMAP ์ง์์ ์ถ์ํ๊ธฐ ์ ๊น์ง๋ MongoDB๋ฅผ ์๊ตฌ ๋ฐ์ดํฐ ์ ์ฅ์๋ก ์ฌ์ฉํ์ต๋๋ค.
์ด ๊ธฐ์ ์ ํ๋ฅญํ๋ฉฐ ์ง๊ธ๋ ์ฌ์ฉ ์ค์ด์ง๋ง, MongoDB์์ ์ํธํ๋ ์ ์ฅ(Encryption-at-rest)์ ์ฌ์ฉํ๋ ค๋ฉด Digital Ocean์ด๋ Mongo Atlas ๊ฐ์ MongoDB Enterprise๋ฅผ ์ ๊ณตํ๋ ๊ณต๊ธ์๋ฅผ ์ด์ฉํ๊ฑฐ๋ ์ํฐํ๋ผ์ด์ฆ ๋ผ์ด์ ์ค๋ฅผ ๊ตฌ๋งคํด์ผ ํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ์ดํ์๋ ์์ ํ๊ณผ์ ์ง์ฐ ๋ฌธ์ ๋ ๊ฒช๊ฒ ๋ฉ๋๋ค).
Forward Email ํ์ ๊ฐ๋ฐ์ ์นํ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ๋ขฐํ ์ ์๊ณ ์ํธํ๋ IMAP ๋ฉ์ผ๋ฐ์ค ์ ์ฅ ์๋ฃจ์ ์ด ํ์ํ์ต๋๋ค. ์คํ์์ค ๊ฐ๋ฐ์๋ก์ ์ํธํ๋ ์ ์ฅ ๊ธฐ๋ฅ์ ์ํด ๋ผ์ด์ ์ค ๋น์ฉ์ ์ง๋ถํด์ผ ํ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํฌ ์์น์ ๋ฐํ๊ธฐ์, ์ง์ ์คํํ๊ณ ์ฐ๊ตฌํ๋ฉฐ ์ด ์๊ตฌ๋ฅผ ํด๊ฒฐํ ์๋ก์ด ์๋ฃจ์ ์ ์ฒ์๋ถํฐ ๊ฐ๋ฐํ์ต๋๋ค.
๊ณต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํด ๋ฉ์ผ๋ฐ์ค๋ฅผ ์ ์ฅํ๋ ๋์ , ๊ฐ ๋ฉ์ผ๋ฐ์ค๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ํธํํ์ฌ ์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ(์ฌ์ฉ์๋ง ์๊ณ ์์)๋ก ๋ณดํธํฉ๋๋ค. ์ ํฌ ์ด๋ฉ์ผ ์๋น์ค๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ผ๋ฉด ๋ฉ์ผ๋ฐ์ค๋ฅผ ์๊ฒ ๋ ์ ๋๋ก ๋งค์ฐ ์์ ํฉ๋๋ค (์คํ๋ผ์ธ ๋ฐฑ์ ์ผ๋ก ๋ณต๊ตฌํ๊ฑฐ๋ ์ฒ์๋ถํฐ ๋ค์ ์์ํด์ผ ํฉ๋๋ค).
์๋์์ ์ด๋ฉ์ผ ์๋น์ค ์ ๊ณต์ ๋น๊ต, ์๋น์ค ์๋ ๋ฐฉ์, ๊ธฐ์ ์คํ ๋ฑ์ ์์ธํ ์ดํด๋ณด์ธ์.
์ด๋ฉ์ผ ์๋น์ค ์ ๊ณต์ ๋น๊ต
์ ํฌ๋ ๊ฐ๋ณ ์ํธํ๋ SQLite ๋ฉ์ผ๋ฐ์ค๋ฅผ ์ ์ฅํ๊ณ ๋ฌด์ ํ ๋๋ฉ์ธ, ๋ณ์นญ, ์ฌ์ฉ์๋ฅผ ์ ๊ณตํ๋ฉฐ ์์๋ฐ์ด๋ SMTP, IMAP, POP3๋ฅผ ์ง์ํ๋ ์ ์ผํ 100% ์คํ์์ค ๋ฐ ํ๋ผ์ด๋ฒ์ ์ค์ฌ ์ด๋ฉ์ผ ์๋น์ค ์ ๊ณต์์ ๋๋ค:
๋ค๋ฅธ ์ด๋ฉ์ผ ์ ๊ณต์์ ๋ฌ๋ฆฌ Forward Email์์๋ ๋๋ฉ์ธ ๋๋ ๋ณ์นญ๋ณ๋ก ์ ์ฅ ๊ณต๊ฐ ๋น์ฉ์ ์ง๋ถํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ฅ ๊ณต๊ฐ์ ์ ์ฒด ๊ณ์ ์ ๊ฑธ์ณ ๊ณต์ ๋๋ฏ๋ก ์ฌ๋ฌ ๋ง์ถค ๋๋ฉ์ธ๊ณผ ๊ฐ ๋๋ฉ์ธ๋ณ ์ฌ๋ฌ ๋ณ์นญ์ด ์์ด๋ ์๋ฒฝํ ์๋ฃจ์ ์ ๋๋ค. ์ํ๋ค๋ฉด ๋๋ฉ์ธ ๋๋ ๋ณ์นญ๋ณ ์ ์ฅ ๊ณต๊ฐ ์ ํ์ ์ค์ ํ ์๋ ์์ต๋๋ค.
์ด๋ฉ์ผ ์๋น์ค ๋น๊ต ์ฝ๊ธฐ
์๋ ์๋ฆฌ
-
Apple Mail, Thunderbird, Gmail, Outlook ๊ฐ์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ๋น๋ฐ๋ฒํธ๋ก ์ ํฌ ์์ ํ IMAP ์๋ฒ์ ์ฐ๊ฒฐํฉ๋๋ค:
- ์ฌ์ฉ์ ์ด๋ฆ์
hello@example.com๊ฐ์ ๋๋ฉ์ธ์ด ํฌํจ๋ ์ ์ฒด ๋ณ์นญ์ ๋๋ค. - ๋น๋ฐ๋ฒํธ๋ ๋ฌด์์๋ก ์์ฑ๋๋ฉฐ ๋น๋ฐ๋ฒํธ ์์ฑ์ ํด๋ฆญํ ๋๋ง 30์ด ๋์ ํ์๋ฉ๋๋ค. ์ด ๋ฒํผ์ ๋ด ๊ณ์ ๋๋ฉ์ธ ๋ณ์นญ์์ ์ฐพ์ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ด๋ฆ์
-
์ฐ๊ฒฐ๋๋ฉด, ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๋ IMAP ํ๋กํ ์ฝ ๋ช ๋ น์ด๋ฅผ ์ฐ๋ฆฌ IMAP ์๋ฒ์ ๋ณด๋ด์ ๋ฉ์ผํจ์ ๋๊ธฐํ ์ํ๋ก ์ ์งํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์์ ์ ์ฅ๋ ์ด๋ฉ์ผ ์์ฑ ๋ฐ ์ ์ฅ๊ณผ ์ฌ์ฉ์๊ฐ ํ ์ ์๋ ๊ธฐํ ์์ (์: ์ด๋ฉ์ผ์ ์ค์ ํ์ํ๊ฑฐ๋ ์คํธ/์ ํฌ ๋ฉ์ผ๋ก ํ๋๊ทธ ์ง์ )์ด ํฌํจ๋ฉ๋๋ค.
-
๋ฉ์ผ ๊ตํ ์๋ฒ(์ผ๋ฐ์ ์ผ๋ก "MX" ์๋ฒ๋ผ๊ณ ํจ)๋ ์๋ก ๋ค์ด์ค๋ ์ด๋ฉ์ผ์ ๋ฐ์์ ๋ฉ์ผํจ์ ์ ์ฅํฉ๋๋ค. ์ด๋ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฆผ์ ๋ฐ๊ณ ๋ฉ์ผํจ์ ๋๊ธฐํํฉ๋๋ค. ์ฐ๋ฆฌ ๋ฉ์ผ ๊ตํ ์๋ฒ๋ ์ด๋ฉ์ผ์ ํ ๋ช ์ด์์ ์์ ์(ํฌํจ ์นํ )์๊ฒ ์ ๋ฌํ๊ฑฐ๋, ์ํธํ๋ IMAP ์ ์ฅ์์ ์ด๋ฉ์ผ์ ์ ์ฅํ๊ฑฐ๋, ๋ ๋ค ํ ์ ์์ต๋๋ค!
Tip
๋ ์๊ณ ์ถ์ผ์ ๊ฐ์? ์ด๋ฉ์ผ ์ ๋ฌ ์ค์ ๋ฐฉ๋ฒ, ๋ฉ์ผ ๊ตํ ์๋น์ค ์๋ ๋ฐฉ์, ๋๋ ๊ฐ์ด๋๋ฅผ ์ฝ์ด๋ณด์ธ์.
-
๋ด๋ถ์ ์ผ๋ก, ์ฐ๋ฆฌ์ ์์ ํ ์ด๋ฉ์ผ ์ ์ฅ ์ค๊ณ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ฉ์ผํจ์ ์ํธํํ๊ณ ์ค์ง ์ฌ์ฉ์๋ง ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค:
-
๋ฐ์ ์๋ก๋ถํฐ ์ ๋ฉ์ผ์ด ์์ ๋๋ฉด, ๋ฉ์ผ ๊ตํ ์๋ฒ๋ ๊ฐ๋ณ์ ์ด๊ณ ์์์ด๋ฉฐ ์ํธํ๋ ๋ฉ์ผํจ์ ๋ฉ์ผ์ ๊ธฐ๋กํฉ๋๋ค.
-
์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๋ก IMAP ์๋ฒ์ ์ฐ๊ฒฐํ๋ฉด, ๋น๋ฐ๋ฒํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ์ํธํ๋์ด ๋ฉ์ผํจ์ ์ฝ๊ณ ์ฐ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋น๋ฐ๋ฒํธ๋ก๋ง ๋ฉ์ผํจ์ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค. ์ด ๋น๋ฐ๋ฒํธ๋ ์ฌ์ฉ์๋ง ์๊ณ ์์ผ๋ฏ๋ก, ์ฌ์ฉ์๋ง ๋ฉ์ผํจ์ ์ ๊ทผํ์ฌ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค. ๋ค์์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์ผ์ ํด๋งํ๊ฑฐ๋ ๋๊ธฐํํ ๋, ์ ๋ฉ์์ง๋ ์ด ์์ ๋ฉ์ผํจ์์ ์ ์ก๋์ด ์ ๊ณต๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํด ์ค์ ๋ฉ์ผํจ ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค. ์ด ์์ ๋ฉ์ผํจ์ ์ดํ ์ญ์ ๋์ด ๋น๋ฐ๋ฒํธ๋ก ๋ณดํธ๋ ๋ฉ์ผํจ์๋ง ๋ฉ์์ง๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค.
-
IMAP์ ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ(์: Apple Mail ๋๋ Thunderbird ๊ฐ์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ), ์์ ๋์คํฌ ์ ์ฅ์์ ์ธ ํ์๊ฐ ์์ต๋๋ค. ๋์ ๋ฉ๋ชจ๋ฆฌ ๋ด ์ํธํ๋ IMAP ๋น๋ฐ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํฉ๋๋ค. ์ค์๊ฐ์ผ๋ก ๋ฉ์์ง๊ฐ ์ ๋ฌ๋ ๋, ๋ชจ๋ IMAP ์๋ฒ์ ํ์ฑ ์ธ์ ์ด ์๋์ง ๋ฌป๋ WebSocket ์์ฒญ์ ๋ณด๋ด๊ณ (์ด๊ฒ์ด ๊ฐ์ ธ์ค๊ธฐ ๋ถ๋ถ), ์ด์ด์ ์ํธํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ฌํฉ๋๋ค โ ๋ฐ๋ผ์ ์์ ๋ฉ์ผํจ์ ์ธ ํ์ ์์ด ์ํธํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํด ์ค์ ์ํธํ๋ ๋ฉ์ผํจ์ ์ธ ์ ์์ต๋๋ค.
-
-
์ํธํ๋ ๋ฉ์ผํจ์ ๋ฐฑ์ ์ ๋งค์ผ ์์ฑ๋ฉ๋๋ค. ์ธ์ ๋ ์ ๋ฐฑ์ ์ ์์ฒญํ๊ฑฐ๋ ๋ด ๊ณ์ ๋๋ฉ์ธ ๋ณ์นญ์์ ์ต์ ๋ฐฑ์ ์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ด๋ฉ์ผ ์๋น์ค๋ก ์ ํํ ๊ฒฝ์ฐ, ์ธ์ ๋ ๋ฉ์ผํจ๊ณผ ๋ฐฑ์ ์ ์ฝ๊ฒ ๋ง์ด๊ทธ๋ ์ด์ , ๋ค์ด๋ก๋, ๋ด๋ณด๋ด๊ธฐ ๋ฐ ์ญ์ ํ ์ ์์ต๋๋ค.
๊ธฐ์
๋ฐ์ดํฐ๋ฒ ์ด์ค
๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ๊ณ์ธต๋ ๊ฒํ ํ์ง๋ง, SQLite๋งํผ ์ฐ๋ฆฌ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑ์ํค๋ ๊ฒ์ ์์์ต๋๋ค:
| Database | Encryption-at-rest | Sandboxed Mailboxes | License | Used Everywhere |
|---|---|---|---|---|
| SQLite โญ | โ SQLite3MultipleCiphers์ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅ | โ | โ ํผ๋ธ๋ฆญ ๋๋ฉ์ธ | โ |
| MongoDB | โ "MongoDB Enterprise์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ" | โ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค | โ AGPL ๋ฐ SSPL-1.0 |
โ |
| rqlite | โ ๋คํธ์ํฌ ์ ์ฉ | โ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค | โ
MIT |
โ |
| dqlite | โ ํ ์คํธ๋์ง ์์๊ฑฐ๋ ์์ง ์ง์๋์ง ์์? | โ ํ ์คํธ๋์ง ์์๊ฑฐ๋ ์์ง ์ง์๋์ง ์์? | โ
LGPL-3.0-only |
โ |
| PostgreSQL | โ ์ | โ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค | โ
PostgreSQL (BSD ๋๋ MIT์ ์ ์ฌ) |
โ |
| MariaDB | โ InnoDB ์ ์ฉ | โ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค | โ
GPLv2 ๋ฐ BUSL-1.1 |
โ |
| CockroachDB | โ ์ํฐํ๋ผ์ด์ฆ ์ ์ฉ ๊ธฐ๋ฅ | โ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค | โ BUSL-1.1 ๋ฑ |
โ |
์ ํ์์ ์ฌ๋ฌ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ์ต์ ์ ๋น๊ตํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด ์์ต๋๋ค.
Security
ํญ์ ์ฐ๋ฆฌ๋ encryption-at-rest (AES-256), encryption-in-transit (TLS), ๐ Tangerine๋ฅผ ์ฌ์ฉํ๋ DNS over HTTPS("DoH"), ๊ทธ๋ฆฌ๊ณ ๋ฉ์ผ๋ฐ์ค์ ๋ํ sqleet (ChaCha20-Poly1305) ์ํธํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ถ๊ฐ๋ก, ์ฐ๋ฆฌ๋ ํ ํฐ ๊ธฐ๋ฐ 2๋จ๊ณ ์ธ์ฆ(SMS๋ ์ค๊ฐ์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ฏ๋ก ์ฌ์ฉํ์ง ์์), ๋ฃจํธ ์ ๊ทผ์ด ๋นํ์ฑํ๋ ํ์ SSH ํค, ์ ํ๋ IP ์ฃผ์๋ฅผ ํตํ ์๋ฒ ๋ ์ ์ ๊ทผ ๋ฑ ๋ค์ํ ๋ณด์ ์กฐ์น๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ์์ ์ธ ๋ฉ์ด๋ ๊ณต๊ฒฉ ๋๋ ์ 3์ ๋ฒค๋์ ์ ์ฑ ์ง์์ด ๋ฐ์ํ๋๋ผ๋, ๊ทํ์ ๋ฉ์ผ๋ฐ์ค๋ ์ค์ง ๊ทํ๊ฐ ์์ฑํ ๋น๋ฐ๋ฒํธ๋ก๋ง ์ด ์ ์์ต๋๋ค. ์์ฌํ์ธ์, ์ฐ๋ฆฌ๋ Cloudflare, DataPacket, Digital Ocean, GitHub, Vultr์ SOC Type 2 ์ค์ ์๋ฒ ์ ๊ณต์ ์ฒด ์ธ์๋ ์ด๋ค ์ 3์ ๋ฒค๋์๋ ์์กดํ์ง ์์ต๋๋ค.
์ฐ๋ฆฌ์ ๋ชฉํ๋ ๊ฐ๋ฅํ ํ ๋จ์ผ ์คํจ ์ง์ ์ ์ต์ํํ๋ ๊ฒ์ ๋๋ค.
๋ฉ์ผ๋ฐ์ค
์์ฝ; ์ฐ๋ฆฌ์ IMAP ์๋ฒ๋ ๊ฐ ๋ฉ์ผ๋ฐ์ค๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ์ํธํ๋ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
SQLite๋ ๋งค์ฐ ์ธ๊ธฐ ์๋ ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ํ์ฌ ๊ทํ์ ํด๋ํฐ๊ณผ ์ปดํจํฐ์์ ์คํ ์ค์ด๋ฉฐ โ ๊ฑฐ์ ๋ชจ๋ ์ฃผ์ ๊ธฐ์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ์ ์ํธํ๋ ์๋ฒ์๋ linux@example.com, info@example.com, hello@example.com ๋ฑ์ ๋ฉ์ผ๋ฐ์ค๋ง๋ค ํ๋์ฉ .sqlite ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ๋ก ๋ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ ์ด๋ฆ์ ์ด๋ฉ์ผ ์ฃผ์๋ก ์ง์ง ์๊ณ , ๋์ BSON ObjectID์ ๊ณ ์ UUID๋ฅผ ์์ฑํ์ฌ ๋ฉ์ผ๋ฐ์ค ์์ ์๋ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ ์ ์๋๋ก ํฉ๋๋ค(์: 353a03f21e534321f5d6e267.sqlite).
๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ทํ๋ง ์๊ณ ์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ sqleet (ChaCha20-Poly1305)๋ก ์์ฒด ์ํธํ๋ฉ๋๋ค. ์ด๋ ๊ทํ์ ๋ฉ์ผ๋ฐ์ค๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์ํธํ๋๊ณ , ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์๋๋ฐ์ค ์ฒ๋ฆฌ๋๊ณ , ํด๋ ๊ฐ๋ฅํจ์ ์๋ฏธํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์ PRAGMA๋ฅผ ์ฌ์ฉํ์ฌ SQLite๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ์ต๋๋ค:
PRAGMA |
๋ชฉ์ |
|---|---|
cipher=chacha20 |
ChaCha20-Poly1305 SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธํ. ์์ธํ ๋ด์ฉ์ ํ๋ก์ ํธ ์๋์ better-sqlite3-multiple-ciphers๋ฅผ ์ฐธ์กฐํ์ธ์. |
key="****************" |
์ด๊ฒ์ ๊ทํ์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ IMAP ์ฐ๊ฒฐ์ ํตํด ์๋ฒ๋ก ์ ๋ฌ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์์๋ง ๋ณตํธํ๋ ๋น๋ฐ๋ฒํธ์ ๋๋ค. ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ์ธ์ ๋ง๋ค ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค๊ฐ ์์ฑ๋๊ณ ๋ซํ ์๋๋ฐ์ฑ๊ณผ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์ฅํฉ๋๋ค. |
journal_mode=WAL |
์ฐ๊ธฐ ์์ ๋ก๊ทธ("WAL") ์ฑ๋ฅ ํฅ์ ๋ฐ ๋์ ์ฝ๊ธฐ ์ ๊ทผ ํ์ฉ. |
busy_timeout=5000 |
๋ค๋ฅธ ์ฐ๊ธฐ ์์ ์ด ์งํ ์ค์ผ ๋ ์ฐ๊ธฐ ์ ๊ธ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. ๊ด๋ จ ์ ๋ณด. |
synchronous=NORMAL |
๋ฐ์ดํฐ ์์ ์ํ ์์ด ํธ๋์ญ์ ๋ด๊ตฌ์ฑ์ ๋์ ๋๋ค. ๊ด๋ จ ์ ๋ณด. |
foreign_keys=ON |
์ธ๋ ํค ์ฐธ์กฐ(์: ํ ํ ์ด๋ธ์์ ๋ค๋ฅธ ํ ์ด๋ธ๋ก์ ๊ด๊ณ)๋ฅผ ๊ฐ์ ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก SQLite์์๋ ํ์ฑํ๋์ด ์์ง ์์ง๋ง, ๊ฒ์ฆ๊ณผ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ํด ํ์ฑํํด์ผ ํฉ๋๋ค. |
encoding='UTF-8' |
๊ฐ๋ฐ์์ ํธ์๋ฅผ ์ํ ๊ธฐ๋ณธ ์ธ์ฝ๋ฉ์ ๋๋ค. |
๋ชจ๋ ๋ค๋ฅธ ๊ธฐ๋ณธ๊ฐ์ ๊ณต์ PRAGMA ๋ฌธ์์ ๋ช ์๋ SQLite์์ ๊ฐ์ ธ์ต๋๋ค.
๋์์ฑ
์์ฝ; ์ํธํ๋ SQLite ๋ฉ์ผ๋ฐ์ค์ ๋ํ ๋์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ์ํด
WebSocket์ ์ฌ์ฉํฉ๋๋ค.
์ฝ๊ธฐ
ํด๋ํฐ์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๋ imap.forwardemail.net์ ๋น์ฌ์ Digital Ocean IP ์ฃผ์ ์ค ํ๋๋ก ํด์ํ ์ ์์ผ๋ฉฐ, ๋ฐ์คํฌํฑ ํด๋ผ์ด์ธํธ๋ ์ ํ ๋ค๋ฅธ ์ ๊ณต์์ ๋ณ๋ IP๋ฅผ ํด์ํ ์ ์์ต๋๋ค.
์ด๋ค IMAP ์๋ฒ์ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ๋๋ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค์๊ฐ์ผ๋ก 100% ์ ํํ๊ฒ ์ฝ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๋ WebSocket์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
์ฐ๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ธฐ๋ ์ฝ๊ฐ ๋ค๋ฆ ๋๋ค โ SQLite๋ ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์ผ๋ฐ์ค๊ฐ ๋จ์ผ ํ์ผ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋์ litestream, rqlite, dqlite์ ๊ฐ์ ์ต์
์ ํ์ํ์ผ๋, ์ด๋ ๊ฒ๋ ์ฐ๋ฆฌ์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ์ง ๋ชปํ์ต๋๋ค.
์ฐ๊ธฐ ์ ๋ก๊ทธ ๊ธฐ๋ก("WAL")์ด ํ์ฑํ๋ ์ํ์์ ์ฐ๊ธฐ๋ฅผ ์ํํ๋ ค๋ฉด, ๋จ ํ๋์ ์๋ฒ("Primary")๋ง์ด ์ด๋ฅผ ๋ด๋นํ๋๋ก ํด์ผ ํฉ๋๋ค. WAL์ ๋์์ฑ์ ํฌ๊ฒ ํฅ์์ํค๋ฉฐ ํ ๋ช ์ ์์ฑ์์ ๋ค์์ ์ฝ๊ธฐ์๋ฅผ ํ์ฉํฉ๋๋ค.
Primary ์๋ฒ๋ ์ํธํ๋ ๋ฉ์ผ๋ฐ์ค๋ฅผ ํฌํจํ๋ ๋ง์ดํธ๋ ๋ณผ๋ฅจ์ด ์๋ ๋ฐ์ดํฐ ์๋ฒ์์ ์คํ๋ฉ๋๋ค. ๋ฐฐํฌ ๊ด์ ์์ ๋ณด๋ฉด, imap.forwardemail.net ๋ค์ ์๋ ๋ชจ๋ ๊ฐ๋ณ IMAP ์๋ฒ๋ฅผ ๋ณด์กฐ ์๋ฒ("Secondary")๋ก ๊ฐ์ฃผํ ์ ์์ต๋๋ค.
์๋ฐฉํฅ ํต์ ์ WebSockets๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค:
- Primary ์๋ฒ๋ ws์
WebSocketServer์๋ฒ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. - Secondary ์๋ฒ๋ ws์
WebSocketํด๋ผ์ด์ธํธ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ด๋ websocket-as-promised์ reconnecting-websocket์ผ๋ก ๋ํ๋์ด ์์ต๋๋ค. ์ด ๋ ๋ํผ๋WebSocket์ด ์ฌ์ฐ๊ฒฐ๋๊ณ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ธฐ๋ฅผ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ฐฑ์
์์ฝ; ์ํธํ๋ ๋ฉ์ผ๋ฐ์ค์ ๋ฐฑ์ ์ ๋งค์ผ ์์ฑ๋ฉ๋๋ค. ๋ํ ์ธ์ ๋ ์ง ๋ด ๊ณ์ ๋๋ฉ์ธ ๋ณ์นญ์์ ์ฆ์ ์ ๋ฐฑ์ ์ ์์ฒญํ๊ฑฐ๋ ์ต์ ๋ฐฑ์ ์ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.
๋ฐฑ์
์ ์ํด, IMAP ๋ช
๋ น ์ฒ๋ฆฌ ์ค ๋งค์ผ SQLite VACUUM INTO ๋ช
๋ น์ ์คํํ๋ฉฐ, ์ด๋ ๋ฉ๋ชจ๋ฆฌ ๋ด IMAP ์ฐ๊ฒฐ์์ ์ํธํ๋ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ฉํฉ๋๋ค. ๊ธฐ์กด ๋ฐฑ์
์ด ์๊ฑฐ๋ ํ์ผ์ SHA-256 ํด์๊ฐ ๊ฐ์ฅ ์ต๊ทผ ๋ฐฑ์
๊ณผ ๋น๊ตํด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ฐฑ์
์ด ์ ์ฅ๋ฉ๋๋ค.
backup ๋ด์ฅ ๋ช
๋ น ๋์ VACUUM INTO ๋ช
๋ น์ ์ฌ์ฉํ๋ ์ด์ ๋, backup ๋ช
๋ น ์คํ ์ค ํ์ด์ง๊ฐ ์์ ๋๋ฉด ๋ค์ ์์ํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. VACUUM INTO ๋ช
๋ น์ ์ค๋
์ท์ ์ฐ์ต๋๋ค. ์์ธํ ๋ด์ฉ์ GitHub ๋ฐ Hacker News์ ๋๊ธ์ ์ฐธ์กฐํ์ธ์.
๋ํ backup ๋ช
๋ น์ rekey๊ฐ ํธ์ถ๋ ๋๊น์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ์ ์ํธํ๋์ง ์์ ์ํ๋ก ๋จ๊ธฐ ๋๋ฌธ์ VACUUM INTO๋ฅผ ์ฌ์ฉํฉ๋๋ค(์์ธํ ๋ด์ฉ์ ์ด GitHub ๋๊ธ ์ฐธ์กฐ).
Secondary๋ WebSocket ์ฐ๊ฒฐ์ ํตํด Primary์ ๋ฐฑ์
์คํ์ ์ง์ํ๋ฉฐ, Primary๋ ๋ช
๋ น์ ์์ ํ ํ ๋ค์์ ์ํํฉ๋๋ค:
- ์ํธํ๋ ๋ฉ์ผ๋ฐ์ค์ ์ฐ๊ฒฐํฉ๋๋ค.
- ์ฐ๊ธฐ ์ ๊ธ์ ํ๋ํฉ๋๋ค.
wal_checkpoint(PASSIVE)๋ฅผ ํตํด WAL ์ฒดํฌํฌ์ธํธ๋ฅผ ์คํํฉ๋๋ค.- SQLite
VACUUM INTO๋ช ๋ น์ ์คํํฉ๋๋ค. - ๋ณต์ฌ๋ ํ์ผ์ด ์ํธํ๋ ๋น๋ฐ๋ฒํธ๋ก ์ด๋ฆฌ๋์ง ํ์ธํฉ๋๋ค(์์ ์ฅ์น/๋๋ฏธ ๋ฐฉ์ง).
- ์ด๋ฅผ Cloudflare R2์ ์ ๋ก๋ํ์ฌ ์ ์ฅํ๊ฑฐ๋ ์ง์ ๋ ๊ฒฝ์ฐ ์์ฒด ์ ๊ณต์์๊ฒ ์ ๋ก๋ํฉ๋๋ค.
๋ฉ์ผ๋ฐ์ค๋ ์ํธํ๋์ด ์๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์ โ WebSocket ํต์ ์ ๋ํด IP ์ ํ ๋ฐ ๊ธฐํ ์ธ์ฆ ์กฐ์น๋ฅผ ์ ์ฉํ๊ณ ์์ง๋ง โ ์ ์์ ์ธ ํ์์๊ฐ ์๋๋ผ๋ WebSocket ํ์ด๋ก๋์ IMAP ๋น๋ฐ๋ฒํธ๊ฐ ํฌํจ๋์ด ์์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด ์ ์์ต๋๋ค.
ํ์ฌ๋ ๋ฉ์ผ๋ฐ์ค๋น ๋ฐฑ์ ์ด ํ๋๋ง ์ ์ฅ๋์ง๋ง, ์์ผ๋ก๋ ์์ ๋ณต๊ตฌ("PITR")๋ฅผ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
๊ฒ์
์ฐ๋ฆฌ์ IMAP ์๋ฒ๋ ๋ณต์กํ ์ฟผ๋ฆฌ, ์ ๊ท ํํ์ ๋ฑ์ ์ง์ํ๋ SEARCH ๋ช
๋ น์ ์ง์ํฉ๋๋ค.
๋น ๋ฅธ ๊ฒ์ ์ฑ๋ฅ์ FTS5์ sqlite-regex ๋๋ถ์ ๋๋ค.
์ฐ๋ฆฌ๋ SQLite ๋ฉ์ผ๋ฐ์ค์ Date ๊ฐ์ ISO 8601 ๋ฌธ์์ด๋ก ์ ์ฅํ๋ฉฐ, ์ด๋ Date.prototype.toISOString (UTC ํ์์กด ์ฌ์ฉ) ์ ํตํด ๋๋ฑ์ฑ ๋น๊ต๊ฐ ์ ๋๋ก ์๋ํ๋๋ก ํฉ๋๋ค.
๊ฒ์ ์ฟผ๋ฆฌ์ ํฌํจ๋ ๋ชจ๋ ์์ฑ์ ๋ํด ์ธ๋ฑ์ค๋ ์ ์ฅ๋ฉ๋๋ค.
ํ๋ก์ ํธ
๋ค์์ ์์ค ์ฝ๋ ๋ฐ ๊ฐ๋ฐ ํ๋ก์ธ์ค์์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ์ํ๋ฒณ์์ผ๋ก ์ ๋ฆฌํ ํ์ ๋๋ค:
| ํ๋ก์ ํธ | ๋ชฉ์ |
|---|---|
| Ansible | ์ ์ฒด ์๋ฒ ๊ตฐ์ ์ฝ๊ฒ ์ ์ง, ํ์ฅ ๋ฐ ๊ด๋ฆฌํ๊ธฐ ์ํ DevOps ์๋ํ ํ๋ซํผ์ ๋๋ค. |
| Bree | cron, ๋ ์ง, ms, later, ๊ทธ๋ฆฌ๊ณ ์ฌ๋์ด ์ดํดํ๊ธฐ ์ฌ์ด ์ง์์ ์ ๊ณตํ๋ Node.js ๋ฐ JavaScript์ฉ ์์ ์ค์ผ์ค๋ฌ์ ๋๋ค. |
| Cabin | ๋ณด์๊ณผ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฅผ ๊ณ ๋ คํ ๊ฐ๋ฐ์ ์นํ์ ์ธ JavaScript ๋ฐ Node.js ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. |
| Lad | MVC ๋ฑ์ผ๋ก ์ ์ฒด ์ํคํ ์ฒ์ ์์ง๋์ด๋ง ์ค๊ณ๋ฅผ ์ง์ํ๋ Node.js ํ๋ ์์ํฌ์ ๋๋ค. |
| MongoDB | ๋ฉ์ผ๋ฐ์ค ์ธ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฃจ์ ์ ๋๋ค(์: ๊ณ์ , ์ค์ , ๋๋ฉ์ธ, ๋ณ์นญ ๊ตฌ์ฑ). |
| Mongoose | ์ ์ฒด ์คํ์์ ์ฌ์ฉํ๋ MongoDB ๊ฐ์ฒด ๋ฌธ์ ๋ชจ๋ธ๋ง("ODM")์ ๋๋ค. ์ฐ๋ฆฌ๋ SQLite์ ํจ๊ป Mongoose๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์๋๋ก ํน๋ณํ ํฌํผ๋ฅผ ์์ฑํ์ต๋๋ค ๐ |
| Node.js | ๋ชจ๋ ์๋ฒ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ์คํ ์์ค ํฌ๋ก์ค ํ๋ซํผ JavaScript ๋ฐํ์ ํ๊ฒฝ์ ๋๋ค. |
| Nodemailer | ์ด๋ฉ์ผ ์ ์ก, ์ฐ๊ฒฐ ์์ฑ ๋ฑ์ ์ํ Node.js ํจํค์ง์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ํ๋ก์ ํธ์ ๊ณต์ ํ์์์ ๋๋ค. |
| Redis | ์บ์ฑ, ๋ฐํ/๊ตฌ๋ ์ฑ๋, DNS over HTTPS ์์ฒญ์ ์ํ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค. |
| SQLite3MultipleCiphers | ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ(์ฐ๊ธฐ ์์ ๊ธฐ๋ก("WAL"), ์ ๋, ๋กค๋ฐฑ ๋ฑ ํฌํจ)์ ์ํธํํ ์ ์๋ SQLite ์ํธํ ํ์ฅ์ ๋๋ค. |
| SQLiteStudio | ๊ฐ๋ฐ์ฉ ๋ฉ์ผ๋ฐ์ค๋ฅผ ํ ์คํธ, ๋ค์ด๋ก๋, ์กฐํํ ์ ์๋ ์๊ฐ์ SQLite ํธ์ง๊ธฐ(์ฌ์ฉํ ์๋ ์์ต๋๋ค). |
| SQLite | ํ์ฅ ๊ฐ๋ฅํ๊ณ ๋ ๋ฆฝ์ ์ด๋ฉฐ ๋น ๋ฅด๊ณ ๊ฒฌ๊ณ ํ IMAP ์ ์ฅ์ ์ํ ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณ์ธต์ ๋๋ค. |
| Spam Scanner | Node.js ๊ธฐ๋ฐ ์คํธ ๋ฐฉ์ง, ์ด๋ฉ์ผ ํํฐ๋ง ๋ฐ ํผ์ฑ ๋ฐฉ์ง ๋๊ตฌ์ ๋๋ค (Spam Assassin ๋ฐ rspamd ๋์ฒดํ). |
| Tangerine | Node.js์ Redis ์บ์ฑ์ ์ฌ์ฉํ DNS over HTTPS ์์ฒญ์ผ๋ก ์ ์ธ๊ณ ์ผ๊ด์ฑ๊ณผ ๊ทธ ์ด์์ ๋ณด์ฅํฉ๋๋ค. |
| Thunderbird | ์ฐ๋ฆฌ ๊ฐ๋ฐํ์ด ์ฌ์ฉํ๋ฉฐ Forward Email๊ณผ ํจ๊ป ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํ๋ ์ ํธ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ์ ๋๋ค. |
| UTM | iOS ๋ฐ macOS์ฉ ๊ฐ์ ๋จธ์ ์ ์์ฑํ์ฌ IMAP ๋ฐ SMTP ์๋ฒ์ ํจ๊ป ๋ค์ํ ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๋ ฌ๋ก ํ ์คํธํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฐ๋ฐํ ๋๊ตฌ์ ๋๋ค. |
| Ubuntu | ๋ชจ๋ ์ธํ๋ผ๋ฅผ ๊ตฌ๋ํ๋ ํ๋์ ์ธ ์คํ ์์ค Linux ๊ธฐ๋ฐ ์๋ฒ ์ด์ ์ฒด์ ์ ๋๋ค. |
| WildDuck | IMAP ์๋ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค โ ์ฒจ๋ถ ํ์ผ ์ค๋ณต ์ ๊ฑฐ ๋ฐ IMAP ํ๋กํ ์ฝ ์ง์ ์ฐธ๊ณ ํ์ธ์. |
| better-sqlite3-multiple-ciphers | SQLite3์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ํธ์์ฉํ๊ธฐ ์ํ ๋น ๋ฅด๊ณ ๊ฐ๋จํ Node.js API ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. |
| email-templates | ๋ง์ถค ์ด๋ฉ์ผ(์: ๊ณ์ ์๋ฆผ ๋ฑ)์ ์์ฑ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ์ ์กํ ์ ์๋ ๊ฐ๋ฐ์ ์นํ์ ์ธ ์ด๋ฉ์ผ ํ๋ ์์ํฌ์ ๋๋ค. |
| json-sql-enhanced | Mongo ์คํ์ผ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ SQL ์ฟผ๋ฆฌ ๋น๋์ ๋๋ค. ์ ์ฒด ์คํ์์ Mongo ์คํ์ผ๋ก ๊ณ์ ์์ฑํ ์ ์์ด ๊ฐ๋ฐํ์ ์๊ฐ์ ์ ์ฝํ๋ฉฐ, ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํด SQL ์ธ์ ์ ๊ณต๊ฒฉ๋ ๋ฐฉ์งํฉ๋๋ค. |
| knex-schema-inspector | ๊ธฐ์กด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์ ๋ณด๋ฅผ ์ถ์ถํ๋ SQL ์ ํธ๋ฆฌํฐ์
๋๋ค. ๋ชจ๋ ์ธ๋ฑ์ค, ํ
์ด๋ธ, ์ปฌ๋ผ, ์ ์ฝ ์กฐ๊ฑด ๋ฑ์ด ์ฌ๋ฐ๋ฅด๊ณ 1:1๋ก ์ผ์นํ๋์ง ์ฝ๊ฒ ๊ฒ์ฆํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ ์ ์ ์ปฌ๋ผ๊ณผ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ ์๋ํ ํฌํผ๋ ์์ฑํ์ผ๋ฉฐ, ๋งค์ฐ ์์ธํ ์ค๋ฅ ์๋ฆผ๋ ์ ๊ณตํฉ๋๋ค. |
| knex | ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
๊ณผ knex-schema-inspector๋ฅผ ํตํ ์คํค๋ง ๊ฒ์ฆ์๋ง ์ฌ์ฉํ๋ SQL ์ฟผ๋ฆฌ ๋น๋์
๋๋ค. |
| mandarin | Google Cloud Translation API๋ฅผ ์ฌ์ฉํ์ฌ Markdown ์ง์๊ณผ ํจ๊ป ์๋ i18n ๊ตฌ๋ฌธ ๋ฒ์ญ์ ์ ๊ณตํฉ๋๋ค. |
| mx-connect | MX ์๋ฒ์์ ์ฐ๊ฒฐ์ ํด๊ฒฐํ๊ณ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ Node.js ํจํค์ง์ ๋๋ค. |
| pm2 | ๋ด์ฅ ๋ก๋ ๋ฐธ๋ฐ์๊ฐ ํฌํจ๋ Node.js ํ๋ก๋์ ํ๋ก์ธ์ค ๊ด๋ฆฌ์์ ๋๋ค (์ฑ๋ฅ์ ์ํด ๋ฏธ์ธ ์กฐ์ ๋จ). |
| smtp-server | SMTP ์๋ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ๋ฉ์ผ ๊ตํ("MX") ๋ฐ ์์๋ฐ์ด๋ SMTP ์๋ฒ์ ์ฌ์ฉํฉ๋๋ค. |
| ImapTest | IMAP ์๋ฒ๋ฅผ ๋ฒค์น๋งํฌ ๋ฐ RFC ๋ช ์ธ IMAP ํ๋กํ ์ฝ ํธํ์ฑ์ ๋ํด ํ ์คํธํ๋ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ์ด ํ๋ก์ ํธ๋ Dovecot ํ์ด ๋ง๋ค์์ผ๋ฉฐ(2002๋ 7์๋ถํฐ ํ๋ฐํ ์คํ ์์ค IMAP ๋ฐ POP3 ์๋ฒ), ์ฐ๋ฆฌ๋ ์ด ๋๊ตฌ๋ก IMAP ์๋ฒ๋ฅผ ๊ด๋ฒ์ํ๊ฒ ํ ์คํธํ์ต๋๋ค. |
์ฐ๋ฆฌ์ GitHub ์์ค ์ฝ๋์์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ํ๋ก์ ํธ๋ค์ ์ฐพ์ ์ ์์ต๋๋ค.
Providers
| Provider | Purpose |
|---|---|
| Cloudflare | DNS ์ ๊ณต์, ์ํ ๊ฒ์ฌ, ๋ก๋ ๋ฐธ๋ฐ์, ๊ทธ๋ฆฌ๊ณ Cloudflare R2๋ฅผ ์ด์ฉํ ๋ฐฑ์ ์คํ ๋ฆฌ์ง. |
| GitHub | ์์ค ์ฝ๋ ํธ์คํ , CI/CD, ๊ทธ๋ฆฌ๊ณ ํ๋ก์ ํธ ๊ด๋ฆฌ. |
| Digital Ocean | ์ ์ฉ ์๋ฒ ํธ์คํ ๋ฐ ๊ด๋ฆฌํ ๋ฐ์ดํฐ๋ฒ ์ด์ค. |
| Vultr | ์ ์ฉ ์๋ฒ ํธ์คํ . |
| DataPacket | ์ ์ฉ ์๋ฒ ํธ์คํ . |
Thoughts
Principles
Forward Email์ ๋ค์ ์์น์ ๋ฐ๋ผ ์ค๊ณ๋์์ต๋๋ค:
- ํญ์ ๊ฐ๋ฐ์ ์นํ์ ์ด๊ณ , ๋ณด์ ๋ฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ์ ์ค์ ์ ๋๋ฉฐ, ํฌ๋ช ํด์ผ ํฉ๋๋ค.
- MVC, Unix, KISS, DRY, YAGNI, Twelve Factor, ์ค์ปด์ ๋ฉด๋๋ , ๊ทธ๋ฆฌ๊ณ ๋๊ทธํธ๋ฉ์ ์ค์ํฉ๋๋ค.
- ์๊ธ์ด ๋ถ์กฑํ, ๋ถํธ์คํธ๋ฉ ๋ฐฉ์์ผ๋ก ์ด์๋๋, ๊ทธ๋ฆฌ๊ณ ๋ผ๋ฉด ์์ต์ฑ์ด ์๋ ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค.
Experiments
์์ฝ; ๊ถ๊ทน์ ์ผ๋ก S3 ํธํ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ๋ฐ/๋๋ Virtual Tables ์ฌ์ฉ์ ์ฑ๋ฅ ๋ฌธ์ ๋ก ๊ธฐ์ ์ ์ผ๋ก ์คํ ๊ฐ๋ฅํ์ง ์์ผ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ผ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์์์ ๋ ผ์ํ ์ต์ข SQLite ์๋ฃจ์ ์ ๋๋ฌํ๊ธฐ๊น์ง ๋ช ๊ฐ์ง ์คํ์ ํ์ต๋๋ค.
๊ทธ ์ค ํ๋๋ rclone๊ณผ SQLite๋ฅผ S3 ํธํ ์คํ ๋ฆฌ์ง ๊ณ์ธต๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ์๋์์ต๋๋ค.
์ด ์คํ์ ํตํด rclone, SQLite, ๊ทธ๋ฆฌ๊ณ VFS ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋ ์ ์ดํดํ๊ณ ๋ฐ๊ฒฌํ์ต๋๋ค:
- rclone์์
--vfs-cache-mode writesํ๋๊ทธ๋ฅผ ํ์ฑํํ๋ฉด ์ฝ๊ธฐ๋ ๊ด์ฐฎ์ง๋ง ์ฐ๊ธฐ๋ ์บ์๋ฉ๋๋ค.- ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ์ฌ๋ฌ IMAP ์๋ฒ๊ฐ ์๋ค๋ฉด, ๋จ์ผ ์์ฑ์์ ๋ค์์ ์ฒญ์ทจ์(์: pub/sub ๋ฐฉ์)๊ฐ ์๋ ์ด์ ์บ์๋ ์๋ฒ ๊ฐ์ ๋๊ธฐํ๋์ง ์์ต๋๋ค.
- ์ด๋ ๋งค์ฐ ๋ณต์กํ๋ฉฐ, ์ด๋ฐ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๋ฉด ๋จ์ผ ์คํจ ์ง์ ์ด ๋ ๋ง์ด ์๊น๋๋ค.
- S3 ํธํ ์คํ ๋ฆฌ์ง ์ ๊ณต์๋ ๋ถ๋ถ ํ์ผ ๋ณ๊ฒฝ์ ์ง์ํ์ง ์์ผ๋ฏ๋ก
.sqliteํ์ผ์ ์ด๋ค ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฒด ๋ณ๊ฒฝ ๋ฐ ์ฌ์ ๋ก๋๋ฅผ ์๋ฏธํฉ๋๋ค. rsync๊ฐ์ ๋ค๋ฅธ ์๋ฃจ์ ๋ ์์ง๋ง, ์ฐ๊ธฐ ์์ ๋ก๊ทธ("WAL") ์ง์์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์์ง ์์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ Litestream์ ๊ฒํ ํ์ต๋๋ค. ๋คํํ๋ ์ฐ๋ฆฌ์ ์ํธํ ์ฌ์ฉ์ ์ด๋ฏธ WAL ํ์ผ์ ์ํธํํ๋ฏ๋ก Litestream์ ์์กดํ ํ์๋ ์์ต๋๋ค. ํ์ง๋ง ์์ง Litestream์ ํ๋ก๋์ ์ ์์ ์๊ฒ ์ฌ์ฉํ๊ธฐ์๋ ๋ถ์กฑํ๋ฉฐ ์๋์ ๋ช ๊ฐ์ง ๋ฉ๋ชจ๊ฐ ์์ต๋๋ค.--vfs-cache-mode writes์ต์ (์ฐ๊ธฐ์ฉ์ผ๋ก rclone ์์์ SQLite๋ฅผ ์ฌ์ฉํ๋ ์ ์ผํ ๋ฐฉ๋ฒ)์ ์ฌ์ฉํ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ฒ์๋ถํฐ ๋ณต์ฌํ๋ ค ์๋ํฉ๋๋ค. 10GB์ง๋ฆฌ ๋ฉ์ผ๋ฐ์ค ํ๋๋ ๊ด์ฐฎ์ง๋ง, ๋งค์ฐ ํฐ ์ฌ๋ฌ ๋ฉ์ผ๋ฐ์ค๋ฅผ ์ฒ๋ฆฌํ๋ฉด IMAP ์๋ฒ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ ํ๊ณผENOMEM์ค๋ฅ, ์ธ๊ทธ๋ฉํ ์ด์ ์ค๋ฅ, ๋ฐ์ดํฐ ์์์ ์ง๋ฉดํฉ๋๋ค.
- SQLite Virtual Tables(์: s3db ์ฌ์ฉ)๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ S3 ํธํ ์คํ ๋ฆฌ์ง ๊ณ์ธต์ ๋๋ ค ํ๋ฉด ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค:
- ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๊ฐ ๋งค์ฐ ๋๋ฆฝ๋๋ค. S3 API ์๋ํฌ์ธํธ์ HTTP
GET,PUT,HEAD,POST์์ฒญ์ ๊ณ์ ๋ณด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. - ๊ฐ๋ฐ ํ
์คํธ์์ 500K-1M+ ๋ ์ฝ๋๋ฅผ ์ด๊ณผํ๋ฉด ๊ด์ฌ์ ์ธํฐ๋ท์์๋ S3 ํธํ ์ ๊ณต์์ ์ฐ๊ธฐ ๋ฐ ์ฝ๊ธฐ ์ฒ๋ฆฌ๋์ ์ํด ์ ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ์๋ค์ด ์์ฐจ์ SQL
INSERT๋ฌธ๊ณผ ๋๋ ๋ฐ์ดํฐ ์ฐ๊ธฐ๋ฅผfor๋ฃจํ๋ก ์คํํ๋๋ฐ, ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฑ๋ฅ์ด ๋งค์ฐ ๋๋ ธ์ต๋๋ค. - ๊ฐ์ ํ
์ด๋ธ์ ์ธ๋ฑ์ค,
ALTER TABLE๋ฌธ, ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ์ ํ์ฌํญ์ด ์์ด ๋ฐ์ดํฐ ์์ ๋ฐ๋ผ 1-2๋ถ ์ด์ ์ง์ฐ๋ ์ ์์ต๋๋ค. - ๊ฐ์ฒด๋ ์ํธํ๋์ง ์์ ์ํ๋ก ์ ์ฅ๋๋ฉฐ, ๊ธฐ๋ณธ ์ํธํ ์ง์์ด ์์ต๋๋ค.
- ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๊ฐ ๋งค์ฐ ๋๋ฆฝ๋๋ค. S3 API ์๋ํฌ์ธํธ์ HTTP
- sqlite-s3vfs๋ ๋น์ทํ ๊ฐ๋
๊ณผ ๊ธฐ์ ์ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช์ต๋๋ค. ๊ฐ๋ฅ์ฑ์ผ๋ก๋ wxSQLite3 ๊ฐ์ ์ํธํ๊ฐ ํฌํจ๋ ์ปค์คํ
sqlite3๋น๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ, ์ด๋ ์ค์ ํ์ผ ํธ์ง์ ํตํด ๊ฐ๋ฅํฉ๋๋ค(์ฐ๋ฆฌ๊ฐ ์ ์๋ฃจ์ ์์ ํ์ฌ ์ฌ์ฉ ์ค). - ๋ ๋ค๋ฅธ ์ ๊ทผ๋ฒ์ multiplex ํ์ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด์ง๋ง, 32GB ์ ํ์ด ์๊ณ ๋ณต์กํ ๋น๋ ๋ฐ ๊ฐ๋ฐ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค.
ALTER TABLE๋ฌธ์ด ํ์ํ๋ฏ๋ก(๊ฐ์ ํ ์ด๋ธ ์ฌ์ฉ ๋ถ๊ฐ)knex-schema-inspector์์ ํ ์ด ์ ๋๋ก ์๋ํ๋๋ก ํด์ผ ํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์์์ ๋ฐฉ์งํ๊ณ ,mongoose์คํค๋ง ์ ์์ ๋ฐ๋ฅธ ์ ํจํ ๋ฌธ์๋ก ๋ณํ ๊ฐ๋ฅํ ํ์ ๋ณด์ฅํฉ๋๋ค(์ ์ฝ์กฐ๊ฑด, ๋ณ์ ํ์ , ์์ ๋ฐ์ดํฐ ๊ฒ์ฆ ํฌํจ).- ์คํ์์ค ์ปค๋ฎค๋ํฐ์์ SQLite ๊ด๋ จ S3 ํธํ ํ๋ก์ ํธ๋ ๊ฑฐ์ Python ๊ธฐ๋ฐ์ด๋ฉฐ, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ 100% JavaScript ์คํ๊ณผ๋ ๋ค๋ฆ ๋๋ค.
- sqlite-zstd ๊ฐ์ ์์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ๋งํด ๋ณด์ด๋, ์์ง ํ๋ก๋์
์ฌ์ฉ ์ค๋น๊ฐ ์ ๋ ๋ฏํฉ๋๋ค. ๋์
String,Object,Map,Array,Set,Buffer๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ธก ์์ถ์ด ๋ ๊น๋ํ๊ณ ์ฌ์ด ์ ๊ทผ๋ฒ์ด๋ฉฐ, ๋ง์ด๊ทธ๋ ์ด์ ๋ ์ฝ์ต๋๋ค(์:Booleanํ๋๊ทธ๋ ์ปฌ๋ผ ์ ์ฅ, ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฉํ๋ฐ์ดํฐ๋กPRAGMA user_version=1์์ถ,user_version=0๋น์์ถ ์ฌ์ฉ).- ๋คํํ IMAP ์๋ฒ ์คํ ๋ฆฌ์ง์ ์ฒจ๋ถํ์ผ ์ค๋ณต ์ ๊ฑฐ๊ฐ ๊ตฌํ๋์ด ์์ด, ๋์ผ ์ฒจ๋ถํ์ผ์ด ์ฌ๋ฌ ๋ฉ์์ง์ ์ค๋ณต ์ ์ฅ๋์ง ์๊ณ , ํ๋์ ์ฒจ๋ถํ์ผ์ด ์ฌ๋ฌ ๋ฉ์์ง์ ์ค๋ ๋์์ ์ฐธ์กฐ๋ฉ๋๋ค.
- SQLite ๋ณต์ ๋ฐ ๋ฐฑ์
์๋ฃจ์
์ธ Litestream ํ๋ก์ ํธ๋ ๋งค์ฐ ์ ๋งํ๋ฉฐ, ์์ผ๋ก ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
- ์ ์๋ค์ ํํํ๋ ค๋ ๊ฒ์ ์๋๋ฉฐ, 10๋ ๋๊ฒ ์คํ์์ค์ ๊ธฐ์ฌํ ๊ทธ๋ค์ ์์ ์ ์กด๊ฒฝํ์ง๋ง, ์ค์ ์ฌ์ฉ์์๋ ๋ง์ ๋ฌธ์ ์ ๋ฐ์ดํฐ ์์ค ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค.
- ๋ฐฑ์
๋ณต์์ ๋ง์ฐฐ ์์ด ๊ฐ๋จํด์ผ ํฉ๋๋ค. MongoDB์
mongodump์mongoexport๊ฐ์ ์๋ฃจ์ ์ ๋ฒ๊ฑฐ๋กญ๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ฉฐ ์ค์ ์ด ๋ณต์กํฉ๋๋ค.- SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋จ์ผ ํ์ผ์ด๋ผ ๊ฐ๋จํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ธ์ ๋ ์ง ๋ฉ์ผ๋ฐ์ค๋ฅผ ๊ฐ์ ธ๊ฐ๊ณ ๋ ๋ ์ ์๋ ์๋ฃจ์
์ ์ค๊ณํ๊ณ ์ ํ์ต๋๋ค.
- ๊ฐ๋จํ Node.js ๋ช
๋ น์ด
fs.unlink('mailbox.sqlite')๋ก ๋์คํฌ ์ ์ฅ์์์ ์๊ตฌ ์ญ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. - S3 ํธํ API์ HTTP
DELETE๋ฅผ ์ฌ์ฉํด ์ค๋ ์ท๊ณผ ๋ฐฑ์ ์ ์ฝ๊ฒ ์ ๊ฑฐํ ์๋ ์์ต๋๋ค.
- ๊ฐ๋จํ Node.js ๋ช
๋ น์ด
- SQLite๊ฐ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ฉฐ ๋น์ฉ ํจ์จ์ ์ธ ์๋ฃจ์ ์ด์์ต๋๋ค.
๋์์ ๋ถ์ฌ
์ ํฌ๊ฐ ์๋ ํ, ๋ค๋ฅธ ์ด๋ฉ์ผ ์๋น์ค๋ค์ ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ค๊ณ๋์ง ์์์ผ๋ฉฐ ์คํ ์์ค๋ ์๋๋๋ค.
์ด๊ฒ์ ๊ธฐ์กด ์ด๋ฉ์ผ ์๋น์ค๋ค์ด ์คํ๊ฒํฐ ์ฝ๋ ๐ ๊ฐ ํฌํจ๋ ๋ ๊ฑฐ์ ๊ธฐ์ ์ ์ด์ ์ค์ด๊ธฐ ๋๋ฌธ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ธฐ์กด ์ด๋ฉ์ผ ์๋น์ค ์ ๊ณต์ ์ฒด ๋๋ถ๋ถ์ ํ์ ์์ค์ด๊ฑฐ๋ ์คํ ์์ค๋ผ๊ณ ๊ด๊ณ ํ์ง๋ง, ์ค์ ๋ก๋ ํ๋ก ํธ์๋๋ง ์คํ ์์ค์ ๋๋ค.
์ด๋ฉ์ผ์์ ๊ฐ์ฅ ๋ฏผ๊ฐํ ๋ถ๋ถ(์ค์ ์ ์ฅ/IMAP/SMTP ์ํธ์์ฉ)์ ๋ชจ๋ ๋ฐฑ์๋(์๋ฒ)์์ ์ฒ๋ฆฌ๋๋ฉฐ, ํ๋ก ํธ์๋(ํด๋ผ์ด์ธํธ)์์๋ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.
Forward Email ์ฌ์ฉํด๋ณด๊ธฐ
์ค๋ https://forwardemail.net ์์ ๊ฐ์ ํ์ธ์! ๐