cafe24에서 서버호스팅을 결제한 후 세팅한 과정에 대한 글로 기본적인 세팅 과정에 대해 기록했다.

cafe24에서 서버호스팅 구입 시 안내에는 centOS, ubuntu, fedora 등 원하는 OS로 설치해준다고 하여 Ubuntu server로 신청했지만, 실제 설치 시 차후 기술 지원은 CentOS 이외에는 어렵다는 이야기에 CentOS로 진행했다.

기본적으로 Cafe24에서 웹서비스를 바로 운용할 수 있도록 세팅을 해준 상태로 설치해주기 때문에 데몬만 실행해주면 바로 사용할 수 있다.

# sudo -u apache /home/apache/bin/httpd -k start</pre>

트래픽, 접속량 등을 제어하기 위한 throttle을 설치하려 했지만 apache2.x을 지원하지 않아 대신 CBand를 설치했다. CBand는 apxs를 요구하는데 httpd-devel에 포함되어 있다.

# yum -y install httpd-devel
# wget http://dembol.org/downloads/cband/mod-cband-0.9.7.5.tgz
# tar xfz mod-cband-0.9.7.5.tgz
# cd mod-cband-0.9.7.5
# ./configure --with-apxs=/usr/sbin/apxs
# make
# make install

CBand 설치는 아파치 2.x 에서의 트래픽 제한 글을 참고했다.

네임서버의 경우 dnsever를 사용하는 것을 권장한다. 직접 설치하고자 한다면 How to config BIND 9 for Linux를 참고해 설치하면 된다.

각각의 계정을 생성해주고 아파치에 설정, 데이터베이스를 생성, 주소를 연결하는 등의 처리를 위한 쉘 스크립트다.

#!/bin/bash

# 계정 생성을 자동으로 처리합니다.
# 1. 서버 아이디 생성 (useradd) / 비밀번호
# 2. /home/에 디렉토리 생성, chmod, chown 설정
# 3. /home/$account/public_html 기본 파일 복사
# 4. 도메인이 있다면
#   /etc/named.conf 추가
# 5. /home/apache/conf/extra/httpd-vhosts.conf 에 해당 계정 virtualhost 추가 (도메인과 서브도메인)
# 6. 데이터베이스 추가

homedir="/home"
httpd="/home/apache/bin/httpd -k"
mysql="/home/mysql/bin/mysql -u root -p"
httpdown="apache"
htdocs="public_html"
namedconf="/etc/named.conf"
zone="standard.zone"
domain="localdomain.localname"
conf="/home/apache/conf/extra/httpd-vhosts-account.conf"

echo "계정 생성을 자동으로 처리합니다."

funcacc () {

    while [ ! $account ]
    do
        echo -n "### 계정을 입력하세요 : "
        read account

        if [ ! $account ]; then
            echo ">>> 계정명을 넣어 주시기 바랍니다."
            unset account
        elif (( $(cat /etc/passwd |grep -c "^$account:") > 0 )) ;then
            echo ">>> 계정이 이미 존재합니다. 다시 입력바랍니다 "
            unset account
        fi
    done

    while [ ! $password ]
    do
        echo -n "### 비밀번호를 입력하세요 : "
        read password

        if [ ! $password ]; then
            echo ">>> 비밀번호를 넣어 주시기 바랍니다."
        fi
    done

    echo -n "### 도메인을 입력하세요 (없으면 그냥 엔터) : "
    read yourdomain

    echo "계정은 $account 입니다."
    echo "비밀번호는 $password 입니다."

}

funcacc

# 계정 생성 /home/$account
useradd $account -s "/bin/bash" -d "$homedir/$account"

# 계정 비밀번호 설정
echo $password | passwd $account --stdin

# 홈디렉토리 권한 설정
chown "$account"."$httpdown" "$homedir/$account"
chmod 711 "$homedir/$account"
echo "initdate  $(date +%Y-%m-%d\ %H:%M)" >> $homedir/$account/.userinfo

# public_html 생성
if [ $htdocs ] && [ ! -d "$homedir/$account/$htdocs" ] ; then
    mkdir "$homedir/$account/$htdocs"
                chown "$account"."$account" "$homedir/$account/$htdocs"
    chmod 711 "$homedir/$account/$htdocs"
fi

#named 추가
if [ $yourdomain ] ; then
    echo "zone \"$yourdomain\" IN {type master;         file \"$zone\"; };" >/tmp/named.conf
    cat /tmp/named.conf >> $namedconf
    /usr/sbin/rndc -p 953 reload
fi

# /home/apache/conf/extra/httpd-vhosts.conf 에 해당 계정 virtualhost 추가 (도메인과 서브도메인)

echo
echo > /tmp/hosting
echo "### 등록일: $dat 계정명: $account ###" >> /tmp/hosting
echo "<VirtualHost *:80>" >> /tmp/hosting

echo "  DocumentRoot $homedir/$account/$htdocs" >> /tmp/hosting

# 개인 도메인의 유무
if [ ! $yourdomain ]; then
    echo "  ServerName $account.domain.co.kr" >> /tmp/hosting
    echo "  ServerAlias www.$account.domain.co.kr" >> /tmp/hosting
else
    echo "  ServerName www.$yourdomain" >> /tmp/hosting
    echo "  ServerAlias $yourdomain $account.domain.co.kr www.$account.domain.co.kr" >> /tmp/hosting
fi
echo "  CBandLimit 1Gi " >> /tmp/hosting
echo "  CBandPeriod 1D " >> /tmp/hosting 

# 로그 파일 셋팅
if [ ! $yourdomain ]; then
        echo "  ErrorLog logs/$account.$domain-error_log" >> /tmp/hosting
        echo "  CustomLog logs/$account.$domain-access_log combined" >> /tmp/hosting
else
    echo "  ErrorLog logs/$yourdomain-error_log" >> /tmp/hosting
    echo "  CustomLog logs/$yourdomain-access_log combined" >> /tmp/hosting
fi

echo "</VirtualHost>" >> /tmp/hosting

echo ">>> 다음 내용이 $conf 에 등록되었습니다"
echo "=================================================="
cat /tmp/hosting
echo "=================================================="

cat /tmp/hosting >> $conf

# $httpd restart
# restart로 재시작하면 cband가 리셋되버리는 문제점이...
$httpd graceful

# 데이터베이스 설정

dbname="$account"

if [ $dbname ]; then
    echo dbname is $dbname
    pass=$password
    echo "dbpasswd is $pass"

    echo "create database $dbname;" > /tmp/dbadd.sql
    echo "grant all privileges on $dbname.* to $account@localhost identified by '${pass}';" >> /tmp/dbadd.sql
    chmod 700 /tmp/dbadd.sql
    echo
    echo ">>> 다음 sql 문이 실행됩니다"
    echo
    echo "=================================================="
    cat /tmp/dbadd.sql
    echo "=================================================="
    echo
    echo ">>> 디비가 다음과 같이 추가후 검색되었습니다.(해당디비가 나오면 정상추가)"
    echo ">>> rt 데이터베이스 비밀번호를 입력해주세요."
    $mysql mysql < /tmp/dbadd.sql
    rm -rf /tmp/dbadd.sql
fi

rm -rf /tmp/hosting
rm -rf /tmp/dbadd.sql

echo "세팅이 완료되었습니다."

위와 같이 쉘로 직접 작업하는 것은 여러가지 문제가 발생할 소지가 있기 때문에 가능하다면 Cpanel, Webmin 과 같은 관리도구를 설치해 사용하는 것을 권장한다.

사무실 이사를 했다.

좁은 사무실 내에 인원이 많아지다보니 무질서한 커뮤니케이션 또한 잦아져 온전히 업무에 집중하기 어렵다는 판단 하에 사무실을 분리하기로 결정했다.

제주큐브 사무실 이사 전 모습

비도 오고 그래서 이사하기에 좋은 날씨는 아니었지만 짐을 내릴 땐 날씨가 괜찮아 다행이었다. 원래 카페를 운영하고자 했던 장소라서 인테리어가 이미 되어 있어 마치 카페와 같은 분위기의 사무실이 되었다. 단점은 지하라는 점.1

이전 사무실에서 대표님의 개발 정책은 거의 애자일에 가까웠다. 매일 아침 회의와 함께 누구든지 의견을 개진할 수 있도록 유도하는 분위기, 그 흐름이 끊기지 않도록 오픈된 공간, 그 연장선에서 개발자와 클라이언트가 직접 대면해 당일 모든 수정을 끝내는 유지보수 정책은 고객들에게 강한 인상으로 남게 되었고 그 방식 자체가 회사의 마케팅 방식 중 하나로 자리를 잡았다.

물론 이 정책은 프로그래머, 디자이너, 플래셔, 퍼블리셔가 각각 한 명일 때 유효한 방식이었고 인원수가 늘어감에 따라 (또는 직책의 수가 늘어남에 따라) 여러가지 문제가 나타났다. 예로, 해당 유지보수 내용이 하위 직책의 인원에 떠넘기기 식으로 넘어오기도 하고, 퇴직자의 공백을 모든 직원이 책임 회피를 하는 등의 문제2도 발생하기도 했다. 중간 관리자의 부재의 문제도 있었지만 규모가 커지면 큰 규모에 맞는 프로세스를 구축하거나 부분별로 나눠 소규모를 지속적으로 유지하는 등의 방법으로 해소하는게 바람직하지 않았나 생각이 든다.

개발자에게 어떤 공간이, 어떤 인원이 가장 효율 높고 불편함이 없을까. 환경적인 요소, 제도적인 요소 등 다각적으로 고민해봐야 한다.

Footnotes

  1. 지하에 사무실을 구해서는 안된다는 사실을 알게 되었다.

  2. 어쩌면 당연한 문제.

한 달 여 프로젝트를 맡아 개발했던 웹사이트가 있었다. 회사에서 투입된 인력으로도 상당한 규모의 프로젝트였고 나는 개발 담당자로 개발 미팅도 내 주도 하에 이루어졌다. 개발이 완료되어 최종 납품하는 순간에 클라이언트는 기획 전반의 변경을 요구하였고 그에 따른 금액적 소요는 모두 자신이 부담하겠다고 말했다. 유지보수 계약에 따라 꾸준히 오는 수정사항에 대해 모두 처리해주고 있었으며 기획의 변경으로 발생하는 내용에 대해서는 추가 금액을 청구했는데 해당 금액이 크다고 느꼈나보다. 그래서 다른 업체를 알아보고는 그쪽이 우리가 청구한 부분에 반도 안되는 가격에 처리해주겠다고 해서 그쪽으로 유지보수를 옮기겠다고 해 사실상 우리 회사와의 관계는 끝을 맺었다.

클라이언트가 요구하는 부분은 수정 요구를 했을 때 바로 처리되었으면 하는 부분이었는데 회사의 일정도 있고 그에 따라 조율되는 부분을 이해해주지 않았다. 그래서 떠나는 거라면 납득을 안할 수가 없다. 그정도의 기획과 개발이 들어가는 사이트라면 자체적인 개발진을 꾸려야  했던 수준이었다.

어제 그 클라이언트에게서 전화가 왔다. 개발이 안된 부분이 있다고 성질을 내더라. 들어보니 무슨 sms 발송과 관련된 부분이 개발되지 않았다고. 우리가 사용하는 솔루션에 기본적으로 들어있는 부분에다 회원가입 시 문자인증 등의 내용이 있어 모듈은 모두 탑재되어 있는 상황이었다. 기획의 변경으로 탑재할 위치가 달라져야 했었던 내용이라 그 기획대로 변경할 때 같이 적용해주면 되는 부분이었다. 그런데 대뜸 전화와서 하는 말이 기능이 개발되지 않았다고 하니 황당했다. 어처구니가 없지만 설명하다보니 그쪽 개발자인가 전화를 바꿔주었는데 나를 바로 긁었다. 대뜸 높은 사람을 바꾸란다. 왜냐고 하니까 내가 자기 설명을 못알아듣는 것 같단다. 내가 개발담당자라고 하니까 개발한 사람이 왜 말을 못알아듣냐고 한다. 그러고서 하는 말이 가관이었다.

이거 보니까 그누보드 오픈소스로 만드셨네요. 오픈소스로 개발하는 개발자도 개발자라고 할 수 있습니까?

그 얘기 듣고 욱해서 뭐라 할까 하다가 그냥 대표님한테 전화를 넘겼다. 하루가 지나니 전후상황 다 잊혀지고 그 말만 계속 머릿속을 맴돌고 있다. 나도 개발자일까? 오픈소스를 활용하고 있으면 개발자가 아니란 걸까? 사실 더 따지고 들지 못하고 욱한 것은 아직 내가 그릇이 작은 탓도 있고, 어쩌면 마음 한 켠에 내가 아직 학문적인 기반이 얕은 개발을 하고 있다는 부분이 마음에 걸렸기 때문인지도 모르겠다.

자성의 시간은 이쯤으로 하고. 오픈소스는 개발자에게 어떤 의미일까?

덧. 오픈소스로 개발한다고 개발자가 아니라고 하는 그 사람은 도대체 뭘 어떻게 개발하고 있는지 궁금하다. 그 사람은 개발자라서 O/S도 직접 개발해서 컴퓨터를 하고 있을지도 모를 일이니까.

요즘 개발 환경에 관심이 많아져 이것저것 찾아보다가 trac에 대해 알게 되었습니다.

trac

trac은 svn과 연계하여 사용할 수 있는 프로젝트 관리 도구입니다. 제가 있는 곳에서는 별도의 버전관리가 없는(알아서 백업하고 알아서 관리하는) 환경이라 실제로 사용해보고 편리하겠구나 하고 끄덕이곤 적용해보지는 못했었는데요. trac은 위키 문법에 직관적이고 미려한 구성, python으로 만들어져 속도도 빠르다고 하니 그냥 설치 한번 해보자는 생각으로 찾아보았습니다. 먼저 설치하신 수많은 분들의 포스트를 보고 따라해봤는데 버전의 문제인지 여러 파일을 설치하는데 뭔가 에러가 나고 복잡복잡 한겁니다. 며칠 이거 설치한다고 뒤적거렸는데 무슨 문제인지 알기도 쉽지가 않더군요. 혹시나 해서 한방에 설치하는 것이 있나 해서 찾아봤더니 있었습니다.

bitNami(http://bitnami.org)는 각종 한방팩을 모두 모아놓아 번거로운 작업을 단번에 해결할 수 있는 사이트입니다. 사이트 둘러보시면 아시겠지만 참 다양한 한방팩들을 무료로 내려받을 수 있게 서비스하고 있습니다.  http://bitnami.org/stack/trac 에서 OS 버전에 맞게 다운로드하여 실행하시면 몇가지 입력 후 바로 설치가 됩니다. (기존에 apm 등의 서버를 돌리고 있는 분이라면 포트를 신경써서 입력해주셔야 합니다.) 간편하게 위키도 사용할 수 있고, 이슈트레킹도 가능하고요. 아직 실 업무에 적용해보진 않아서 정확하게 모르겠지만 확실히 속도는 빠르더군요.

개발은 기획부터 과정, 결과물과 그 이후의 모든 일을 기록으로 남기는 것이 가장 중요하다는 생각이 요즘에야 부쩍 듭니다.

색상을 바꿔요

눈에 편한 색상을 골라보세요 :)

Darkreader 플러그인으로 선택한 색상이 제대로 표시되지 않을 수 있습니다.