배포 실행 파일 수정 DB 덤프 자동실행 추가

This commit is contained in:
root
2026-07-23 17:06:22 +09:00
parent 371ad1063d
commit b5801d149a
7 changed files with 317905 additions and 9 deletions
+8
View File
@@ -0,0 +1,8 @@
APP_ENV=production
APP_PORT=8071
DB_PORT=3307
G5_MYSQL_DB=egbim
G5_MYSQL_USER=egbim
G5_MYSQL_PASSWORD=change-me
MARIADB_ROOT_PASSWORD=change-me
COMPOSE_PROJECT_NAME=egbim
+20 -1
View File
@@ -11,6 +11,10 @@ on:
description: Target directory on server description: Target directory on server
required: true required: true
default: /srv/egbim_homepage default: /srv/egbim_homepage
db_dump_path:
description: SQL dump path inside repository
required: true
default: egbim_DB.sql
jobs: jobs:
deploy: deploy:
@@ -27,13 +31,28 @@ jobs:
chmod 600 ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -p '${{ secrets.DEPLOY_PORT }}' '${{ secrets.DEPLOY_HOST }}' >> ~/.ssh/known_hosts ssh-keyscan -p '${{ secrets.DEPLOY_PORT }}' '${{ secrets.DEPLOY_HOST }}' >> ~/.ssh/known_hosts
- name: Render deployment env
shell: bash
run: |
cat > /tmp/egbim.deploy.env <<EOF
APP_ENV=${{ secrets.APP_ENV }}
APP_PORT=${{ secrets.APP_PORT }}
DB_PORT=${{ secrets.DB_PORT }}
G5_MYSQL_DB=${{ secrets.G5_MYSQL_DB }}
G5_MYSQL_USER=${{ secrets.G5_MYSQL_USER }}
G5_MYSQL_PASSWORD=${{ secrets.G5_MYSQL_PASSWORD }}
MARIADB_ROOT_PASSWORD=${{ secrets.MARIADB_ROOT_PASSWORD }}
COMPOSE_PROJECT_NAME=${{ secrets.COMPOSE_PROJECT_NAME }}
EOF
- name: Upload deployment script - name: Upload deployment script
shell: bash shell: bash
run: | run: |
scp -P '${{ secrets.DEPLOY_PORT }}' -i ~/.ssh/id_ed25519 scripts/deploy_remote.sh '${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:/tmp/egbim_deploy_remote.sh' scp -P '${{ secrets.DEPLOY_PORT }}' -i ~/.ssh/id_ed25519 scripts/deploy_remote.sh '${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:/tmp/egbim_deploy_remote.sh'
scp -P '${{ secrets.DEPLOY_PORT }}' -i ~/.ssh/id_ed25519 /tmp/egbim.deploy.env '${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:/tmp/egbim.deploy.env'
- name: Run deploy - name: Run deploy
shell: bash shell: bash
run: | run: |
ssh -p '${{ secrets.DEPLOY_PORT }}' -i ~/.ssh/id_ed25519 '${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}' \ ssh -p '${{ secrets.DEPLOY_PORT }}' -i ~/.ssh/id_ed25519 '${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}' \
"chmod +x /tmp/egbim_deploy_remote.sh && /tmp/egbim_deploy_remote.sh '${{ inputs.branch }}' '${{ inputs.target_dir }}'" "chmod +x /tmp/egbim_deploy_remote.sh && /tmp/egbim_deploy_remote.sh '${{ inputs.branch }}' '${{ inputs.target_dir }}' /tmp/egbim.deploy.env '${{ inputs.db_dump_path }}'"
-1
View File
@@ -5,7 +5,6 @@
.DS_Store .DS_Store
Thumbs.db Thumbs.db
egbim_DB.sql
egbim/img/ egbim/img/
eng/img/ eng/img/
+81 -5
View File
@@ -7,6 +7,11 @@
- Git 원격: `https://gitea.hmac.kr/b24014/egbim_homepage.git` - Git 원격: `https://gitea.hmac.kr/b24014/egbim_homepage.git`
- 실행 방식: `git push` 후 Gitea Actions 에서 수동 실행 - 실행 방식: `git push` 후 Gitea Actions 에서 수동 실행
로컬 푸시는 두 가지 방식 중 하나를 쓴다.
- `HTTPS`: Gitea 계정 + Personal Access Token 사용
- `SSH`: Gitea 계정에 공개키 등록 후 `git@172.16.10.175:22` 사용
## 1. 로컬 저장소 초기화 ## 1. 로컬 저장소 초기화
```bash ```bash
@@ -29,6 +34,13 @@ origin https://gitea.hmac.kr/b24014/egbim_homepage.git (fetch)
origin https://gitea.hmac.kr/b24014/egbim_homepage.git (push) origin https://gitea.hmac.kr/b24014/egbim_homepage.git (push)
``` ```
SSH 원격으로 바꾸려면:
```bash
cd /home/b24014/egbim
./scripts/setup_gitea_remote.sh ssh
```
## 2. 첫 푸시 ## 2. 첫 푸시
```bash ```bash
@@ -40,6 +52,50 @@ git push -u origin main
HTTPS 인증이 필요하면 Gitea 사용자 계정과 토큰 또는 비밀번호를 사용한다. HTTPS 인증이 필요하면 Gitea 사용자 계정과 토큰 또는 비밀번호를 사용한다.
현재 `remote: Unauthorized` 가 나오면 일반 비밀번호 푸시가 막혀 있거나 토큰이 없는 상태다. 이 경우 아래 둘 중 하나로 해결한다.
### HTTPS로 계속 푸시
1. Gitea 로그인
2. 우상단 프로필 -> `Settings`
3. `Applications`
4. `Generate New Token`
5. repo 쓰기 권한 토큰 생성
6. 다시 `git push -u origin main`
프롬프트가 나오면:
- Username: Gitea 아이디
- Password: 방금 만든 토큰
### SSH로 전환해서 푸시
공개키:
```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJsVztQit66olQovEoLh/MoPC4iF6Drcr5woELWskWx/ b24014@sdi9429
```
1. Gitea 로그인
2. 우상단 프로필 -> `Settings`
3. `SSH / GPG Keys`
4. 위 공개키 등록
5. 아래 명령 실행
```bash
cd /home/b24014/egbim
./scripts/setup_gitea_remote.sh ssh
git push -u origin main
```
SSH 점검:
```bash
ssh -T -i /root/.ssh/id_ed25519 git@172.16.10.175
```
현재 상태에서는 서버가 응답하지만 `Permission denied (publickey)` 이므로, 포트 문제는 아니고 Gitea에 키 등록만 남은 상태다.
## 3. Gitea Actions 수동 배포 ## 3. Gitea Actions 수동 배포
저장소에 추가된 워크플로 이름은 `Manual Deploy` 이다. 저장소에 추가된 워크플로 이름은 `Manual Deploy` 이다.
@@ -50,8 +106,9 @@ Gitea 저장소 화면에서 아래 순서로 실행한다.
2. `Manual Deploy` 선택 2. `Manual Deploy` 선택
3. `Run workflow` 클릭 3. `Run workflow` 클릭
4. `branch``target_dir` 확인 후 실행 4. `branch``target_dir` 확인 후 실행
5. 최초 배포면 `db_dump_path``egbim_DB.sql` 로 유지
워크플로는 서버에 SSH 접속해서 지정 디렉터리에 소스를 동기화하고 `docker compose up -d --build` 를 수행한다. 워크플로는 서버에 SSH 접속해서 지정 디렉터리에 소스를 동기화하고 `docker compose up -d --build` 를 수행한다. 저장소 루트의 SQL 덤프가 있고 `.db_import_done` 마커가 없으면 최초 1회 DB import까지 수행한다.
## 4. Gitea Secrets ## 4. Gitea Secrets
@@ -61,21 +118,34 @@ Gitea 저장소 화면에서 아래 순서로 실행한다.
- `DEPLOY_PORT`: 예) `22` - `DEPLOY_PORT`: 예) `22`
- `DEPLOY_USER`: 서버 SSH 계정 - `DEPLOY_USER`: 서버 SSH 계정
- `DEPLOY_SSH_KEY`: 배포용 개인키 전체 내용 - `DEPLOY_SSH_KEY`: 배포용 개인키 전체 내용
- `APP_ENV`: `production`
- `APP_PORT`: `8071`
- `DB_PORT`: `3307`
- `G5_MYSQL_DB`: 예) `egbim`
- `G5_MYSQL_USER`: 예) `egbim`
- `G5_MYSQL_PASSWORD`: 운영 DB 비밀번호
- `MARIADB_ROOT_PASSWORD`: 운영 MariaDB root 비밀번호
- `COMPOSE_PROJECT_NAME`: 예) `egbim`
필요하면 아래도 변수로 바꿀 수 있다. 이 워크플로는 위 시크릿으로 서버의 `.env` 파일을 생성한 뒤 배포를 수행한다.
필요하면 아래도 수동 실행 입력값으로 바꿀 수 있다.
- `target_dir`: 서버 배포 경로, 기본값 `/srv/egbim_homepage` - `target_dir`: 서버 배포 경로, 기본값 `/srv/egbim_homepage`
- 서버 `.env` 안의 `APP_PORT=8071` - `branch`: 기본값 `main`
- `db_dump_path`: 기본값 `egbim_DB.sql`
## 5. 서버 준비 조건 ## 5. 서버 준비 조건
- 서버에 `git`, `docker`, `docker compose` 가 설치되어 있어야 한다. - 서버에 `git`, `docker`, `docker compose` 가 설치되어 있어야 한다.
- 배포 경로에 쓰기 권한이 있어야 한다. - 배포 경로에 쓰기 권한이 있어야 한다.
- 서비스 포트 `8071` 이 외부에서 접근 가능해야 한다. - 서비스 포트 `8071` 이 외부에서 접근 가능해야 한다.
- 서버 배포 경로의 `.env` 파일에 운영값이 들어 있어야 한다. - 서버 배포용 SSH 키가 허용되어 있어야 한다.
- `egbim/img` 는 CDN 대체 대상이므로 Git 배포 대상에서 제외된다. - `egbim/img` 는 CDN 대체 대상이므로 Git 배포 대상에서 제외된다.
- DB는 `docker compose up -d --build` 시 MariaDB 컨테이너가 처음 올라오면서 `G5_MYSQL_DB`, `G5_MYSQL_USER`, `G5_MYSQL_PASSWORD` 값으로 자동 생성된다.
- 저장소에 포함된 `egbim_DB.sql` 은 최초 배포 시 1회 자동 import 된다.
운영 `.env` 예시: 워크플로가 생성하는 운영 `.env` 예시:
```text ```text
APP_ENV=production APP_ENV=production
@@ -88,6 +158,12 @@ MARIADB_ROOT_PASSWORD=<set-on-server>
COMPOSE_PROJECT_NAME=egbim COMPOSE_PROJECT_NAME=egbim
``` ```
## 5-1. SQL 덤프 포함 주의
- `egbim_DB.sql` 은 이제 배포용 저장소 추적 대상이다.
- 덤프 파일이 바뀌어도 서버에 `.db_import_done` 파일이 있으면 자동 재적재되지 않는다.
- DB를 다시 밀어넣어야 하면 서버에서 `.db_import_done` 을 삭제한 뒤 워크플로를 다시 실행한다.
## 6. 이후 배포 반영 ## 6. 이후 배포 반영
일반 작업: 일반 작업:
+317752
View File
File diff suppressed because one or more lines are too long
+29
View File
@@ -3,6 +3,9 @@ set -euo pipefail
branch="${1:-main}" branch="${1:-main}"
target_dir="${2:-/srv/egbim_homepage}" target_dir="${2:-/srv/egbim_homepage}"
env_file="${3:-}"
db_dump_path="${4:-egbim_DB.sql}"
db_import_marker=".db_import_done"
mkdir -p "$target_dir" mkdir -p "$target_dir"
cd "$target_dir" cd "$target_dir"
@@ -15,4 +18,30 @@ else
git reset --hard "origin/$branch" git reset --hard "origin/$branch"
fi fi
if [[ -n "$env_file" ]]; then
cp "$env_file" .env
fi
if [[ -f .env ]]; then
set -a
# shellcheck disable=SC1091
source .env
set +a
fi
mkdir -p docker/mysql/init
docker compose up -d --build docker compose up -d --build
if [[ -f "$db_dump_path" && ! -f "$db_import_marker" ]]; then
for _ in $(seq 1 30); do
if docker compose exec -T db mariadb-admin ping -h localhost -uroot "-p${MARIADB_ROOT_PASSWORD}" >/dev/null 2>&1; then
break
fi
sleep 2
done
docker compose exec -T db mariadb-admin ping -h localhost -uroot "-p${MARIADB_ROOT_PASSWORD}" >/dev/null 2>&1
docker compose exec -T db mariadb -u"${G5_MYSQL_USER}" "-p${G5_MYSQL_PASSWORD}" "${G5_MYSQL_DB}" < "$db_dump_path"
touch "$db_import_marker"
fi
+13
View File
@@ -2,7 +2,20 @@
set -euo pipefail set -euo pipefail
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
remote_mode="${1:-https}"
case "$remote_mode" in
https)
remote_url="https://gitea.hmac.kr/b24014/egbim_homepage.git" remote_url="https://gitea.hmac.kr/b24014/egbim_homepage.git"
;;
ssh)
remote_url="ssh://git@172.16.10.175:22/b24014/egbim_homepage.git"
;;
*)
echo "Usage: $0 [https|ssh]" >&2
exit 1
;;
esac
cd "$repo_root" cd "$repo_root"