[AI로 웹서버] 02. 로컬 개발 환경을 구축해보자 (2) (Docker와 git 설정/실행)

웹서버를 개발하는 일은 따분하고 힘들다. 하지만 AI가 돕는다면, 즐거운 일이 된다.
웹서버를 개발하는 일은 따분하고 힘들다. 하지만 AI가 돕는다면, 즐거운 일이 된다.

기본 설치가 끝난 로컬 개발 환경이 제대로 작동하는지 본격적으로 점검해볼 시간이다. 물론 젬 대리(Gemini)와 클로 과장(Claude)이 함께할 예정이다.

이전에 준비한 Docker 이미지를 실행해본다.

(먼저 Docker Desktop이 백그라운드에서 실행되어 있는지 확인이 필수다. 그렇지 않으면 당연히 Docker 이미지가 실행안된다. Docker Desktop 실행 여부는 윈도우 우측 아래 상태 창에 고래가 떠 있는지 보면 된다)

Docker Desktop이 백그라운드로 돌고 있지 않을 때, Docker 이미지를 실행하면 ... 에러 난다.
Docker Desktop이 백그라운드로 돌고 있지 않을 때, Docker 이미지를 실행하면 ... 에러 난다.

Docker의 '고래' 로고가 상태창에 떠 있는 지 확인한다
Docker의 '고래' 로고가 상태창에 떠 있는 지 확인한다

어라? Docker 웹 이미지 빌딩하는 과정에서,

mysql.sock에 문제가 있다는 에러가 난다.

젬 대리는 .dockerignore 파일을 생성해서 해결하라고 한다.

젬 대리의 해결책

클로 과장 역시 .dockerignore 파일로 해결하라고 한다.

둘의 설명을 들어보니, 비슷한 듯 하면서도 약간 다르다.

젬 대리는 단순히 mysql_data/만 Docker 이미지에 포함시키지 말라고 하는데, 클로 과장은 그 뿐만 아니라, 모든 .sock 파일, .env 파일, .git/ 관련 등까지 포함시키지 말라고 한다.

이번 건 문제해결에는 젬 대리의 의견도 상관없으나, 비슷한 유형의 문제를 원천 차단하기 위해서는 당연히클로 과장 의견이 더 낫다.

클로 과장의 의견을 따르기로 했다.

(역시 클로가 한 수 위다)

문제 해결 완료!
문제 해결 완료!

깨끗하게 에러는 해결되었다.

그 뿐만 아니라, 비슷한 유형의 에러는 이제 거의 없을 것이다.

이제 Docker 이미지는 모두 빌드가 되었고, 에러없이 시작되었다.

Docker 프로세스 상태는 어떤 지 확인해보았다.

docker compose ps

그런데 어제부터 mysql db가 계속 Restarting이 되고 있다. 처음 이미지 실행 후 40초 정도는 기다려주라고 해서, 그렇게 하는데도 계속 이런 상태다.

해당 컨테이너 로그를 뽑아서, 젬 대리와 클로 과장에게 확인을 지시했다.

docker logs sejongview-db

젬 대리의 진단
젬 대리의 진단
클로 과장의 진단
클로 과장의 진단
클로 과장의 원인 분석은 군더더기 없이 깔끔하다
클로 과장의 원인 분석은 군더더기 없이 깔끔하다

둘 다 진단은 똑같았다.

바로 적용했다.

둘 다 원인분석은 같았지만, 젬 대리의 해법이 좀 더 확실한 거 같아서 젬 대리 안으로 적용했다
둘 다 원인분석은 같았지만, 젬 대리의 해법이 좀 더 확실한 거 같아서 젬 대리 안으로 적용했다

오~ 바로 문제 해결!

그리고 기존의 백업해두었던 DB 백업본(.sql)을 새로 생성한 DB에 올렸다.

docker exec -it sejongview-db bash -c "mysql -u root -p데이터베이스루트비밀번호 sv_db < /tmp/backup.sql"

그리고 브라우저에서 http://localhost 에 접속하면

이제 리모트 서버와 동일하게 로컬에도 구축되었다
이제 리모트 서버와 동일하게 로컬에도 구축되었다

개발중인 서버가 로컬에서도 제대로 돌아가고 있음을 알 수 있다.

이제 Git을 이용해서, 로컬의 파일을 리모트에 적용하는 절차를 테스트해보자. 여기까지 완료된다면, 로컬 개발 환경 구축은 모두 완료되었다고 볼 수 있을 것이다.

먼저 클로 과장에게 Git으로 로컬에서 리모트 서버로 파일을 옮기는 절차에 대해물었다.

클로 과장이 설명해준 'git을 이용한 소스코드 백업 및 리모트 서버 반영'
클로 과장이 설명해준 'git을 이용한 소스코드 백업 및 리모트 서버 반영'

로컬에서 소스코드를 변경했을 때, 기본 설정이 끝나고 나면 다음만 기억하면 될 거 같다.

(명령어 실행 위치는 Dockerfile, .gitignore파일 등이 있는 곳이다.)

# 1. .gitignore 작성 (환경변수, DB 데이터 및 백업, SSL 인증서, __pycache__ 등, .DS_Store나 Thumbs.db 등 git 백업 제외)

cd D:\ ... \sejongview

# 2. git 초기화
git init
git config --global user.email "your@email.com"
git config --global user.name "YourName"

# 3. push 준비
git add .
git commit -m "first commit"

# GitHub에서 새 저장소(repo) 만든 후 연결
git remote add origin https://github.com/YOUR_ID/sejongview.git
git branch -M main
git push -u origin main

로컬 개발 환경에서 git 백업을 최초 실행할 때

# 1. 어떤 파일이 push될 것인지 먼저 확인(좋은 습관!)
git status

# 2. 변경 파일 전체 스테이징
git add .

# 3. 메모 적기
git commit -m "변경 내용 설명"

# 4. 파일 push
git push origin main

로컬에서 git으로 파일을 수시로 올릴 때(push)

리모트 서버에서 git에 있는 소스코드를 가져올 때는 다음만 기억하면 된다.

(명령어 실행 위치는 마찬가지로 Dockerfile, .gitignore 등이 있는 곳이다)

# 1. (중요) 서버에서 인증서 백업 (정기적으로 실행 권장)
tar czf ~/certbot_backup_$(date +%Y%m%d).tar.gz ~/sejongview/certbot/conf/

# 2. 처음이면 clone (sejongview 폴더가 없는 상태에서 실행)
git clone https://github.com/treeinsight/sejongview.git
cd sejongview

# 3. .env 파일 직접 생성 (git에 없으므로)
nano .env

# 4. 로컬 .env 내용 그대로 붙여넣기 후 저장

# 5. 백업된 인증서 복원
tar xzf ~/certbot_backup_YYYYMMDD.tar.gz -C ~/sejongview/

# 6. Docker 이미지 빌드 및 실행
docker compose up -d --build

리모트 서버에서 최초 실행할 때

cd sejongview

# 1. 변경된 파일만 자동으로 업데이트됨
git pull origin main

# 2. 코드 변경이 반영되도록 재빌드
docker compose up -d --build

이후 git에서 리모트 서버로 파일을 수시로 가져올 때(pull)

리모트 서버에서 이를 적용하면 아래와 같이 나온다.

git에서 리모트 서버로 파일을 가져와서, Docker 이미지까지 빌드/실행 완료한 상태
git에서 리모트 서버로 파일을 가져와서, Docker 이미지까지 빌드/실행 완료한 상태

리모트 서버에서 최초로 Docker 이미지를 빌드했으니, MySQL은 비어있을 것이다.

먼저, 로컬에서 만든 DB 백업본으로 리모트 서버 db를 백업하면 ...

# 1. 백업 파일을 컨테이너 안으로 복사
docker cp sv_db_backup.sql sejongview-db:/tmp/sv_db_backup.sql

# 2. 기존 DB 삭제 후 재생성
docker exec -it sejongview-db mysql -u root -pYOURPASSWORD -e "DROP DATABASE sv_db; CREATE DATABASE sv_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

# 3. 백업 파일로 전체 복원
docker exec -it sejongview-db bash -c "mysql -u root -pYOURPASSWORD --default-character-set=utf8mb4 sv_db < /tmp/sv_db_backup.sql"

# 4. 복원 확인
docker exec -it sejongview-db mysql -u root -pYOURPASSWORD sv_db -e "SHOW TABLES;"

아래처럼, https 역시 아무런 문제 없이 연결되는 것을 볼 수 있다.

지금까지 로컬 개발 환경을 구축하는 방법에 대해서 알아보았다.

로컬에서 개발한 소스를 git으로 백업하고, git에서 리모트 서버로 끌어오는 방식으로 변경사항을 리모트 서버에 반영하는 방법도 언급했다.

중요한 점은 서버 구축과 관리는 변수가 많으며, 언제든지 위의 설명이 적용되지 않는 순간이 올 수도 있다는 점이다. 이럴 때는 주저하지 말고, 에러코드를 긁어서 젬 대리나 클로 과장에게 물어보는 것이 문제 해결이 큰 도움이 된다는 것을 느꼈다.


#로컬개발환경 #Docker구축 #Git배포 #MySQL에러해결 #도커컴포즈 #세종뷰 #AI개발협업 #클로드 #제미나이 #웹서비스구축 #Docker #GitWorkflow #WebDevelopment

Read more

가운데는 ... 난가?

[AI로 웹서버] 02. 로컬 개발 환경을 구축해보자 (1) (feat. 젬 대리 & 클로 과장)

본격적인 개발에 앞서 젬에게 몇 가지 서버 일을 시켜봤다 젬이 쓸만한 AI 직원이라는 사실에 정말 기분 좋다. 이제 힘들고 까다로운 일은 젬이 다 할 것이다. 변수명, 데이터 하나에 전체 시스템이 멈추는 일은 이제 없을 것이다. 아니, 멈춘다고 하더라도 내가 밤 샐 필요는 없을 것이다. 이제는 젬이 그걸 대신 분석하고, 대안을

AI 시대에 로봇에게도 개성은 지능이 될 것이다. 하물며 인간은....

인공지능 시대 '개성'의 의미는 - 다양성이 지능의 새로운 척도가 될 때

인공지능(AI)의 발전은 이제 단순한 기술적 진보를 넘어 사회 구조 자체를 재편하고 있다. 언어 생성, 이미지 창작, 의사결정 보조에 이르기까지, AI는 인간 고유의 영역이라 믿었던 곳에 조용히, 그러나 빠르게 침투하고 있다. 불과 몇 년 전까지만 해도 상상 속의 이야기로 여겨졌던 것들이 이제는 일상의 언어로 논의된다. 이러한 시대의 전환점에서 한

언제나 변하지 않는 금이지만 그 가치는 결코 고정 불변이 아니다

절대적 가치는 없다 : 변하는 시대, 금(Gold)을 대하는 바람직한 관점

변하지 않는 것은 없다: 위기 속 흔들리는 금값 “전쟁이 나면 금을 사라.” 이 말은 오랫동안 투자 시장의 불문율처럼 통용되어 왔습니다. 지정학적 긴장이 고조될 때, 주식이나 채권 같은 위험 자산의 가치가 흔들릴 때, 투자자들은 안전을 보장해 줄 자산을 찾기 마련이고, 그 중심에는 늘 '금(Gold)'이 있었습니다. 금은 불변의

'AI직원' 젬에게 웹 서버 구축을 지시했다. (이미지출처 : FREEPIK)

[AI로 웹서버] 01. 3년 전 포기했던 서버 구축, 'AI 직원' 젬(Gemini)에게 맡겼더니 벌어진 일

마약같은 서버의 세계로 다시 들어오고 말았다 오랜만에 사고를 쳤다. 3년전인가.. 업데이트에 업데이트, 코드 수정에 수정에 지쳐서 다시는 손대지 않겠다고 선언하며, 그만둔 웹 서버 구축과 관리. 일하면서 취미로 만지기에는 너무나 기술 발전이 빨랐고, 그것을 따라잡기에 내 시간과 능력은 턱없이 모자랐다. 결국 나는 스스로 한계를 느끼며, 텃밭처럼 키워온 알토란 같은 서버를 내렸다.