워드프레스 소스를 git으로 관리하기 - 코어까지 통째로
워드프레스를 Docker 공식 이미지로 쓰면 소스가 컨테이너 안에 숨어 있습니다. 파일을 직접 보거나 고칠 수 없고, 업데이트도 이미지가 알아서 합니다.
편하지만 통제권이 없습니다. 그래서 공식 소스를 직접 받아 git으로 관리하기로 했습니다.
결론부터
github.com/WordPress/WordPress (공식 미러, upstream)
│ git clone --branch <버전태그>
▼
내 저장소 (origin) ──► 서버워드프레스는 GPL 오픈소스이고 공식 git 미러가 있습니다. 거기서 받아 쓰면
업데이트도 git으로 할 수 있습니다.
| 이미지에 맡기기 | git으로 관리 | |
|---|---|---|
| 코어 업데이트 | 자동 | git 으로 직접 |
| 파일 변조 탐지 | 불가 | git status 로 즉시 |
| 코어 수정 | 불가 | 가능 |
| 관리 부담 | 적음 | 보안 패치를 직접 따라가야 |
해킹으로 파일이 심어지면 git status 에 바로 뜹니다. 이게 가장 큰 이점입니다.
1. 공식 소스 받기 — 태그를 지정합니다
git clone --depth 1 --branch 7.1.2 \
https://github.com/WordPress/WordPress.git wp-src
--branch 에 버전 태그를 반드시 지정하세요. 안 하면 기본 브랜치를 받는데, 거기는 개발 중인 alpha 버전입니다.
저는 이걸 놓쳐서 7.2-alpha 를 받았습니다. 버전 파일을 열어보고서야 알았습니다.
grep "wp_version =" wp-includes/version.php
# $wp_version = '7.2-alpha-63948'; ← 이러면 잘못 받은 것
2. 히스토리를 가져갈 것인가
전체 히스토리를 받으면 무겁습니다. 실제로 재보니 이랬습니다.
전체 clone .git 326M + 작업파일 155M
현재 버전만 .git 68M + 작업파일 155M326M이 전부 20년치 커밋 이력입니다. 블로그 운영에는 쓸 일이 없습니다.
히스토리를 버리고 현재 버전만 담으려면 이렇게 합니다.
# 받은 소스에서 .git 을 떼고 새로 시작
rsync -a --exclude=.git 원본/ wp-src/
cd wp-src
git init
git add -A
git commit -m "WordPress 7.1.2 베이스라인"
git remote add upstream https://github.com/WordPress/WordPress.git
upstream 을 걸어두면 나중에 새 버전을 받아올 수 있습니다. 히스토리는 없어도 태그는 가져옵니다.
3. 업데이트 — merge 대신 파일 교체
히스토리가 없으니 git merge 는 쓸 수 없습니다. 대신 새 태그의 파일만 덮어씁니다.
git fetch upstream --tags # 공식에서 새 태그 받기
git checkout 7.1.3 -- . # 파일만 가져오기 (히스토리 병합 아님)
git status --short # ← 뭐가 바뀌었는지 확인
git commit -am "WordPress 7.1.3"
git checkout <태그> -- . 가 핵심입니다. 그 태그 시점의 파일로 작업 트리를 바꾸되, 커밋 이력은 내 것으로 유지합니다.
실제로 7.1.1 → 7.1.2 를 해보니 이렇게 나왔습니다.
3 files changed, 93 insertions(+), 7 deletions(-)
M wp-admin/about.php
M wp-includes/template.php
M wp-includes/version.php마이너 업데이트는 바뀌는 파일이 몇 개 안 됩니다. 뭐가 달라졌는지 전부 볼 수 있습니다.
공식에 없는 파일(내가 만든 테마 등)은
checkout이 건드리지 않습니다.
그래서 내 작업물과 코어 업데이트가 섞이지 않습니다.
4. .gitignore — 서버가 만드는 것은 넣지 않습니다
wp-config.php # DB 접속정보. 서버마다 다르다
.htaccess # 서버 설정
wp-content/uploads/ # 업로드 이미지 → 백업 대상이지 git 대상 아님
wp-content/cache/
wp-content/upgrade/
*.log
wp-config.php 를 커밋하면 DB 비밀번호가 저장소에 들어갑니다. 가장 먼저 제외해야 합니다.
⚠️ 5. 자동 업데이트와 양립하지 않습니다
이 방식을 택하면 코어 자동 업데이트를 포기해야 합니다.
자동 업데이트가 코어 파일을 바꾸면,
git status에 수백 개 변경이 뜹니다- 변조 탐지가 무의미해집니다 — 해킹인지 업데이트인지 구분이 안 됩니다
실제로는 파일 소유권으로 자연히 막힙니다. 웹서버(www-data)가 코어 파일에 쓰기 권한이 없으면 자동 업데이트가 실패합니다.
ls -ld wp-src/wp-includes wp-src/wp-content
# drwxrwxr-x ubuntu:ubuntu wp-includes ← 웹서버가 못 씀 (의도한 것)
# drwxrwxr-x www-data:www-data wp-content ← 플러그인·테마는 가능
대신 보안 패치를 직접 따라가야 합니다. 주기적으로 확인하는 장치가 필요합니다.
# 새 버전 나왔는지 확인
git fetch upstream --tags -q
git tag -l | grep -E '^[0-9]+\.[0-9]+(\.[0-9]+)?$' | sort -V | tail -1
크론에 걸어두면 됩니다.
저는 소스를 직접 손에 쥐고 싶어서 이 길을 택했습니다.
이미지에 맡기면 편하지만, 무엇이 언제 바뀌는지 알 수 없습니다. 오픈소스인데 정작 소스를 볼 수 없는 상태가 이상하게 느껴졌습니다.
대신 보안 패치를 챙기는 일이 제 몫이 됐습니다. 자동으로 올라가던 것을 제가 확인하고 반영해야 합니다. 편의를 하나 내주고 통제를 하나 받은 셈입니다.
정리
- 워드프레스는 공식 git 미러가 있습니다. 거기서 받아 관리할 수 있습니다
--branch <버전태그>를 꼭 지정하세요. 기본 브랜치는 alpha입니다- 히스토리 326M은 버려도 업데이트에 지장이 없습니다
- 업데이트는
git checkout <태그> -- .로 파일만 교체합니다 wp-config.php는 절대 커밋하지 마세요- 자동 업데이트를 포기하는 대신 변조 탐지를 얻습니다. 보안 패치 확인은 직접 챙겨야 합니다