CentOS 7에 Restyaboard 설치 및 구성

개요
Restyaboard는 무료 오픈소스 칸반 보드 애플리케이션으로, Trello의 셀프 호스팅 대안입니다. PHP로 작성되었으며 데이터 저장소로 PostgreSQL을 사용합니다. 이 문서는 CentOS 7 환경에서 Restyaboard를 설치하고 운영하기 위한 권장 구성과 실무 팁, 문제 해결 방안을 포함합니다.
중요 정의: PHP-FPM — PHP를 FastCGI 방식으로 실행해 Nginx와 연동하는 서비스입니다.
사전 준비
- 최소 CentOS 7 서버(루트 권한)
- 네트워크 및 방화벽에서 포트 80(또는 443)이 허용되어야 함
- 도메인(예: board.yourdomain.com)을 설정해 두면 편리함
중요: 이 가이드에서는 시스템 패키지와 레포지토리 추가, PHP-FPM을 소켓 방식으로 구성, PostgreSQL 9.6 설치, Restyaboard 파일 설치 및 Nginx 서버 블록 구성을 다룹니다.
단계 요약
- Nginx 설치
- PHP 7.0 + PHP-FPM 및 mbstring 등 모듈 설치/설정
- PostgreSQL 9.6 설치 및 데이터베이스 준비
- Restyaboard 다운로드 및 초기 데이터 로드
- Nginx 서버 블록과 권한 설정, 크론 작업 추가
- SELinux 처리 및 서비스 재시작
1단계 — Nginx 설치
설치 전 시스템 패키지를 최신 상태로 업데이트합니다.
yum -y update
CentOS 기본 YUM 리포지토리에는 nginx가 없으므로 EPEL을 추가해야 합니다.
yum -y install epel-release
이후 nginx를 설치합니다.
yum -y install nginx
설치가 완료되면 nginx를 시작하고 부팅 시 자동 시작하도록 설정합니다.
systemctl start nginx systemctl enable nginx
이제 nginx가 서버에서 실행 중이어야 합니다.
참고: 방화벽(firewalld)을 사용 중이라면 80/443 포트를 허용해야 합니다.
2단계 — PHP-FPM 및 mbstring 설치 및 구성
Restyaboard는 PHP 7.0을 지원하므로 PHP 7.0을 설치합니다. CentOS 기본 레포지토리에 PHP 7.0이 없으므로 Webtatic 레포지토리를 추가합니다.
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
필요한 PHP 패키지와 PHP-FPM, 확장 모듈을 설치합니다.
yum -y install php70w php70w-fpm php70w-devel php70w-cli php70w-curl php70w-pgsql php70w-mbstring php70w-ldap php70w-pear php70w-imap php70w-xml php70w-pecl-imagick ImageMagick
설치 후 기본 PHP-FPM 설정은 Apache를 위한 사용자로 설정되어 있으므로 nginx와 함께 동작하도록 사용자, 그룹, 리스닝 소켓을 변경해야 합니다. 편집할 파일: /etc/php-fpm.d/www.conf
(편의를 위해 nano 사용 예시를 포함합니다. nano가 없으면 yum -y install nano로 설치하세요.)
nano /etc/php-fpm.d/www.conf
파일에서 다음 줄을 찾아 apache를 nginx로 변경합니다.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
리스닝을 포트 대신 유닉스 소켓으로 변경합니다.
listen = 127.0.0.1:9000
다음과 같이 변경합니다.
listen = /run/php-fpm/php7.0-fpm.sock
다음 주석 처리된 listen 관련 항목을 찾아 소유권과 권한을 설정합니다.
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660
다음 값으로 변경하세요.
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
추가로 php.ini에서 타임존을 설정하고 cgi.fix_pathinfo를 비활성화합니다.
nano /etc/php.ini
예시(타임존은 필요에 따라 변경):
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Kolkata
그리고 아래 항목을 찾아 주석 해제 및 값 변경:
cgi.fix_pathinfo=0
GeoIP 확장을 설치하고 활성화합니다.
yum -y install GeoIP-devel
/etc/php.ini 맨 끝에 다음 한 줄을 추가합니다.
extension=geoip.so
PHP-FPM을 시작하고 부팅 시 자동 시작하도록 설정합니다.
systemctl start php-fpm systemctl enable php-fpm
변경 사항 적용을 위해 nginx를 재시작합니다.
systemctl restart nginx
팁: php-fpm이 예상대로 소켓을 생성하지 않으면 /run/php-fpm/ 디렉터리의 소유권과 권한, php-fpm 로그(/var/log/php-fpm/)를 확인하세요.
3단계 — PostgreSQL 설치 및 데이터베이스 구성
Restyaboard는 PostgreSQL을 데이터베이스로 사용합니다. CentOS 기본 리포지토리에 원하는 버전이 없으므로 PostgreSQL 공식 레포지토리를 추가합니다.
rpm -Uvh https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
PostgreSQL 설치:
yum -y install postgresql96-server postgresql96-contrib
데이터베이스 초기화:
/usr/pgsql-9.6/bin/postgresql96-setup initdb
PostgreSQL 인증 설정을 수정해 MD5 기반 인증을 사용하도록 합니다. 편집 파일: /var/lib/pgsql/9.6/data/pg_hba.conf
nano /var/lib/pgsql/9.6/data/pg_hba.conf
원본(예시)에서 peer/ident를 변경:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident
# IPv6 local connections:
host all all ::1/128 ident
변경 후:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
PostgreSQL 시작 및 자동 시작 설정:
systemctl start postgresql-9.6 systemctl enable postgresql-9.6
postgres 시스템 사용자 비밀번호 변경:
passwd postgres
Postgres 계정으로 전환:
su - postgres
새 데이터베이스 사용자 생성:
createuser rb_user
psql 쉘로 진입:
psql
새로 생성한 사용자에 대해 암호 설정(예시):
ALTER USER rb_user WITH ENCRYPTED password 'StrongPassword';
(세미콜론 필요)
데이터베이스 생성:
CREATE DATABASE rb_data OWNER rb_user ENCODING 'UTF8' TEMPLATE template0;
psql에서 빠져나옵니다:
\q
그리고 postgres 계정에서 로그아웃하여 root로 복귀합니다.
보안 팁: 실제 운영 환경에서는 ‘StrongPassword’를 강력한 랜덤 문자열로 교체하고 비밀번호 관리 정책(주기적 변경, 별도 보관)을 적용하세요.
4단계 — Restyaboard 다운로드
의존성 설치가 완료되었다면 Restyaboard 배포판을 다운로드합니다.
cd /usr/share/nginx/html wget https://github.com/RestyaPlatform/board/releases/download/v0.4.2/board-v0.4.2.zip
최신 릴리스 링크는 Restyaboard GitHub 릴리스 페이지에서 확인하세요.
압축 해제(만약 unzip이 없다면 yum -y install unzip):
unzip board-v0.4.2.zip -d board
초기 SQL 데이터 가져오기:
psql -d rb_data -f "/usr/share/nginx/html/board/sql/restyaboard_with_empty_data.sql" -U rb_user
Restyaboard 구성 파일을 편집하여 데이터베이스 인증 정보를 업데이트합니다.
nano /usr/share/nginx/html/board/server/php/config.inc.php
원본 예시:
define('R_DB_HOST', 'localhost');
define('R_DB_USER', 'restya');
define('R_DB_PASSWORD', 'hjVl2!rGd');
define('R_DB_NAME', 'restyaboard');
define('R_DB_PORT', 5432);
환경에 맞게 수정:
define('R_DB_HOST', 'localhost');
define('R_DB_USER', 'rb_user');
define('R_DB_PASSWORD', 'StrongPassword');
define('R_DB_NAME', 'rb_data');
define('R_DB_PORT', 5432);
보안 팁: config.inc.php 파일의 접근 권한을 최소화하고, 저장소에 노출되지 않도록 주의하세요.
5단계 — Nginx 서버 블록 구성
Restyaboard 패키지에는 기본 nginx 서버 블록 파일이 포함되어 있습니다. 이를 nginx 설정 디렉터리로 복사합니다.
cp /usr/share/nginx/html/board/restyaboard.conf /etc/nginx/conf.d
파일을 열어 도메인과 루트 경로, PHP-FPM 소켓 경로 등을 수정합니다.
nano /etc/nginx/conf.d/restyaboard.conf
설정 예시에서 server_name과 root를 운영 도메인과 경로로 변경합니다.
원본 예시:
server {
listen 80 default_server;
server_name _;
변경:
server {
listen 80;
server_name board.yourdomain.com;
또한 root 경로를 Restyaboard 설치 폴더로 맞춥니다.
원본 예시들:
root /usr/share/nginx/html;
location / {
root /usr/share/nginx/html/client;
}
root /usr/share/nginx/html/client;
변경 후:
root /usr/share/nginx/html/board;
location / {
root /usr/share/nginx/html/board/client;
}
root /usr/share/nginx/html/board/client
fastcgi_pass 항목에서 소켓 경로를 올바르게 지정합니다.
원본:
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
변경:
fastcgi_pass unix:/run/php-fpm/php7.0-fpm.sock;
구성 파일을 저장한 뒤 파일 소유권과 권한을 설정합니다.
chown -R nginx:nginx /usr/share/nginx/html/board/
chmod -R go+w "/usr/share/nginx/html/board/media"
chmod -R go+w "/usr/share/nginx/html/board/client/img"
chmod -R go+w "/usr/share/nginx/html/board/tmp/cache"
chmod -R 0755 /usr/share/nginx/html/board/server/php/shell/*.sh
크론 작업을 추가해 예약 작업(알림, IMAP 폴링 등)을 활성화합니다.
echo "*/5 * * * * /usr/share/nginx/html/board/server/php/shell/instant_email_notification.sh" >> /var/spool/cron/root
echo "0 * * * * /usr/share/nginx/html/board/server/php/shell/periodic_email_notification.sh" >> /var/spool/cron/root
echo "*/30 * * * * /usr/share/nginx/html/board/server/php/shell/imap.sh" >> /var/spool/cron/root
echo "*/5 * * * * /usr/share/nginx/html/board/server/php/shell/webhook.sh" >> /var/spool/cron/root
echo "*/5 * * * * /usr/share/nginx/html/board/server/php/shell/card_due_notification.sh" >> /var/spool/cron/root
주의: 운영 환경에서는 cron에 직접 비밀번호나 민감정보가 노출되지 않도록 스크립트 내부 보안을 검토하세요.
6단계 — SELinux 처리 및 서비스 재시작
기본적으로 제공된 프록시 구성은 SELinux 정책과 충돌할 수 있으므로 이 가이드에서는 SELinux를 비활성화하는 방법을 안내합니다. 먼저 임시로 끕니다(재부팅 없이 적용).
setenforce 0
영구 비활성화를 원하면 /etc/selinux/config 파일에서 SELINUX 값을 수정합니다.
nano /etc/selinux/config
변경 전:
SELINUX=enforcing
변경 후:
SELINUX=disabled
변경 후 nginx를 재시작합니다.
systemctl restart nginx
접속 테스트:
http://board.yourdomain.com
로그인: 기본 사용자 admin, 기본 비밀번호 restya (설치 후 즉시 관리자 비밀번호를 변경하세요).
이미지: 설치 후 보이는 로그인 화면
로그인 후 대시보드 화면
새 보드 만들기(왼쪽 상단 화살표 → Add Board or Organization)
템플릿 선택 화면
보드 생성 후 예시 화면
관리자 패널 접근(화면 오른쪽 하단의 Admin → 상단 바의 Settings)
운영 전 권장 검증 및 보안 사항
- 관리자 비밀번호 즉시 변경 및 강력한 비밀번호 정책 적용
- config.inc.php 접근 권한 최소화(600 또는 소유자 nginx로 제한)
- HTTPS 설정: Let’s Encrypt 또는 상용 인증서로 TLS 적용
- 정기 백업: PostgreSQL 덤프 스케줄과 파일 시스템(미디어) 백업
- 로그 모니터링: nginx, php-fpm, postgres 로그 패스 및 회전 정책
- 방화벽: 필요한 포트만 허용(80/443 외 공개 포트 최소화)
- SELinux 비활성화 대신 정책 허용이 가능하면 정책을 조정해 활성화 유지 권장
보안 하드닝 제안(우선순위):
- TLS(HTTPS) 적용(긴급)
- 관리자 계정 2단계 인증 도입(가능한 경우)
- 정기 보안 업데이트 적용
트러블슈팅 체크리스트
- nginx 502 혹은 PHP 오류 → php-fpm이 실행 중인지, 소켓 경로가 설정 파일과 일치하는지 확인
- PostgreSQL 인증 실패 → pg_hba.conf와 config.inc.php의 DB 사용자/비밀번호 일치 여부 확인
- 소스 파일 권한 문제(파일 업로드/이미지 표시 안됨) → /usr/share/nginx/html/board 디렉터리의 소유권과 쓰기 권한 점검
- Cron이 동작하지 않음 → /var/spool/cron/root에 크론 엔트리 존재 여부, 쉘 스크립트 실행 권한 확인
간단한 진단 명령:
- 시스템 서비스 상태 확인
systemctl status nginx
systemctl status php-fpm
systemctl status postgresql-9.6
- PostgreSQL 접속 테스트
psql -U rb_user -d rb_data -h localhost
- php-fpm 소켓 존재 확인
ls -l /run/php-fpm/php7.0-fpm.sock
롤백 및 백업 권장 절차 (간단 SOP)
- 설치 전 전체 서버 스냅샷(가능한 경우) 또는 최소한 /usr/share/nginx/html와 Postgres 데이터베이스 덤프 생성
- 데이터베이스 백업: pg_dump
pg_dump -U rb_user -F c -b -v -f "/root/rb_data_backup_$(date +%F).dump" rb_data
- 파일 시스템(미디어, 첨부) 백업
tar czf /root/board_media_backup_$(date +%F).tar.gz /usr/share/nginx/html/board/media
- 문제가 발생하면 최신 백업으로 복원
역할별 체크리스트
- 시스템 관리자
- nginx, php-fpm, postgres 설치 및 서비스 관리
- TLS 설정 및 방화벽 구성
- 시스템 보안 및 업데이트
- 데이터베이스 관리자
- 사용자 및 권한 관리
- 정기 백업 및 복구 테스트
- 성능 튜닝(인덱스, 메모리 설정)
- 애플리케이션 관리자(팀 리더)
- 관리자 계정 관리 및 권한 분배
- 템플릿/보드 관리 정책 수립
- 개발자
- Restyaboard 코어 또는 플러그인 수정 시 테스트 환경 구성
- 배포 자동화(스크립트) 작성
테스트 케이스 / 수락 기준
- 웹 UI에 접속하여 로그인 가능해야 함(기본 admin → 비밀번호 변경 확인)
- 새 보드 생성 및 카드 추가/이동이 정상 동작해야 함
- 첨부 파일 업로드 및 다운로드가 성공해야 함
- 이메일 알림(instant 및 periodic) 동작 확인: cron 스크립트 실행 결과 확인
- DB 연결이 안정적이어야 하며, 트랜잭션 오류가 없어야 함
수락 기준 예시:
- 3명 이상의 사용자로 동시 카드 이동 테스트 시 응답 지연이 2초 이하
- 백업으로부터 복원 완료 후 데이터 무결성 확인
자주 묻는 문제(간단 FAQ)
Q: PHP-FPM이 소켓을 생성하지 않습니다. 무엇을 확인해야 하나요? A: php-fpm 설정의 listen 경로와 nginx 설정의 fastcgi_pass가 일치하는지, php-fpm 서비스가 실행 중인지, /run/php-fpm 디렉터리의 권한을 확인하세요.
Q: 이메일 알림이 작동하지 않습니다. A: 크론 작업이 등록되어 있는지, 해당 쉘 스크립트가 실행 권한을 가지는지, 시스템 MTA(메일 전송 에이전트) 설정 여부를 확인하세요.
마이그레이션 및 호환성 팁
- 다른 데이터베이스에서 마이그레이션 시에는 Restyaboard SQL 스키마에 맞춰 변환 스크립트를 작성하세요.
- PHP 버전이나 패키지 레포지토리가 오래된 시스템에서는 보안 패치를 적용하거나 컨테이너화를 고려하세요.
- 운영 환경에서 PostgreSQL 버전 업그레이드는 데이터 덤프 후 재로딩 방식으로 안전하게 수행하는 것을 권장합니다.
요약
이 가이드는 CentOS 7 서버에 Restyaboard를 설치하고 운영하는 데 필요한 전체 절차를 제공합니다. 핵심 단계는 nginx 설치, PHP-FPM 구성, PostgreSQL 설정, Restyaboard 파일 설치 및 구성, Nginx 서버 블록/권한 설정, SELinux 처리 및 서비스 검증입니다. 설치 후에는 TLS 적용, 관리자 계정 보안, 정기 백업 및 로그 모니터링을 통해 안정적으로 운영하세요.
중요: 설치 직후 기본 관리자 계정 정보를 변경하고, 운영 환경에서는 SELinux를 비활성화하기보다 정책을 조정해 활성화 상태로 두는 것을 우선 검토하세요.
추가 리소스: Restyaboard GitHub(릴리스 페이지), PostgreSQL 공식 문서, PHP-FPM/Nginx 관련 운영 가이드