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

Share
웹서버를 개발하는 일은 따분하고 힘들다. 하지만 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

주역 괘는 로르샤흐의 잉크 자국처럼 우리 내면을 끌어낸다 (이미지 : Gemini)

결정이 힘들 때 '주역'을 읽어야 하는 이유: 뇌의 맥락화와 로르샤흐 효과 (2/2)

양자역학과 주역이 만났을 때: 당신의 무의식이 이미 답을 알고 있다 (1/2)주역의 득괘 행위는 단순한 점술일까요? 양자역학의 중첩 및 관측 효과, 그리고 칼 융의 동시성 개념을 통해 내면의 모호한 고민을 명료한 결단으로 바꾸는 무의식의 인지·심리적 메커니즘을 분석합니다.지혜나무숲지혜나무숲 (위 포스팅에서 이어집니다) 우리 뇌는 주역괘를 어떻게 인지할까(맥락화와 무의식의

당신은 주역을 통해 무의식에서 답을 얻을 수 있다 (이미지 : Gemini)

양자역학과 주역이 만났을 때: 당신의 무의식이 이미 답을 알고 있다 (1/2)

우연한 득괘(得卦)가 내면의 혼돈을 명료한 결단으로 바꾸는 인지·심리적 메커니즘 질문이 상징을 만나는 순간 살아가며 중요한 선택의 갈림길에 서거나 해결하기 힘든 고민에 직면했을 때, 사람들은 저마다의 방식으로 답을 찾는다. 누군가는 주변 사람들로부터 조언을 구하고, 누군가는 독서를 통해서 길을 찾기도 한다. 또 누군가는 명상을 하며, 또 누군가는 주역(周易)

주역의 팔괘는 단어, 64괘는 문장으로 세상을 표현할 수 있다. (출처 : 제미나이 생성)

주역 괘로 세상을 표현하는 법(음효·양효부터 SSIM 모델까지 한 번에 정리해보자)

주역의 괘는 단순하게 생겼다. 하나로 이어진 줄(양효, —) 또는 가운데가 끊어진 줄(음효, - -)이 전부다. 이것을 효(爻)라고 부른다. 음효와 양효는 세상의 모든 음과 양을 상징한다. 여자와 남자, 하늘과 땅, 밤과 낮, 여름과 겨울 ... 세상에 존재하는 삼라만상의 모든 것들은 음과 양 2분법적으로 구분해볼 수 있다. 그렇다고 음과 양이 언제나

고대 초원의 서사적 분위기를 담은 석조 전차의 모습. (출처: StockCake)

선과 악의 시작: 인드라 vs 아후라 마즈다, 그리고 주역으로 본 공동체의 분열 (쾌夬)

아리아인의 생존을 위한 대이동과 전사 집단으로의 변화 공동체는 살아있는 생명이다. 그래서 상황의 변화에 따라 둘로 분열되기도 하고, 분열된 두 그룹이 서로 대립 갈등하기도 한다. 기원전 2000년경, 중앙아시아 초원의 유목민이었던 아리아인들이 그랬다. 그들은 원래 초원에서 소와 말을 키우면서 사는 비교적 온순한 사람들이었다. 하지만 척박한 환경과 생존을 위한 인도·이란 대륙으로의 대이동