์ด ๊ธ์ Heroku Free tier๋ฅผ ์ฌ์ฉํ์ฌ ํธ์คํ ํ๊ธฐ ์ํ ํํ ๋ฆฌ์ผ์ธ๋ฐ 2022๋ 11์ 28์ผ์๋ก Heroku์์ Free tier๋ฅผ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌด๋ฃ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํ๋ ๋ถ๋ค์ ๋ค๋ฅธ ํํ ๋ฆฌ์ผ๋ค์ ์ฐธ๊ณ ํด๋ณด๊ธธ ๋ฐ๋๋ค.
(์ด ๊ธ์ 2021๋ 4์ 14์ผ ๊ธฐ์ค ๊ธ์ด๋ค.)
๐คจ ์ฝ์ง์ ๋ฐ๋จ
์ง๋๋ฌ์ ์๋ก์ด ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ค. ํ๋ก ํธ๋ Next.js๋ฅผ ์ฌ์ฉํ์๊ณ ๋ฐฑ์๋๋ Github์ jsonํ์ผ์ ์ฌ๋ ค gh-pages๋ก ํธ์คํ
์ ํ ์ ์์ด ์๋(?) ๋ฃจํธ๋ฅผ ์ฌ์ฉํ๋ค. ํ๋ก์ ํธ๋ฅผ ๋๋ต ์์ฑํ๊ธฐ๋ ํ์ง๋ง ๋ฐฑ์๋๊ฐ ์... ๋๋ฌด ์ฐ์ฐํ๋ค.
๋์ ๋ค์ด๊ธฐ ์ซ๊ณ , API๋ ๋ง๋ค๊ณ ์ถ๊ณ , ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณด๋ค ์๊ฒ ๋ Strapi!
COMMUNITY PLAN์ ๋ฌด๋ฃ๋ผ๊ธฐ์ ํํ ๋ฆฌ์ผ์ ์ฐพ์์ ๋ฐ๋ก ์ค์นํ๋ค. ์ฌ์ค ์ค์นํ์ง๋ ๋ฒ์จ 3์ฃผ ์ ?์ด๋ ์๊ฐ์ด ๊ทธ๋๋ ํ๋ ์ง๋ง... Strapi๋ฅผ ์ฒ์ ๋ง๋๊ณ ๋ ์ฝ๊ฐ์ ์ฐ์ฌ๊ณก์ ์ด ์์๋ค. (์ฐ์ฌ๊ณก์ ์ ์๋ตํ๋ค.) ๋ฌดํผ ๊ทธ๋ฌ๋ค ์ด์ ์ ๋๋ก ๊ฐ์ก๊ณ ์์์ ๋ฐฐํฌ๊น์ง ๋๋ด๋ฒ๋ฆฌ๋ฆฌ ๊ฒฐ์ฌํ๊ณ ์ง์ง ๋๋๋ค.
์ ๋งค๋ฒ ์ค์ ํ๋ ๊ฑด ์ด๋ ๊ฒ๋ ํ๋ค๊ณ ์ฝ์ง์ ํด์ผ๋ง ํ๋์ง... ๋ด๊ฐ ๋๋ฌด ๋ชจ๋ฅด๋ ๊ฒ ๋ง์์๋ผ๊ณ ์๊ฐํ์๋๋ฐ ์๋ ๊ฐ๋ฐ์ ๋ถ๊ป ํ๋ฒ ์ฌ์ญค๋ณด๋ ๋ณธ์ธ๋ ๊ทธ๋ฌ์๋จ๋ค... ๊ทธ๋์ ๊ธฐ๋กํด๋ฌ์ผ ํ๋ค๊ณ ... (์๋ก๊ฐ ๋๋ค.)
ํน์ Strapi๋ฅผ ๋ ์ฌ์ฉํ ๋ฏธ๋์ ๋๋ฅผ ์ํด ์ด ๊ธ์ ์์ฑํ๋ค. ํน ์ด ๊ธ์ด ๋ค๋ฅธ ๋ถ๊ป๋ ๋์์ด ๋๋ค๋ฉด.... (๋ ํฐ ์๋ จ์ ์๊ฒจ๋๋ฆฌ์ง ์๋ ๊ฒ๋ง์ผ๋ก๋) ์ข๊ฒ ๋ค.
๐ ์ค๋น์ฌํญ
- Heroku ๊ณ์ ์์ฑ (https://www.heroku.com)
- Heroku CLI ์ค์น (Heroku ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ )
- PostgreSQL ์ค์น (PostgreSQL ๊ณต์ ์ฌ์ดํธ ์ฐธ๊ณ )
๐ ์์
1. Heroku ๋ก๊ทธ์ธํ๊ธฐ (์ค๋น์ฌํญ์ด ๋ชจ๋ ์ค๋น ๋์ด์์ด์ผํ๋ค.)
heroku login
์์ ๋ช ๋ น์ด๋ฅผ ํฐ๋ฏธ๋์ ์ ๋ ฅํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ก Heroku Login ํ๋ฉด์ด ๋จ๊ณ Login ๋ฒํผ์ ํด๋ฆญํ๋ค. ์ฑ๊ณต์ ์ผ๋ก ๋ก๊ทธ์ธ๋๋ฉด ํฐ๋ฏธ๋์ Heroku CLI์์ ์๋์ ๊ฐ์ด ํ์ธํ ์ ์๋ค.
Logged in as <๋ด ๊ณ์ ์ด๋ฉ์ผ>
2. PostgreSQL ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑํ๊ธฐ
์๋ก์ด ํฐ๋ฏธ๋ ์ฐฝ์ ํ๋ ๋์์ ์๋์ ๊ฐ์ด ์์ฐจ์ ์ผ๋ก ์คํํ๋ค.
# 1. postgres ์คํ
psql postgres
# 2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
CREATE DATABASE <๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช
>;
# 3. User role ์์ฑ
CREATE ROLE <๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์๋ช
> WITH LOGIN PASSWORD '<ํจ์ค์๋>' CREATEDB;
# 4. ๊ถํ ๋ถ์ฌ
GRANT ALL PRIVILEGES ON DATABASE <๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช
> TO <๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์๋ช
>;
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช , ์ฌ์ฉ์๋ช , ํจ์ค์๋๊ฐ Strapi ํ๋ก์ ํธ ์์ฑ ์ ํ์ํ๋ ๊ธฐ์ตํด๋ ๊ฒ! Heroku ๋ก๊ทธ์ธ์ด ๋์ด ์๋ ์ฐฝ์ผ๋ก ๋์๊ฐ๋ค.
3. Strapi ํ๋ก์ ํธ ์์ฑํ๊ธฐ
ํฐ๋ฏธ๋์์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ์ถ์ ํด๋๋ก ์ด๋ํ๋ค. ์๋ฅผ ๋ค์ด "test-api"๋ผ๋ Strapi ํ๋ก์ ํธ๋ฅผ "sideproject" ํด๋ ์๋์ ์์ฑํ๊ณ ์ถ๋ค๋ฉด, "sideproject" ํด๋๋ก ์ด๋ํ์ฌ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค. yarn/npx ์ฌ์ฉํ๋ ๊ฒ์ ๋ง์ถฐ ๋ ์ค ํ๋๋ฅผ ์ ๋ ฅํ๋ค.
# yarn
yarn create strapi-app <ํ๋ก์ ํธ ์ด๋ฆ>
#npx
npx create-strapi-app <ํ๋ก์ ํธ ์ด๋ฆ>
์์ ๋ช ๋ น์ด์์ --quickstart๋ผ๋ ํ๋๊ทธ๋ฅผ ๋งจ ๋ค์ ๋ถ์ด๋ฉด ๋ก์ปฌ์์๋ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋๋ฐ Heroku์์๋ ํธํ๋์ง ์๋๋ค๊ณ ํ๋ค. --quickstart๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํด์ค ํ๋ก์ ํธ๋ ๋์ค์ Heroku์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ๋ก ์ค์ ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ --quickstart๋ผ๋ ํ๋๊ทธ ์์ด ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ฃผ์๋ค.
--quickstart๋ฅผ ์ ๋ ฅํด์ฃผ์ง ์์๋ ์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ์๋์ ๊ฐ์ด ๋ณด์ธ๋ค.
? Choose your installation type (Use arrow keys)
Quickstart (recommended)
> Custom (manual settings)
ํ์ดํ ํค๋ก Custom์ผ๋ก ์ด๋ ํ ์ ํํด์ฃผ๋ฉด(์ํฐํค) ์๋์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ํํ ์ ์๋ค.
? Choose your default database client (Use arrow keys)
sqlite
> postgres
mysql
mongo
์์ ๊ฐ์ด ํ์ดํ ํค๋ก postgres๋ก ์ด๋ ํ ์ ํํด์ฃผ๋ฉด(์ํฐํค) ์๋์ ๊ฐ์ด ์ ๋จ๊ณ์์ ์์ฑํด์ค postgres ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด๋ฅผ ์ ๋ ฅํด์ผ ํ๋ค.
? Database name: <๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ช
>
? Host: (127.0.0.1) # ์ํฐ์น๊ณ ๋์ด๊ฐ
? Port: (5432) # ์ํฐ์น๊ณ ๋์ด๊ฐ
? Username: <๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์๋ช
>
? Password: <ํจ์ค์๋>
? Enable SSL connection: N # N ์
๋ ฅ, y๋ ์ค์ ์ด ๋ฐ๋ก ํ์ํ๋ฏ...
๊ธฐ๋ค๋ฆฌ๋ฉด ํ๋ก์ ํธ ์์ฑ์ ์์ํ๊ณ ์ค์ ํ๋๋ฐ ์๊ฐ์ด ์ฝ๊ฐ ๊ฑธ๋ฆฐ๋ค. ์์ฑ์ด ์๋ฃ๋๋ฉด ์์ฑ๋ ํ๋ก์ ํธ ํด๋๋ก ์ด๋ํด์ yarn develop/start/build ๋ช ๋ น์ด๋ก ๋ก์ปฌ๋ก ๋๋ฆด ์ ์์ง๋ง Heroku์ ๋ฐฐํฌํ๋ ๊ฒ์ด ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ ๋จ๊ณ๋ก ์งํํ๋ค.
4. .gitignore ์ ๋ฐ์ดํธํ๊ธฐ
.gitignore ํ์ผ์ ์
๋ฐ์ดํธํ๊ธฐ ์ํด์ ์์ ์ด ์ฌ์ฉํ๋ ํธ์ง๊ธฐ๋ก ํด๋๋ฅผ ์ฐ๋ค.
.gitignore ํ์ผ ๋งจ ๋์ package-lock.json์ ์ถ๊ฐ ํ ์ ์ฅํด์ค๋ค. (115์ค ์ฐธ๊ณ )
5. ํด๋น ํ๋ก์ ํธ git init์ผ๋ก ์ด๊ธฐํ ๋ฐ ์ ์ฅ์์ ์ปค๋ฐ
ํด๋น ํ๋ก์ ํธ์ ์์น(./strapi ํ๋ก์ ํธ๋ช /)์์ ์๋์ git ๋ช ๋ น์ด๋ค์ ์คํํด์ค๋ค.
# path: ./Strapi ํ๋ก์ ํธ๋ช
/
git init
git add .
git commit -m "Initial Commit"
6. Heroku ํ๋ก์ ํธ ์์ฑํ๊ธฐ
5๋ฒ๊ณผ ๊ฐ์ ๊ฒฝ๋ก์์ ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํด์ค๋ค.
# ์๋์์ฑ๋๋ ๋๋ค ํ๋ก์ ํธ ๋ช
์ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ
heroku create
# ์์ ์ด ํ๋ก์ ํธ ๋ช
์ ์
๋ ฅํ๊ณ ์ถ์ ๋: <์ปค์คํ
-ํ๋ก์ ํธ-๋ช
>.heroku.com์ผ๋ก URL์ด ์์ฑ๋จ
heroku create <์ปค์คํ
-ํ๋ก์ ํธ-๋ช
>
์์ ๋ช ๋ น์ด์ ๋ํ ๊ฒฐ๊ณผ๋ก Heroku ํ๋ก์ ํธ URL์ด ์์ฑ๋๋ค. ๊ณ์ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ ์งํํด๋ณด์.
7. Heroku ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
์ฌ๊ธฐ์๋ PostgreSQL ๊ธฐ์ค์ผ๋ก ์ค์ ์ ์งํํ๋ค.
- Heroku Postgres addon ์ค์นํ๊ธฐ
Hobby Dev ํ๋์์๋ ๋ฌด๋ฃ๋ก ์ ๊ณต๋๋ค. ์ค์ ๋ก ์ด์ํ๊ธฐ ์ํด ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ ์ ๋ฃ ํ๋์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ถ์ฒํ๋ค๊ณ ๋ฌธ์์ ์ ํ์๋ค.
๊ฒฝ๋ก๋ 5๋ฒ๊ณผ ๊ฐ์ ./Strapi ํ๋ก์ ํธ๋ช
/ ์ด๋ค. ์๋์ ๊ฐ์ด ์
๋ ฅํด์ค๋ค.
heroku addons:create heroku-postgresql:hobby-dev
์ฑ๊ณต์ ์ผ๋ก ์ค์น๊ฐ ๋๋ ๊ฒฝ์ฐ "Database has been created and is available"์ด๋ผ๋ ๋ฌธ๊ตฌ์ ํจ๊ป ๋ช ๋ง๋๊ฐ ๋ ์ถ๋ ฅ๋๋ค.
- ์์ฑ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ธํ๊ธฐ
heroku config
์์ ๊ฐ์ด ์
๋ ฅํ๋ฉด, postgres://USERNAME:PASSWORD@HOST:PORT:DATABASE_NAME ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค URL์ด ์ถ๋ ฅ๋๋ค.
์ด ๋ด์ฉ์ dashboard.heroku.com/apps ์์ ๋ณธ์ธ์ด ์์ฑํ Heroku ํ๋ก์ ํธ๋ฅผ ์ ํ ํ > Resources ํญ > Add-ons์ Heroku Postgres ํด๋ฆญ
์ธ ๋ฒ์งธ ํญ Settings > Database Credentials์์๋ ๋ณผ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ์ ์๋ ์ค์ ํ๊ธฐ
Strapi๋ ์์์ ์์ฑ๋ URL์ pg-connection-string ํจํค์ง๋ฅผ ์ฌ์ฉํด์ ํ๊ฒฝ๋ณ์๋ฅผ ๋ถ์ํ ์ ์๋ค๊ณ ํ๋ค. Heroku์์ ์์ URL์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ๋ URL์์ ํ๊ฒฝ๋ณ์๋ฅผ ์๋์ผ๋ก ๋ถ์ํ๋๋ก pg-connection-string ํจํค์ง๋ฅผ ์ถ๊ฐํด์ค๋ค.
# npm
npm install pg-connection-string --save
# yarn
yarn add pg-connection-string
- ์ด์ํ๊ฒฝ ๋ฐฐํฌ ์ํ Heroku ๋ฐ์ดํฐ๋ฒ ์ด์ค config ํ์ผ ์์ฑํ๊ธฐ
config ํด๋ ํ์์ /env/production ํด๋๋ฅผ ์์ฑํด์ฃผ๊ณ production ํด๋ ์์ database.js ๋ฅผ ์์ฑํด์ค๋ค. ๊ฒฝ๋ก๋ ./config/env/producton/database.js ์ด์ ๊ฐ์์ผ ํ๋ค. ์๋ ๊ทธ๋ฆผ ์ฐธ๊ณ
database.js ํ์ผ์๋ ์๋์ ์ฝ๋๋ฅผ ์ ๋๋ค.
const parse = require('pg-connection-string').parse;
const config = parse(process.env.DATABASE_URL);
module.exports = ({ env }) => ({
defaultConnection: 'default',
connections: {
default: {
connector: 'bookshelf',
settings: {
client: 'postgres',
host: config.host,
port: config.port,
database: config.database,
username: config.user,
password: config.password,
ssl: {
rejectUnauthorized: false,
},
},
options: {
ssl: true,
},
},
},
});
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ ํ์ผ์ด ์ฌ์ฉ๋๋๋ก Heroku์ NODE_ENV๋ฅผ production์ผ๋ก ์ค์ ํด์ค๋ค. ๊ฒฝ๋ก๋ Strapi ํ๋ก์ ํธ๊ฐ ์์นํ ๊ณณ์ด๋ค.
heroku config:set NODE_ENV=production
- ์ด์ํ๊ฒฝ์ ์ํด์ Strapi server config ์์ฑํ๊ธฐ
database.js๋ฅผ ์์ฑํ ํด๋์ server.js๋ ์์ฑํด์ค๋ค.
ํ์ผ์ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ค.
module.exports = ({ env }) => ({
url: env('HEROKU_URL'),
});
ํฐ๋ฏธ๋์์ Heroku์ ํ๊ฒฝ๋ณ์๋ฅผ ์ค์ ํด์ค๋ค. ๊ฒฝ๋ก๋ Strapi ํ๋ก์ ํธ๊ฐ ์์นํ ๊ณณ์ด๋ค.
heroku config:set HEROKU_URL=$(heroku info -s | grep web_url | cut -d= -f2)
HEROKU_URL: https://<HEROKU-ํ๋ก์ ํธ-๋ช >.herokuapp.com/ ๊ฐ์ด ๋ณด์ธ๋ค.
- (์ ํ) ๋ก์ปฌ Strapi ํ๋ก์ ํธ๊ฐ Postgres๋ก ์ค์ ๋์ด ์์ง ์๋ค๋ฉด pg node modules ์ค์น ํ์
์์์ ์งํํ ๋ฐฉ๋ฒ์ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก Postgres๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ํ์ง ์์.
๋ง์ฝ ํ์ํ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ์ค์น
npm install pg --save
8. ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐํ๊ธฐ
ํฐ๋ฏธ๋ ํน์ IDE์์ ์๋์ ๊ฐ์ด ์ปค๋ฐํ๋ค. ๊ฒฝ๋ก๋ Strapi ํ๋ก์ ํธ๊ฐ ์์นํ ๊ณณ์ด๋ค.
git add .
git commit -m "Update database config" # ์ปค๋ฐ ๋ฉ์์ง๋ ์์์...
9. Yarn lockfile ์ ๋ฐ์ดํธ
ํฐ๋ฏธ๋์์ ๊ฒฝ๋ก๋ Strapi ํ๋ก์ ํธ๊ฐ ์์นํ ๊ณณ์์ ์๋์ ๊ฐ์ด ์ ๋ ฅํ๋ค.
yarn install
10. ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐํ๊ธฐ
ํฐ๋ฏธ๋ ํน์ IDE์์ ์๋์ ๊ฐ์ด ์ปค๋ฐํ๋ค. ๊ฒฝ๋ก๋ Strapi ํ๋ก์ ํธ๊ฐ ์์นํ ๊ณณ์ด๋ค.
git add yarn.lock
git commit -m "Updated Yarn lockfile" # ์ปค๋ฐ ๋ฉ์์ง๋ ์์์...
11. ๋ฐฐํฌ
ํฐ๋ฏธ๋ ํน์ IDE์์ ์๋์ ๊ฐ์ด ํธ์ํ๋ค. ๊ฒฝ๋ก๋ Strapi ํ๋ก์ ํธ๊ฐ ์์นํ ๊ณณ์ด๋ค.
git push heroku HEAD:main
๋ฐฐํฌ๋ ๋ช ๋ถ ๊ฑธ๋ฆด ์ ์๋ค. ๋ฐฐํฌ๊ฐ ๋๋๊ณ ํ๋ก์ ํธ URL์ด ๋ณด์ด๋ฉด ์ด์ด๋ณผ ์ ์๋ค. ํฐ๋ฏธ๋์ heroku open์ ์
๋ ฅํด๋ ๋๋ค.
https://<HEROKU-ํ๋ก์ ํธ-๋ช
>.herokuapp.com/์์ Strapi ์ฐ์ปด ํ์ด์ง๊ฐ ๋ณด์ธ๋ค๋ฉด ์ฑ๊ณต์ด๋ค! ๐
๋ค์ ํธ์์๋ Github๊ณผ ์ฐ๊ฒฐํด์ ์๋ ๋ฐฐํฌ๋ฅผ ์ค์ ํ๋ ๋ฒ์ ๋ํด์ ๋ค๋ค๋ณด๊ฒ ๋ค.
๐ ์ฐธ์กฐ
https://strapi.io/documentation/developer-docs/latest/setup-deployment-guides/deployment/hosting-guides/heroku.html
https://tute.io/install-configure-strapi-postgresql