AI로 이 사이트를
어떻게 만들었을까요?
아이디어를 코드로 만들고, GitHub에서 검사한 뒤 AWS 서버에 자동 배포하기까지. 이 그룹웨어를 만든 연결 과정을 처음 보는 사람도 순서대로 따라갈 수 있게 적었습니다.
전체 흐름부터 보기사이트가 돌아가는 길과 코드가 배포되는 길
사이트를 보는 사람의 요청은 도메인 → Nginx → Node.js 앱으로 들어옵니다. 앱은 RDS PostgreSQL에 업무 데이터를 저장하고, 파일은 설정에 따라 로컬 저장소 또는 S3를 사용합니다. 코드를 고칠 때는 GitHub Actions가 검사하고, AWS Systems Manager가 EC2에 배포 명령을 보냅니다.
무엇이 실제 기록인가요? 이 글의 저장소 경로, 파일 이름, 환경변수 이름, 배포 순서는 현재 코드와 운영 문서에서 확인했습니다. AWS의 최초 화면 선택과 새 서버 설치 명령은 같은 구성을 다시 만드는 따라 하기 예시입니다. 과거에 누른 버튼이나 실행한 명령을 확인할 수 없는 부분은 실제로 실행했다고 적지 않았습니다.
준비물과 바꿔 넣을 이름
이 프로젝트는 GitHub 저장소 cel0843/groupWebTest, 서울 AWS 리전 ap-northeast-2, 운영 도메인 ckddms.com을 사용합니다. 그대로 따라 만드는 사람은 자신의 저장소·도메인·AWS 계정 값으로 바꿔야 합니다.
현재 원본 GitHub 저장소는 비공개라 외부인이 코드를 그대로 복제할 수는 없습니다. 먼저 자신의 Node.js 앱 코드를 저장소에 준비한 뒤, 이 글의 서버·CI/CD·AI 연결 절차를 적용하면 같은 방식으로 운영할 수 있습니다.
따라 할 때 바꾸는 표시 YOUR_OWNER, YOUR_REPO, YOUR_DOMAIN, YOUR_ACCOUNT_ID, YOUR_INSTANCE_ID, YOUR_RDS_ENDPOINT는 예시 자리입니다. 실제 값을 공개 글이나 Git 커밋에 올리지 마세요.
서버, 데이터베이스, 파일 보관소 만들기
EC2는 사이트 프로그램이 실행되는 컴퓨터, RDS PostgreSQL은 게시글·사용자·개발 요청을 저장하는 데이터베이스입니다. S3는 첨부파일을 보관할 때 선택할 수 있습니다. 이 사이트의 앱 코드는 Node.js 22, Express, EJS, PostgreSQL로 구성되어 있습니다.
RDS PostgreSQL
AWS 콘솔에서 서울 리전에 PostgreSQL DB를 만들고 데이터베이스 이름을 groupware로 정합니다. DB를 인터넷 전체에 열지 말고, EC2 보안 그룹에서 오는 PostgreSQL 포트 5432만 허용합니다. 연결 주소와 계정은 뒤의 서버 .env에만 적습니다. 비용과 백업 보존 기간을 생성 화면에서 확인합니다.
Amazon Linux 2023 EC2
같은 리전과 VPC에 Amazon Linux 2023 인스턴스를 만듭니다. 사이트 접속용 보안 그룹은 HTTP 80, HTTPS 443을 허용합니다. SSH 22가 필요하면 자신의 IP로 범위를 좁힙니다. 앱의 3000 포트는 Nginx가 서버 안에서 연결하므로 외부에 열 필요가 없습니다.
Systems Manager 연결
EC2에 AmazonSSMManagedInstanceCore 권한이 있는 인스턴스 역할을 붙이고 SSM Agent가 실행되는지 확인합니다. AWS 콘솔의 Systems Manager → 관리형 노드에 이 인스턴스가 보이면 GitHub의 배포 명령을 받을 준비가 된 것입니다.
S3는 파일을 옮길 때 사용
파일 업로드를 S3로 운영하려면 비공개 버킷, 버전 관리, 필요한 uploads/ 경로 권한을 준비합니다. EC2 인스턴스 역할에 필요한 S3 읽기·쓰기 권한을 연결합니다. 기존 파일을 옮기는 절차는 docs/aws-operations.md에 있으며, 일반 코드 배포와 별개로 실행합니다.
EC2와 RDS는 계속 켜 두면 AWS 사용료가 발생합니다. OpenAI에 충전한 10달러와 AWS 요금은 서로 다른 청구 항목입니다.
EC2에 Node.js 앱을 준비하기
AWS 콘솔의 EC2 Instance Connect 또는 Systems Manager Session Manager로 접속한 뒤, 아래 명령을 EC2의 ec2-user 터미널에서 실행합니다. 이 프로젝트의 CI와 서버는 Node.js 22를 기준으로 합니다.
sudo dnf install -y git nginx nodejs22 nodejs22-npm
node --version
npm --version
sudo systemctl enable --now nginx
node --version에 22가 나오지 않으면 설치된 Node 버전의 선택 상태를 확인합니다. 앱은 현재 /home/ec2-user/groupware에 놓여 있습니다. GitHub에서 코드를 가져오는 명령은 다음 장의 읽기 키 등록을 마친 뒤 실행합니다.
운영 설정 파일은 서버에만 둡니다
코드를 받은 뒤 저장소의 .env.example을 복사하고 .env를 수정합니다. DATABASE_URL은 RDS 연결 주소이고 SESSION_SECRET은 로그인 세션을 지키는 긴 임의 문자열입니다. 실제 값은 이 글, GitHub 코드, GitHub Variables에 입력하지 않습니다.
cd /home/ec2-user/groupware
umask 077
cp .env.example .env
nano .env
chmod 600 .env
DATABASE_URL=postgresql://YOUR_DB_USER:YOUR_DB_PASSWORD@YOUR_RDS_ENDPOINT:5432/groupware
NODE_ENV=production
PORT=3000
SESSION_SECRET=YOUR_LONG_RANDOM_SECRET
ALLOW_PUBLIC_REGISTRATION=false
STORAGE_DRIVER=local
이 앱은 시작할 때 필요한 테이블을 준비하고 /health에서 DB 연결까지 확인합니다. 기존 데이터를 지우는 명령은 일반 배포에 포함하지 않습니다.
서버가 재시작해도 앱을 켜 두기
이 사이트의 배포 스크립트는 groupware라는 systemd 서비스를 다시 시작합니다. 새로 만드는 서버라면 아래처럼 서비스를 등록합니다. command -v node 결과가 /usr/bin/node와 다르면 ExecStart 경로를 바꿉니다.
command -v node
sudo nano /etc/systemd/system/groupware.service
[Unit]
Description=GW System groupware
After=network-online.target
[Service]
Type=simple
User=ec2-user
WorkingDirectory=/home/ec2-user/groupware
ExecStart=/usr/bin/node app.js
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
cd /home/ec2-user/groupware
npm ci --omit=dev
sudo systemctl daemon-reload
sudo systemctl enable --now groupware
sudo systemctl status groupware --no-pager
curl http://127.0.0.1:3000/health
EC2가 GitHub 코드를 읽도록 하기
운영 서버는 저장소의 최신 코드를 읽어야 합니다. 실제로 이 프로젝트에서는 EC2에서 SSH 공개 키와 개인 키를 만들고, 공개 키만 GitHub 저장소의 Settings → Deploy keys에 등록했습니다. 읽기 전용으로 두었으므로 서버가 저장소 코드를 수정하지는 못합니다.
mkdir -p ~/.ssh && chmod 700 ~/.ssh
ssh-keygen -t ed25519 -C "groupware-production-deploy" -f ~/.ssh/groupware_deploy -N ""
cat ~/.ssh/groupware_deploy.pub
마지막 명령의 ssh-ed25519로 시작하는 한 줄만 GitHub의 Settings → Deploy keys → Add deploy key에 넣습니다. Allow write access는 선택하지 않습니다. 확장자가 .pub이 아닌 ~/.ssh/groupware_deploy 파일은 서버 밖으로 복사하지 않습니다.
cat > ~/.ssh/config <<'EOF'
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/groupware_deploy
IdentitiesOnly yes
StrictHostKeyChecking accept-new
EOF
chmod 600 ~/.ssh/config
# 처음 설치라면 자신의 저장소 주소로 복제
git clone git@github.com:YOUR_OWNER/YOUR_REPO.git /home/ec2-user/groupware
# 이미 복제한 이 프로젝트에서는 원격 주소를 SSH로 변경
cd /home/ec2-user/groupware
git remote set-url origin git@github.com:cel0843/groupWebTest.git
git fetch origin main
git status --short --branch
git remote get-url origin
실제 진행 기록에서 git fetch origin main이 성공했고 main...origin/main 상태가 확인됐습니다. 이때 서버는 배포용 공개 키로 GitHub 저장소를 읽을 수 있게 되었습니다.
도메인과 HTTPS로 앱을 보여주기
도메인의 DNS에서 YOUR_DOMAIN을 EC2의 고정 공인 주소로 연결합니다. Nginx는 인터넷의 80/443 요청을 받고, 같은 서버의 Node.js 127.0.0.1:3000으로 전달합니다. 이 프로젝트에서는 ckddms.com이 실제 운영 주소입니다.
sudo nano /etc/nginx/conf.d/groupware.conf
server {
listen 80;
server_name YOUR_DOMAIN;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
sudo nginx -t
sudo systemctl reload nginx
sudo dnf install -y certbot python3-certbot-nginx
sudo certbot --nginx -d YOUR_DOMAIN
curl -I https://YOUR_DOMAIN/login
HTTPS 인증서는 자신이 관리하는 도메인으로 발급합니다. 발급 전에 DNS가 EC2를 가리키고 80 포트가 연결되는지 확인합니다. 이 앱은 운영 환경에서 HTTPS 뒤의 프록시를 신뢰하고 로그인 쿠키를 안전하게 설정합니다.
GitHub가 코드를 먼저 검사합니다
CI는 “코드를 합치기 전에 자동으로 점검한다”는 뜻입니다. 이 저장소의 .github/workflows/ci-cd.yml은 main으로 향하는 Pull Request와 main의 변경을 만나면 실행됩니다.
npm ci잠금 파일에 적힌 패키지 버전 그대로 설치합니다.
npm run checkJavaScript 문법과 EJS 화면 템플릿을 검사합니다.
npm test프로젝트의 자동 테스트를 실행합니다.
npm audit --omit=dev --audit-level=high운영 패키지의 높은 수준 보안 문제를 확인합니다.
로컬에서도 같은 검사를 실행할 수 있습니다. GitHub 저장소의 Actions → CI and production deploy에서 각 단계가 성공했는지 확인합니다. main 보호 규칙을 사용할 수 있는 계정이라면 PR과 Test 통과를 병합 조건으로 설정합니다.
git switch -c feat/my-feature
# 코드 수정 후
git add .
git commit -m "feat: add my feature"
git push -u origin feat/my-feature
GitHub에서 이 브랜치의 Pull Request를 만들고 검사 결과를 봅니다. 기능을 사람이 직접 개발할 때는 검토 후 병합하고, 아래의 AI 개발 요청 경로는 현재 워크플로가 자동 검사 뒤 PR을 자동 병합합니다.
GitHub Actions가 AWS EC2에 배포합니다
CD는 검사를 통과해 main에 들어온 코드를 운영 서버에 반영하는 단계입니다. GitHub는 고정 AWS Access Key를 저장하지 않고 OIDC로 AWS에서 잠깐 유효한 권한을 받습니다. AWS IAM의 신뢰 정책은 어떤 저장소와 브랜치가 이 역할을 맡을지 정합니다.
AWS IAM에 OIDC 공급자 만들기
IAM → 자격 증명 공급자에서 주소 https://token.actions.githubusercontent.com, Audience sts.amazonaws.com을 등록합니다.
GitHub 배포 역할 만들기
웹 자격 증명이 맡을 역할의 신뢰 조건을 main 브랜치로 제한합니다. 다음 JSON의 YOUR_* 자리만 각자의 값으로 바꿉니다.
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::YOUR_ACCOUNT_ID:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:YOUR_OWNER/YOUR_REPO:ref:refs/heads/main"
}
}
}]
}
GitHub 저장소의 생성 시점 또는 설정에 따라 sub에 owner/repository ID가 들어가는 형식이 쓰일 수 있습니다. IAM 신뢰 정책을 저장하기 전에 GitHub의 OIDC subject 문서에서 자신의 저장소 형식을 확인하세요.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "ssm:SendCommand",
"Resource": [
"arn:aws:ec2:ap-northeast-2:YOUR_ACCOUNT_ID:instance/YOUR_INSTANCE_ID",
"arn:aws:ssm:ap-northeast-2::document/AWS-RunShellScript"
]
},
{
"Effect": "Allow",
"Action": "ssm:GetCommandInvocation",
"Resource": "*"
}
]
}
GitHub Variables 입력하기
저장소 Settings → Secrets and variables → Actions → Variables에서 아래 이름으로 세 개를 추가합니다. 값은 AWS 콘솔에서 확인합니다.
| 이름 | 넣을 값 | 쓰는 곳 |
|---|---|---|
AWS_REGION | 예: ap-northeast-2 | AWS 요청을 보낼 리전 |
EC2_INSTANCE_ID | 자신의 EC2 인스턴스 ID | 배포할 서버 지정 |
AWS_DEPLOY_ROLE_ARN | 방금 만든 IAM 역할 ARN | OIDC로 단기 권한 받기 |
워크플로가 서버에 명령 보내기
main이 갱신되면 GitHub Actions의 Deploy to EC2 작업이 AWS 역할을 맡고 ssm:SendCommand로 EC2에 명령을 보냅니다. 명령은 서버에서 git fetch를 하고, 검사된 커밋의 scripts/deploy.sh를 실행합니다. SSM 명령의 완료 상태와 출력을 Actions에서 확인합니다.
git checkout -B main TARGET_COMMIT_SHA
npm ci --omit=dev
npm run check
npm test
sudo systemctl restart groupware
curl http://127.0.0.1:3000/health
스크립트는 Git 커밋 SHA가 올바른지와 서버의 추적 파일에 직접 수정한 내용이 없는지 먼저 검사합니다. /health는 앱과 DB가 정상인지 확인합니다. 이 확인이 실패하면 스크립트가 직전 커밋으로 코드와 패키지를 되돌리고 서비스를 다시 시작합니다. DB와 업로드 파일을 삭제하지 않습니다.
SSM 명령 권한은 강합니다. 허용한 서버와 문서를 좁히고, 역할을 맡을 수 있는 GitHub 저장소·브랜치를 정확히 제한하세요. 위 권한 JSON은 이 프로젝트의 배포 구조를 설명하기 위한 예시입니다.
10달러로 AI 기능을 시험하고 서버에 키 연결하기
이 프로젝트에서는 사용자가 OpenAI Platform에 10달러 크레딧을 충전한 뒤 API 키를 발급했습니다. 화면에서 자동 충전은 꺼진 상태를 확인했습니다. 충전액은 이 사이트를 만들기 위해 실제로 선택한 금액이지, 다른 사람의 필수 결제액은 아닙니다. OpenAI API 청구와 AWS 서버 청구는 별개입니다.
크레딧 충전
OpenAI Platform → Billing에서 결제 수단, 충전할 금액, 자동 충전 여부를 확인합니다. 이 프로젝트에서는 10달러로 시험했습니다. 잔액이 얼마인지, 실제 사용량이 얼마인지 Billing과 Usage에서 다시 확인합니다.
프로젝트 API 키 만들기
API keys에서 이 사이트용 키를 만듭니다. 키의 이름, 만료일, 권한을 선택하고 생성 화면에서 표시되는 값을 안전하게 보관합니다. 이 글에는 실제 키를 적지 않습니다. 사용자가 브라우저에서 OpenAI에 직접 접속하는 구조가 아니라 운영 서버가 API를 호출합니다.
EC2 설정 파일에 연결
EC2의 /home/ec2-user/groupware/.env에 아래 이름을 설정합니다. OPENAI_API_KEY 값은 자신이 발급받은 키이고, 모델은 현재 코드의 기본값인 gpt-5-mini입니다. 키 원문은 채팅, GitHub 코드, 화면 캡처에 넣지 않습니다.
OPENAI_API_KEY=YOUR_OPENAI_KEY
OPENAI_MODEL=gpt-5-mini
OPENAI_CODING_MODEL=gpt-5-mini
cd /home/ec2-user/groupware
chmod 600 .env
node -e "require('dotenv').config(); console.log(process.env.OPENAI_API_KEY ? 'configured' : 'missing')"
sudo systemctl restart groupware
sudo systemctl status groupware --no-pager
configured는 서버가 환경변수를 읽었다는 뜻입니다. 실제 API 호출은 관리자 계정으로 그룹웨어의 개발 요청을 열고 AI 요구사항 분석을 실행해 확인합니다. 이때 키가 유효하고 계정에 사용 가능한 한도가 있어야 분석 결과가 나옵니다. 이 사이트의 코드는 공식 Node.js SDK의 responses.create()를 사용합니다.
돈을 확인하는 두 곳 OpenAI의 크레딧 잔액과 사용량 한도는 서로 다른 설정입니다. 자동 충전을 끄더라도 사용량 반영에 시간이 걸릴 수 있으니 잔액만 절대적인 즉시 차단 장치로 생각하지 말고 사용량 화면과 한도도 확인합니다. 키 만료일이 오면 새 키로 바꾼 뒤 앱을 재시작합니다.
요청 한 줄이 코드·Pull Request·배포로 이어지는 법
OpenAI 키를 연결하면 먼저 요구사항 분석을 할 수 있습니다. 자동 코드 개발까지 하려면 서버가 GitHub Actions를 시작할 권한과, GitHub Actions가 서버의 자동화 API를 부를 공유 토큰도 필요합니다.
| 이름 | 어디에 저장하나요? | 하는 일 |
|---|---|---|
OPENAI_API_KEY | EC2 .env | 서버가 OpenAI 분석·코드 생성 API를 호출 |
GITHUB_REPOSITORY | EC2 .env | Actions를 시작할 소유자/저장소 지정 |
GITHUB_ACTIONS_TOKEN | EC2 .env | 서버가 GitHub 워크플로를 시작하는 권한 |
AI_AUTOMATION_TOKEN | EC2 .env와 GitHub Actions Secret | 서버와 Actions가 서로의 자동화 요청을 확인 |
GitHub 계정의 Settings → Developer settings → Personal access tokens에서 이 저장소에 제한된 fine-grained 토큰을 만들고 Actions 워크플로 실행 권한을 부여해 서버의 GITHUB_ACTIONS_TOKEN으로 저장합니다. 이 프로젝트에서도 초기에 쓰던 불필요한 복제용 PAT는 폐기하고, 서버 코드 읽기는 앞 장의 Deploy key로 바꿨습니다.
GitHub 저장소의 Settings → Secrets and variables → Actions → Secrets에는 AI_AUTOMATION_TOKEN을 넣습니다. EC2의 같은 이름 환경변수와 동일한 값이어야 합니다. 값은 비밀번호 관리자에서 만들거나 아래 명령으로 새 임의 문자열을 만든 뒤 안전하게 보관합니다.
openssl rand -hex 32
GitHub 저장소의 Settings → Actions → General에서는 워크플로가 필요한 쓰기 권한과 Pull Request 생성 권한을 사용할 수 있게 설정합니다. .github/workflows/ai-development.yml에는 actions: write, contents: write, pull-requests: write가 선언되어 있습니다.
요청과 분석
직원이 그룹웨어의 AI 개발 요청에 원하는 기능을 적습니다. 관리자가 AI 요구사항 분석을 누르면 서버가 OpenAI API로 범위·완료 조건·위험·검사 계획을 만들어 DB에 저장합니다. 이때는 코드를 아직 수정하지 않습니다.
관리자의 개발 승인
관리자가 분석 결과를 확인하고 상태를 개발 승인으로 저장하면, 서버가 GitHub API로 AI development worker 워크플로를 실행합니다. 그 작업은 운영 서버의 자동화 API에서 승인된 요청을 가져옵니다.
AI 코드 생성과 격리된 검사
운영 앱이 OpenAI API로 변경할 파일 내용을 만들고 임시로 DB에 보관합니다. GitHub Actions 러너가 결과를 가져와 허용된 경로에만 씁니다. .env, 패키지 파일, 배포 워크플로 등은 생성 대상에서 제외합니다. 러너가 코드 검사·테스트·운영 패키지 감사를 실행합니다.
브랜치, PR, 자동 병합
검사가 통과하면 ai/request-... 브랜치에 변경을 저장하고 Pull Request를 만듭니다. 현재 운영 워크플로는 PR을 자동으로 병합합니다. 이전 문서나 화면에서 사람이 직접 Merge를 눌렀던 설명은 자동 병합을 추가하기 전 과정입니다.
배포 워크플로 별도 시작
AI 워크플로가 gh workflow run ci-cd.yml --ref main -f request_id=...로 배포 작업을 시작합니다. GitHub Actions가 만든 토큰으로 병합한 커밋은 일반 push 워크플로가 자동 실행되지 않을 수 있어 이 별도의 workflow_dispatch가 중요합니다.
배포 성공 알림
CI와 EC2 배포, /health 검사가 통과하면 배포 워크플로가 서버의 /api/development-automation/report에 성공을 알립니다. 그때 요청 상태가 완료로 바뀌고 알림이 생성됩니다. 중간에 실패하면 실패 단계와 Actions 실행 링크가 요청 화면에 남습니다.
이 구조에서 OpenAI API 키는 운영 서버가 읽습니다. GitHub Actions 러너는 AI_AUTOMATION_TOKEN으로 서버와 통신하며, AWS 배포 권한은 CI/CD의 OIDC 역할이 잠시 맡습니다. 서로 다른 세 권한을 같은 키로 취급하지 않습니다.
기능 하나를 바꿀 때 무엇을 누르고 볼까요?
사람이 직접 코드를 수정할 때
- 새 Git 브랜치에서 코드를 고칩니다.
- 커밋과 Pull Request를 만듭니다.
- Test 자동 검사가 통과했는지 봅니다.
- PR을 병합합니다.
- Deploy to EC2가 성공했는지 확인합니다.
- 사이트에서 바뀐 기능을 직접 눌러 봅니다.
AI 개발 요청 기능을 사용할 때
- 그룹웨어에서 요청과 완료 조건을 적습니다.
- 관리자가 AI 분석 결과를 검토합니다.
- 개발 승인 → 상태 저장을 누릅니다.
- 진행 화면에서 코드 생성·검사·PR·배포를 봅니다.
- 완료와 배포 성공 알림을 확인합니다.
- 사이트에서 새 기능을 직접 눌러 봅니다.
AI가 만든 코드도 항상 원하는 동작을 보장하지 않습니다. 사이트에서 실제로 확인하고, 결과가 요구사항과 다르면 새 요청이나 수정 요청으로 보완합니다.
어디가 멈췄는지 순서대로 찾기
| 보이는 문제 | 먼저 확인할 곳 | 다음 행동 |
|---|---|---|
| 주소가 열리지 않음 | DNS, EC2, Nginx, 80/443 보안 그룹 | sudo nginx -t와 sudo systemctl status nginx 확인 |
| 502 Bad Gateway | Node 앱 서비스와 3000번 포트 | sudo systemctl status groupware, curl http://127.0.0.1:3000/health 확인 |
| 로그인 또는 데이터 조회 실패 | RDS 연결과 앱 로그 | sudo journalctl -u groupware -n 100 --no-pager 확인 |
git fetch 실패 | Deploy key와 SSH 원격 주소 | git remote get-url origin, GitHub Deploy keys 등록 확인 |
| PR의 Test 실패 | GitHub Actions의 첫 실패 단계 | 코드 검사·테스트·감사 로그를 읽고 브랜치 수정 |
| AI 분석 실패 | 서버 OpenAI 키, API 사용량, 앱 로그 | 키 설정과 잔액·한도 확인 후 다시 분석 |
| PR은 병합됐는데 배포 시작 실패 | AI development worker의 배포 시작 단계 | Actions 쓰기 권한과 ci-cd.yml의 workflow_dispatch 확인 |
| 개발 중에서 멈춤 | AI 작업과 CI/CD 작업의 실행 결과 | 요청 상세의 Actions 링크로 실패 단계를 확인 |
| EC2 배포 실패 | SSM 명령 출력·서버 상태·/health | 역할 권한, 서버 Git 상태, 서비스 로그를 순서대로 확인 |
오류 화면이나 로그를 공유하기 전에 API 키, DB 암호, 세션 비밀값이 들어 있지 않은지 확인합니다. 값이 공개됐다면 키를 폐기하고 새로 발급합니다.
같은 사이트를 만들었다면 여기까지 보여야 합니다
- EC2에서
systemctl status groupware가 실행 중으로 나옵니다. -
https://YOUR_DOMAIN/health가{"status":"ok"}를 반환합니다. - Pull Request의 GitHub Actions Test가 통과합니다.
-
main병합 뒤 Deploy to EC2가 통과합니다. - AI 분석 결과가 나오고, 승인한 요청의 진행 단계가 업데이트됩니다.
- 배포 완료 후 사이트 화면에서 새 기능이 실제로 동작합니다.
어려운 말 한 번 더
- 브랜치
- 운영 코드를 건드리지 않고 따로 작업하는 코드 갈래
- Pull Request
- 내 변경을 본 코드에 합치자고 요청하는 화면
- CI
- 코드를 합치기 전에 자동으로 검사하는 일
- CD
- 검사를 통과한 코드를 운영 서버에 올리는 일
- OIDC
- GitHub가 AWS에 자신을 증명해 잠깐 권한을 받는 방법
- SSM
- AWS가 EC2에 원격으로 명령을 보내는 통로
- API 키
- 서버가 OpenAI API를 쓸 때 제시하는 비밀 자격 증명