CentOS 7에 Gogs로 자체 Git 서버 설치 및 구성

중요: 이 문서는 루트 권한과 CentOS 7 환경을 전제로 합니다. 프로덕션 환경에서는 추가적인 보안 및 백업 정책을 적용하세요.
주요 대상 및 관련 검색어
- 주요 의도: Gogs 설치 및 구성
- 관련 변형: CentOS 7 Gogs 설치, Gogs PostgreSQL 구성, Gogs Nginx 리버스 프록시, 자체 호스팅 Git 서버, Go 기반 Git 서비스
목차
- 준비사항
- 1단계: EPEL 저장소 설치
- 2단계: PostgreSQL 설치 및 구성
- 3단계: Go와 Git 설치 및 환경 구성
- 4단계: Gogs 소스 다운로드 및 빌드
- 5단계: Gogs 설정(custom/conf/app.ini) 구성
- 6단계: systemd로 Gogs 서비스 등록 및 실행
- 7단계: Nginx를 리버스 프록시로 설정
- 8단계: 설치 검증 및 초기 관리자 계정 생성
- 문제 발생 시 점검 항목
- 대안과 확장 옵션
- 보안 강화 권장 사항
- 역할별 체크리스트
- 간단한 용어집
- 테스트 및 수용 기준
- 요약
준비사항
- CentOS 7 서버(최소 사양 권장: 1 CPU, 1GB RAM 이상) — 실제 트래픽에 따라 확장 필요
- 루트 권한 또는 sudo 사용 가능한 계정
- 방화벽(iptables/firewalld)을 사용하는 경우 포트 80 또는 리버스 프록시 포트가 열려 있어야 함
중요: 실제 서비스 도메인을 사용하는 경우 DNS가 올바르게 설정되어 있어야 합니다.
1단계 - EPEL 저장소 설치
EPEL(Extra Packages for Enterprise Linux)은 CentOS에서 널리 쓰이는 추가 패키지 저장소입니다. 먼저 EPEL을 설치합니다.
sudo yum -y install epel-release
성공하면 EPEL 저장소가 시스템에 추가됩니다.
2단계 - PostgreSQL 설치 및 구성
Gogs는 여러 DB(MariaDB/MySQL, PostgreSQL, SQLite 등)를 지원합니다. 이 가이드에서는 PostgreSQL을 사용합니다.
PostgreSQL 설치:
sudo yum -y install postgresql-server postgresql-contrib
데이터베이스 초기화:
sudo postgresql-setup initdb
PostgreSQL을 로컬 바인딩(127.0.0.1)으로 설정하고 md5 인증을 사용하도록 구성합니다.
Postgres 사용자로 전환:
su - postgres
데이터 디렉터리로 이동하여 설정 편집:
cd data/
vim postgresql.conf
listen_addresses를 찾아 아래처럼 주석 해제하고 값 변경:
listen_addresses = '127.0.0.1'
저장 후 pg_hba.conf 편집:
vim pg_hba.conf
로컬 접속 라인(127.0.0.1/32)을 md5로 설정:
host all all 127.0.0.1/32 md5
서비스 시작 및 부팅 시 자동 시작 활성화:
sudo systemctl start postgresql
sudo systemctl enable postgresql
PostgreSQL이 127.0.0.1:5432로 실행 중인지 netstat로 확인:
netstat -plntu
데이터베이스 및 사용자 생성:
su - postgres
psql
psql에서 git 사용자 생성(데이터베이스 생성 권한 포함) 및 비밀번호 설정:
CREATE USER git CREATEDB;
\password git
Gogs용 데이터베이스 생성 및 소유자 지정:
CREATE DATABASE gogs_production OWNER git;
exit
참고: 운영 환경에서는 강력한 비밀번호 정책과 네트워크 접근 제어를 적용하세요.
3단계 - Go 및 Git 설치
기본 Git 설치:
sudo yum -y install git
‘gog’ 서비스를 실행할 전용 사용자 ‘git’ 생성:
useradd -m -s /bin/bash git
passwd git
git 사용자로 전환하여 로컬 디렉터리 생성:
su - git
mkdir -p /home/git/local
로컬 디렉터리로 이동해 Go 바이너리 다운로드(예시는 go1.9.2) — 최신 버전으로 교체 권장:
cd ~/local
wget https://dl.google.com/go/go1.9.2.linux-amd64.tar.gz
압축 해제 및 아카이브 삭제:
tar -xf go1.9.2.linux-amd64.tar.gz
rm -f go1.9.2.linux-amd64.tar.gz
환경 변수 설정(GOROOT, GOPATH, PATH):
cd ~/
echo 'export GOROOT=$HOME/local/go' >> $HOME/.bashrc
echo 'export GOPATH=$HOME/go' >> $HOME/.bashrc
echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> $HOME/.bashrc
쉘 환경 재로딩:
source ~/.bashrc
bash가 기본 쉘인지 확인하고 go 버전 확인:
go version
참고: Go 버전은 프로젝트 요구사항에 따라 달라질 수 있습니다. Gogs 안정 브랜치 및 권장 버전을 확인하세요.
4단계 - Gogs 설치(소스 다운로드 및 빌드)
git 사용자로 Gogs 소스 다운로드:
su - git
go get -u github.com/gogits/gogs
소스는 $GOPATH/src/github.com/gogits/gogs에 위치합니다. 빌드:
cd $GOPATH/src/github.com/gogits/gogs
go build
에러 없이 빌드되면 Gogs 실행:
./gogs web
기본적으로 포트 3000에서 모든 인터페이스(공개 IP)로 바인딩되어 실행됩니다.
브라우저에서 http://서버IP:3000 로 접속하면 초기 화면이 표시됩니다.
터미널로 돌아가서 Ctrl+C로 서버를 중지합니다.
중요: 직접 실행 모드는 디버깅에 유용하지만, 프로덕션에서는 systemd 서비스로 실행하십시오.
5단계 - Gogs 구성(custom/conf/app.ini) 편집
Gogs 설치 디렉터리에서 사용자 정의 구성 디렉터리 생성:
cd $GOPATH/src/github.com/gogits/gogs
mkdir -p custom/conf/
기본 conf를 복사하고 수정:
cp conf/app.ini custom/conf/app.ini
vim custom/conf/app.ini
[server] 섹션에서 Gogs를 로컬 바인딩으로 제한:
[server]
PROTOCOL = http
DOMAIN = localhost
ROOT_URL = %(PROTOCOL)s://%(DOMAIN)s:%(HTTP_PORT)s/
HTTP_ADDR = 127.0.0.1
HTTP_PORT = 3000
[database] 섹션에서 PostgreSQL 정보 입력(예시):
[database]
DB_TYPE = postgres
HOST = 127.0.0.1:5432
NAME = gogs_production
USER = git
PASSWD = aqwe123@
비밀번호는 예시이므로 안전한 값으로 변경하세요.
구성 확인을 위해 다시 Gogs 실행:
./gogs web
Gogs가 127.0.0.1:3000에서 실행되어야 합니다.
6단계 - Gogs를 systemd 서비스로 실행
/etc/systemd/system에 gogs.service 파일 생성:
cd /etc/systemd/system
vim gogs.service
다음 내용을 붙여넣기(경로는 실제 Gogs 설치 경로에 맞게 수정):
[Unit]
Description=Gogs
After=syslog.target
After=network.target
After=mariadb.service mysqld.service postgresql.service memcached.service redis.service
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
Type=simple
User=git
Group=git
WorkingDirectory=/home/git/go/src/github.com/gogits/gogs
ExecStart=/home/git/go/src/github.com/gogits/gogs/gogs web
Restart=always
Environment=USER=git HOME=/home/git
[Install]
WantedBy=multi-user.target
저장 후 systemd 리로드 및 서비스 시작/활성화:
systemctl daemon-reload
systemctl start gogs
systemctl enable gogs
서비스 상태 및 포트 확인:
netstat -plntu
systemctl status gogs
중요: WorkingDirectory 및 ExecStart 경로가 실제 빌드 결과와 일치하는지 확인하세요.
7단계 - Nginx를 Gogs 리버스 프록시로 설정
EPEL에서 Nginx 설치:
yum -y install nginx
/etc/nginx/conf.d에 가상 호스트 파일 생성:
cd /etc/nginx/
vim conf.d/gogs.conf
예시 서버 블록(도메인 부분은 실제 도메인으로 변경):
server {
listen 80;
server_name git.hakase-labs.co;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
구성 문법 검사:
nginx -t
Nginx 재시작 및 부팅시 활성화:
systemctl restart nginx
systemctl enable nginx
포트 80이 열려 있는지 확인:
netstat -plntu
참고: 실제 서비스에서는 HTTPS(포트 443)를 사용해야 하며, Let’s Encrypt와 같은 CA를 통한 자동 갱신을 권장합니다.
8단계 - 설치 테스트 및 초기 관리자 계정 생성
브라우저에서 Gogs 도메인 또는 IP로 접속:
웹 설치 화면에서 PostgreSQL 연결 정보를 입력합니다(앞서 custom/conf에 입력한 값과 일치해야 함).
페이지 하단의 Admin account settings에서 관리자 계정(아이디, 비밀번호, 이메일) 입력:
Install Gogs 버튼 클릭 후 대시보드로 리디렉션되면 설치 성공입니다.
설치가 성공적으로 완료되었습니다. 이제 리포지터리 생성, SSH 키 등록, 조직(Organization) 설정 등을 진행할 수 있습니다.
문제 발생 시 점검 항목
- 서비스가 바인딩되지 않음: custom/conf/app.ini의 HTTP_ADDR와 HTTP_PORT 확인
- DB 연결 실패: pg_hba.conf의 인증 설정과 PostgreSQL이 로컬에서 청취 중인지 확인
- 포트 충돌: netstat -plntu로 포트 사용 상태 확인
- systemd 서비스 시작 실패: journalctl -u gogs –no-pager를 통해 로그 확인
- Nginx 프록시 오류(502): Gogs가 로컬에서 정상 실행되는지, proxy_pass URL을 확인
중요: 로그는 문제 원인 파악에 핵심입니다. Gogs 로그와 systemd, nginx 로그를 함께 확인하세요.
언제 이 방법이 적합하지 않은가(예외 사례)
- 소규모 테스트 환경에서 단순히 Git 호스팅만 필요하고 GUI는 필요하지 않다면, 단순 bare-repo + SSH 방식이 더 가볍습니다.
- 높은 가용성과 자동 확장(클러스터링)이 필요한 대규모 프로덕션 환경에는 Gogs 단독 설치보다 GitLab, Gitea(클러스터 지원), 또는 관리형 Git 서비스가 적합할 수 있습니다.
- 데이터 규정 준수 또는 감사 로그가 엄격해야 하는 환경에서는 추가 로깅·백업·모니터링 인프라가 필요합니다.
대안 및 확장 옵션
- 데이터베이스: MySQL/MariaDB 또는 SQLite 사용 가능(소규모 테스트용). PostgreSQL은 안정성과 기능 측면에서 권장.
- 인증: LDAP/SSO 연동 지원(설정은 Gogs의 공식 문서 참조).
- HTTPS: Nginx에서 Let’s Encrypt(ACME)를 사용하여 자동 HTTPS 구성 권장.
- 배포 방식: 바이너리 릴리스 사용 또는 도커 이미지를 이용한 컨테이너 배포(컨테이너 환경에서는 볼륨/데이터관리에 유의).
간단한 비교(선택 가이드):
- 간단 설치, 경량: Gogs
- 활발한 개발/기능: Gitea (Gogs 포크)
- 고급 기능(이슈, CI, 대기업 기능): GitLab
보안 강화 권장 사항
- TLS 적용: Nginx에서 HTTPS 설정(포트 443) 및 HTTP -> HTTPS 리디렉션
- 데이터베이스 접근 제한: PostgreSQL을 로컬 바인딩으로 유지하고 방화벽으로 외부 접근 차단
- 비밀번호 정책: 관리자 및 사용자의 강력한 비밀번호 요구
- SSH 접근: SSH 포트 변경, 공개키 기반 인증 강제, fail2ban 적용
- 백업 정책: 정기적인 DB dump 및 Git 리포지터리 백업
- 모니터링: 서비스 가용성 및 로그 모니터링(예: Prometheus + Grafana 또는 로그 수집 시스템)
중요: 프로덕션 환경에서는 보안 감사와 침해사고 대응 계획(IR playbook)을 마련하세요.
역할별 체크리스트
시스템 관리자
- CentOS 업데이트 및 EPEL 설치
- PostgreSQL 초기화 및 백업 설정
- 방화벽/SELinux 정책 확인
- systemd 서비스 등록 및 모니터링 설정
개발/팀 관리자
- 관리자 계정 생성 및 조직 설정
- 사용자 초대 및 권한 정책 설계
- 템플릿 리포지터리 생성
보안 담당자
- TLS 인증서 관리
- 비밀번호/SSH 정책 적용
- 로그·감사 설정 및 주기적 검토
간단한 용어집(한 줄)
- Gogs: Go로 작성된 경량 자체 호스팅 Git 서비스
- GOPATH/GOROOT: Go 작업공간 및 설치 경로
- systemd: Linux의 서비스 및 데몬 관리자
- Nginx: 리버스 프록시 및 웹 서버
- PostgreSQL: 관계형 데이터베이스 시스템
테스트 및 수용 기준
- 서비스가 부팅 시 자동으로 시작되는가? (systemctl enable/시작 확인)
- 웹 UI가 HTTPS(권장) 또는 HTTP에서 정상 로드되는가?
- 관리자 계정으로 로그인하고 리포지터리 생성, 푸시·풀 동작이 정상인가?
- 백업 복구 시나리오(데이터베이스 덤프 복원 및 리포지터리 복원)가 문서화되어 있는가?
간단한 수용 테스트 목록(테스트 케이스):
- 웹 UI 접속 및 로그인: 성공
- 신규 리포지터리 생성 후 로컬에서 git push: 성공
- SSH 키 등록 후 SSH push: 성공
- 시스템 재부팅 후 Gogs 서비스 자동 시작: 성공
마이그레이션 및 버전 주의사항
- Gogs 버전 업그레이드 전에는 DB 및 리포지터리 백업을 반드시 수행하세요.
- Go 버전이나 Gogs 소스 구조 변경으로 인해 빌드/경로가 변경될 수 있습니다. 빌드 경로(WorkingDirectory, ExecStart)를 재검토하세요.
- 컨테이너로 마이그레이션 시 데이터(디렉터리, DB) 볼륨 마운트 전략을 계획하세요.
SOP(간단한 운영 절차)
장애 발생 시
- systemctl status gogs 확인
- journalctl -u gogs –since “10 minutes ago”로 최근 로그 확인
- nginx 로그(/var/log/nginx) 및 PostgreSQL 로그 확인
- 복구 불가 시 DB/리포지터리 백업에서 복구
보안 사고 발생 시
- 관리자 계정 비활성화 및 비밀번호 초기화
- 관련 시스템 격리
- 로그 수집 및 사고 범위 판별
요약
이 가이드는 CentOS 7에 Gogs를 설치하고 PostgreSQL과 Nginx로 구성하는 전체 과정을 다룹니다. 주요 단계는 EPEL 설치, PostgreSQL 초기화 및 사용자/DB 생성, Go 및 Git 설치, Gogs 빌드, custom/conf 설정, systemd 서비스 등록, Nginx 리버스 프록시 설정 및 설치 검증입니다. 프로덕션 전환 시 TLS 적용, 백업/복원 절차, 접근 제어 및 모니터링을 반드시 구현하세요.