1. 일단 우분투 컨테이너와 Nginx의 포트를 모두 포트포워딩 하자.

- docker-compose.yml 파일의 설정을 바꿔서 포트포워딩을 설정해야한다.

- 다음과 같이 파일을 수정할 수 있게 vim으로 연다

vim /opt/redash/docker-compose.yml

 

- 마지막 부분의 Nginx 설정에서 "443:443" 포트포워딩 설정을 아래와 같이 추가해준다

- 수정을 마치고 :wq!로 파일을 저장하고 나온다.

  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - server
    links:
      - server:redash
    restart: always

 

- docker-compose.yml 파일이 있는 경로로 이동하고, docker compose로 설정이 변경된 컨테이너를 다시 띄운다.

- 설정이 변경되지 않은 컨테이너는 재생성 되지 않고 Nginx 컨테이너만 다시 생성될 것이다.

1. 경로로 이동해서 Nginx 컨테이너를 다시 실행
cd /opt/redash
COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d


2. 컨테이너 재생성 후 docker-compose ps 입력 후 아래와 같은 화면이 나오는지 확인

          Name                         Command               State                    Ports                  
-------------------------------------------------------------------------------------------------------------
redash_adhoc_worker_1       /app/bin/docker-entrypoint ...   Up      5000/tcp                                
redash_nginx_1              nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
redash_postgres_1           docker-entrypoint.sh postgres    Up      5432/tcp                                
redash_redis_1              docker-entrypoint.sh redis ...   Up      6379/tcp                                
redash_scheduled_worker_1   /app/bin/docker-entrypoint ...   Up      5000/tcp                                
redash_scheduler_1          /app/bin/docker-entrypoint ...   Up      5000/tcp                                
redash_server_1             /app/bin/docker-entrypoint ...   Up      0.0.0.0:5000->5000/tcp


3. redash_nginx_1의 Ports가 아래와 같으면 설정 성공
0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

 

- 시험삼아 http://my.example.domain:80으로 접속하면 redash 웹페이지가 나타나는 것을 확인할 수 있다.

- 또한 http://my.example.domain으로 접속해도 동일한 페이지가 나타난다.

 

 

 

2. Nginx 컨테이너로 접근하여 세팅을 진행하자

- 원활한 세팅을 위해 nginx 컨테이너에서 직접 세팅을 한다.

- nginx 설정 파일 수정을 위해 vim도 설치해주자

1. Nginx 컨테이너로 진입
docker exec -itu 0 redash_nginx_1 bash

2. vim 설치
apt-get update
apt-get install vim

3. Nginx 설정 파일이 있는 폴더로 이동
cd /etc/nginx

 

 

 

3. 테스트용 SSL 인증서 생성

- 간단한 연습을 위해 SSL 인증서와 도메인을 구매할 수는 없다.

- openssl이 설치되어 있다면 아래의 명령어로 자체 서명된 인증서를 생성할 수 있다.

- 물론 자체 서명이므로 보안성이 전혀 없으니 연습용으로만 사용할 수 있으니 실제 적용에는 인증서를 꼭 구매해야한다.

1. 인증서를 생성하여 저장할 폴더를 생성하고 폴더로 진입
mkdir self_cert_ssl_files
cd self_cert_ssl_files

2. openssl로 자체서명 인증서 생성
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365

3. 입력을 요청하는 정보는 정확히 입력할 필요는 없으니 참고
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (e.g. server FQDN or YOUR name) []:test
Email Address []:test@test.test

4. cert.pem 과 key.pem 파일이 생성되었는지 확인하자

 

 

 

4. 80번 포트와 443 포트 설정

- 80번 포트는 http 접속, 443번 포트는 https 접속인 것을 기억할 것이다.

- 이제 Nginx의 설정을 변경해서 80번 포트와 443번 포트에 대한 접속 설정을 해보자.

vim /etc/nginx/conf.d/default.conf

 

- 연습삼아 redash 공식 홈페이지의 설정을 일부 수정하여 적용해보자

- 아래의 설정을 default.conf 파일에 적용하자

- 아래의 설정은 80번 포트로 접속하는 경우 403 에러가 나도록 설정하고, 443번 포트로 접속하는 경우 SSL을 적용하는 설정이다.

https://redash.io/help/open-source/admin-guide/https-ssl-setup

server {
  listen   80 default;
  return 403;
}

server {
  listen 443 ssl;

  ssl on;
  ssl_certificate /etc/nginx/self_cert_ssl_files/cert.pem;
  ssl_certificate_key /etc/nginx/self_cert_ssl_files/key.pem;


  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

  access_log /var/log/nginx/redash.access.log;

  gzip on;
  gzip_types *;
  gzip_proxied any;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://redash;
    proxy_redirect   off;
  }
}

 

- 설정 파일에 문제가 없는지 테스트를 해보고, Nginx에 설정을 적용한다.

1. 터미널에 nginx -t 입력하여 메세지 확인

2. 설정이 정상이라면 아래와 같은 출력 값이 뜬다.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

3. Nginx를 끄지 않고 설정을 적용할 수 있다.
service nginx reload

4. 정상적으로 적용 됐다면 아래와 같은 출력 값이 뜬다.
[ ok ] Reloading nginx: nginx.

 

 

 

5. 80번과 443번에 해당하는 주소로 접속해보자

- http://my.example.domain으로 접속하면 아래와 같은 화면을 볼 수 있다.

- 위의 설정 파일에서 return 403으로 403에러가 발생하도록 설정했기 때문이다.

 

- 이번엔 https://my.example.domain으로 접속해보자.

- 위의 설정 파일에서 SSL을 적용하고 5000번 포트에 띄워진 리대시 웹페이지로 가도록 설정되었기 때문에 도메인 주소로 접속이 된다.

- 하지만 정상적으로 인증되지 않은 자체 서명 인증서이므로 아래와 같은 화면이 뜬다.

- 정상적인 인증서로 설정하는 경우 홈페이지로 접속하는 화면을 확인할 수 있으니 실제 적용에는 올바른 인증서를 사용해보자.

 

- 마지막으로 80번 포트에서 403에러가 발생하는 것이 아닌 https가 적용된 주소로 리다이렉팅하는 설정은 아래와 같다.

- http://my.example.domain으로 접속하면 https://my.example.domain으로 접속되는 것을 확인할 수 있다.

server {
  listen   80 default;
  return 301 https://my.example.domain;
}

server {
  listen 443 ssl;

  ssl on;
  ssl_certificate /etc/nginx/self_cert_ssl_files/cert.pem;
  ssl_certificate_key /etc/nginx/self_cert_ssl_files/key.pem;


  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

  access_log /var/log/nginx/redash.access.log;

  gzip on;
  gzip_types *;
  gzip_proxied any;

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass       http://redash;
    proxy_redirect   off;
  }
}

 

 

 

6. Nginx 설정은 이게 끝이 아니다.

- 예시로 나온 설정은 아주 간단한 예시이다.

- 특정 도메인 주소로만 접근할 수 있도록 하거나, SSL protocol을 다른 방식을 적용하는 등의 추가 설정이 반드시 필요하다.

- 제공할 서비스의 보안 사항에 따라 적절한 세팅 값을 추가하고 변경하여 적용하자.

- 세부적인 Nginx의 설정은 redash 구축 범위에서 벗어나므로 Nginx를 따로 포스팅 하게 되면 상세히 적어보도록 하겠다.

1. 이전에 열어둔 80번 포트와 443번 포트는 어디에 사용하나요?

- 우리가 접속하는 글자로 된 도메인은 사실 모두 ip주소가 있다.

- 예를 들어 네이버는 223.130.200.107라는 ip주소가 존재한다.

- 하지만 인터넷 브라우저에서 접속을 하게 되면 https://naver.com으로 다시 접속되는 것을 확인할 수 있다.  

- 그리고 http://223.130.200.107로 접속을 시도해보면, https://naver.com으로 다시 접속되는 것을 확인할 수 있다. 

- https는 암호화된 통신을 할 수 있는 기능이라고 생각하면 간단하며, 보안을 위해 적용하는 것이라고 생각하면 된다.

- 결론적으로 포트 번호가 없는 http와 https 도메인을 사용할 수 있도록 하는 포트가 80번과 443번 포트이다.

 

 

 

2. 뭔말인지 잘 모르겠어요.

- 직접 우리가 실습 중인 redash로 확인해보자

- 일단 좀 더 직관적인 도메인 실습을 위해 localhost가 아닌 임의의 도메인을 등록해보도록 하자.

1. 아래의 방식으로 파일에 관리자 권한에 접근한다
윈도우즈는 C:\Windows\System32\drivers\etc\hosts (텍스트 편집기를 사용해 관리자 권한으로 연다)
맥OS는 sudo vim /private/etc/hosts
우분투는 sudo vim /etc/hosts


2. 임의의 도메인 이름을 설정하고 저장한다.
127.0.0.1 localhost 라고 설정된 것 처럼
127.0.0.1 my.example.domain 과 같은 임의의 도메인을 설정한다.

 

- 이렇게 설정한 이후 127.0.0.1:5000, localhost:5000, my.example.domain:5000으로 접속해서 동일한 페이지가 뜨는 것을 확인할 수 있다.

설정한 임의의 도메인으로도 접속할 수 있다.

 

 

 

3. 80번 포트로 접속해보자 - http 접속

- 이번에는 127.0.0.1:80, localhost:80, my.example.domain:80

- 5000이 주소에 보였던 것과 달리 127.0.0.1, localhost, my.example.domain만 주소창에 나타나는 것을 볼 수 있다.

- 이처럼 80번 포트는 기본적으로 포트 번호가 숨겨진 것을 알 수 있다.

- 그리고 크롬에서 확인해보면 보안 연결인 https가 적용되지 않은 http로 접속한 것을 확인할 수 있다.

보안이 중요한 사이트인 경우 https로 접근하도록 설정해야한다.

 

 

 

4. 443 포트로 접근은 다음 글에서 실습해보도록 하겠다.

- https 접근을 위해서는 SSL 인증서를 구입해야한다.

- 하지만 실습을 위해 도메인과 SSL 인증서를 구입할 수는 없으니 연습용 인증서를 사용해 실습할 것이다.

- 정상적인 접근 화면은 확인할 수 없지만 Nginx를 통해 80번 포트로의 접근을 443포트로 보내주는 설정 등을 실습하여 안전한 대시보드 환경을 만들어보도록 하자!

1. 기본적인 시각화 생성과 대시보드 생성

- 역시나 오픈소스라서 이런저런 정보가 국내에는 많이 없다.

- 현업에서 지표를 보는 용도 정도로는 일부 세부 기능만 사용해도 괜찮다.

- 시각화의 일반적인 설정 예시와 대시보드에 시각화를 배치하는 연습을 해보자!

 

 

 

2. 시각화 생성

- 이전에 활용한 classicmodel 데이터 베이스에서 임의의 통계치를 조회해보았다.

SELECT date_format(orderDate, "%Y-%m") AS order_month,
       count(*) AS order_month_count
FROM orders
GROUP BY order_month

 

- 조회된 테이블에 있는 New Visualization를 눌러서 시각화를 해보자

라이언이 귀여워서 라이언으로 New Visualization을 표시해보았다.

 

- 아래와 같은 에디터에서 시각화 설정을 할 수 있다.

(1) 시각화 선택에서 box, chart, map 등의 다양한 시각화 방식을 선택할 수 있다.

(2) 생성한 시각화에 이름을 설정할 수 있다.

(3) 각 시각화 방식에 따라 세부 설정할 수 있는 옵션이 다르게 나오니 직접 실습해보자.

 

- 세부 설정을 통해 시각화 색상/범례/수치표시 등의 설정을 변경할 수 있다

옵션 설정의 설명이 영어로 되어 있지만 난이도가 높지 않다.

 

- Pivot Table을 활용한 시각화는 직접 만들어보도록 하자.

- 아래의 쿼리를 사용해서 만들면 아래의 GIF와 동일한 기능을 할 수 있는 통계치를 뽑을 수 있다.

SELECT date_format(orderDate, "%Y-%m") AS order_month,
       status,
       count(*) AS status_count
FROM orders
WHERE orderDate BETWEEN '{{날짜.start}}' AND '{{날짜.end}}'
GROUP BY order_month,
         status

 

- '{{날짜}}'와 같은 방식으로 파라미터를 설정하여 사용자가 임의의 날짜를 선택할 수 있도록 할 수 있다.

- 대시보드에 시각화를 넣으면 대시보드에서 날짜를 조절하는 등의 기능을 그대로 사용할 수 있다.

파라미터를 설정하고 톱니바퀴를 누르면 Type을 설정할 수 있다.

- 글로 설명하기 어려워서 GIF 파일을 사용했다.

- 다양한 통계치를 뽑는 방식이 있으니 실습해보자.

컬럼을 이동시켜 축에 배치할 수 있고 다양한 통계치를 선택할 수 있다.

 

 

 

3. 대시보드 생성

- Dashboard로 진입하여 대시보드를 생성할 수 있다.

- 우측 하단의 Add Textbox를 누르면 마크다운이 가능한 텍스트 위젯을 생성할 수 있고, Add widget를 누르면 미리 생성한 시각화를 배치할 수 있다.

- 작성한 쿼리와 시각화를 선택해서 Add to Dashboard를 통해 시각화를 배치해보자.

쿼리와 시각화 이름을 확실히 정해두면 대시보드를 구성할 때 도움이 된다.
왼쪽 상단의 날짜의 수치를 변경해서 다양한 기간의 시각화 결과를 확인할 수 있다.

 

 

 

4. 대시보드 위젯 설정

- Add widget으로 시각화를 대시보드에 배치할 때 Value Source 설정을 변경할 수 있다.

- 변경할 수 있는 파라미터를 여러개 생성하거나 위젯에 종속시켜 각각 다르게 수치를 변경할 수 있다.

(1) New dashboard parameter로 새로운 파라미터 key를 생성할 수 있다.

(2) Existing dash dashboard parameter로 미리 작성한 위젯의 key를 같이 사용할 수 있다.

(3) Widget parameter로 해당 위젯에만 독립적으로 사용되는 파라미터를 생성할 수 있다.

(4) Static value로 설정한 파라미터 값으로 나온 결과를 보여주는 위젯을 생성할 수 있다.

2~3개의 시각화를 작성해두고 사용해보면 어렵지 않게 습득할 수 있다.

 

 

 

5. 공식 홈페이지의 설명도 확인해보자

- 국내에는 자료가 없어서 parameter 사용법은 redash 공식 홈페이지의 가이드로 확인해서 습득하였다.

- 세세한 사용 방법은 역시 검색과 실습 밖에 없다!

- 기본적인 사용법의 설명은 이번 포스팅으로 끝이다.

- 다음으로는 ldap과 같은 로그인 방식의 적용, Nginx를 활용한 https로의 접속 방식 설명을 적어보도록 하겠다.

1. 계정 생성 후 해야할 기본적인 세팅

- 설치 후 첫 화면에서 해봐야할 것들을 간단하게 링크로 제시해주고 있다.

- 우측 상단의 설정 아이콘을 통해 모든 세팅에 접근할 수 있으니 우측 상단의 세팅 버튼을 애용하자.

Let's get started의 순서로 세팅을 진행해보자

 

 

 

2. Data Source - 데이터베이스를 연결

- 일반적인 데이터베이스나 파일시스템을 연결해서 사용할 수 있다.

- 포스팅에서는 Mysql 예제DB인 classicmodels를 사용했다.

- New Data Source 버튼을 클릭해서 mysql을 검색하여 선택하면 아래와 같은 세팅 화면이 나온다.

- 하나의 Data Source에는 하나의 데이터 베이스만 연결할 수 있으니 데이터베이스명을 꼭 명시하도록 하자.

- 127.0.0.1 이나 localhost로 접근이 안되는 경우 할당된 ip를 확인하여 입력해보자.

- 연결이 완료 되었다면 좌측 상단의 Queries로 진입해서 쿼리작성과 시각화를 해보자.

New Data source 버튼으로 진입해서 일반적인 DB연결 과정을 진행하면 된다.

 

 

 

3. Queries - 쿼리 결과 조회와 시각화

- 쿼리를 작성하고 결과를 볼 수 있다.

- 조회된 쿼리로 바로 시각화를 할 수 있다.

- 쿼리 결과가 보이는 창에 있는 New Visualization으로 시각화를 할 수 있다.

일반적인 쿼리 작업 환경과 동일하다.

 

- {{}}를 쿼리에 삽입하여 parameter를 설정할 수 있다.

- 해당 기능을 삽입한 쿼리로 대시보드를 구성하면 대시보드를 조회하는 사용자가 인자를 직접 입력할 수 있다.

- 아래의 링크에서 세부 사용법을 알 수 있으니 참고!

- https://redash.io/help/user-guide/querying/query-parameters

대시보드 조회자에게 매우 유용한 기능이다.

- Visualization Type에서 다양한 시각화를 선택할 수 있다.

- 일반적인 시각화 방식과 동일하니 기능을 사용해보며 익혀보자.

일반적인 bar chart
워드 클라우드도 가능하다!

- Pivot Table의 기능이 상당히 좋은 편이다.

- Pivot Table에서 다양한 group by 조건을 GUI에서 수행할 수 있다.

- 다만 데이터가 너무 많으면 결과 조회에 많은 시간이 들어가며 컴퓨터 자원도 많이 소모하니 주의해서 사용하자.

컬럼명을 X축이나 Y축으로 이동시켜 사용할 수 있고, 히트맵 등의 시각화 기능을 제공한다.

 

 

 

4. Dashboards - 쿼리 결과와 시각화를 대시보드에 적용

- Queries에서 작성하고 Publishing한 저장된 쿼리 테이블과 시각화를 GUI환경에서 배치하여 대시보드를 생성할 수 있다.

- 우측 하단의 Add Widget을 통해 추가할 수 있으며, 배치 후에 크기와 위치를 조정할 수 있다.

위젯을 모두 배치한 후에는 대시보드도 Publish를 해야 권한이 있는 사용자에게도 대시보드가 노출된다.

 

 

5. 세세한 사용 방법은 공홈의 가이드를 확인해보자.

- 위의 기능 정도면 기본적인 대시보드 기능을 사용할 수 있다.

- 세부적인 세팅 변경이나 기능들은 공홈에 많은 가이드가 있으니 확인해보자.

- 대시보드의 세부 기능은 다음 글로 좀 더 세세하게 풀어보도록 하겠다.

1. docker로 구축하는 이유가 있나요?

- redash 공식 홈페이지에서 초보자를 위해 도커로 시스템을 구축해주는 스크립트를 추천합니다.

- 그리고 기본적인 설정을 잡아주기 때문에 DB연결 등의 세부적인 작업이 필요 없습니다.

- 또한, redash 백엔드를 도커이미지로 유지하고 DB등은 직접 구축한 DB로도 변경할 수 있습니다.

- 그리고 제일 좋은 것은 구동 환경을 다 잡아둔 도커 이미지를 쓰기 때문에 환경 설정 시간이 거의 없습니다.

 

 

 

2. 환경 설명과 도커를 활용한 실습 준비

(1) 실습을 위한 기본 설명

- 도커를 기본적으로는 사용하실 수 있어야 합니다(도커 사용법도 따로 정리해서 추가하겠습니다).

- 편의를 위해서 우분투에서 systemctl 관련 세팅이 잘 되어있는 이미지를 사용합니다. 일반 우분투 이미지를 사용하면 현재 연습을 위한 환경 구축에서 도커가 잘 실행되지 않는 경우가 있었습니다.

- 결론적으로 컨테이너 내부에 다시 컨테이너들을 구축하는 경우입니다.

- 물론 자체적으로 우분투에서 구축하셔도 상관없습니다. 다만 윈도우 유저나 우분투 18.04에서의 구축을 추천하는 Redash 홈페이지 안내문에 따라 위의 방식을 택하였으니 참고해주세요.

그림으로 표현하자면 이런 구조에서 구축 실습을 하게 됩니다.

 

(2) 우분투 18.04 컨테이너 생성

- 모든 작업은 윈도우즈 cmd, 리눅스나 맥의 terminal 기반으로 설명합니다.

docker pull jrei/systemd-ubuntu:18.04
docker run -d -p 5000:5000 -p 80:80 -p 443:443 --name redash_test --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro jrei/systemd-ubuntu:18.04

- 생성한 컨테이너의 이름은 redash_test, 로컬호스트의 5000, 80, 443번 포트와 컨테이너의 5000, 80, 443번 포트를 포트포워딩 했습니다.

- Redash 서버가 기본적으로 5000번포트로 띄워지고, 우리에게 익숙한 포트 번호가 없는 도메인으로 접속하기 위한 80번 포트와 SSL 적용을 위한 443 포트 또한 포트포워딩했습니다.

- 80번 포트와 443 포트의 사용은 아직 이해하지 않으셔도 되고, 추후 Nginx를 설정 설명에서 이해하시면 됩니다.

 

(1) 터미널에서 컨테이너 상태 확인
docker ps -a

(2) 결과가 아래와 같아야 정상 작동하는 것
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                    NAMES
c7dcfad7ca41   jrei/systemd-ubuntu:18.04   "/lib/systemd/systemd"   5 minutes ago   Up 5 minutes   0.0.0.0:5000->5000/tcp   redash_test

(3) 수월한 설치를 위해 sudo 권한으로 컨테이너에 진입
docker exec -itu 0 redash_test bash

- 위의 과정 중에 docker exec -itu 0 rehasd_test bash의 -it는 익숙하지만 -itu 0가 익숙하지 않을 수 있습니다.

- u 0는 sudo 권한을 컨테이너 내에서 사용할 수 있게 하는 설정입니다.

- Redash 설치 스크립트에 sudo 권한을 요구하는 과정이 많으니 편의를 위해 꼭 sudo 권한을 사용할 수 있도록 설정합시다.

 

 

 

3. 설치 세부 과정

(1) Redash 스크립트 설치와 설치에 필요한 환경 설정

- 필수로 필요한 우분투 패키지를 설치하고 설치 스크립트를 가져옵니다.

- 기존에 도커와 도커컴포즈가 설치된 시스템에서 설치를 해보시는 경우 도커 버전이 변경될 수 있으니 주의하세요!

(1) 필요한 우분투 패키지 설치
apt-get update
apt-get install sudo
apt-get install git
apt-get install vim

(2) 설치 스크립트를 가져옵니다
git clone https://github.com/getredash/setup.git
cd setup

- (선택사항)도커 설치가 필요 없는 분은 setup.sh파일의 마지막 부분의 install_docker 부분을 삭제하시면 됩니다.

 

(2) 설치 진행과 발생할 수 있는 오류 설명

- 설치 파일의 권한을 변경하고 설치 스크립트를 실행합니다.

sudo chmod +x setup.sh
sudo ./setup.sh

- 일반적으로 첫번째로 볼 수 있는 에러는 아래와 같습니다.

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0   1019      0 --:--:-- --:--:-- --:--:--  1018
100 11.2M  100 11.2M    0     0  2939k      0  0:00:03  0:00:03 --:--:-- 5165k
--2022-04-22 06:13:04--  https://raw.githubusercontent.com/getredash/setup/master/data/docker-compose.yml
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1076 (1.1K) [text/plain]
Saving to: 'docker-compose.yml'

docker-compose.yml            100%[=================================================>]   1.05K  --.-KB/s    in 0s

2022-04-22 06:13:04 (64.1 MB/s) - 'docker-compose.yml' saved [1076/1076]

ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

- 에러메세지 설명대로 도커가 실행되지 않은 경우에 발생합니다.

- 도커를 실행하고 다시 setup 스크립트를 실행합니다.

(1) docker가 켜져있는지 확인
service --status-all

(2) 실행되지 않았다면 아래처럼 [-] 표시가 있음
 [ - ]  apparmor
 [ - ]  cron
 [ + ]  dbus
 [ - ]  docker
 [ - ]  hwclock.sh
 [ - ]  procps
 [ + ]  unattended-upgrades
 
 (3) 도커를 실행
 service docker start
 
 (4) service --status-all로 다시 확인하고 실행되었다면 [+]로 표시됨
 [ - ]  apparmor
 [ - ]  cron
 [ + ]  dbus
 [ + ]  docker
 [ - ]  hwclock.sh
 [ - ]  procps
 [ + ]  unattended-upgrades
 
 (5) 설치 스크립트를 다시 실행
 sudo ./setup.sh

- 완전히 설치가 됐다면 아래와 같은 메세지를 확인할 수 있습니다.

redash_postgres_1 is up-to-date
redash_redis_1 is up-to-date
Creating redash_server_1           ... done
Creating redash_scheduler_1        ... done
Creating redash_scheduled_worker_1 ... done
Creating redash_adhoc_worker_1     ... done
Creating redash_nginx_1            ... done

- 가끔씩 이 과정에서 time out error라는 문구와 함께 컨테이너가 일부만 생성되거나 하는 문제가 발생하는데, docker-compose의 HTTP 테스트시간이 짧게 설정되어 있어서 발생하는 문제입니다.

- 아래와 같은 과정으로 일반적으로 해결할 수 있습니다.

(1) 깨끗하게 설치하기 위해 설치되다가 멈춘 컨테이너를 삭제
docker-compose down

(2) 도커 컴포즈의 HTTP 테스트 시간을 200초 까지 늘려서 다시 생성
sudo COMPOSE_HTTP_TIMEOUT=200 docker-compose up -d

- 도커 컴포즈 설정 파일이 있는 폴더로 이동하여 정상적으로 Redash 시스템이 구축되었는지 확인합니다.

- docker-compose.yml파일에 docker-compose.yml.1와 같이 숫자가 붙은 파일들이 많이 있을텐데 반복된 설치 스크립트 실행으로 생긴 것이니 docker-compose.yml을 제외한 yml 파일은 삭제하시면 됩니다.

(1) Redash 시스템 구성과 관련된 파일들이 있는 디렉토리로 이동
cd /opt/redash

(2) 도커 컴포즈에서 Redash 시스템 구성이 잘 되었는지 확인
docker-compose ps -a

(3) 아래와 같이 나오면 성공
          Name                         Command               State              Ports
------------------------------------------------------------------------------------------------
redash_adhoc_worker_1       /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_nginx_1              nginx -g daemon off;             Up      443/tcp, 0.0.0.0:80->80/tcp
redash_postgres_1           docker-entrypoint.sh postgres    Up      5432/tcp
redash_redis_1              docker-entrypoint.sh redis ...   Up      6379/tcp
redash_scheduled_worker_1   /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_scheduler_1          /app/bin/docker-entrypoint ...   Up      5000/tcp
redash_server_1             /app/bin/docker-entrypoint ...   Up      0.0.0.0:5000->5000/tcp

(4) 에러 발생으로 인한 반복 과정에서 생성된 docker-compose.yml파일이 있는지 확인
ls

(5) 디렉토리에서 docker-compose.yml.1을 확인함
docker-compose.yml  docker-compose.yml.1  env  postgres-data

(6) docker-compose.yml.1을 완전히 삭제
rm -f docker-compose.yml.1

 

 

3. 기본적인 설치를 완료했다!

- 웹브라우저에서 내 컴퓨터의 80번이나 5000번 포트로 접속해서 아래와 같은 화면이 뜨면 시스템 구축에 성공한 것이다.

- localhost:80나 localhost:5000을 주소창에 입력하여 접속해보자!

- 80번 포트는 Nginx를 통해 5000번 포트로 다시 접근하는 경로이고, 5000번 포트는 플라스크 서버로 띄운 Redash에 직접 접근하는 것이다.

- 일반적인 접근은 80번 포트로 접근해서 도메인 주소로만 접근하는 방식입니다.

Redash 구축 후 최초로 접속하면 나오는 화면이다

 

4. 다음 글 예고

- 다음 글에서는 Redash의 기본적인 세팅 방법과 사용 예시를 살펴보도록 하겠습니다.

1. 시스템구조를 알아야할까요?

- 사실 냅다 구성만해서 사용하려면 딱히 알 필요가 없다.

- 왜냐면 설치 스크립트 한 방이면 걍 잘 돌아가게 구축이 되니까!

- 그러나 컨테이너형식이 아닌 직접 구축한 데이터베이스를 쓰려면 시스템 구조를 알아야 바꿀 수 있다.

- 그리고 실무에서는 아무튼 돌아감으로 해결되지 않는 많은 문제들이 발생한다...

- 하여튼 시스템구조를 살펴보고 각 기능에 대해 간단하게 짚고 넘어가자

 

 

 

2. 시스템 구조 설명

Redash의 아키텍처 다이어그램

- 공식 사이트에 다이어그램이나 기능에 대한 정확한 가이드를 적어두지 않아서 포럼을 뒤져서 찾았다.

(1) Nginx

- 리버스 프록시로 Redash 서버에 https를 적용하기 쉽게 해준다

(2) Redash server

- 플라스크로 띄우는 실질적인 대시보드 서버다

- 쉽게 이야기 하면 대시보드 웹페이지를 띄워주는 서버다

(3) postgreSQL

- postgreSQL 데이터베이스를 띄우는 서버로 운영하는 리대시의 모든 정보가 저장된다

- 유저, 쿼리, 시각화 등의 값들이 저장되는 곳이라고 생각하면 된다

(4) scheduler

- 대시보드에서 발생하는 잡(job)의 큐(queue)로 관리해주는 곳이다

(5) redis

- 스케쥴러에서 수행할 일(task)를 수행할 워커 서버로 보내기 전에 redis 서버에서 모니터링한다

- 정확히는 모르겠는데 adhoc task와 scheduled task를 관리하는 기능인 것 같다

(6) worker

- 각 워커에서 수행할 task를 실질적으로 수행한다

- 일시적인 쿼리를 실행하거나 주기적으로 돌아갈 작성된 쿼리 수행과 관련된 서버이다.

 

* 참고한 포럼

https://discuss.redash.io/t/what-are-the-individual-services-in-redash-actually-for/9675

 

What are the individual services in Redash actually for?

In Redash docker-compose files, we have been used to the following services: Server Adhoc-worker scheduled_worker scheduler Worker What are these services actually doing? The flask application which runs the redash under the hood looks to be the server. Bu

discuss.redash.io

 

 

3. 어... 뭔 말인지 모르겠어요

- 사실 도커기반으로 구축하는데 모든 기능을 세세하게 이해할 필요는 없습니다!

- 이런 이야기는 그만하고 다음엔 실질적으로 간단하게 구축을 해봅시다.

1. 왜 Redash를 사용하나요?

- 데이터를 분석한 결과의 수치나 시각화 결과를 보여주는 방식 중에 대시보드를 구성하는 방법이 있다.

- 세상에 유료로 대시보드를 쓸 수 있는 방법이 많지만 어느정도 직접 운영을 할 수 있다면 좋은 오픈 소스를 써도 된다.

- 파이썬에서 dash / voila / streamlit라는 대시보드를 만드는 라이브러리들이 존재하지만 직접 대시보드 구성을 코딩해야하는 번거로운이 있다.

- 그러니까 만들어진 걸 쉽게 운용할 수 있다면 잘 만들어 놓은 것을 쓰는 것이 좋고, 오픈소스 대시보드 프레임워크 중에서 Redash를 사용해보고자 한다.

 

 

 

2. Redash가 왜 좋아요?

Redash에서 사용할 수 있는 데이터베이스/데이터소스의 일부

- 그냥 우리가 알고있는 데이터베이스는 다 연결해서 사용할 수 있다.

- 데이터 베이스의 쿼리 작업을 Redash 내에서 할 수 있어서 쿼리 작성과 데이터 분석 결과 확인과 배치에 용이 하다.

- plotly 기반의 시각화 기능을 쉽게 사용할 수 있고, 능력껏 추가해서 사용할 수 있다.

- python으로 데이터를 전처리 해서 쿼리 결과 처럼 사용할 수 있어서 쿼리 보다 자유롭고 다양한 데이터 분석 결과를 대시보드에 바로 적용할 수 있다.

- 단순하게 운영만 한다면 docker 기반의 설치 파일로 쉽게 Redash 사용 환경을 구축할 수 있다.

 

 

 

3. Redash의 단점은요?

- 어플리케이션의 백엔드와 프론트엔드를 수정하는 것이 쉽지 않아서 사실상 Redash를 커스텀하려면 개발 지식이 필요하다.

- 사용자가 모두 작성된 쿼리를 볼 수 있으므로 보수적인 보안 환경에는 도입이 어려울 수 있다.

- 메일 시스템 구축, 세팅 값 변경시 docker-compose를 사용한 서버 재구성 등의 상용 프로그램을 사용하는 것보다 운용 측면에서 알아야하는 것들이 부수적으로 발생한다.

 

 

 

4. 그래도 Redash를 써봅시다.

- 대시보드 구축, 쿼리사용, 도커 사용을 한 번에 공부할 수 있습니다.

- 그리고 docker 기반의 구축은 스크립트 파일 하나로 간단하게 되니까 쉽게 시작할 수 있습니다!

+ Recent posts