개인 또는 소수 인원이 쓰는 저장소 용도로 GitLab CE 를 컨테이너로 올릴 때의 자원 산정과, 제한된 하드웨어에서 쓸 만하게 만드는 설정을 정리한다. Intel N100 + 16 GB 램의 NAS 에 다른 서비스(Nextcloud · WordPress · Wiki.js · Nginx Proxy Manager)가 이미 돌고 있는 환경을 기준으로 삼는다.
GitLab Omnibus 하나에 Puma(웹) · Sidekiq(백그라운드) · PostgreSQL · Redis · Gitaly 가 모두 들어 있다. 그래서 "GitLab 하나"라고 해도 실제로는 여러 서비스를 띄우는 것과 같다.
| 항목 | 기준 |
|---|---|
| CPU | 4 코어면 저장소 용도로 충분하다. 빌드를 돌리면 곧바로 부족해진다 |
| 메모리 | 유휴 상태에서 3~5 GB. 여유 메모리 6 GB 이상을 확보한 뒤 올린다 |
| 디스크 | SSD 또는 NVMe. 작은 랜덤 I/O 가 많아 HDD 단독으로는 웹 UI 가 눈에 띄게 느리다 |
| CI 러너 | 본체와 분리한다. 같은 호스트에서 이미지 빌드를 돌리면 전체가 멈춘다 |
여유 메모리는 free -h 의 available 값으로 본다. used 는 페이지 캐시를 포함해 크게 보이므로 그 값만 보고 부족하다고 판단하면 안 된다. 예전 형식(free -g 의 -/+ buffers/cache 줄)을 쓰는 오래된 시스템이라면 그 줄의 오른쪽 값이 available 에 해당한다.
용도가 저장소 보관 정도라면 GitLab 대신 Gitea 나 Forgejo 를 쓰는 편이 자원 대비 효율이 훨씬 낫다. 이슈·머지 리퀘스트·CI 까지 한 제품에서 쓸 생각이 아니면 GitLab 의 무게를 감당할 이유가 적다.
공식 Omnibus 이미지를 쓰되 쓰지 않는 구성 요소를 끄고 메모리 상한을 건다.
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: gitlab.example.com
shm_size: '256m'
mem_limit: 6g
ports:
- "8929:8929"
- "2224:22"
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com:8929'
nginx['listen_port'] = 8929
nginx['listen_https'] = false
gitlab_rails['gitlab_shell_ssh_port'] = 2224
gitlab_rails['time_zone'] = 'Asia/Seoul'
registry['enable'] = false
prometheus_monitoring['enable'] = false
puma['worker_processes'] = 2
sidekiq['max_concurrency'] = 10
postgresql['shared_buffers'] = "256MB"
volumes:
- ./config:/etc/gitlab
- ./logs:/var/log/gitlab
- ./data:/var/opt/gitlab
external_url 에 적은 포트와 nginx['listen_port'] 그리고 게시 포트가 서로 맞아야 한다. 앞단에 리버스 프록시를 두면 TLS 종료는 거기서 하고 GitLab 은 HTTP 로 두는 편이 단순하다. 그 경우 프록시가 X-Forwarded-Proto 를 넘겨 주어야 하고, external_url 은 사용자가 보는 주소(https://...)로 적는다.
puma['worker_processes'] = 0 은 단일 모드로 떨어져 오히려 불안정하므로 줄이더라도 1 이나 2 로 둔다. 컨테이너 SSH 포트를 22 가 아닌 값으로 게시했다면 gitlab_shell_ssh_port 를 같이 바꿔야 사용자에게 안내되는 clone 주소가 맞는다.
첫 기동은 재구성 때문에 5~15분 걸린다.
docker compose up -d
docker logs -f gitlab # gitlab Reconfigured! 가 보이면 완료
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
초기 비밀번호 파일은 24시간 뒤 삭제된다. 업그레이드할 때는 마이너 버전을 건너뛰지 말고 한 단계씩 올린다. 건너뛰면 데이터베이스 마이그레이션이 깨진다.