공부/Linux

오라클 클라우드 APP-SERVER 진행 과정

미친사람 2026. 5. 13. 10:52
반응형

오라클 클라우드에 간단한 Docker 구축 후 App 여러개 올려서 사용할 목적으로 구축

그로인해 추후에 내가 보기 위해 진행 과정 작성


오라클 스펙

이미지 Ubuntu 24.04 Minimal aarch64
OCPU / RAM 2 OCPU / 12GB
Boot volume 100GB

 


SSH 접속 후 설정

1. 서버 업데이트

sudo apt update
sudo apt full-upgrade -y
sudo apt autoremove -y

커널이나 중요 패키지가 업데이트 됐다면 재부팅합니다.

sudo reboot

 

2. 기본 패키지 설치

패키지 설명 용도
curl URL을 통해 서버와 데이터를 주고받는 명령줄 도구 API 테스트, 웹 요청
wget 웹 서버에서 파일과 콘텐츠를 다운로드하는 도구 파일 다운로드
git 분산 버전 관리 시스템 소스 코드 다운로드 및 관리
unzip ZIP 압축 해제 도구 압축 파일 해제
vim 터미널 텍스트 에디터 설정 파일 수정
htop 시스템 리소스 모니터링 도구 CPU, 메모리, 프로세스 확인
jq JSON 파싱 및 가공 도구 JSON 데이터 처리
ca-certificates SSL/TLS 인증서 모음 HTTPS 연결
gnupg 공개키 암호화 프로그램 외부 저장소 인증 키 등록
lsb-release 배포판 버전 정보 확인 도구 OS 버전 조회
fail2ban 로그 기반 IP 차단 도구 SSH 무차별 대입 방어
iptables-persistent iptables 규칙 저장 도구 방화벽 규칙 영구 저장
netfilter-persistent Netfilter 규칙 로드 서비스 재부팅 시 방화벽 규칙 자동 로드
sudo apt install -y curl wget git unzip vim htop jq ca-certificates gnupg lsb-release fail2ban iptables-persistent netfilter-persistent

설치 중에 iptables 저장 여부를 물으면:

IPv4 rules 저장: Yes
IPv6 rules 저장: Yes

 

3. 현재 iptables 백업

중요합니다. Oracle 기본 규칙을 날리지 않기 위한 백업입니다.

sudo iptables-save | sudo tee /home/ubuntu/iptables-before-web.rules > /dev/null

현재 규칙 확인

sudo iptables -nL INPUT --line-numbers

보통 Oracle Ubuntu에서는 마지막 쪽에 이런 규칙이 있습니다.

ACCEPT tcp ... dpt:22
REJECT all ...

80/443은 반드시 REJECT보다 위에 들어가야 합니다.

 

4. HTTP/HTTPS 포트 열기

가장 단순하고 안전하게 맨 위에 추가합니다.

sudo iptables -I INPUT 1 -p tcp -m state --state NEW --dport 80 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp -m state --state NEW --dport 443 -j ACCEPT
Oracle 기본 iptables 규칙에는 InstanceServices 체인이 포함될 수 있습니다. 이 체인은 Oracle 내부 서비스 접근과 관련되어 있으므로 삭제하지 않습니다. iptables -F, iptables -X 같은 전체 초기화 명령은 사용하지 않습니다.

 

확인:

sudo iptables -nL INPUT --line-numbers

위쪽에 아래가 보이면 됩니다.

ACCEPT tcp ... dpt:443
ACCEPT tcp ... dpt:80

 

5. 재부팅 후에도 유지되게 저장

sudo netfilter-persistent save
sudo netfilter-persistent reload

저장 확인:

sudo ls -l /etc/iptables/

아래 파일이 있으면 정상입니다.

rules.v4
rules.v6

오라클 클라우드 VCN 보안규칙에도 추가해야합니다.

HTTP
Source CIDR: 0.0.0.0/0
Protocol: TCP
Destination Port: 80

HTTPS
Source CIDR: 0.0.0.0/0
Protocol: TCP
Destination Port: 443

 

6. 시간대 설정

한국 시간으로 맞춥니다.

sudo timedatectl set-timezone Asia/Seoul
timedatectl

 

7. Swap 추가

RAM 12GB면 필수는 아니지만, Docker 빌드나 업데이트 중 여유를 위해 4GB 정도 추천합니다.

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

재부팅 후에도 유지되게 등록합니다.

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h

 

8. SSH 기본 보안 확인

비밀번호 SSH 로그인을 막는 설정을 확인합니다.

sudo grep -E "PasswordAuthentication|PermitRootLogin|PubkeyAuthentication" /etc/ssh/sshd_config

권장값은 이렇습니다.

PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes

수정이 필요하면:

sudo vim /etc/ssh/sshd_config
sudo systemctl reload ssh

 

9. Docker 설치

sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker
sudo usermod -aG docker ubuntu

그다음 SSH를 한 번 끊고 다시 접속하세요. 재접속 후 확인합니다.

docker --version
docker compose version
docker run --rm hello-world
Docker 설치 후 iptables에 DOCKER, DOCKER-USER, DOCKER-FORWARD 같은 체인이 생길 수 있으며 정상입니다.

 

10. 앱 디렉터리 준비

서비스 파일을 한 곳에 모아두는 식으로 진행합니다.

sudo mkdir -p /opt/apps
sudo chown -R ubuntu:ubuntu /opt/apps
mkdir -p /opt/apps/appName

나중에 App들은 /opt/apps/appName/docker-compose.yml 형태로 두면 됩니다.

 

11. 리버스 프록시 선택

둘 중 하나를 고르면 됩니다.

 

간단하게 자동 HTTPS까지 원한다면 Caddy 추천:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy

 

대규모 트래픽으로 운영한다면 Nginx + Certbot:

sudo apt install -y nginx certbot python3-certbot-nginx
sudo systemctl enable --now nginx

처음이면 Caddy가 압도적으로 편합니다, 도메인만 연결되어있다면 HTTPS 인증서를 자동으로 발급/갱신합니다.

저는 Caddy로 진행합니다.

각 App의 Docker 포트는 가능하면 127.0.0.1에만 바인딩하고, 외부 공개는 Caddy/Nginx의 80/443을 통해서만 진행합니다.

예시:
ports:
  - "127.0.0.1:3000:3000"​

 

12. 상태 점검

여기까지 끝나면 아래가 정상이어야 합니다.

hostnamectl
free -h
df -h
sudo iptables -nL --line-numbers
sudo systemctl status netfilter-persistent
systemctl status docker
systemctl status caddy
# 또는
systemctl status nginx

브라우저에서 서버 IP 또는 도메인으로 접속했을 때 Caddy/Nginx 응답이 보이면 네트워크와 방화벽은 대체로 정상입니다.

아직 사이트 설정을 하지 않았다면 404, 기본 페이지 또는 연결 실패가 나올 수 있습니다.

 

반응형