-
GCP VM에 Infisical docker-compose로 설치 후 팀원 초대클라우드 2025. 5. 19. 22:42
우선 GCP의 VM에 접속합니다.
그리고 docker와 docker compose를 설치합니다.
sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release # Docker GPG 키 추가 sudo mkdir -p /etc/apt/keyrings curl -fsSL <https://download.docker.com/linux/debian/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # Docker 저장소 추가 echo \\ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \\ <https://download.docker.com/linux/debian> \\ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Docker 엔진 설치 sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # docker 명령어가 잘 되는지 확인 sudo docker run hello-world
잘 설치 되는지 확인 됩니다.
docker compose version Docker Compose version v2.35.1
그리고 sudo 없이 docker를 실행하기 위해
sudo usermod -aG docker $USER newgrp docker
명령어를 실행시켜줍니다.
그리고 docker-compose 명령어를 입력해도 실행 되도록
심볼릭 링크를 설정합니다.
sudo ln -s /usr/libexec/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose
TMI로 심볼릭 링크는 바로가기라고 보면 되는데 /usr/local/bin/docker-compose 이 명령어를 입력했을 때
/usr/libexec/docker/cli-plugins/docker-compose 이 명령어를 실행하게 만들어서
구 버전의 명령어인 docker-compose 를 써도 최신 docker compose가 실행되게 합니다.
더 TMI로 하드링크는 딥 카피라고 보면 됩니다.
심볼릭 링크는 바로가기라 원본이 삭제되면 참조하는 부분이 없어져 실행이 안되는데 하드 링크는 원본이 삭제되도 남아있습니다.
ln -s 가 심볼릭링크이고, ln 이 하드 링크를 설정하는 방법입니다.
그리고 다음 명령어를 사용하여 infisical의 docker-compose.prod.yml 파일을 다운받습니다.
curl -o docker-compose.prod.yml <https://raw.githubusercontent.com/Infisical/infisical/main/docker-compose.prod.yml>
그리고 필요한 다음 명령어를 통해 .env의 샘플을 다운받습니다.
curl -o .env <https://raw.githubusercontent.com/Infisical/infisical/main/.env.example>
그리고 ls -al 명령어를 치면 .env 파일이 보이는데 이것을 확인해보면 다음 내용이 나옵니다.
# Keys # Required key for platform encryption/decryption ops # THIS IS A SAMPLE ENCRYPTION KEY AND SHOULD NEVER BE USED FOR PRODUCTION ENCRYPTION_KEY=6c1fe4e407b8911c104518103505b218 # JWT # Required secrets to sign JWT tokens # THIS IS A SAMPLE AUTH_SECRET KEY AND SHOULD NEVER BE USED FOR PRODUCTION AUTH_SECRET=5lrMXKKWCVocS/uerPsl7V+TX/aaUaI7iDkgl3tSmLE= # Postgres creds POSTGRES_PASSWORD=infisical POSTGRES_USER=infisical POSTGRES_DB=infisical # Required DB_CONNECTION_URI=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} # Redis REDIS_URL=redis://redis:6379 # Website URL # Required SITE_URL=http://localhost:8080 # Mail/SMTP SMTP_HOST= SMTP_PORT= SMTP_FROM_ADDRESS= SMTP_FROM_NAME= SMTP_USERNAME= SMTP_PASSWORD= # Integration # Optional only if integration is used CLIENT_ID_HEROKU= CLIENT_ID_VERCEL= CLIENT_ID_NETLIFY= CLIENT_ID_GITHUB= CLIENT_ID_GITHUB_APP= CLIENT_SLUG_GITHUB_APP= CLIENT_ID_GITLAB= CLIENT_ID_BITBUCKET= CLIENT_SECRET_HEROKU= CLIENT_SECRET_VERCEL= CLIENT_SECRET_NETLIFY= CLIENT_SECRET_GITHUB= CLIENT_SECRET_GITHUB_APP= CLIENT_SECRET_GITLAB= CLIENT_SECRET_BITBUCKET= CLIENT_SLUG_VERCEL= CLIENT_PRIVATE_KEY_GITHUB_APP= CLIENT_APP_ID_GITHUB_APP= # Sentry (optional) for monitoring errors SENTRY_DSN= # Infisical Cloud-specific configs # Ignore - Not applicable for self-hosted version POSTHOG_HOST= POSTHOG_PROJECT_API_KEY= # SSO-specific variables CLIENT_ID_GOOGLE_LOGIN= CLIENT_SECRET_GOOGLE_LOGIN= CLIENT_ID_GITHUB_LOGIN= CLIENT_SECRET_GITHUB_LOGIN= CLIENT_ID_GITLAB_LOGIN= CLIENT_SECRET_GITLAB_LOGIN= CAPTCHA_SECRET= NEXT_PUBLIC_CAPTCHA_SITE_KEY= OTEL_TELEMETRY_COLLECTION_ENABLED=false OTEL_EXPORT_TYPE=prometheus OTEL_EXPORT_OTLP_ENDPOINT= OTEL_OTLP_PUSH_INTERVAL= OTEL_COLLECTOR_BASIC_AUTH_USERNAME= OTEL_COLLECTOR_BASIC_AUTH_PASSWORD= PLAIN_API_KEY= PLAIN_WISH_LABEL_IDS= SSL_CLIENT_CERTIFICATE_HEADER_KEY= ENABLE_MSSQL_SECRET_ROTATION_ENCRYPT=true # App Connections # aws assume-role connection INF_APP_CONNECTION_AWS_ACCESS_KEY_ID= INF_APP_CONNECTION_AWS_SECRET_ACCESS_KEY= # github oauth connection INF_APP_CONNECTION_GITHUB_OAUTH_CLIENT_ID= INF_APP_CONNECTION_GITHUB_OAUTH_CLIENT_SECRET= #github app connection INF_APP_CONNECTION_GITHUB_APP_CLIENT_ID= INF_APP_CONNECTION_GITHUB_APP_CLIENT_SECRET= INF_APP_CONNECTION_GITHUB_APP_PRIVATE_KEY= INF_APP_CONNECTION_GITHUB_APP_SLUG= INF_APP_CONNECTION_GITHUB_APP_ID= #gcp app connection INF_APP_CONNECTION_GCP_SERVICE_ACCOUNT_CREDENTIAL= # azure app connection INF_APP_CONNECTION_AZURE_CLIENT_ID= INF_APP_CONNECTION_AZURE_CLIENT_SECRET= # datadog SHOULD_USE_DATADOG_TRACER= DATADOG_PROFILING_ENABLED= DATADOG_ENV= DATADOG_SERVICE= DATADOG_HOSTNAME=
여기서 우리가수정할것은
# Keys # Required key for platform encryption/decryption ops # THIS IS A SAMPLE ENCRYPTION KEY AND SHOULD NEVER BE USED FOR PRODUCTION ENCRYPTION_KEY=6c1fe4e407b8911c104518103505b218 # JWT # Required secrets to sign JWT tokens # THIS IS A SAMPLE AUTH_SECRET KEY AND SHOULD NEVER BE USED FOR PRODUCTION AUTH_SECRET=5lrMXKKWCVocS/uerPsl7V+TX/aaUaI7iDkgl3tSmLE= # Postgres creds POSTGRES_PASSWORD=infisical POSTGRES_USER=infisical POSTGRES_DB=infisical # Required DB_CONNECTION_URI=postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} # Redis REDIS_URL=redis://redis:6379 # Website URL # Required SITE_URL=http://localhost:8080 # Mail/SMTP SMTP_HOST= SMTP_PORT= SMTP_FROM_ADDRESS= SMTP_FROM_NAME= SMTP_USERNAME= SMTP_PASSWORD=
여기까지 입니다.
처음부터 차근차근히 채워가겠습니다.
우선 ENCRYPTION_KEY에는 샘플이 입력되어 있는데 이걸 운영환경에서는 쓰지말라고 써있기 때문에 다음 명령어를 입력하여 랜덤값을 생성합니다.
openssl rand -hex 16
샘플이고 실제 사용한 값과는 다릅니다 이제 AUTH_KEY를 만들겠습니다.
openssl rand -base64 32
샘플이고 실제 사용한 값과는 다릅니다 POSTGRES DB, 사용자, 패스워드는 원하는 DB 설정으로 바꿔줍니다.
저 같은 경우는 저희 프로젝트에 맞는 DB 설정으로 하였습니다.
REDIS_URL과 SITE_URL 은 그대로 설정해두고 사용하면 회원가입, 로그인, 비밀 운영 업무 같은 기본적인 기능은 사용이 가능합니다.
하지만 팀원 초대를 할 수가 없습니다. 저희는 사용목적이 환경변수 공유 목적이라 팀원들이 접속할 수 있어야 했습니다. 그래서 이메일 설정까지 해줍니다.
이메일 설정하는 다양한 방법들이 있었는데, 저는 AWS SES를 사용하려 했습니다.
왜냐하면 저는 AWS 서비스를 하나라도 더 사용해보고 싶었기 때문입니다.
AWS SES 구성하는 방법은
https://velog.io/@inmyhead/AWS-SES으로-유저에게-이메일-전송하기 다음 블로그를 참고하였습니다.
저는 팀원 초대를 위한 것이니 프로덕션까지 필요 없을 것 같아 이메일 인증과 도메인 인증 2가지만 합니다.
이메일 인증은 사이드바의 “구성 - 자격증명”에 들어가서 이메일 선택하면
이메일 주소 입력하고 작성한 이메일로 메일이 하나 오는데 거기에 있는 링크 클릭하면 인증이 됩니다.
그리고 도메인 인증입니다.
사둔 도메인을 입력하고
다음과 같이 설정하고 생성버튼을 누르면 CNAME이 나오는데 이를 도메인의 호스팅 영역에 CNAME으로 넣어주면 됩니다.
저는 Route53으로 도메인을 구매해서 자동연동되고 인증이 되었습니다.
그리고 테스트 이메일을 보내보는데, 전송성공 시나리오는 메일이 제 메일로 오지 않아 되는지 불확실하여, 사용자 지정으로 제 메일주소로 메일을 보냈습니다.
메일이 잘 오는 것을 확인했습니다.
그 후 Infiscal의 메일 설정을 해주기 위해 사이드바의 SMTP 설정에 들어가서 SMTP 보안인증 설정합니다.
그럼 IAM USER를 생성하게 되는데 생성 후 나오는 ID와 PASSWORD를 잘 저장해두고 환경변수에 넣어줍니다.
이렇게 하면 환경변수를 사용하는데 필요한 설정이 전부 끝나서
# Mail/SMTP SMTP_HOST= SMTP_PORT= SMTP_FROM_ADDRESS= SMTP_FROM_NAME= SMTP_USERNAME= SMTP_PASSWORD=
이 환경변수에다가 밑의 값들을 넣어주면 됩니다.
SMTP_HOST에는 AWS콘솔의 SMTP설정에서 확인할 수 있는 SMTP엔드포인트를 넣어줍니다.
SMTP_PORT에는 465를 넣어줍니다.
SMTP_FROM_ADDRESS 에는 전송할 주소(도메인 or 메일주소)를 넣어줍니다.
SMTP_FROM_NAME 에는 이름을 설정합니다.
SMTP_USERNAME 과 SMTP_PASSWORD 에는 IAM 생성하고 나온 값들을 넣어줍니다.
환경변수 설정들을 다 해줬으면
docker-compose -f docker-compose.prod.yml up
를 통해 실행합니다.
그럼 필요한 docker 이미지들을 Pull 받고 컨테이너를 실행시키게 됩니다.
다 실행이 됐다면 브라우저에 VM의 IP를 입력하면
다음 화면이 나옵니다.
만약에 안나온다면 VM의 방화벽을 풀어줘야 합니다. GCP 콘솔에서 보안그룹 뿐만 아니라 인스턴스 내부에서의 방화벽을 풀어줘야합니다.
저는 다음 명령어를 입력하고 나오는 화면에서 YES 두번 누르고 풀었습니다.
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo apt install iptables-persistent -y sudo netfilter-persistent save
정보를 입력하고 Continue를 나오고 로딩을 좀 오래 한다음에 메인 화면이 나오는데
사이드바에 Admin - Access Control로 들어갑니다. 여기에서 Add member를 통해 팀원의 이메일을 선택하고 초대를 보내면
http://localhost:8080 으로 리다이렉션 됩니다. 이 문제는 위에서 환경변수 설정 해둘 때 SITE_URL 을 그렇게 해놨기 때문인데, 이걸 포트번호(8080)을 빼고 http://<VM의 IP> 로 수정하면 팀원 초대가 됩니다.
그전에, 저희는 SES 샌드박스를 풀지 않아서 인증된 이메일에 추가해줘야 해서 팀원이
2개의 인증 메일
- AWS SES 인증메일
- Infisical 연동메일
을 전부 인증하고 초대를 받을 수 있었습니다.
'클라우드' 카테고리의 다른 글
React+Vite CI/CD with Infisical (0) 2025.05.23 React+Vite nginx로 GCP VM(우분투)에 수동배포 하는 방법 (0) 2025.05.22 Infisical으로 React 환경변수 적용하기 (0) 2025.05.20 docker 멀티 아키텍처 빌드하는 방법 (0) 2025.05.16