[Strapi] Strapi 프로젝트를 Fly.io에 배포하기
strapi 프로젝트를 Fly.io에 배포하는 방법에 대해 알아보겠습니다.
Strapi 설정
Strapi 프로젝트 생성
yarn create strapi-app strapi-fly --quickstart
명령어를 수행하면 strapi 프로젝트가 기본 설정으로 생성됩니다.
Postgresql 설정
Strapi 프로젝트를 생성하면 sqlite가 기본 데이터베이스로 설정되어 있습니다.
Fly.io는 postgresql을 기본 지원하기 때문에 이에 맞게 strapi에서 postgresql를 사용하도록 설정해주겠습니다.
// config/database.js
const path = require('path');
module.exports = ({ env }) => {
const client = env('DATABASE_CLIENT', 'postgres'); // sqlite > postgres
// ...
postgres: {
connection: {
connectionString: env('DATABASE_URL'), // 삭제해주세요
host: env('DATABASE_HOST', 'localhost'),
// ...
config/database.js 파일에서 client를 sqlite에서 postgres로 변경합니다.
그리고 아래로 가면 postgres 설정이 있는데, connectionString을 삭제해주세요. 추후 Fly.io와 연동 이후 해당 설정이 있다면 에러가 발생합니다.
// .env
DATABASE_CLIENT=postgres
DATABASE_HOST=127.0.0.1
DATABASE_PORT=5432
DATABASE_NAME=데이터베이스이름
DATABASE_USERNAME=유저이름
DATABASE_PASSWORD=유저패스워드
그리고 .env파일도 DATABASE_CLIENT를 postgres로 수정하고, DB 이름과 유저이름, 비밀번호도 본인이 설정한 것으로 수정합니다.
Dockerfile 생성
Fly에 배포하기 위해서 Dockerfile를 생성해야합니다. 프로젝트 root 디렉터리에 Dockerfile 파일명으로 파일을 생성해주시고, 아래 코드를 작성해주세요.
# Dockerfile
FROM node:16
# Installing libvips-dev for sharp Compatability
RUN apt-get update && apt-get install libvips-dev -y
# Set environment to production
ENV NODE_ENV=production
# Copy the configuration files
WORKDIR /opt/
COPY ./package.json ./yarn.lock ./
ENV PATH /opt/node_modules/.bin:$PATH
# Install dependencies
RUN yarn install
# Copy the application files
WORKDIR /opt/app
COPY ./ .
# Build the Strapi application
RUN yarn build
# Expose the Strapi port
EXPOSE 1337
# Start the Strapi application
CMD ["yarn", "start"]
추가적으로 .dockerignore파일을 생성하여 아래와 같이 작성해주세요.
.tmp/
.cache/
.git/
build/
node_modules/
data/
plugins 파일 생성
config폴더에 plugins.js파일을 생성하여 아래 코드를 작성해주세요.
// config/plugins.js
module.exports = ({ env }) => ({
"users-permissions": {
config: {
jwtSecret: env("ADMIN_JWT_SECRET"),
},
},
});
이 파일이 없다면, 나중에 배포 후에 아래와 같은 에러가 발생합니다. 작성자처럼 삽질하지 말라고 설정 편의를 위해 미리 작성하였습니다..
Fly.io 설정
Strapi 설정을 마쳤다면 Fly에 배포하기 위해 설정을 진행하겠습니다.
Fly CLI 설치
우선 컴퓨터에 Fly CLI를 설치해야합니다. 설치에 필요한 명령어는 아래와 같습니다.
Mac
brew install flyctl
Window | Linux
curl -L https://fly.io/install.sh | sh
Fly에 로그인하기
CLI를 설치했다면 아래 명령어로 로그인해야합니다. 만약 계정이 없다면 생성해주세요.
fly auth login
Fly 프로젝트 생성하기
fly launch
? Choose an app name (leave blank to generate one): 프로젝트 이름을 지정합니다.
? Choose a region for deployment: Tokyo, Japan (nrt) 한국과 가까운 도쿄로 지정합니다.
Created app '프로젝트 이름' in organization ''
Admin URL: https://fly.io/apps/프로젝트 이름
Hostname: 프로젝트 이름.fly.dev
strapi 프로젝트 루트에서 fly launch 명령을 실행하면 프로젝트 이름과 region을 지정할 수 있습니다.
이후 Postgresql database를 셋업할거냐는 질문이 나오는데 Yes를 선택해 주시고, 저는 연습용으로 사용하기 때문에 가장 작은 용량으로 선택했습니다.
만약 셋업 질문이 나오지 않는다면 목차 아래의 TroubleShooting 부분으로 가서 내용을 확인해주세요.
이후 DATABASE_URL=postgres://프로젝트이름:비밀번호...와 같은 정보가 표시됩니다. 이것을 복사해서 .env 파일에 추가해주세요.
// .env
// ...
DATABASE_URL=postgres://...
이후 기본 설정을 선택해 주시고, 다 마쳤다면 자동으로 fly.toml파일이 생성되며 프로젝트 생성 작업이 종료됩니다.
추가적으로 이후에 아래와 같은 질문이 나오는데, 추가적으로 설정할 것이 있기 때문에 No를 선택해줍니다.
? Would you like to deploy now? (y/N) > No
TroubleShooting: Fly 프로젝트 생성시 셋업 질문이 나오지 않는다면
만약 fly launch 명령어로 프로젝트를 생성했는데 fly.toml파일만 생성되고 Postgresql을 셋업해줄까? 하는 질문이 나오지 않는다면 귀찮지만 프로젝트를 삭제하고, 아래 명령어로 다시 프로젝트를 생성해주세요
fly launch --image flyio/hellofly:latest
이후 Postgresql 셋업 및 DATABASE_URL까지 env파일에 적었다면 생성된 fly.toml에서 아래 부분을 삭제해주세요.
해당 코드가 남아있으면 Strapi가 빌드된 Docker 이미지가 업로드 되지 않고, 기본 제공 이미지가 업로드됩니다.
// fly.toml
// ...
[build] // 삭제
image = "flyio/hellofly:latest" // 삭제
fly.toml 파일 수정하기
생성된 fly.toml파일에서 [http_service]의 internal_port를 1337로 수정하고, 아래 코드를 추가해줍니다.
[http_service]
internal_port = 1337 // 1337로 수정
// ...
// 아래 코드 추가
[[services]]
http_checks = []
internal_port = 1337
processes = ["app"]
protocol = "tcp"
script_checks = []
postgresql production 환경 설정
postgresql을 Fly에 배포되는 production 환경에서 사용하기 위해 config/env/production경로를 만들고, database.js파일을 생성합니다.
이전에 Strapi 설정 단계에서 .env파일에 DATABASE_URL을 지정했었습니다. 이를 파싱하기 위해 필요한 패키지를 설치합니다.
yarn add pg-connection-string pg
설치 후 database.js 파일을 아래와 같이 작성합니다.
// config/env/production/database.js
const parse = require("pg-connection-string").parse;
const config = parse(process.env.DATABASE_URL);
module.exports = () => ({
connection: {
client: "postgres",
connection: {
host: config.host,
port: config.port,
database: config.database,
user: config.user,
password: config.password,
ssl: false,
},
debug: false,
},
});
Fly에 배포하기
긴 설정을 마쳤다면 이제 배포만 하면 됩니다.
fly deploy
참고로 배포 환경에서는 content-type을 수정하지 못하기 때문에 수정이 필요하다면 개발 환경에서 진행해주세요.
strapi 프로젝트를 수정하게 되면 다시 fly deploy 명령을 수행하여 재배포할 수 있습니다.
마치며
원래 heroku를 통해 배포하려했으나, heroku에서 이전에 제공하던 무료 플랜이 사라졌기에 대체제로 Fly.io를 찾아 배포하는 과정을 작성했습니다.
그리고 이 Fly.io에 배포하는 과정에서 거의 6시간 가량을 삽질했기 때문에 억울해서 저와 같이 시간 낭비하지 마시라고 정리해서 작성합니다.. (특히 TroubleShooting 부분.. 자동 셋업이 안떠서 postgresql 프로젝트를 따로 만들어서 연결하려다가 결국 해결 못했습니다ㅠㅠ)
그래도 계속된 삽질을 통해 Dockerfile에 사용되는 문법이나 DB설정 방법 등을 얻고가는 것 같아 그나마 만족합니다..,,
본 글은 아래 커뮤니티글을 토대로 작성되었고, 추가적인 설정이 필요한 부분과 에러가 안나도록 내용을 추가하였습니다. 또 패키지 매니저는 yarn을 기준으로 작성했기 때문에, npm을 사용한다면 해당 링크를 참고해주세요.
https://forum.strapi.io/t/fly-io-deployment/22438