Docker를 사용하여 Ubuntu 22.04에 메타베이스를 설치하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Docker 및 Docker Compose 설치
  4. 3단계 - 메타베이스용 Docker Compose 파일 만들기
  5. 4단계 - 환경 파일 구성 및 메타베이스 시작\n
  6. 5단계 - Nginx 설치
  7. 6단계 - SSL 설치
  8. 7단계 - Nginx 구성
  9. 8단계 - 메타베이스 설치 및 액세스
  10. 9단계 - 백업 메타베이스
  11. 10단계 - 메타베이스 업그레이드
  12. 결론

Metabase는 Java 기반 오픈 소스 비즈니스 인텔리전스(BI) 도구입니다. 여러 데이터베이스에 연결하고 질문 빌더를 사용하여 고객 데이터를 읽을 수 있는 형식으로 시각화하고 분석할 수 있는 대규모 SQL 쿼리의 복잡성을 숨깁니다. 데이터에 대해 질문하거나 데이터를 앱에 포함하여 고객이 스스로 데이터를 탐색할 수 있도록 할 수 있습니다. 대시보드와 시각화를 생성하고 Slack 채널에 알림을 보낼 수 있습니다. MySQL, Google Analytics, MongoDB, PostgreSQL, ClickHouse, Amazon Athena, Amazon Redshift 등을 비롯한 많은 데이터베이스 플랫폼 및 데이터 소스에 연결할 수 있습니다.

Docker를 사용하여 Ubuntu 22.04 서버에 Metabase를 설치하는 방법을 배웁니다.

전제 조건

  • A server running Ubuntu 22.04 with a minimum of 2 CPU cores and 2GB of memory. You will need to upgrade the server as per requirements.

  • A non-root user with sudo privileges.

  • A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will use metabase.example.com as the domain name.

  • Metabase sends email notifications to users. We recommend you use a 3rd party Transactional mail service like Mailgun, Sendgrid, Amazon SES, or Sparkpost. The instructions in the guide will be using Amazon SES.

  • Make sure everything is updated.

    $ sudo apt update
    
  • Install basic utility packages. Some of them may already be installed.

    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

1단계 - 방화벽 구성

첫 번째 단계는 방화벽을 구성하는 것입니다. 우분투는 기본적으로 ufw(복잡하지 않은 방화벽)와 함께 제공됩니다.

방화벽이 실행 중인지 확인하십시오.

$ sudo ufw status

다음 출력을 얻어야 합니다.

Status: inactive

방화벽이 활성화 시 현재 연결을 끊지 않도록 SSH 포트를 허용합니다.

$ sudo ufw allow OpenSSH

HTTP 및 HTTPS 포트도 허용합니다.

$ sudo ufw allow http
$ sudo ufw allow https

방화벽 활성화

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

방화벽의 상태를 다시 확인하십시오.

$ sudo ufw status

비슷한 출력이 표시되어야 합니다.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

2단계 - Docker 및 Docker Compose 설치

Ubuntu 22.04는 이전 버전의 Docker와 함께 제공됩니다. 최신 버전을 설치하려면 먼저 Docker GPG 키를 가져옵니다.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Docker 리포지토리 파일을 만듭니다.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

시스템 저장소 목록을 업데이트하십시오.

$ sudo apt update

최신 버전의 Docker를 설치합니다.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

실행 중인지 확인합니다.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-01-05 05:55:23 UTC; 2min 16s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 2116 (dockerd)
      Tasks: 8
     Memory: 22.5M
        CPU: 252ms
     CGroup: /system.slice/docker.service
             ??2116 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

기본적으로 Docker에는 루트 권한이 필요합니다. sudo 명령을 실행할 때마다 sudo를 사용하지 않으려면 docker 그룹에 사용자 이름을 추가하세요.

$ sudo usermod -aG docker $(whoami)

이 변경 사항을 활성화하려면 서버에서 로그아웃하고 동일한 사용자로 다시 로그인하거나 다음 명령을 사용해야 합니다.

$ su - ${USER}

사용자가 Docker 그룹에 추가되었는지 확인합니다.

$ groups
navjot wheel docker

3단계 - 메타베이스용 Docker Compose 파일 만들기

Metabase용 디렉터리를 만듭니다.

$ mkdir ~/metabase

편집을 위해 Docker 작성 파일을 만들고 엽니다.

$ nano docker-compose.yml

다음 코드를 붙여넣습니다.

version: '3.9'
services:
  metabase:
    image: metabase/metabase:latest
    container_name: metabase
    hostname: metabase
    volumes:
    - /dev/urandom:/dev/random:ro
    ports:
      - 3000:3000
    environment:
      MB_DB_TYPE: postgres
      MB_DB_DBNAME: metabase
      MB_DB_PORT: 5432
      MB_DB_USER_FILE: /run/secrets/db_user
      MB_DB_PASS_FILE: /run/secrets/db_password
      MB_DB_HOST: postgres
    env_file:
      - metabase.env
    healthcheck:
      test: curl --fail -I http://localhost:3000/api/health || exit 1
      interval: 15s
      retries: 5
      start_period: 10s
      timeout: 5s
    networks:
      - metanet1
    depends_on:
      - postgres
    secrets:
      - db_password
      - db_user
  postgres:
    image: postgres:latest
    container_name: postgres
    hostname: postgres
    environment:
      POSTGRES_USER_FILE: /run/secrets/db_user
      POSTGRES_DB: metabase
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'postgres']
    volumes:
      - ./postgresql:/var/lib/postgresql/data
    networks:
      - metanet1
    secrets:
      - db_password
      - db_user
networks:
  metanet1:
    driver: bridge
secrets:
   db_password:
     file: db_password.txt
   db_user:
     file: db_user.txt

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

위의 Docker 작성 파일은 최신 버전의 메타베이스 Docker 이미지를 가져오고 포트 3000을 통해 앱을 노출합니다. PostgreSQL 이미지에 연결됩니다. PostgreSQL 데이터베이스 사용자 이름과 비밀번호는 각각 db_user.txtdb_password.txt 파일에 저장됩니다.

편집을 위해 db_user.txt 파일을 만들고 엽니다.

$ nano db_user.txt

사용자 이름을 붙여넣고 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

편집을 위해 db_password.txt 파일을 만들고 엽니다.

$ nano db_password.txt

암호를 붙여넣고 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

4단계 - 환경 파일 구성 및 메타베이스 시작

다음 명령을 사용하여 암호화 키를 생성합니다.

$ openssl rand -base64 32
aWPk99bIjkG7NvWYVqR5NIAojhW1Idk0OvTH1xWVMbY=

나중에 사용할 수 있도록 키를 복사합니다.

편집을 위해 metabase.env 파일을 만들고 엽니다.

$ nano metabase.env

다음 코드를 붙여넣습니다. 생성한 비밀 키를 MB_ENCRYPTION_SECRET_KEY 변수에 붙여넣습니다. https 프로토콜을 포함하여 메타베이스 도메인을 입력합니다. 사용하는 공급자를 사용하여 SMTP 세부 정보를 입력합니다. Amazon SES를 사용하고 있습니다. MB_PASSWORD_COMPLEXITY 변수는 strong로 설정됩니다. 즉, 메타베이스 암호는 소문자 2개, 대문자 2개, 숫자 1개 및 특수 문자 1개를 포함하여 길이가 최소 8자여야 합니다.

MB_SITE_URL=https://metabase.example.com
MB_SITE_NAME="Howtoforge"



MB_EMAIL_FROM_NAME=Howtoforge
MB_EMAIL_SMTP_HOST=email-smtp.us-west-2.amazonaws.com
MB_EMAIL_SMTP_USERNAME=AWS_USERID
MB_EMAIL_SMTP_PASSWORD=AWS_KEY
MB_EMAIL_SMTP_PORT=587
MB_EMAIL_SMTP_SECURITY=starttls

MB_ENCRYPTION_SECRET_KEY=aWPk99bIjkG7NvWYVqR5NIAojhW1Idk0OvTH1xWVMbY=
MB_ANON_TRACKING_ENABLED=false
MB_APPLICATION_NAME=Howtoforge Metabase
MB_PASSWORD_COMPLEXITY=strong

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

Docker 컨테이너를 시작합니다.

$ docker compose up -d

다음 명령을 사용하여 컨테이너의 상태를 볼 수 있습니다.

$ watch docker ps

비슷한 출력을 받게 됩니다. 두 컨테이너의 상태가 정상이 될 때까지 기다린 다음 Ctrl + C를 눌러 화면을 종료합니다.

CONTAINER ID   IMAGE                      COMMAND                  CREATED         STATUS                   PORTS                                       NAMES
15698ae2de6a   metabase/metabase:latest   "/app/run_metabase.sh"   2 minutes ago   Up 2 minutes (healthy)   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   metabase
ee2d03dc3a00   postgres:latest            "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes (healthy)   5432/tcp                                    postgres

5단계 - Nginx 설치

Ubuntu 22.04는 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

Nginxs 서명 키를 가져옵니다.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
	| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Nginxs 안정 버전용 리포지토리를 추가합니다.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

시스템 리포지토리를 업데이트합니다.

$ sudo apt update

Nginx를 설치합니다.

$ sudo apt install nginx

설치를 확인하십시오.

$ nginx -v
nginx version: nginx/1.22.1

Nginx 서버를 시작합니다.

$ sudo systemctl start nginx

서버의 상태를 확인하십시오.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-01-05 07:21:46 UTC; 1s ago
       Docs: https://nginx.org/en/docs/
    Process: 13197 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 13198 (nginx)
      Tasks: 3 (limit: 2237)
     Memory: 2.6M
        CPU: 7ms
     CGroup: /system.slice/nginx.service
             ??13198 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??13199 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
             ??13200 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

Jan 05 07:21:46 metabase systemd[1]: Starting nginx - high performance web server...
Jan 05 07:21:46 metabase systemd[1]: Started nginx - high performance web server.

6단계 - SSL 설치

SSL 인증서를 생성하려면 Certbot을 설치해야 합니다. Ubuntus 저장소를 사용하여 Certbot을 설치하거나 Snapd 도구를 사용하여 최신 버전을 가져올 수 있습니다. 우리는 Snapd 버전을 사용할 것입니다.

Ubuntu 22.04는 기본적으로 Snapd가 설치된 상태로 제공됩니다. 다음 명령을 실행하여 Snapd 버전이 최신인지 확인하십시오. Snapd 버전이 최신인지 확인하세요.

$ sudo snap install core
$ sudo snap refresh core

Certbot을 설치합니다.

$ sudo snap install --classic certbot

다음 명령을 사용하여 /usr/bin 디렉토리에 대한 심볼릭 링크를 생성하여 Certbot 명령이 실행되도록 합니다.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

다음 명령을 실행하여 SSL 인증서를 생성합니다.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d metabase.example.com

위의 명령은 서버의 /etc/letsencrypt/live/metabase.example.com 디렉토리에 인증서를 다운로드합니다.

Diffie-Hellman 그룹 인증서를 생성합니다.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

SSL 갱신이 제대로 작동하는지 확인하려면 프로세스를 테스트 실행하십시오.

$ sudo certbot renew --dry-run

오류가 표시되지 않으면 모든 설정이 완료된 것입니다. 인증서가 자동으로 갱신됩니다.

7단계 - Nginx 구성

편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

$ sudo nano /etc/nginx/nginx.conf

include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

server_names_hash_bucket_size  64;

Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

편집을 위해 /etc/nginx/conf.d/metabase.conf 파일을 만들고 엽니다.

$ sudo nano /etc/nginx/conf.d/metabase.conf

다음 코드를 붙여넣습니다.

server {
  # Redirect any http requests to https
  listen         80;
  listen         [::]:80;
  server_name    metabase.example.com;
  return 301     https://$host$request_uri;
}

server {
  listen                    443 ssl http2;
  listen                    [::]:443 ssl http2;
  server_name               metabase.example.com;

  access_log                /var/log/nginx/metabase.access.log;
  error_log                 /var/log/nginx/metabase.error.log;

  # TLS configuration
  ssl_certificate           /etc/letsencrypt/live/metabase.example.com/fullchain.pem;
  ssl_certificate_key       /etc/letsencrypt/live/metabase.example.com/privkey.pem;
  ssl_trusted_certificate   /etc/letsencrypt/live/metabase.example.com/chain.pem;
  ssl_protocols             TLSv1.2 TLSv1.3;

  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
  ssl_prefer_server_ciphers on;
  ssl_session_cache         shared:SSL:50m;
  ssl_session_timeout       1d;

  # OCSP Stapling ---
  # fetch OCSP records from URL in ssl_certificate and cache them
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;

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

완료되면 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

Nginx 구성 파일 구문을 확인합니다.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginx 서버를 다시 시작합니다.

$ sudo systemctl restart nginx

8단계 - 메타베이스 설치 및 액세스

URL https://metabase.example.com을 열어 메타베이스 설정 마법사를 시작합니다.

Lets get started 버튼을 클릭하여 다음 단계로 진행합니다. 다음 페이지에는 여러 단계가 나열됩니다. 언어를 선택하고 다음을 클릭하여 계속 진행합니다.

메타베이스 관리자 세부 정보를 입력합니다.

다음으로 탐색할 데이터를 메타베이스에 추가하라는 메시지가 표시됩니다. 데이터를 지금 추가하거나 나중에 추가할 수 있습니다.

계속 진행하려면 나중에 내 데이터를 추가하겠습니다를 클릭합니다.

메타베이스가 사용 이벤트를 익명으로 수집하도록 허용 체크 표시를 해제하고 마침 버튼을 클릭하여 프로세스를 완료합니다.

메타베이스로 이동 버튼을 클릭하여 메타베이스 대시보드를 시작합니다.

지금 Metabase를 사용할 수 있습니다.

9단계 - 백업 메타베이스

Metabase 데이터베이스를 백업하려면 다음 명령을 사용하십시오.

$ docker exec -t postgres pg_dumpall -c -U navjot > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

navjot를 데이터베이스 사용자 이름으로 바꾸고 postgres를 PostgreSQL용 도커 컨테이너 이름으로 바꿉니다.

데이터베이스를 복원하려면 다음 명령을 사용하십시오.

$ cat dump_*.sql | docker exec -i your-db-container psql -U navjot

10단계 - 메타베이스 업그레이드

Metabase를 업그레이드하려면 여러 단계가 필요합니다. 첫 번째 단계는 9단계의 명령을 사용하여 메타베이스 데이터베이스를 백업하는 것입니다.

그런 다음 디렉터리로 전환합니다.

$ cd /opt/metabase

Mastodon의 최신 컨테이너 이미지를 가져옵니다.

$ docker compose pull metabase/metabase:latest

원하는 경우 docker-compose.yml을 변경합니다.

Mastodon 컨테이너를 다시 시작합니다.

$ docker compose up -d

위의 지침은 일반적인 업데이트 지침입니다. 항상 Mastodon의 GitHub 릴리스 페이지를 확인하여 모든 것이 원활하게 진행되도록 버전 간의 특정 업데이트 작업 및 명령을 찾습니다.

결론

이것으로 Ubuntu 22.04 서버에 Metabase를 설치하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.