๐Ÿ‡จ๐Ÿ‡ณ Discourse ๊ณต์‹ ์„ค์น˜ ๊ฐ€์ด๋“œ | Discourse ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ์„ค์น˜

๋ณธ ๋ฌธ์„œ๋Š” discourse/docs/INSTALL-cloud.md at main ยท discourse/discourse ยท GitHub ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ๋ฒˆ์—ญํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒˆ์—ญ ์›๋ฌธ์€ Discourse ไบ‘ๅนณๅฐๅฎ‰่ฃ… - Discourse - iSharkFly ์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ† ๋ก ์— ์ฐธ์—ฌํ•ด ์ฃผ์„ธ์š”.

ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ์„ค์น˜

ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํ”Œ๋žซํผ์—์„œ์˜ Discourse ์„ค์น˜์—๋Š” ๋ณดํ†ต 30๋ถ„์ด ์ฑ„ ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rails๋‚˜ Linux ์…ธ์— ๋Œ€ํ•œ ์ง€์‹์ด ์ „ํ˜€ ์—†์–ด๋„ ์„ค์น˜๋ฅผ้กบๅˆฉๅฎŒๆˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ๋Š” DigitalOcean ์„œ๋น„์Šค ์ œ๊ณต์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์น˜ํ•˜๋Š” ์˜ˆ๋ฅผ ๋“ค์—ˆ์ง€๋งŒ, ๋ชจ๋“  ์„ค์น˜ ๋‹จ๊ณ„๋Š” Docker์™€ ํ˜ธํ™˜๋˜๋Š” ๋ชจ๋“  ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ํ”Œ๋žซํผ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋กœ์ปฌ ์„œ๋ฒ„์—์„œ๋„ ์„ค์น˜๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

:bell: 30๋ถ„๋„ ์‹œ๊ฐ„์ด ์•ˆ ๋˜์‹œ๋‚˜์š”? Discourse ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์—ฐ๋ฝํ•˜์—ฌ ์„ค์น˜๋ฅผ ๋„์™€๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Discourse ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ผํšŒ์„ฑ $150(๋ฏธ๊ตญ ๋‹ฌ๋Ÿฌ)์˜ ๋น„์šฉ์„ ๋ถ€๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” .

์‹œ์ž‘ ์ „ ์ค€๋น„ ์‚ฌํ•ญ

๋„๋ฉ”์ธ

:bell: Discourse๋Š” IP ์ฃผ์†Œ๋กœ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜ํ•˜๋ ค๋ฉด ๋„๋ฉ”์ธ ๋˜๋Š” ์„œ๋ธŒ๋„๋ฉ”์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด example.com ๋“ฑ.

  • ์ด๋ฏธ ๋„๋ฉ”์ธ์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, discourse.example.com ๋˜๋Š” talk.example.com ๋˜๋Š” forum.example.com๊ณผ ๊ฐ™์€ ์„œ๋ธŒ๋„๋ฉ”์ธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ Discourse ์ธ์Šคํ„ด์Šค๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋„๋ฉ”์ธ์ด ์—†๋‹ค๋ฉด, NameCheap ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ์›ํ•˜๋Š” ๋„๋ฉ”์ธ์„ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜, Google์—์„œ great domain name registrars๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๋งˆ์Œ์— ๋“œ๋Š” ๋„๋ฉ”์ธ ๋“ฑ๋ก์‚ฌ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DNS ์ฝ˜์†”์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•œ ํ›„์—๋Š” DNS ์„ค์ •์— ์ ‘๊ทผํ•˜์—ฌ DNS๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ํ•˜๋ ค๋Š” Discourse ์›น์‚ฌ์ดํŠธ์— ๋Œ€ํ•ด DNS๋ฅผ ํ†ตํ•ด A ๋ ˆ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด A ๋ ˆ์ฝ”๋“œ๋Š” ์„ค์น˜ํ•˜๋ ค๋Š” ๋„๋ฉ”์ธ์„ ํŠน์ • IP ์ฃผ์†Œ๋กœ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด IP ์ฃผ์†Œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ ๊ตฌ๋งคํ•œ ์„œ๋ฒ„์˜ IP ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.

์ด๋ฉ”์ผ

:warning: ์ด๋ฉ”์ผ ์‹œ์Šคํ…œ์€ Discourse์˜ ์‚ฌ์šฉ์ž ์ƒ์„ฑ ๊ณผ์ •์—์„œ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Discourse ์„ค์น˜ ์ „์— ์ด๋ฉ”์ผ SMTP ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด, ์„ค์น˜ํ•œ Discourse์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์‚ฌ์ดํŠธ๊ฐ€ ๊นจ์ง„ ์ƒํƒœ)!*

  • ์ด๋ฏธ ์ž์ฒด SMTP ๋ฉ”์ผ ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ธฐ์กด ๋ฉ”์ผ ์„œ๋ฒ„ ์„ค์ • ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”์ผ ์„œ๋ฒ„๊ฐ€ ์—†๋‹ค๋ฉด, Discourse์—์„œ ๊ถŒ์žฅํ•˜๋Š” ๋ฉ”์ผ ์„œ๋ฒ„๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.
  • ์ด๋ฉ”์ผ์ด ์ •์ƒ์ ์œผ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ํ•˜๋ ค๋ฉด DNS์— ์œ ํšจํ•œ SPF ๋ฐ DKIM ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ผ ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด์˜ ๋ฌธ์„œ์—์„œ ์ด ์ •๋ณด ์„ค์ • ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”.

์‹ค์ œ ์‚ฌ์šฉ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ, Discourse ์„ค์น˜์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๋ฉ”์ธ๊ณผ ๋ฉ”์ผ ์„œ๋ฒ„ ์„ค์ •์ด ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ค‘๊ตญ ๋ณธํ† ์˜ ๊ฒฝ์šฐ, ์•Œ๋ฆฌ๋ฐ”๋ฐ” ํด๋ผ์šฐ๋“œ ๋˜๋Š” ํ…์„ผํŠธ ํด๋ผ์šฐ๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์—…์šฉ ๋ฉ”์ผํ•จ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด์™ธ ๋ฉ”์ผ ์„œ๋ฒ„, ์˜ˆ๋ฅผ ๋“ค์–ด AWS SES๋‚˜ MailGun๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ตญ์ œ ์‹ ์šฉ์นด๋“œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ํ•„์ˆ˜์ด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Discourse ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ค์น˜

์ƒˆ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์ƒ์„ฑ

์ƒˆ๋กœ์šด ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„, ์˜ˆ๋ฅผ ๋“ค์–ด DigitalOcean์„ ์ƒ์„ฑํ•˜์„ธ์š”. ๋ฌผ๋ก  ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค‘๊ตญ ๋ณธํ†  ๋‚ด์— ์œ„์น˜ํ•œ ์„œ๋ฒ„๋ฅผ ์„ ํƒํ–ˆ๋‹ค๋ฉด ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด ๋ฒˆ์—ญ๋ณธ์—๋Š” ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์„น์…˜์ด ์ถ”๊ฐ€๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ ๊ตฌ์„ฑ์ธ ํ˜„์žฌ ๋ฒ„์ „์˜ LTS Ubuntu ์šด์˜ ์ฒด์ œ๊ฐ€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ 64๋น„ํŠธ Linux ์šด์˜ ์ฒด์ œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ด ์šด์˜ ์ฒด์ œ์˜ ์ปค๋„์€ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๊ตฌ์„ฑ์ธ 1 GB์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ž‘์€ ๊ทœ๋ชจ์˜ Discourse ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๊ทœ๋ชจ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์œ„ํ•ด 2 GB์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๊ตฌ์„ฑ์ธ ๋‰ด์š• ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋Š” ๋ถ๋ฏธ์™€ ์œ ๋Ÿฝ ๋ชจ๋‘์—๊ฒŒ ์ข‹์€ ์ง€๋ฆฌ์  ์˜์—ญ์ž…๋‹ˆ๋‹ค. Discourse ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์ง€๋ฆฌ์  ์œ„์น˜์— ์žˆ๋Š” ๊ฒฝ์šฐ, ์กฐ๊ธˆ ๋” ๊ฐ€๊นŒ์šด ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • DigitalOcean์—์„œ Droplet์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋„๋ฉ”์ธ discourse.example.com์„ ์ž…๋ ฅํ•˜์„ธ์š” (Droplet์€ DigitalOcean์ด ์ •์˜ํ•œ ์„œ๋ฒ„ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค). ๋ฌผ๋ก  ์ž์ฒด ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ Discourse ์„ค์น˜์—๋Š” ์‹ค์ œ ๋„๋ฉ”์ธ์ด ํ•„์š”ํ•˜๋ฉฐ IP ์ฃผ์†Œ๋กœ๋Š” ์„ค์น˜ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๋จผ์ € ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋„๋ฉ”์ธ์˜ ์„œ๋ธŒ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด Droplet์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์€ DigitalOcean์—์„œ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์œผ๋ฉฐ, ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ VPS๋‚˜ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด Root ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฉ”์ผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์ ‘๊ทผ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด SSH ํ‚ค ์‚ฌ์šฉ ์„ค์ •์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๊ธฐ

IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SSH๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, Windows ํ”Œ๋žซํผ์˜ ๊ฒฝ์šฐ Putty๋ฅผ ์„ค์น˜ํ•œ ํ›„ ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

ssh root@192.168.1.1

SSH ํ‚ค๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด, DigitalOcean์—์„œ ๋ณด๋‚ธ ์ด๋ฉ”์ผ์— ํฌํ•จ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธํ•˜๊ฑฐ๋‚˜, ๋กœ์ปฌ SSH ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Docker / Git ์„ค์น˜ (์„ ํƒ ์‚ฌํ•ญ)

sudo apt install docker.io
sudo apt install git

์ž์ฒด Docker ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด์ œ ์ƒˆ๋กœ ์„ค์ •ํ•œ ์„œ๋ฒ„์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— Docker๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด discourse-setup์ด get.docker.com์—์„œ ์ž๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

Discourse ์„ค์น˜

๊ณต์‹ Discourse Docker ์„ค์น˜ ์ €์žฅ์†Œ์—์„œ ์ฝ”๋“œ๋ฅผ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์˜ /var/discourse ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ํด๋ก ํ•ฉ๋‹ˆ๋‹ค.

sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse

์œ„ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Discourse ์„ค์น˜ ๊ณผ์ •์—๋Š” root ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Docker ๋ฏธ๋Ÿฌ ์ถ”๊ฐ€ (์ค‘๊ตญ ๋ณธํ†  ์„œ๋ฒ„ ์ „์šฉ)

์„œ๋ฒ„๊ฐ€ ์ค‘๊ตญ ๋ณธํ† ์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด, ์•„๋ž˜ ๋‹จ๊ณ„์—์„œ docker ๋‹จ๊ณ„์—์„œ ๋ง‰ํž ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. Docker ๋ฏธ๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์„ธ์š”.

ํ…์„ผํŠธ ํด๋ผ์šฐ๋“œ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, ์ข‹์•„ํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ linux์˜ /etc/docker/daemon.json์„ ํŽธ์ง‘ํ•˜๊ณ  ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. https://mirror.ccs.tencentyun.com์„ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์ œ๊ณต์—…์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” docker ๋ฏธ๋Ÿฌ URL๋กœ ๋ณ€๊ฒฝํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

{
   "registry-mirrors": [
   "https://mirror.ccs.tencentyun.com"
  ]
}

docker ๋ฏธ๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•œ ํ›„, sudo systemctl restart docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ docker ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์‹œ์ž‘ํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜์„ธ์š”.

Discourse ์„ค์ • ํŽธ์ง‘

์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์„ค์ • ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

./discourse-setup

์•„๋ž˜ ํ”„๋กฌํ”„ํŠธ์— ๋”ฐ๋ผ ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

Hostname for your Discourse? [discourse.example.com]: 
Email address for admin account(s)? [me@example.com,you@example.com]: 
SMTP server address? [smtp.example.com]: 
SMTP port? [587]: 
SMTP user name? [user@example.com]: 
SMTP password? [pa$word]: 
Let's Encrypt account email? (ENTER to skip) [me@example.com]: 

์œ„ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” Discourse ์ธ์Šคํ„ด์Šค๋ฅผ ์œ„ํ•œ app.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ์„ค์น˜ ์ง„ํ–‰ ํ›„ Discourse ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์„ค์น˜ ์‹œ์ž‘ ๊ณผ์ •์€ Discourse ๊ตฌ์„ฑ์— 2~8๋ถ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์„ค์น˜ ์™„๋ฃŒ ํ›„์—๋„ ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ./discourse-setup ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๋ช…๋ น์€ ๊ธฐ์กด app.yml ํŒŒ์ผ์„ ๋‹ค์‹œ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค). ๋˜๋Š” /containers/app.yml ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ง์ ‘ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ•œ ํ›„ ./launcher rebuild app๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ค‘๊ตญ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ ์ตœ์ ํ™”

ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„๊ฐ€ ์ค‘๊ตญ ๋ณธํ† ์— ์œ„์น˜ํ•ด ์žˆ๋‹ค๋ฉด, ./discourse-setup ๋˜๋Š” ./launcher rebuild app๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋ฅผ ๊ฒช์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. Discourse๋Š” docker๋ฅผ ์ œ์™ธํ•œ ๋ฏธ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ์ด๋ฏธ ์ž‘์„ฑํ•ด ๋‘์—ˆ์œผ๋ฉฐ, containers/app.yml์˜ ์—ฌ๊ธฐ ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.china.template.yml" # ์ด ์ค„์„ ์ถ”๊ฐ€ํ•˜์—ฌ npm, rubygems ๋“ฑ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์˜ ๋ฏธ๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

Discourse ์‹œ์ž‘

์ดˆ๊ธฐ ์„ค์น˜ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜๋ฉด, ๊ตฌ์„ฑํ•œ ๋„๋ฉ”์ธ discourse.example.com์„ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—์„œ Discourse ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ตญ ๋ณธํ† ์— ์œ„์น˜ํ•œ ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ, ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์ œ๊ณต์—…์ฒด์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ ๋จผ์ € ํ†ต์ง€(ๅค‡ๆกˆ)๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ ๊ด€๋ฆฌ์ž ๊ณ„์ • ๋“ฑ๋ก

์‹œ์ž‘ ๊ตฌ์„ฑ ๊ณผ์ •์—์„œ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

(๊ด€๋ฆฌ์ž ๊ณ„์ •(Admin)์„ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๊ฒฝ๋กœ /var/discourse/shared/standalone/log/rails/production.log๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ด๋ฉ”์ผ ๋ฌธ์ œ ์ ๊ฒ€ ๋ชฉ๋ก์„ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.)

๊ด€๋ฆฌ์ž ๊ณ„์ • ๋“ฑ๋ก์„ ์™„๋ฃŒํ•˜๋ฉด, ์„ค์ • ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์‹œ์ž‘๋˜์–ด Discourse ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋„๋ก ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์„ค์ • ๋งˆ๋ฒ•์‚ฌ๋ฅผ ์™„๋ฃŒํ•˜๋ฉด, ์Šคํƒœํ”„ ํ† ํ”ฝ(Staff topics)๊ณผ READ ME FIRST: Admin Quick Start Guide๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ ๋งˆ๋ฒ•์‚ฌ์—๋Š” ํ›„์† ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ๊ณผ Discourse ์„ค์น˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ํ›„ ์œ ์ง€ ๊ด€๋ฆฌ

  • ์šด์˜ ์ฒด์ œ์˜ ๋ณด์•ˆ ์ž๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ์ผœ๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. Ubuntu์—์„œ๋Š” dpkg-reconfigure -plow unattended-upgrades ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. CentOS/RHEL์—์„œ๋Š” yum-cron ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • SSH ํ‚ค ๋Œ€์‹  ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ์šด์˜ ์ฒด์ œ์— ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ•๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. Ubuntu์—์„œ๋Š” apt-get install libpam-cracklib ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. fail2ban ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๋ฉฐ, ์ด๋Š” 3ํšŒ ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ IP ์ฃผ์†Œ๋ฅผ 10๋ถ„ ๋™์•ˆ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
    • Ubuntu: apt-get install fail2ban
    • CentOS/RHEL: sudo yum install fail2ban (EPEL ํ•„์š”)
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฉํ™”๋ฒฝ์„ ์„ค์น˜ํ•˜๋ ค๋ฉด, Ubuntu์˜ ๊ฒฝ์šฐ ufw ํ™œ์„ฑํ™” ๋˜๋Š” CentOS/RHEL 7 ๋ฐ ์ดํ›„ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ firewalld๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Discourse์— ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด, ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ์—…๋ฐ์ดํŠธ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜๋„๋ก Discourse ์ธ์Šคํ„ด์Šค๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ด ์ฃผ์„ธ์š”. Discourse์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์ถœ์‹œ๋˜๋ฉด ์ด๋ฉ”์ผ ์•Œ๋ฆผ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๊ธฐ๋Šฅ๊ณผ ๋ณด์•ˆ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ตœ์‹  ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด ์ฃผ์„ธ์š”. Discourse๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด /admin/upgrade์— ์ ‘๊ทผํ•œ ํ›„ ์—…๋ฐ์ดํŠธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”.

/var/discourse ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ launcher ๋ช…๋ น์€ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค:

Usage: launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]
Commands:
    start:      Start/initialize a container (์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘/์ดˆ๊ธฐํ™”)
    stop:       Stop a running container (์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€)
    restart:    Restart a container (์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘)
    destroy:    Stop and remove a container (์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€ ๋ฐ ์‚ญ์ œ)
    enter:      Use nsenter to get a shell into a container (nsenter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์…ธ์— ์ ‘๊ทผ)
    logs:       View the Docker logs for a container (์ปจํ…Œ์ด๋„ˆ์˜ Docker ๋กœ๊ทธ ๋ณด๊ธฐ)
    bootstrap:  Bootstrap a container for the config based on a template (ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ)
    rebuild:    Rebuild a container (destroy old, bootstrap, start new) (์ปจํ…Œ์ด๋„ˆ ์žฌ๊ตฌ์ถ•: ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ, ์ดˆ๊ธฐํ™”, ์ƒˆ ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘)
    cleanup:    Remove all containers that have stopped for > 24 hours (24์‹œ๊ฐ„ ์ด์ƒ ์ค‘์ง€๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ)

Options:
    --skip-prereqs             Don't check launcher prerequisites (๋Ÿฐ์ฒ˜ ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ ๊ฒ€์‚ฌ ๊ฑด๋„ˆ๋›ฐ๊ธฐ)
    --docker-args              Extra arguments to pass when running docker (docker ์‹คํ–‰ ์‹œ ์ „๋‹ฌํ•  ์ถ”๊ฐ€ ์ธ์ž)
5๊ฐœ์˜ ์ข‹์•„์š”

๋ฒˆ์—ญ์ด ๊ฝค ์ข‹๋„ค์š”. ์นญ์ฐฌ ํ•˜๋‚˜์š”. ๊ณต์‹์ ์œผ๋กœ ๋‹ค๊ตญ์–ด ์ง„์ž…์ ์ด ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ €ํฌ๋„ Discourse๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ค‘๊ตญ์–ด ์ฝ˜ํ…์ธ ๊ฐ€ ๋„ˆ๋ฌด ์ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Discourse ํ”Œ๋žซํผ ์ž์ฒด๋Š” ์ •๋ง ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜ ๊ณผ์ •์€ ๋‹ค์†Œ ์–ด๋ ค์›€์ด ์žˆ๊ณ  ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์ „ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์–ด, ๋‹จ์ˆœํžˆ ๋จธ์‹  ํ•˜๋‚˜์— ๋ฐ”๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ์šฐํšŒํ•˜๊ฑฐ๋‚˜ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์„œ, ์ด๋ฏธ ๋‚ด๋ถ€์— ๊ฒŒ์‹œ๋œ ๋‚ด์šฉ์„ ๊ณต์‹ ์ฑ„๋„์— ์ œ์ถœํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์‹ ์ธก์—์„œ๋Š” ๋น„๊ต์  ์ง€์›์ ์ด๊ณ  ๊ฐœ๋ฐฉ์ ์ธ ํƒœ๋„๋ฅผ ๋ณด์ด๊ณ  ์žˆ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋‹ค์†Œ ์–ด์ˆ˜์„ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ ์ง„์ ์œผ๋กœ ์ €ํฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธ€๋“ค๋„ ๊ณต์‹ ์ฑ„๋„์— ์ œ์ถœํ•ด ๋‚˜๊ฐˆ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

์›๋ž˜ ์ค‘๊ตญ์–ด ํฌ๋Ÿผ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์—ฐ์ดˆ์— ํ์‡„๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด์ „์— ์ด๊ฑธ ๋ณธ ๊ธฐ์–ต์ด ๋‚˜์š”. ์„ค์น˜ํ•  ๋•Œ ๊ทธ๋“ค์˜ ๋ช‡ ๊ฐ€์ง€ ๊ธ€์„ ์ฐธ๊ณ ํ•˜๊ธฐ๋„ ํ–ˆ์—ˆ๊ฑฐ๋“ ์š”.

์•„๋งˆ ์›๋ž˜็‰ˆไธป(์šด์˜์ง„)๋„ ์œ ์ง€๋ณด์ˆ˜์— ์‹œ๊ฐ„์„ ์“ธ ์—ฌ์œ ๊ฐ€ ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ๆฏ•็ซŸ ์›น์‚ฌ์ดํŠธ๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ็ฒพๅŠ›๊ณผ ๊ฒฝ์ œ์  ์ง€์ถœ์ด ํ•„์š”ํ•˜๋‹ˆ๊นŒ์š”.

์šฐ๋ฆฌ๋Š” Discourse์—๋„ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋™์•ˆ Discuz๋ฅผ ์‚ฌ์šฉํ•ด ์™”์–ด์š”. DISCUZ๊ฐ€ Tencent์— ์ธ์ˆ˜๋œ ์ดํ›„๋กœ ๋ช‡ ๋…„ ๋™์•ˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ค‘๋‹จ๋˜๊ณ  ๋ฌธ์ œ๊ฐ€ ์‚ฐ๋”๋ฏธ์ฒ˜๋Ÿผ ์Œ“์—ฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋„ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ๊ฑฐ๋“ ์š”.

๊ทธ๋ž˜์„œ ๋Œ€์•ˆ์„ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ Discourse๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๊ณ , ์„ค์น˜ํ•ด ์จ๋ณด๋‹ˆ ๊ฝค ๊ดœ์ฐฎ์•˜์–ด์š”.

์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์–ป์€ ๊ฒฝํ—˜์„ ์ €ํฌ์˜ ์„น์…˜์— ์˜ฌ๋ ค๋‘์—ˆ์Šต๋‹ˆ๋‹ค: iSharkFly - ้ฃž้ฒจ

์ ์ฐจ ์ค‘๊ตญ์–ด ์ž๋ฃŒ๊ฐ€ ์ •๋ง ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ , ๊ณต์‹ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๊ณต์œ ํ•ด ๋ณด์ž๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”.

์›น์‚ฌ์ดํŠธ๋ฅผ ๊พธ์ค€ํžˆ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์•„์š”. :slight_smile:

์—ฌ๋Ÿฌ๋ถ„๋„ Discourse๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด ์ฃผ์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์„์ˆ˜๋ก ๋ถ„์œ„๊ธฐ๊ฐ€ ์‚ด์•„๋‚˜๊ณ , ์‹ค์ œ๋กœ ๋” ํฅ๋ฏธ๋กœ์›Œ์ง€๋‹ˆ๊นŒ์š”.

1๊ฐœ์˜ ์ข‹์•„์š”

@fantasticfears ์ด๊ฑฐ ์•„๋งˆ ์ค‘๊ตญ์–ด ์‚ฌ์ดํŠธ ์šด์˜์ž๊ฐ€ ๋งž๋Š” ๊ฒƒ ๊ฐ™์€๋ฐโ€ฆโ€ฆ ๋งˆ์ง€๋ง‰ ์ ‘์†๋„ 19๋…„ ์ „์ด๋ผ์„œ ์„œ๋ฒ„ ๊ฐฑ์‹ ์„ ์žŠ์—ˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ๋Š” ๊ฑด์ง€, ์ค‘๊ตญ์–ด ์‚ฌ์ดํŠธ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์‚ฌ๋ผ์ ธ ๋ฒ„๋ ธ์–ด์š”

์‹œ๊ฐ„์ด ์—†์—ˆ๋‚˜ ๋ณด๋„ค์š”.

๊ดœ์ฐฎ์•„์š”, ๊ณต์‹ ํฌ๋Ÿผ์—์„œ ์‹œ๊ฐ„ ๋•Œ์šฐ์„ธ์š”. ํ—ท.

์ฃผ๋กœ ์ค‘๊ตญ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋Š” ์ค‘๊ตญ์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๊ฒฝ์šฐ, Discourse์˜ ํ˜„์ง€ํ™” ์ˆ˜์ค€์€ ์—ฌ์ „ํžˆ ๋‹ค์†Œ ๋ถ€์กฑํ•œ ํŽธ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž๋“ค์˜ ์‚ฌ์šฉ ์Šต๊ด€์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์ด๊ฑด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ๋งคํ•‘ ๋ฐฉ์‹์œผ๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๋ชจ๋“  ์‹œ์Šคํ…œ์— ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒˆ์—ญ๋œ ๋ฌธ์ž์—ด๊ณผ ์ •๋ ฌ ๋ฐฉ์‹์ด ์ข€ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ discourse๋Š” ์—ฌ์ „ํžˆ ๋งค์šฐ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ฒจ๋ถ€ ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ€ ์ •๋ง ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ ๋Š” md ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํ•™์Šต ๊ณก์„ ์ด ์žˆ์ง€๋งŒ, ์ถฉ๋ถ„ํžˆ ์“ธ ๋งŒํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ ๋ฐ์ดํ„ฐ์™€ ์ €์žฅ์†Œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ •๋ง ์นญ์ฐฌํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋ฌด์ œํ•œ์˜ ์ฒจ๋ถ€ ํŒŒ์ผ ์ €์žฅ ๊ณต๊ฐ„๊ณผ ๋‚ด์žฅ CDN์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฐฑ์—… ์‹œ ์ฒจ๋ถ€ ํŒŒ์ผ์„ ๋”ฐ๋กœ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ์ƒท์„ ๋งŽ์ด ์˜ฌ๋ฆฌ๋Š” ๋ถ„๋“ค์—๊ฒŒ๋Š” ์ •๋ง ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

OSSEZ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋„๋ฉ”์ธ์„ ๋ณ€๊ฒฝํ•˜์—ฌ, ์ด ๊ธ€์€ Discourse ไบ‘ๅนณๅฐๅฎ‰่ฃ… - Discourse - iSharkFly ์ฃผ์†Œ์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

์ค‘๊ตญ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ ์ตœ์ ํ™” ์„น์…˜์„ ์ถ”๊ฐ€ํ•ด ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”