You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Oracle Cloud Infrastructure(OCI) Always Free 리소스를 활용해서 NextJS 프로젝트 배포 환경을 구축하고, A1.Flex 용량 부족 문제를 E2.1.Micro 2개 활용하는 방법으로 해결했습니다. 특히 Ubuntu 22.04의 iptables 방화벽 문제로 트러블슈팅을 거쳐 완전한 배포 환경을 구축했습니다.
VCN(가상 클라우드 네트워크) 구성과 서브넷 설정 방법
OCI 보안 목록과 Ubuntu iptables 이중 방화벽 관리
A1.Flex vs E2.1.Micro 인스턴스 특성과 선택 전략
Docker + Nginx + SSL을 활용한 프로덕션 환경 구축
GitHub Actions + GHCR을 활용한 CI/CD 파이프라인 구축
🔍 배경 / 문제 상황
프론트엔드 부트캠프 프로젝트인 글로벌 노마드를 배포하기 위해 인프라 구축이 필요한 상황이었습니다:
문제점:
NextJS 15 + Docker 환경을 무료로 배포할 수 있으면서 추후 포트폴리오로 활용해야 하므로 지속적인 배포 상태를 유지 필요
AWS 프리티어는 t2.micro(1GB RAM)로 메모리 부족 우려
개발 서버와 배포 서버를 동시에 운영이 가능하다면 동시에 운영 예정
비용은 최대한 절약하면서 안정적인 서비스 운영 필요
목표:
완전 무료로 운영 가능한 클라우드 인프라 구축
고성능 ARM 인스턴스 확보 (A1.Flex)
보안이 강화된 프로덕션 수준의 환경 설정
CI/CD 파이프라인을 통한 자동 배포 구현
✅ 핵심 정리 / 해결 방법
OCI Always Free 리소스를 활용하여 글로벌 노마드 프로젝트용 클라우드 인프라를 구축했습니다. A1.Flex 용량 부족 문제를 만나 E2.1.Micro 2개로 개발/배포 환경을 분리하는 방법으로 전환했고, 첫 인스턴스에서 22 포트를 제외한 포트에 접속할 수 없는 문제들을 Ubuntu 22.04의 iptables 방화벽 문제를 해결하여 완전한 배포 환경을 구축했습니다.
🎯 작업 전후 비교
Before (작업 전)
❌ 클라우드 인프라 없음
❌ 로컬 개발 환경에만 의존
❌ 배포 환경 부재
❌ 수동 배포 프로세스
After (작업 후)
✅ 완전한 클라우드 네트워크 인프라 구축 완료
✅ Docker + Nginx + SSL 프로덕션 환경 구성
✅ GitHub Actions 기반 CI/CD 파이프라인 구축
✅ 개발/운영 환경 분리 전략 수립
✅ 월 $0 비용으로 운영 가능한 인프라 확보
# Stateful vs Stateless 선택
웹 서비스: Stateful 방화벽 사용
이유: 연결 상태 추적으로 보안성 향상
🔐 4단계: A1.Flex 인스턴스 생성 시도
작업 내용: 고성능 ARM 인스턴스 생성 시도
시도한 구성
이미지: Canonical Ubuntu 22.04 LTSShape: VM.Standard.A1.Flex리소스: 4 OCPU, 24GB RAM가용성 도메인: 모든 도메인 시도
결과
❌ 모든 가용성 도메인에서 "용량 부족" 오류
❌ 결함 도메인 변경해도 동일한 결과
❌ 시간대 변경해도 실패
⚙️ 5단계: E2.1.Micro 2개 활용 방법으로 전환
문제 해결: 환경 분리를 통한 리소스 최적화
최종 인스턴스 구성
# 첫 번째 인스턴스 (실패)이름: global-nomad-prodIP: 134.185.112.25상태: iptables 문제인지 모르고 보안그룹부터 여러가지 설정들을 건드려보다가 새 인스턴스를 생성해서 처음부터 다시 해보기로 결정# 두 번째 인스턴스 (성공)이름: global-nomad-prod-v2IP: 152.67.217.89Shape: VM.Standard.E2.1.Micro리소스: 1 OCPU, 1GB RAM, 46.6GB Storage네트워크: 퍼블릭 서브넷 + 퍼블릭 IP 자동 할당보안: 실드된 인스턴스 + SSH 키 인증
🔥 6단계: Ubuntu 22.04 iptables 방화벽 문제 해결
문제 상황: 며칠간의 트러블슈팅
OCI 보안 목록에서 포트를 열었음에도 외부 접속 불가
SSH(22번)만 작동하고 HTTP/HTTPS/3000 포트 "Connection refused"
첫 번째 인스턴스 포기하고 새 인스턴스 생성했으나 동일한 문제 발생
진짜 원인 발견:
Ubuntu 22.04의 기본 iptables REJECT 규칙
# 문제의 규칙 (맨 마지막에 위치)
Chain INPUT (policy ACCEPT)
num target prot opt source destination
...
8 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
월 비용: $0 (Always Free)
유지 기간: 무제한
CI/CD: GitHub Actions 무료 (공개 저장소)
🔧 유지보수 명령어
서버 상태 확인
# PM2 프로세스
pm2 status
# Docker 컨테이너
docker-compose ps
# 로그 확인
docker-compose logs -f nextjs
배포 관련
# 수동 배포cd~/projects/GlobalNomad
git pull origin develop
docker-compose up -d
# 롤백export NEXTJS_IMAGE="ghcr.io/username/global-nomad:이전버전"
docker-compose up -d
네트워크 확인
# iptables 규칙 확인 (중요!)
sudo iptables -L -n --line-numbers
# 포트 확인
sudo lsof -i :80
sudo lsof -i :3000
🧠 느낀점 또는 생각 메모
처음에는 단순히 무료 서버만 얻으면 된다고 생각했는데, 실제로는 네트워킹부터 보안까지 전체적인 클라우드 아키텍처를 이해해야 한다는 것을 깨달았습니다.
진행하면서 중요하게 생각하게 된 점들:
1. A1.Flex:
A1.Flex가 성능은 우수하지만 너무 인기가 많아서 실제로 확보하기 어렵다는 현실적 제약을 경험했습니다. 인프라를 구성할 때는 항상 대안 계획이 필요하다는 것을 배웠습니다. (시간 압박...ㅠ)
2. 클라우드 네트워킹의 복잡성:
VCN 생성 시 서브넷이 자동으로 생성되지 않아서 서브넷, 인터넷 게이트웨이, 라우팅 테이블 등 각 컴포넌트 간의 의존성?을 이해하고 직접 구성해야 했습니다. VCN을 생성 하면서 클라우드 서비스는 단순한 임대 서비스가 아니라 가상 데이터센터를 하나 설계하는 일과 비슷하다고 느꼈습니다.
3. 보안 설정의 세밀함:
Stateful vs Stateless 방화벽 선택, 실드된 인스턴스 등 보안 기능들이 어떤것들이 있는지 알아볼 수 있는 기회가 되어 좋았습니다.
4. iptables와 클라우드 방화벽의 이중 구조 (가장 큰 깨달음!):
며칠간의 트러블슈팅을 통해 깨달은 가장 중요한 점은 클라우드 레벨 보안(OCI 보안 목록)과 OS 레벨 보안(iptables)이 별개라는 것입니다. "가장 가까운 곳부터 확인"하는 원칙의 중요성을 뼈저리게 느꼈습니다. 새 인스턴스를 만들기 전에 iptables를 확인했다면 시간을 크게 절약할 수 있었을 것입니다. 이를 통해서 클라우드 환경에서는 제공업체의 방화벽(보안 그룹, 보안 목록등)과 OS의 방화벽(iptables, firewalld 등) 두 가지가 존재함을 깨닫게 되었습니다.
규칙의 순서의 중요성:
특히 iptables는 규칙이 순서대로 적용 되므로, REJECT 규칙보다 먼저 ACCEPT 규칙을 삽입(-I)해야 하는것 또한 알 수 있었습니다. 이 과정들을 통해서 다음에도 이런 문제를 맞닿뜨린다면 어떤 진단 순서로 해결해야 할지 이제 좀 감이 잡힌거 같습니다.
애플리케이션이 올바른 포트로 실행 중인지 확인 (lsof, netstat)
OS 자체 방화벽 확인 (iptables, firewalld)
클라우드 제공업체의 방화벽 확인 (보안 그룹, 보안 목록)
네트워크 라우팅 및 ACL 확인 (라우팅 테이블, NACL)
5. 메모리 관리의 중요성:
1GB RAM 환경에서는 스왑 파일이 필수였습니다. 실제로 스왑 설정 없이 pnpm install을 실행하다 시스템이 멈추는 문제를 직접 겪으며, 1GB RAM이 얼마나 작은지 직접 실감할 수 있었습니다. 그리고 이 과정을 통해서 무엇보다... 돈을 쓰면 시간을 절약할 수 있다라는 것도 실감하게 되었습니다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
📌 배운 내용
Oracle Cloud Infrastructure(OCI) Always Free 리소스를 활용해서 NextJS 프로젝트 배포 환경을 구축하고, A1.Flex 용량 부족 문제를 E2.1.Micro 2개 활용하는 방법으로 해결했습니다. 특히 Ubuntu 22.04의 iptables 방화벽 문제로 트러블슈팅을 거쳐 완전한 배포 환경을 구축했습니다.
🔍 배경 / 문제 상황
프론트엔드 부트캠프 프로젝트인 글로벌 노마드를 배포하기 위해 인프라 구축이 필요한 상황이었습니다:
문제점:
목표:
✅ 핵심 정리 / 해결 방법
OCI Always Free 리소스를 활용하여 글로벌 노마드 프로젝트용 클라우드 인프라를 구축했습니다. A1.Flex 용량 부족 문제를 만나 E2.1.Micro 2개로 개발/배포 환경을 분리하는 방법으로 전환했고, 첫 인스턴스에서 22 포트를 제외한 포트에 접속할 수 없는 문제들을 Ubuntu 22.04의 iptables 방화벽 문제를 해결하여 완전한 배포 환경을 구축했습니다.
🎯 작업 전후 비교
Before (작업 전)
❌ 클라우드 인프라 없음
❌ 로컬 개발 환경에만 의존
❌ 배포 환경 부재
❌ 수동 배포 프로세스
After (작업 후)
✅ 완전한 클라우드 네트워크 인프라 구축 완료
✅ Docker + Nginx + SSL 프로덕션 환경 구성
✅ GitHub Actions 기반 CI/CD 파이프라인 구축
✅ 개발/운영 환경 분리 전략 수립
✅ 월 $0 비용으로 운영 가능한 인프라 확보
🛠 사전 준비사항
OCI 계정 설정
리전: 춘천(ap-chuncheon-1)
계정: Oracle Cloud Always Free
프로젝트: global-nomad
목표 리소스
A1.Flex: 4 OCPU, 24GB RAM (1차 목표)
E2.1.Micro: 1 OCPU, 1GB RAM × 2개 (대안)
프로젝트 요구사항
NextJS 15 + Docker 환경
SSH 접속 환경
HTTP/HTTPS 웹 서비스 포트
도메인 연결 (globalnomad.site)
🔍 1단계: 클라우드 서비스 비교 분석
작업 내용: AWS vs OCI 프리티어 비교 및 OCI 선택
비교 결과
선택 이유
⚙️ 2단계: VCN(가상 클라우드 네트워크) 구성
작업 내용: 네트워크 인프라 기초 설정
VCN 생성
퍼블릭 서브넷 생성
인터넷 게이트웨이 설정
🌐 3단계: 보안 설정
보안 목록 규칙 추가
방화벽 설정
# Stateful vs Stateless 선택 웹 서비스: Stateful 방화벽 사용 이유: 연결 상태 추적으로 보안성 향상🔐 4단계: A1.Flex 인스턴스 생성 시도
작업 내용: 고성능 ARM 인스턴스 생성 시도
시도한 구성
결과
❌ 모든 가용성 도메인에서 "용량 부족" 오류 ❌ 결함 도메인 변경해도 동일한 결과 ❌ 시간대 변경해도 실패⚙️ 5단계: E2.1.Micro 2개 활용 방법으로 전환
문제 해결: 환경 분리를 통한 리소스 최적화
최종 인스턴스 구성
🔥 6단계: Ubuntu 22.04 iptables 방화벽 문제 해결
문제 상황: 며칠간의 트러블슈팅
진짜 원인 발견:

Ubuntu 22.04의 기본 iptables REJECT 규칙
해결 방법:

🐳 7단계: Docker 및 개발 환경 구축
메모리 관리 (1GB RAM 한계 극복)
개발 도구 설치
🚀 8단계: 배포 환경 구성
Docker 컨테이너화
Nginx + SSL 설정
도메인 연결
도메인: globalnomad.site (GoDaddy 구매) DNS: A 레코드 → 152.67.217.89 SSL: Let's Encrypt 무료 인증서🔄 9단계: CI/CD 파이프라인 구축
GitHub Actions 설정
보안 설정
# GitHub Secrets OCI_HOST: 152.67.217.89 OCI_USERNAME: ubuntu OCI_SSH_KEY: (SSH 개인키) GHCR_PAT: (Personal Access Token)🎉 결과
최종 인프라 구성
OCI 춘천 리전 ↓ global-nomad-vcn (10.0.0.0/16) ↓ 퍼블릭 서브넷 (10.0.1.0/24, 10.0.2.0/24) ↓ E2.1.Micro 인스턴스 × 2 (개발/운영 분리 예정) ↓ Docker + Nginx + SSL + GitHub Actions CI/CD접속 정보
비용
월 비용: $0 (Always Free) 유지 기간: 무제한 CI/CD: GitHub Actions 무료 (공개 저장소)🔧 유지보수 명령어
서버 상태 확인
배포 관련
네트워크 확인
🧠 느낀점 또는 생각 메모
처음에는 단순히 무료 서버만 얻으면 된다고 생각했는데, 실제로는 네트워킹부터 보안까지 전체적인 클라우드 아키텍처를 이해해야 한다는 것을 깨달았습니다.
진행하면서 중요하게 생각하게 된 점들:
1. A1.Flex:
A1.Flex가 성능은 우수하지만 너무 인기가 많아서 실제로 확보하기 어렵다는 현실적 제약을 경험했습니다. 인프라를 구성할 때는 항상 대안 계획이 필요하다는 것을 배웠습니다. (시간 압박...ㅠ)
2. 클라우드 네트워킹의 복잡성:
VCN 생성 시 서브넷이 자동으로 생성되지 않아서 서브넷, 인터넷 게이트웨이, 라우팅 테이블 등 각 컴포넌트 간의 의존성?을 이해하고 직접 구성해야 했습니다. VCN을 생성 하면서 클라우드 서비스는 단순한 임대 서비스가 아니라 가상 데이터센터를 하나 설계하는 일과 비슷하다고 느꼈습니다.
3. 보안 설정의 세밀함:
Stateful vs Stateless 방화벽 선택, 실드된 인스턴스 등 보안 기능들이 어떤것들이 있는지 알아볼 수 있는 기회가 되어 좋았습니다.
4. iptables와 클라우드 방화벽의 이중 구조 (가장 큰 깨달음!):
며칠간의 트러블슈팅을 통해 깨달은 가장 중요한 점은 클라우드 레벨 보안(OCI 보안 목록)과 OS 레벨 보안(iptables)이 별개라는 것입니다. "가장 가까운 곳부터 확인"하는 원칙의 중요성을 뼈저리게 느꼈습니다. 새 인스턴스를 만들기 전에 iptables를 확인했다면 시간을 크게 절약할 수 있었을 것입니다. 이를 통해서 클라우드 환경에서는 제공업체의 방화벽(보안 그룹, 보안 목록등)과 OS의 방화벽(iptables, firewalld 등) 두 가지가 존재함을 깨닫게 되었습니다.
규칙의 순서의 중요성:
특히 iptables는 규칙이 순서대로 적용 되므로, REJECT 규칙보다 먼저 ACCEPT 규칙을 삽입(-I)해야 하는것 또한 알 수 있었습니다. 이 과정들을 통해서 다음에도 이런 문제를 맞닿뜨린다면 어떤 진단 순서로 해결해야 할지 이제 좀 감이 잡힌거 같습니다.
애플리케이션이 올바른 포트로 실행 중인지 확인 (lsof, netstat)
OS 자체 방화벽 확인 (iptables, firewalld)
클라우드 제공업체의 방화벽 확인 (보안 그룹, 보안 목록)
네트워크 라우팅 및 ACL 확인 (라우팅 테이블, NACL)
5. 메모리 관리의 중요성:
1GB RAM 환경에서는 스왑 파일이 필수였습니다. 실제로 스왑 설정 없이 pnpm install을 실행하다 시스템이 멈추는 문제를 직접 겪으며, 1GB RAM이 얼마나 작은지 직접 실감할 수 있었습니다. 그리고 이 과정을 통해서 무엇보다... 돈을 쓰면 시간을 절약할 수 있다라는 것도 실감하게 되었습니다.
해당 링크는 제가 인프라를 구성하면서 OCI 인프라 구성 용어 및 개념 설명들을 정리한 글입니다.
https://www.notion.so/leech0129/OCI-23036c523e22809ea215ecee135d4496?source=copy_linkv=b78695df4784431fbab90654c6521070&p=23036c523e22809ea215ecee135d4496&pm=s
해당 링크는 제가 인스턴스를 구성하면서 직접 설정하고 스크린샷으로 간략하게 남겨둔 기록입니다.
https://www.notion.so/leech0129/OCI-23336c523e2280f19409fefc2a80deb9?source=copy_link
📚 래퍼런스
[Oracle Cloud 공식 문서](https://docs.oracle.com/en-us/iaas/)
[OCI Always Free 가이드](https://www.oracle.com/cloud/free/)
[OCI VCN 설정 가이드](https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/overview.htm)
[OCI 보안 목록 관리](https://docs.oracle.com/en-us/iaas/Content/Network/Concepts/securitylists.htm)
[Ubuntu iptables 가이드](https://ubuntu.com/server/docs/security-firewall)
[Docker 공식 문서](https://docs.docker.com/)
Beta Was this translation helpful? Give feedback.
All reactions