2024년 11월 19일 화요일

n8n으로 자동화 시작하기: 기능 설명과 셀프 호스팅 설정 가이드


n8n 소개

n8n은 "No-code" 워크플로우 자동화 도구로, 코드 없이 다양한 애플리케이션과 서비스를 연결하여 자동화된 작업을 수행할 수 있는 플랫폼입니다. 데이터 처리, 알림 발송, API 통합 등 반복적인 작업을 자동화하고 효율적인 비즈니스 프로세스를 구축하는 데 매우 유용합니다. n8n은 오픈 소스(무료)로 제공되며, 클라우드 기반 호스팅뿐만 아니라 셀프 호스팅을 통해 개인 서버에서 자유롭게 실행할 수 있어 많은 기업과 개발자들에게 큰 인기를 얻고 있습니다.




한국사람들은 n8n 을 주로 "엔팔엔"으로 발음하고, 외국에서는 "엔에잇엔", "네이튼" 등으로 발음합니다.


n8n의 주요 기능

n8n은 다양한 기능을 제공하여 복잡한 자동화 작업을 손쉽게 처리할 수 있습니다. 주요 기능은 다음과 같습니다:


(1) 워크플로우 디자인

n8n은 사용자 친화적인 UI를 통해 워크플로우를 시각적으로 디자인할 수 있습니다. 사용자는 드래그 앤 드롭 방식으로 다양한 작업을 연결하여 복잡한 자동화 프로세스를 쉽게 만들 수 있습니다. 예를 들어, 구글 시트에서 데이터를 읽어와 이메일로 알림을 발송하거나, API 호출을 통해 데이터베이스에 저장하는 등의 작업을 손쉽게 구현할 수 있습니다.


(2) 다양한 통합 지원

n8n은 200개 이상의 외부 서비스와 통합을 지원합니다. 여기에는 Slack, Google Sheets, GitHub, Twitter, AWS, Dropbox 등 여러 인기 있는 애플리케이션이 포함됩니다. 이를 통해 데이터의 흐름을 원활하게 연결하고 다양한 외부 시스템과 상호작용할 수 있습니다.


(3) 조건부 흐름 제어

n8n은 단순히 작업을 순차적으로 처리하는 것 이상으로, 조건부 흐름 제어가 가능합니다. 예를 들어, 특정 조건이 충족될 때만 작업을 실행하거나, 오류가 발생할 경우 예외 처리를 하도록 설정할 수 있습니다. 이는 복잡한 비즈니스 로직을 자동화하는 데 유용합니다.


(4) API 및 Webhook 통합

n8n은 API 호출 및 Webhook을 쉽게 설정할 수 있어, 다양한 시스템과의 실시간 데이터 연동이 가능합니다. 외부 시스템에서 발생한 이벤트에 따라 자동화된 작업을 실행하는 등 복잡한 작업도 처리할 수 있습니다.


(5) 파일 처리

파일을 다루는 기능도 탁월합니다. CSV, JSON, XML 파일을 처리하고 변환하는 기능을 제공하여, 다양한 형식의 데이터를 자동으로 변환하고 전달하는 데 유용합니다.


셀프 호스팅 설정 방법

n8n을 사용하기 위해서는 클라우드 서비스나 개인 서버에 설치할 수 있습니다. 이 섹션에서는 n8n을 셀프 호스팅하는 방법을 단계별로 안내합니다.


(1) 서버 준비

먼저 n8n을 호스팅할 서버가 필요합니다. n8n은 Linux, macOS, Windows에서 모두 실행 가능하며, Docker를 사용하면 다양한 환경에서 쉽게 설정할 수 있습니다. 여기서는 Docker를 이용한 설치 방법을 설명합니다.


(2) Docker 설치

n8n은 Docker 이미지를 제공하므로 Docker를 설치해야 합니다. Docker가 설치되지 않은 경우, 공식 웹사이트(https://www.docker.com)에서 Docker를 설치할 수 있습니다.

  • Linux: sudo apt install docker.io 명령어를 사용해 설치
  • Windows: Docker Desktop을 다운로드하여 설치
  • macOS: Docker Desktop을 설치

(3) n8n Docker 이미지 실행

Docker가 설치된 후, 다음 명령어를 사용해 n8n을 실행할 수 있습니다. 이 명령어는 n8n을 컨테이너로 실행하는 과정입니다.

bash
docker run -d \
  --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/root/.n8n \
  n8nio/n8n


이 명령어는 n8n을 백그라운드에서 실행하고, 5678 포트를 사용하여 외부에서 접근할 수 있도록 설정합니다. 또한, 데이터가 영구적으로 저장되도록 ~/.n8n 디렉토리를 마운트합니다.


(4) n8n 웹 인터페이스 접속

n8n이 성공적으로 실행되면 웹 브라우저에서 http://localhost:5678 주소로 접속하여 n8n의 웹 인터페이스에 접근할 수 있습니다. 여기서부터는 드래그 앤 드롭 방식으로 워크플로우를 디자인하고 자동화 작업을 시작할 수 있습니다.


(5) 데이터베이스 설정

n8n은 기본적으로 SQLite를 사용하지만, 대규모 운영을 고려한다면 PostgreSQL이나 MySQL을 사용하는 것이 좋습니다. 데이터베이스 설정은 docker-compose 파일을 수정하여 구성할 수 있습니다. 예를 들어, PostgreSQL을 사용하는 방법은 아래와 같습니다:

yaml
version: '3'
services:
  n8n:
    image: n8nio/n8n
    ports:
      - 5678:5678
    environment:
      - DB_TYPE=postgresdb
      - DB_POSTGRESDB_HOST=postgres
      - DB_POSTGRESDB_PORT=5432
      - DB_POSTGRESDB_DATABASE=n8n
      - DB_POSTGRESDB_USER=n8n
      - DB_POSTGRESDB_PASSWORD=n8n_password
    volumes:
      - ~/.n8n:/root/.n8n
    depends_on:
      - postgres
  postgres:
    image: postgres:13
    environment:
      - POSTGRES_USER=n8n
      - POSTGRES_PASSWORD=n8n_password
      - POSTGRES_DB=n8n
    volumes:
      - ~/.postgres:/var/lib/postgresql/data


위와 같은 설정을 통해 PostgreSQL을 데이터베이스로 사용하여 n8n을 안정적으로 운영할 수 있습니다.


결론

n8n은 코드 없이 복잡한 자동화 워크플로우를 구축할 수 있는 강력한 도구입니다. 다양한 외부 서비스와의 통합과 강력한 기능을 통해 비즈니스 자동화의 효율성을 극대화할 수 있습니다. 셀프 호스팅을 통해 개인 서버에서 실행할 수 있으며, Docker를 사용하면 쉽게 설치하고 관리할 수 있습니다. 이제 n8n을 활용해 반복적인 업무를 자동화하고, 비즈니스 프로세스를 최적화해 보세요.

2018년 3월 12일 월요일

윈도우10 메모리/디스크 사용량 100% 문제

윈도우10 메모리 사용량 99% 이상일때

윈도우 10에서 메모리 사용량이 계속 99% 여서 인터넷 찾아보고, services.msc 에서 필요없는 서비스 모두 사용중지해도 계속 99%이상이었는데, 아래처럼 해보니 괜찮아졌음.

1. Windows Key + R
2. Regedit



간략하게 정리하면 레지스트리 편집기를 열어  'HKEY_LOCAL_MACHINE -> SYSTEM -> ControlSet001 -> Services -> NDU'항목으로 이동해 'Start'의 값을 4로 입력해주시면 문제 해결은 됩니다.

저는 이 글을 쓰면서 확인하니 'Start'의 값이 2인데 메모리 사용량에 문제가 없었네요.


출처: http://pastimelife.com/1473 [잡다한 세상]
'HKEY_LOCAL_MACHINE -> SYSTEM -> ControlSet001 -> Services -> NDU'항목으로 이동해 'Start'의 값을 4로 입력



크롬 사용하면 디스크 100% 될때

윈도우 10에서 크롬만 사용하면 디스크가 100%가 되었는데, 크롬 History 파일 찾아서 삭제하니깐 디스크가 100% 되는 문제 없어짐.

1. C:\Users\*your id*\AppData\Local\Google\Chrome\User Data\Default
2. History 파일 찾아서 삭제





2016년 7월 28일 목요일

A Swift Tour

The Swift Programming Language (Swift 3)

최근 Swift 에 부쩍 관심이 간다. Objective-C 를 대체해서 아이폰 어플을 개발하기 위한 언어인데, 확실히 문법이 Objective-C 보다는 쉽고 Modern 하다. 그런데 또한 생소한 문법들도 있는 것 같다.

아이폰 어플 개발용 언어이기 때문에 Mac 환경에서 개발 가능하지만, 간단한 문법 정도는 IBM 에서 제공하는 REPL 에서 테스트 해볼수 있다.

아래 A Swift Tour 에서 간략한 문법을 확인할 수 있다.
짬짬이 시간 날 때마다 공부해봐야 겠다.

A Swift Tour

https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

IBM Swift REPL 환경

https://swiftlang.ng.bluemix.net/#/repl/57988668bf9f1feb4143f284




2015년 9월 24일 목요일

영어 비지니스 이메일 작성하기(2015-09-24)

1. ~에 관해서

in respect of (공식적인 비지니스 레터에는 잘 쓰지 않음)
in reference to ~
with regard to ~
regarding to ~
concerning to ~

I am writing in reference to our recent purchase.
I am writing with regard to our recent purchase.
I am writing regarding/concerning to our recent purchase.

나는 최근 구매품에 대해서 적고자 합니다.


2. 유감이다

regret: 유감스럽게 생각한다. 유감의 뜻으로 사용될 때는 would like to(~하고 싶다)와 같이 사용하면 어색해짐. regret 뒤에는 바로 그 유감스러운 사건/일이 와야함.
죄송하다는 표현은 apologize for 를 사용함.

We regret the delay in shipping.
우리는 선적이 늦어진 것에 유감입니다.

We would like to apologize for the delay in shipping.
우리는 선적이 늦어진 것을 사과드리고 싶습니다.


3. 확신시키다 / 보장하다

assure + 사람: 그사람을 확신시키다. 그사람의 의심을 없앤다는 뜻
ensure + 사물: 그 사실이나 조건에 대해서 보장한다는 뜻. ensure 다음에는 that 절이 주로 옴.

I assure you that our products are of the highest quality.
나는 당신에게 우리 상품이 매우 높은 품질을 가지고 있다고 확언한다.

We have a quality control process to ensure that every item is free from defects.
우리는 모든 물건들이 불량품이 전혀 없는 것을 보장하는 양질의 통제 과정이 있습니다.


4. by / until

미래의 어떤 시점 전까지 일어나야 하는 일에는 전치사 by 를 써야하고, 그 시간까지는 계속 그 일이 발생해야하는 사건에는 until 을 써야 함.

Your order will be shipped by Wednesday at the latest.
주문은 늦어도 수요일까지 선적(출하)될 것입니다.

We will be performing maintenance until the 25th.
우리는 25일까지 유지보수가 이루어 질 것입니다.


5. informations

명사 information 을 셀수없는 명사(불가산 명사)이기 때문에 단수만 써야 함.

I would like to request some information about your services.
서비스에 대해서 정보를 요청드립니다.


6. accept / except

accept 는 받아들이다, 수용하다 라는 뜻
except 는 제외시키다, 배제시키다 라는 뜻

We accept all major credit cards as well as checks and money orders.
저희는 모든 신용카드, 체크, 머니오더를 다 취급합니다.

We offer free shipping to every U.S stat except Alaska and Hawaii.
저희는 알래스카와 하와이를 제외하고는 모든 미국에 무료배송을 제공합니다.


출처: http://raccoonenglish.tistory.com/3255

2015년 6월 30일 화요일

우분투14.04 에서 Django + uWSGI + Nginx 설치하기

AWS EC2 Instance 를 생각지도 못한 일로 새로 설치하고 기존에 셋팅되어 있던 것들이 전부 날라가서 웹서버부터 다시 설치해야 했다. 이참에 다시 공부한다는 생각으로 구글링해서 나름 괜찮은 블로그 포스팅을 찾았다. 영문이라 번역도 해볼겸 기록으로 남긴다.

개요

Django 는 Python 애플리케이션이나 웹사이트를 개발하는데 도움을 주는 강력한 웹 프레임워크이다. Django 는 코드를 자체적으로 테스트하기 위한 간단한 웹서버를 가지고 있는데, 제품출시를 위해 이것보다는 좀 더 보안이 좋고 강력한 웹서버가 필요하다.

본 가이드에서는 우분투 14.04 에 Django 애플리케이션을 지원하는 몇가지 Component 들을 어떻게 설치하고 설정하는지 시연할 것이다. 그리고 Django 애플리케션을 위한 uWSGI 애플리케이션 컨테이너 서버에 대해서 설정하고, uWSGI 와의 역프록시를 위한 Nginx를 설치해서 Django 애플리케이션의 보안과 성능을 높이고자 한다.

선결 조건과 목표

본 가이드를 마치기 위해 새로운 우분투 14.04 서버 인스턴스와 sudo 를 사용할 수 있는 root 가 아닌 계정이 필요하다. 우분투 서버 설정은 이곳 에서 배울수 있다.

두개의 다른 가상환경에 Django 를 설치하고 각각의 설정을 따로 핸들링하도록 할 것이다. 두개의 샘플 프로젝트를 생성함으로써 멀티 프로젝트 환경에 한걸음 다가설 수 있다.

Django 애플리케이션을 설치한 후 uWSGI 애플리케이션 서버를 설치하고 설정할 것이다. 이 서버는 HTTP 를 통한 사용자 리퀘스트를 Django 애플리케이션이 처리할수 있는 Python 으로 변환하는 인터페이스 기능을 한다. 그리고 uWSGI 앞단에 Nginx를 설치해서 고성능의 연결 핸들링 메카니즘과 보안모듈을 손쉽게 탑재할수 있는 이점을 가져간다.

자, 이제 시작해보자.

VirtualEnv 와 VirtualEnvWrapper 설치 및 설정하기

먼저 Django 프로젝트와 필요한 사항들을 각각의 가상환경에 설치한다. 이를 위해서, Python 가상 환경을 생성해주는 virtualenv 를 설치하고 virtualenv 작업을 효율적으로 개선시켜주는 virtualenvwrapper 를 설치하자.

이 두 모듈을 Python 패키지 매니저인 pip 를 통해서 설치한다. pip 는 우분투 레포지토리에서 apt-get 으로 설치할 수 있다.
$ sudo apt-get update
$ sudo apt-get install python-pip
본 가이드에서는 Python 2.x 버전을 사용한다. Python 3.x 버전을 사용하는 사용자는 python3-pip 패키지로 설치할 수 있다. 그리고 pip 대신 pip3 명령어를 사용하면 된다.

이제 pip 가 설치되었으면, virtualenv virtualenvwrapper 를 설치할 수 있게 된다.
$ sudo pip install virtualenv virtualenvwrapper
두개의 모듈이 설치되었으면, 이제 shell 에서 virtualenvwrapper 스크립트 사용을 위한 설정을 해야한다. 가상환경은 간편하게 접근하기 위해서 home 폴더안에 Env 폴더에 위치시킨다. WORKON_HOME 이라는 환경변수를 생성하고, 이것으로 virtualenvwrapper 스크립트를 실행한다.

만약 Python3와 pip3 를 사용한다면, 아래 라인을 shell 초기화 스크립트에 추가해야 한다.
$ echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3"
어떤 Python 버전을 사용하는 가에 상관없이, 아래 라인을 실행하자.
$ echo "export WORKON_HOME=~/Env" >> ~/.bashrc
$ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
이제 설정한 Shell 초기화 스크립트를 실행하면 된다.
$ source ~/.bashrc
그리고나면, 가상환경 정보 저장을 위한 Env 폴더가 home 폴더안에 생성되게 된다.

Django 프로젝트 생성하기

이제 가상환경툴이 생겼다. 이것으로 두개의 가상환경을 생성하고 각각의 가상환경에 Django를 설치하고 프로젝트를 생성해보자.

첫번째 프로젝트 생성하기

virtualenvwrapper 스크립트를 이용해서 간단하게 가상환경을 생성할 수 있다.

첫번째 가상환경을 생성해보자
$ mkvirtualenv firstsite
위 명령어는 가상환경을 생성 후 가상환경에 포함된 Python과 pip 를 설치하고 가상환경을 동작시킨다. 가상환경이 동작되면 현재 새로운 가상환경이 동작하고 있다고 알려주는 프롬프트로 아래와 같이 변경된다. 괄호안의 값은 위에서 설정한 가상환경의 이름으로 나온다.
(firstsite)user@hostname:~$
이제부터 pip 로 설치하는 모든 모듈은 전체시스템이 아니라 가상환경 상에 설치가 되어지고 프로젝트 별로 패키지를 관리할 수 있게 된다.

sudo 없이 pip 를 이용해 가상환경에 Django 를 설지하고, 첫번째 Django 프로젝트를 만들어보자.
(firstsite)user@hostname:~$ pip install django
(firstsite)user@hostname:~$ django-admin.py startproject firstsite
home 폴더 안에 firstsite 라는 하위폴더가 생성된다. 샘플 프로젝트를 설정하기 위해서 firstsite 폴더로 이동하자
(firstsite)user@hostname:~$ cd ~/firstsite

프로젝트에서 사용 할 SQLite 데이터베이스를 초기화 하자. 원할경우 SQLite 대신 다른 데이터베이스를 설정해도 되지만, 본 가이드에서는 언급하지 않겠다.
$ ./manage.py migrate
$ python manage migrate
이제 프로젝트 폴더에 db.sqlite3 라는 데이터베이스 파일을 가지게 될 것이다. 그리고 어드민 계정을 하나 생성하자.
$ ./manage.py createsuperuser
$ python manage createsuperuser
username, email address, password, confirm password 를 입력하게 된다.

다음으로, 프로젝트 설정파일을 오픈하자. (원문에서는 nano를 썼는데, 아무래도 vi 가 손에 익어서 vi 로 대체 하였다.)
$ vi firstsite/settins.py
Nginx 로 Django 사이트를 서비스하려면, 사이트에서 사용할 static 파일들을 저장할 폴더를 설정하는 것이 필요하다. Nginx 가 직접 static 파일들을 제공하도록 하면 성능에도 긍정적인 영향을 주게 된다. Django 에게 static 파일들을 프로젝트 기본폴더 안 static 폴더안에 위치시키라고 알려주기 위해 아래 라인을 설정파일의 맨하단에 추가한다.
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
추가가 끝나면 저장하고 Django 사이트에서 사용할 static 파일들을 해당폴더에 수집하는 작업이 필요하다.
$ ./manage.py collectstatic
$ python manage collectstatic
yes 를 입력하고 확인하면 static 파일들을 수집하고 프로젝트 폴더에 static 폴더가 생성된다.

위 일련의 과정이 마무리되면, 이제 첫번째 프로젝트를 개발서버로 실행할 수 있다.
$ ./manage.py runserver 0.0.0.0:8000
$ python manage runserver 0.0.0.0:8000
개발서버 8000번 포트를 이용해서 시작되는데, 아래와 같이 서버의 도메인이름 혹은 IP 주소뒤에 8000 포트를 붙여서 브라우저에서 열어보자.
http://server_domain_or_IP:8000

It worked! 페이지가 제대로 보이면 성공한 것이다.
http://server_domain_or_IP:8000/admin
URL 맨끝에 /admin 을 붙이면 어드민 페이지 접속할수 있고, 아까 생성했던 어드민 계정으로 로그인 할 수 있다.

이제 실행중인 개발서버를 CTRL-C 로 종료시키고, 두번째 프로젝트를 생성해 보자.

두번째 프로젝트 생성하기

두번째 프로젝트 역시 첫번째와 동일하다. 프로젝트를 한번 생성해봤기 때문에 이번 섹션은 간단하게 축약해서 설명하도록 하겠다.

다시 home 폴더로 돌아와서 두번째 가상환경을 생성하고 Django 를 설치하자.
(firstsite)user@hostname:~/firstsite$ cd ~
(firstsite)user@hostname:~$ mkvirtualenv secondsite
(secondsite)user@hostname:~$ pip install django
(secondsite)user@hostname:~$ django-admin.py startproject secondsite
(secondsite)user@hostname:~$ cd secondsite
(secondsite)user@hostname:~/secondsite$
새로운 가상환경을 생성하면 첫번째 가상화면은 종료되고, 생성한 새로운 가상화면으로 변경된다. 여기서 설치한 Django 는 이전에 설정했던 것과는 완전히 분리된다. 즉, 필요에 따라 독립적으로 관리할 수 있게된다.

첫번째 프로젝트와 마찬가지 방식으로 설정해보자.
$ ./manage.py migrate
$ ./manage.py createsuperuser
$ vi secondsite/settings.py
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
$ ./manage.py collectstatic
$ ./manage.py runserver 0.0.0.0:8080
http://server_domain_or_IP:8080
http://server_domain_or_IP:8080/admin

가상환경 종료하기

가상환경 종료를 위해서는 아래 명령어를 입력하면 된다.
$ deactivate

가상환경 종료 후 설정한 가상환경을 다시 불러서 작업을 하기 위해서는 workon 명령어를 사용하면 된다.
$ workon firstsite
또는,
$ workon secondsite
마찬가지로 종료하기 위해서는 deactivate 명령어를 사용하면 된다.

uWSGI 애플리케이션 서버 설정하기

이제 두개의 Django 프로젝트 설정을 마쳤고, uWSGI 설정을 할 준비가 되었다. uWSGI 는 Django 애플리케이션과 WSGI 라는 표준 인터페이스로 통신하는 애플리케이션 서버이다. 우분투에서 Nginx 와 uWSGI 를 설정하느 더 자세한 사항은 여기에서 확인할 수 있다.

uWSGI 설치하기

위에서 제공한 링크와는 다르게, 본 가이드에서는 uWSGI 를 전체시스템에 설치할 것이다. 이렇게 함으로써, 멀티 Django 프로젝트를 관리할때 충돌을 줄여줄 수 있다. uWSGI 를 설치하기 전에 uWSGI 와 의존성이 있는 Python Development 파일을 먼저 아래와 같이 설치해야 한다.
$ sudo apt-get install python-dev
development 파일들이 설치되면, pip 를 통해서 전체시스템에 uWSGI를 설치하자.
$ sudo pip install uwsgi
설치 후 uWSGI를 간단하게 테스트 해볼수 있다. 아래와 같이 첫번째 프로젝트를 테스트해보자.
$ uwsgi --http :8080 --home /home/user/Env/firstsite --chdir /home/user/firstsite -w firstsite.wsgi
여기에서, 가상환경 ~/Env, 프로젝트폴더 firstsite 그리고 프로젝트폴더에 포함된 wsgi.py 파일을 사용할수 있게 uWSGI 에 알려주었다. 위 테스트에서는 8080 포트를 이용해서 HTTP 로 프로젝트를 서비스했고, 도메인 혹은 IP 에 :8080 을 붙여서 브라우저에서 오픈하면 runserver 와 동일하게 Django 사이트가 동작하는 것을 확인할 수 있다.(그렇지만 /admin 의 static 엘리먼트들은 아직 동작하지 않는다.) CTRL-C로 테스트를 종료할 수 있다.

설정파일 생성하기

커맨드라인에서 uWSGI 를 동작시키는 것은 테스트 할때 유용하다. 그렇지만, 실제 배포환경에서는 특별히 도움이 되지 않는다. 그래서 uWSGI 를 독립된 애플리케이션들을 자동으로 관리해주는 "Emperor mode" 로 동작시킬 것이다.

우선, 설정파일을 저장할 폴더를 생성하자. 전체시스템에 적용되어야 하기 때문에 /etc/uwsgi/sites 폴더를 생성하고 설정파일을 저장할 것이다. 폴더를 생성하고 이동하자.
$ sudo mkdir -p /etc/uwsgi/sites
$ cd /etc/uwsgi/sites
위 폴더에 서비스할 프로젝트의 설정파일을 각각 생성해야 한다. uWSGI 프로세스는 다양한 포맷의 설정파일을 가져올수 있지만, 본 가이드에서는 간단하게 .ini 파일을 사용할 것이다.
$ sudo vi firstsite.ini
[uwsgi]
project = firstsite
base = /home/user

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 5

socket = %(base)/%(project)/%(project).sock
chmod-socket = 664
vacuum = true
설정파일의 시작은 무조건 [uwsgi] 로 시작하여야 하고 모든 설정은 이 섹션아래에 있어야 한다. project 이름과 home 폴더는 재사용하기 위해서 변수 project base 로 만들어준다.

chdir 에 프로젝트 경로, home 에 가상환경의 경로를 설정하고, 프로젝트와 어떻게 상호작용할지를 알려준다(프로젝트폴더에 있는 wsgi.py 에서 "application" 을 임포트한다.)

마스터 프로세스와 5개의 워커를 설정해준다.

다음으로, uWSGI 가 어떻게 네트웤을 연결해야할지를 설정한다. 위 테스트에서는 HTTP 와 네트웤 포트를 사용했지만, Nginx 를 역프록시로 사용할 것이기 때문에 더 좋은 옵션이 있다.

모든 모듈들이 하나의 서버에서 동작하기 때문에 네트웤 포트를 사용하는 대신 더욱 안전하고 성능좋은 유닉스소켓을 사용할 수 있다. 유닉스소켓은 HTTP 를 사용하지 않고, 다른 서버와 통신하기 위해 디자인된  바이너리 프로토콜인 uWSGI의 uwsgi 프로토콜을 사용한다. Nginx 는 기본적으로 uwsgi 프로토콜을 사용할수 있기 때문에 유닉스소켓을 사용하는 것이 가장 좋은 선택이라고 볼수있다.

또한 웹서버가 쓰기권한을 가질수 있도록 소켓의 권한을 변경하여야 한다.

마지막으로 서버가 Stop 되었을때 자동으로 소켓파일이 삭제되도록 vacuum 옵션을 준다.

이것으로 첫번째 프로젝트의 uWSGI 설정이 완료되었다.

설정파일에 변수를 사용하는 것의 장점은 재사용하기가 놀랍도록 간단하다는 것이다. 첫번째 프로젝트의 설정파일을 복사해서 두번째 프로젝트의 설정파일로 만들어 보자.
$ sudo cp /etc/uwsgi/sites/firstsite.ini /etc/uwsgi/sites/secondsite.ini
두번째 프로젝트 설정파일을 열고 project 변수의 이름을 두번째 프로젝트의 이름으로 변경해주면 된다.
$ sudo vi /etc/uwsgi/sites/secondsite.ini
[uwsgi]
project = secondsite
base = /home/user

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 5

socket = %(base)/%(project)/%(project).sock
chmod-socket = 664
vacuum = true
이제 두번째 프로젝트 설정파일도 준비되었다.

uWSGI 를 위한 Upstart 스크립트 생성하기

Django 프로젝트를 서비스하기 위해서 필요한 설정파일이 준비되었다. 그렇지만, 아직 자동화된 프로세스는 아니기 때문에 부팅시에 uWSGI를 자동으로 시작시켜주기위한 Upstart 스크립트를 생성할 것이다.

Upstart 스크립트 파일은 /etc/init 폴더에 생성한다.
$ sudo vi /etc/init/uwsgi.conf
description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

setuid user
setgid www-data

exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
uWSGI 서비스를 위한 설명문을 작성하고 자동으로 동작될때의 런레벨을 알려준다. 여기서는 2,3,4,5의 런레벨로 설정한다.

다음으로 프로세스가 어떤 유저와 그룹으로 동작될지를 설정한다. 유저는 지금까지 파일을 생성한 권한이 있는 사용자로 설정을 하도록 하고 그룹은 www-data 로 설정한다. uWSGI 설정파일에서의 소켓설정은 웹서버가 소켓에 쓰기권한을 가지고 있어야 한다.

마지막으로, 실제 실행 명령어를 입력한다. 설정파일이 있는 폴더를 입력하고 uWSGI를 Emperor 모드로 시작한다. uWSGI 가 해당 파일들을 읽고 각 프로젝트를 서비스하게 된다.

완료되면 저장하고 종료하자. Nginx를 설치하기전까지는 www-data 그룹이 없기 때문에 아직 uWSGI 를 시작하지 않는다.

Nginx 설치하기 및 역프록시 설정하기

uWSGI 설정을 마치고 사용할 준비가 되었다. 이제 Nginx를 설치하고 역프록시로 설정해보자.
$ sudo apt-get install nginx
Nginx 가 설치되면 각 프로젝트에 대한 서버블록 설정파일을 만들수 있다. 첫번째 프로젝트에 대한 서버블록 설정파일부터 만들어보자.
$ sudo vi /etc/nginx/sites-avaliable/firstsite
server {
    listen 80;
    server_name firstsite.com www.firstsite.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user/firstsite;
    }

    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/home/user/firstsite/firstsite.sock;
    }
}
첫번째 프로젝트가 접속할 서버 도메인 이름과 포트 숫자를 지정한다. 다음으로, Favicon 이 없어도 오류를 발생시키지 않도록 설정하고, 정적파일의 폴더를 지정한다.
uswgi_pass 를 이용해서 트래픽을 프로젝트 폴더에 있는 firstproject.sock 소켓파일로 전달하도록 지정한다. 또한, include 를 이용해 네트웤 연결 핸들링에 필요한 uwsgi 파라메터를 포함시킨다.

위에서 생성한 설정파일을 복사해서 두번째 프로젝트용 Nginx 설정파일을 만든다.
$ sudo cp /etc/nginx/sites-available/firstsite /etc/nginx/sites-available/secondsite
설정파일을 오픈해서 firstsite 를 secondsite 로 변경하고 server_name 에 사용할 도메인을 입력한다.
$ sudo vi /etc/nginx/sites-avaliable/secondsite
server {
    listen 80;
    server_name secondsite.com www.secondsite.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user/secondsite;
    }

    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/home/user/secondsite/secondsite.sock;
    }
}
다음으로, Nginx 의 sites-enabled 폴더에 위 설정파일들의 링크를 생성한다.
(기본적으로 설정파일들을 만들때는 sites-available 폴더에 만들어 놓고, 서비스를 운영할 때 설정파일들을 sites-enabled 폴더로 링크복사해서 사용한다.)
$ sudo ln -s /etc/nginx/sites-available/firstsite /etc/nginx/sites-enabled
$ sudo ln -s /etc/nginx/sites-available/secondsite /etc/nginx/sites-enabled
Nginx 설정파일이 정상적으로 만들어졌는지 체크해보자.
$ sudo service nginx configtest
설정파일이 문제가 없으면 Nginx 를 재시작해서 설정파일을 다시 로딩한다.
$ sudo service nginx restart
아직 uWSGI 를 시작한적이 없기때문에 uWSGI 역시 동작시킨다.
$ sudo service uwsgi start
이제 전에 만들었던 두 프로젝트 모두에 접근할수 있게 된다. 기대한대로 일반 사이트와 어드민 사이트가 제대로 동작할 것이다.

결론

본 가이드에서, 각각의 가상환경을 가진 두개의 Django 프로젝트를 생성하고 설정했다.  또한 각각의 가상환경을 사용하는 독립적인 프로젝트를 서비스하기 위해 uWSGI 도 설정했다. 그리고나서, 클라이언트 연결을 핸들링하고 클라이언트 리퀘스트에 따라 알맞은 프로젝트를 서비스하는 역프록시 역할의 Nginx 도 설정했다.

Django 는 제공되는 수많은 모듈들로 프로젝트와 애플리케이션 생성을 간단하게 만들어주고, 개발자는 특별한 요소에만 집중할수 있도록 해준다. 본 가이드에서 설명하고 있는 일반적인 툴체인들을 지렛대삼아 싱글서버에서 더욱 쉽게 Django 애플리케이션을 서비스 할수 있길 바란다.

AWS EC2 Instance 에서 whereami 설치 후기

어제(2015년 6월 29일) 아마존 무료계정으로 설치했던 서버에서 놀다가 갑자기 무슨 생각이 들었는지 "whereami"를 타이핑 했더니 그런명령어 없다고 apt-get 으로 설치하랬다.
$ whereami
sudo apt-get install whereami

그래서 아무생각없이 whereami 를 설치했는데, 세상에 설치하다가 도중에 멈추더니 EC2 인스턴스가 그대로 죽어버렸다. 급하게 aws 콘솔로 들어가서 확인했는데 Instance Status 가 1/2 checks passed 라고 나오고 Instance Status Checks 가 패스되지 않는다. (putty 로 접속했는데 계속 network error 가 발생한다.)

구글링해보니 reboot을 해보라고 해서 reboot 을 해봤는데 아무 동작을 하지 않는다. 그래서 할수없이 Instance 를 stop 시키고 다시 start 를 해봤다.(Instance 를 stop 시키니깐, public IP가 변경되버려서 도메인을 다시 설정했다.)

아무리해도 도무지 Instance 가 동작하지 않아서 결국 Instance 를 terminate 시키고 새 Instance 를 생성해야 했다.

아직도 원인이 뭔지 왜 Instance 가 멈췄는지 알수가 없다. aws 포럼에도 비슷한 문제로 질문을 한 사용자가 있는데, 제대로 된 답변이 달려있지 않다.

결론,

AWS EC2 Instance(Ubuntu14.04)에서 whereami 를 절대 설치하지 말자!


2015년 6월 18일 목요일

[CSS] 구글블로거 본문글의 pre 태그에 블럭효과 주기

요즘 Test-Driven Development with Python 이란 책 - (한국어판은 "클린 코드를 위한 테스트 주도 개발")을 보면서 Django 공부를 다시 하고 있는데, 영문판 버전의 경우 웹사이트에서 무료로도 볼수가 있다.

웹사이트의 포스팅 중간에 나오는 블럭이 마음에 들어서 CSS로 따라 만들어보고자 한다.

대략 아래와 같은 느낌의 블럭이다.

pre 태그에 블럭효과 주기

CSS 편집

아래 CSS 를 구글블로거의 디자인 > 템플릿디자이너 > 고급 > 맞춤 CSS 추가 부분에 입력하면 된다.



사용법

본문글을 쓸때 HTML 을 선택하고 사용하고 싶은 부분에 pre 태그로 감싸면 된다. 이때 pre 태그의 class="screen" 값을 넣어주면 된다.(class 명은 변경가능)




Fabric 설치 후 DistributionNotFound 오류수정

Python Django 로 웹서비스 개발을 하는 예제를 따라하는 중에 Fabric 을 사용하여 운영서버(혹은 Staging 서버, 개발서버)에 배포(Deploying) 하는 부분이 나왔길래 책에서 설명하는 그대로 따라했는데, 역시나 한방에 되지를 않는다.


책에서 설명하기를 Fabric 은 Pycrypto에 의존성이 있기때문에 pycrypto 를 먼저 설치해야 되는데 윈도우환경에서는 윈도우용 pycypto 를 먼저 설치하고 Fabric 을 설치하라고 했다.


Fabric depends on pycrypto, which is a package that needs compiling. Compiling on Windows is a rather fraught process; it’s often quicker to try and get hold of precompiled binaries put out there by some kindly soul. In this case the excellent Michael Foord[12] has provided some Windows binaries. (Don’t forget to giggle at the mention of absurd US munitions export controls.)
So the instructions, for Windows, are:
  1. Download and install pycrypto from the previous URL.
  2. pip install Fabric.
Another amazing source of precompiled Python packages for Windows is maintained by Christoph Gohlke.


Fabric의 경우 최신버전이라도 아직 Python 3.x 버전은 지원을 하지 않기 때문에 Python 2.7 버전에 설치를 했다.

$ pip2 install fabric

Fabric을 설치 후 잘 동작하는지 확인을 해보았는데, 에러가 발생했다.

$ fab --help
Traceback (most recent call last):
  File "c:\Python27\Scripts\fab-script.py", line 5, in <module>
    from pkg_resources import load_entry_point
  File "c:\Python27\lib\site-packages\pkg_resources\__init__.py", 
line 3084, in <module> 
    @_call_aside
  File "c:\Python27\lib\site-packages\pkg_resources\__init__.py", 
line 3070, in _call_aside 
    f(*args, **kwargs)
  File "c:\Python27\lib\site-packages\pkg_resources\__init__.py", 
line 3097, in _initialize_master_working_set 
    working_set = WorkingSet._build_master()
  File "c:\Python27\lib\site-packages\pkg_resources\__init__.py", 
line 651, in _build_master
    ws.require(__requires__)
  File "c:\Python27\lib\site-packages\pkg_resources\__init__.py", 
line 952, in require
    needed = self.resolve(parse_requirements(requirements))
  File "c:\Python27\lib\site-packages\pkg_resources\__init__.py", 
line 839, in resolve
    raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'ecdsa>=0.11' 
distribution was not found  and is required by paramiko

Fabric을 실행하는 fab 에서 오류가 발생했다. 어떤오류인지 몰라서 여기저기 구글링을 했는데 pip 를 업그레이드 하면 된다 virtualenv 를 업그레이드 하면 된다고 하는데, 다 해봐도 계속 오류가 발생했다.

역시 해답은 오류 Traceback 안에 있었는데, ecdsa 를 설치(혹은 업그레이드)하니깐 오류가 발생하지 않았다.

$ pip2 install ecdsa
Downloading/unpacking ecdsa
Installing collected packages: ecdsa
Successfully installed ecdsa
Cleaning up...




2015년 5월 27일 수요일

훌륭한 프로그래머가 더 훌륭해지기 위한 방법 - 4단계

전문적인 개발자가 될수 있도록 노력한다.

훌륭한 프로그래머는 더 훌륭해지기 위한 방법을 지속적으로 찾는다. 우리 회사와 다른 회사에서는 다음과 같은 전문적인 개발 단계들을 고려한다.


1단계 초보자란 한가지 언어의 기본적인 기능들을 사용할 수 있는 프로그래머를 말한다. 초보자는 클래스와 루틴, 루프, 조건문을 작성할 수 있으며 해당 언어의 많은 기능들을 사용할 수 있다.

2단계 입문 초보 단계를 넘어온 중급 수준의 프로그래머는 여러 언어의 기본적인 기능들을 사용할 수 있으며 적어도 한 가지 언어를 능숙하게 다룬다.

3단계 유능한 프로그래머는 한 가지 언어나 환경 또는 둘 다에 전문적 기술을 갖고 있다. 이 단계에 있는 프로그래머는 J2EE의 모든 복잡한 부분들을 알고 있거나 Annotated C++ Reference Manual을 암기하고 있을 것이다. 이 단계에 있는 프로그래머들은 회사에서 중요한 위치에 있게 되는데, 많은 개발자들이 이 단계를 넘어서질 못한다.

4단계 리더는 3단계 프로그래머에 대한 전문적인 지식을 갖고 있다. 그리고 프로그램에서 컴퓨터와의 의사 소통은 오직 15%뿐이며 85%가 사람과의 의사 소통임을 알고 있다. 일반적인 프로그래머는 30% 정도만 혼자서 일한다(McCue 1978). 심지어는 그보다 더 적은 시간을 컴퓨터와 작업하는 데 보낸다. 전문가는 기계보다는 사람을 위해서 코드를 작성한다. 진정한 전문가 수준의 프로그래머는 보석처럼 명확한 코드를 작성하며 문서화한다. 그들은 한 줄의 주석으로 표현하여 이해할 수 있는 코드의 로직을 재작성하느라 머리를 쓰고 싶어하지 않는다.


"어떤 바보라도 자신의 실수에 대해서 정당성을 주장할 수 있으며 
대부분의 바보들이 그렇게 한다."   
- Dale Carnegie -


"전체 개발시간의 10%가 코드 작성의 90%를 차지하며, 
나머지 10%가 개발시간의 90%를 차지한다"  
- Tom Cargill -



출처: CODE COMPLETE SECONDE EDITION, Part7 소프트웨어 장인정신 p1126    - 스티브 맥코넬 저 -

파이썬에서 한글 사용하기

한글이 들어있는 파이썬 소스를 윈도우 커맨드 창(또은 리눅스 쉘)에서 그냥 실행하면 이런 에러가 뜨게 된다.

E:\python>python int2base.py
  File "int2base.py", line 11
SyntaxError: Non-ASCII character '\xc5' in file int2base.py on line 11, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

이때는 파이썬 소스의 처음부분(1,2번째줄)에 # -*- coding: cp949 -*-  을 추가하면 된다.

추가로 유닉스 계열 운영체제를 사용할때는 #!/usr/bin/python를 첫줄에 붙이면 실행파일 속성을 주고 바로 파이썬코드를 실행할수 있다.

2015년 5월 14일 목요일

구글블로거(Blogger)에 Syntax Highligher 추가하기

요즘 티스토리에서 구글블로그로 넘어와서 포스팅을 시작했는데, Syntax Highlighting 기능이 없어서 일반 텍스트로 넣었었는데, 혹시나 하고 검색해보니 역시나 해결방법이 있었다.
기본적으로 SyntaxHighlighter.css 파일과 js 파일들을 등록해놓고 사용할 수 있다.

SyntaxHighlighter.css 파일 입력

1) 디자인 -> HTML편집 -> <b:skin></b:skin> 사이에 입력
2) 디자인 -> 템플릿디자이너 -> 고급 -> CSS추가 에 입력



JS 파일 인클루드

<head></head> 사이에 입력.
</head> 태그 바로 앞에 입력하면 된다.



스크립트 붙여넣기

<body></body> 사이에 입력.
</body> 태그 바로 앞에 입력하면 된다.



사용하기

글쓰기할때 HTML 편집모드로 해서 pre나 textarea 태그로 감싸면 된다.

참고로, HTML 코드를 넣기 위해서는 "<" 를 "&lt;", ">" 를 "&gt;" 로 변경하고 입력하면 된다.


지원언어

class 속성값으로 입력할 수 있는 언어
언어class
C/C++cpp, c, c++
C#c#, c-sharp, csharp
CSScss
Delphidelphi, pascal
Javajava
Java Scriptjs, jscript, javascript
PHPphp
Pythonpy, python
Rubyrb, ruby, rails, ror
Sqlsql
VBvb, vb.net
XML/HTMLxml, html, xhtml, xslt



출처: http://anshnote.blogspot.kr/2011/07/syntax-highlighter-blogger.html?showComment=1431567335717#c3433844348594219144

해외송금을 위한 시티은행 영문 계좌정보

해외송금을 위해서는 기본적으로 은행계좌의 영문정보가 필요하다. 여기서 중요한 게 SWIFT 코드인데 이 코드를 통해 은행으로 직접적인 송금이 이루어 진다고 한다.

예전에 만들어 둔 한국시티은행 계좌에 대한 정보이다.

은행명: CITIBANK KOREA INC
주소: #24, CHUNGGAECHEONRO, JUNG-GU, SEOUL, KOREA 100-180 C.P.O. Box 3949
SWIFT: CITIKRSX
IBAN: 한국시티은행은 IBAN 이나 short 코드 대신에 SWIFT 를 사용함. 입력할 필요 없음.


아래는 우리나라 은행들에 대한 SWIFT 코드표이다.
IDBank or InstitutionCityBranchSwift Code
1AGRICULTURAL BANK OF CHINA SEOUL BRANCHSEOULABOCKRSE
2AUSTRALIA AND NEW ZEALAND BANKING GROUP LIMITEDSEOULANZBKRSX
3BANCO BILBAO VIZCAYA ARGENTARIA SA.SEOULBBVAKRSE
4BANK OF AMERICA, N.A. SEOUL BRANCHSEOULBOFAKR2X
5BANK OF CHINA SEOUL BRANCHANSAN(ANSAN BRANCH)BKCHKRSEANS
6BANK OF CHINA SEOUL BRANCHDAEGU(DAEGU BRANCH)BKCHKRSEDAE
7BANK OF CHINA SEOUL BRANCHINCHEON(INCHEON BRANCH)BKCHKRSEICN
8BANK OF CHINA SEOUL BRANCHSEOUL(GURO BRANCH)BKCHKRSEGRO
9BANK OF CHINA SEOUL BRANCHSEOUL(GURO BRANCH)BKCHKRSEGUR
10BANK OF CHINA SEOUL BRANCHSEOULBKCHKRSE
11BANK OF COMMUNICATIONS CO. LTD SEOUL BRANCHSEOUL(SEOUL BRANCH (RMB CLEARING BANK))COMMKRSE888
12BANK OF COMMUNICATIONS CO. LTD SEOUL BRANCHSEOULCOMMKRSE
13BANK OF KOREASEOULBOKRKRST
14BANK OF KOREA, THESEOULBOKRKRSE
15BANK OF NOVA SCOTIA, THE, SEOUL BRANCHSEOULNOSCKRSE
16BANK OF TOKYO-MITSUBISHI UFJ, LTD., THESEOUL(SEOUL BRANCH)BOTKKRSX
17BARCLAYS BANK PLC, SEOUL BRANCHSEOULBARCKRSE
18BNP PARIBAS SEOUL BRANCHSEOULBNPAKRSE
19BUSAN BANKBUSANPUSBKR2P
20BUSAN BANKMASAN(MASAN BRANCH)PUSBKR2PMAS
21BUSAN BANKSEOUL(INTERNATIONAL DEPARTMENT SEOUL)PUSBKR2PINT
22BUSAN BANKSEOUL(SEOUL BRANCH)PUSBKR2PSEL
23CHEIL INDUSTRIES INC.UIWANG-SICIISKR22
24CHEIL WORLDWIDE, INCSEOULCIWWKRSE
25CHINA CONSTRUCTION BANK SEOUL BRANCHSEOULPCBCKRSE
26CITIBANK KOREA INCSEOUL(WORLDLINK OPERATION)CITIKRSXWLS
27CITIBANK KOREA INCSEOULCITIKRSX
28CONSTRUCTION GUARANTEE COOPERATIVESEOULKCGCKRSE
29CREDIT AGRICOLE CIBSEOULCRLYKRSE
30CREDIT SUISSE AG, SEOUL BRANCHSEOULCRESKRSE
31CREDIT SUISSE SECURITIES (EUROPE) LIMITED, SEOUL BRANCHSEOULCSFBKRSE
32DAEGU BANK, LTD.,THEDAEGUDAEBKR22
33DAEGU BANK, LTD.,THESEOULDAEBKR22SEL
34DAEWOO SECURITIES CO., LTD.SEOULDWSEKRSE
35DAIMLER TRUCKS KOREA LTD.SEOULDTKRKRSE
36DAISHIN SECURITES CO., LTDSEOULDSSCKRSE
37DBS BANK LTD, SEOUL BRANCHSEOUL(SEOUL BRANCH)DBSSKRSEIBD
38DBS BANK LTD, SEOUL BRANCHSEOULDBSSKRSE
39DEUTSCHE BANK AG, SEOUL BRANCHSEOULDEUTKRSE
40DEUTSCHE BANK AG, SEOUL BRANCHSEOULDEUTKRSEF4C
41ELAND WORLD LIMITEDSEOULELGTKRSE
42GOLDMAN SACHS (ASIA) L.L.C. SEOUL BRANCHSEOULGSALKRSE
43GOLDMAN SACHS INTERNATIONAL BANK, SEOUL BRANCHSEOULGSIBKRSE
44HANA BANKSEOULHNBNKRSE
45HANA BANKSEOULHNBNKRSETCS
46HANA DAETOO SECURITIESSEOULHNDTKRSE
47HANWHA LIFE INSURANCESEOULHWLIKRSE
48HONGKONG AND SHANGHAI BANKING CORPORATION LIMITED, THEBUSAN(BUSAN BRANCH)HSBCKRSEBSN
49HONGKONG AND SHANGHAI BANKING CORPORATION LIMITED, THESEOULHSBCKRSE
50HONGKONG AND SHANGHAI BANKING CORPORATION LIMITED, THESEOULHSBCKRSEC
출처: http://www.theswiftcodes.com/south-korea/