웹사이트 검색

Ubuntu 20.04에서 Docker와 함께 Ghost CMS를 설치하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - UFW 방화벽 구성\n
  3. 2단계 - Certbot 설치 및 SSL 인증서 얻기
  4. 3단계 - Docker 및 Docker Compose 설치
  5. 4단계 - Ghost 설치
    1. Docker Compose 파일 만들기
    2. Nginx 도커 이미지 만들기

    Ghost는 전문가 수준의 블로그를 만드는 데 도움이 되는 오픈 소스 블로그 플랫폼입니다. 지나치게 복잡해졌기 때문에 WordPress의 대안으로 2013년에 출시되었습니다. Ghost는 JavaScript로 작성되었으며 Node.js로 구동됩니다.

    이 자습서에서는 Ubuntu 20.04 기반 서버에서 Docker를 사용하여 Ghost CMS를 설치하는 방법을 살펴봅니다. 또한 Nginx를 프록시로 사용하고 SSL 인증서를 암호화하여 설치를 보호합니다.

    전제 조건

    • A server running Ubuntu 20.04.

    • A non-root sudo user.

    • Make sure everything is updated.

      $ sudo apt update 
      $ sudo apt upgrade
      

    1단계 - UFW 방화벽 구성

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

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

    $ sudo ufw status
    

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

    Status: inactive
    

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

    $ sudo ufw allow OpenSSH
    

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

    $ sudo ufw allow 80
    $ sudo ufw allow 443
    

    방화벽 활성화

    $ 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                         ALLOW       Anywhere
    443                        ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    80 (v6)                    ALLOW       Anywhere (v6)
    443 (v6)                   ALLOW       Anywhere (v6)
    

    2단계 - Certbot 설치 및 SSL 인증서 얻기

    계속 진행하기 전에 Certbot 도구를 설치하고 도메인에 대한 SSL 인증서를 설치해야 합니다.

    Certbot을 설치하기 위해 Snapd 패키지 설치 프로그램을 사용합니다. Certbots 공식 저장소는 더 이상 사용되지 않으며 Ubuntus Certbot 패키지는 1년 이상 되었습니다. Snapd는 항상 안정적인 최신 버전의 Certbot을 제공하므로 이를 사용해야 합니다. 다행스럽게도 Ubuntu 20.04에는 Snapd가 미리 설치되어 있습니다.

    Snapd 버전이 최신인지 확인하세요.

    $ sudo snap install core 
    $ sudo snap refresh core
    

    이전 버전의 Certbot을 제거하십시오.

    $ sudo apt remove certbot
    

    Certbot을 설치합니다.

    $ sudo snap install --classic certbot
    

    다음 명령을 사용하여 /usr/bin 디렉토리에 대한 심볼릭 링크를 생성하여 Certbot 명령을 실행할 수 있는지 확인하십시오.

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

    SSL 인증서를 생성합니다.

    $ sudo certbot certonly --standalone -d example.com
    

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

    3단계 - Docker 및 Docker Compose 설치

    첫 번째 단계는 Docker Engine 및 Docker Compose를 설치하는 것입니다. 먼저 이전 버전의 Docker를 모두 제거합니다.

    $ sudo apt remove docker docker-engine docker.io containerd runc
    

    Docker를 실행하는 데 필요한 일부 패키지를 설치합니다.

    $ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release
    

    Dockers 공식 GPG 키를 추가합니다.

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    

    Dockers 공식 리포지토리를 추가합니다.

    $ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.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 엔진이 실행 중이고 올바르게 설치되었는지 확인하십시오.

    $ sudo docker run hello-world
    

    기본적으로 Docker를 실행하려면 sudo가 필요합니다. 이 문제를 해결하기 위해 현재 사용자 계정을 docker 사용자 그룹에 추가할 수 있습니다.

    $ sudo usermod -aG docker ${USER}
    

    새 그룹 구성원을 적용하려면 로그아웃했다가 다시 로그인하거나 다음 명령을 사용하십시오.

    $ su - ${USER}
    

    이제 sudo를 사용하지 않고 도커 명령을 실행할 수 있습니다.

    다음으로 Docker Compose의 최신 안정 릴리스를 다운로드합니다.

    sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    이 자습서를 작성할 당시 1.28.6은 Docker Compose의 최신 버전입니다. Docker Compose의 Github 릴리스 페이지에서 확인하여 언제든지 명령에서 다른 버전을 변경하거나 선택할 수 있습니다.

    설치된 Docker Compose 버전에 실행 권한을 적용합니다.

    $ sudo chmod +x /usr/local/bin/docker-compose
    

    설치를 테스트하십시오.

    $ docker-compose --version
    docker-compose version 1.28.6, build 5db8d86f
    

    4단계 - 고스트 설치

    Ghost 설치는 Ghost 패키지, MySQL과 같은 데이터베이스 서버 및 웹 서버(Nginx)의 세 가지 구성 요소로 구성됩니다. 이러한 모든 서비스는 단일 Docker 작성 파일을 사용하여 설치할 수 있습니다.

    Docker Compose 파일 생성

    먼저 Docker 작성 파일을 저장하고 시작할 디렉터리를 만듭니다.

    $ mkdir ghost && cd ghost
    

    docker-compose.yml이라는 파일을 만들고 Nano 편집기로 엽니다.

    $ nano docker-compose.yml
    

    파일에 다음 코드를 붙여넣습니다. example.com을 귀하의 도메인으로 바꾸고 your_password 값 대신 데이터베이스 암호를 삽입하십시오. database__connection__passwordMYSQL_ROOT_PASSWORD의 값을 동일하게 유지하십시오. <username>를 서버 사용자 이름으로 바꾸십시오.

    version: '3.3'
    services:
    
      ghost:
        image: ghost:latest
        restart: always
        depends_on:
          - db
        environment:
          url: https://example.com
          database__client: mysql
          database__connection__host: db
          database__connection__user: ghost
          database__connection__password: ghostdbpass
          database__connection__database: ghostdb
          mail__transport: SMTP
          mail__options__host: {Your Mail Service host}
          mail__options__port: {Your Mail Service port}
          mail__options__secureConnection: {true/false}
          mail__options__service: {Your Mail Service}
          mail__options__auth__user: {Your User Name}
          mail__options__auth__pass: {Your Password}
        volumes:
          - /home/<username>/ghost/content:/var/lib/ghost/content
    
      db:
        image: mariadb:latest
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: your_mysql_root_password
    	  MYSQL_USER: ghost
          MYSQL_PASSWORD: ghostdbpass
          MYSQL_DATABASE: ghostdb
        volumes:
          - /home/<username>/ghost/mysql:/var/lib/mysql
    
      nginx:
        build:
          context: ./nginx
          dockerfile: Dockerfile
        restart: always
        depends_on:
          - ghost
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /etc/letsencrypt/:/etc/letsencrypt/
          - /usr/share/nginx/html:/usr/share/nginx/html
    

    Docker 작성 파일은 몇 개의 마운트 지점을 생성합니다. 즉, 서버의 특정 디렉터리를 컨테이너 내부의 디렉터리에 매핑합니다.

    • 컨테이너 내부의 /var/lib/ghost/content/var/lib/mysql 디렉토리는 /home//에 매핑됩니다. ghost/content/home//ghost/mysql 서버에 있습니다.
    • Nginx는 /etc/letsencrypt/ 바인딩을 사용하여 서버에서 Lets Encrypt 인증서에 액세스합니다.\n
    • Nginx는 또한 인증서에 대한 Lets Encrypt Challenge 파일에 액세스할 수 있도록 사용자 디렉토리 /usr/share/nginx/html에 액세스해야 합니다.\n

    위 파일에는 메일 설정 옵션도 포함되어 있습니다. Mailgun, Mailjet, Mandrill, Postmark, Sendgrid, SendCloud, SES, Zoho 또는 Gmail과 같은 널리 사용되는 SMTP 메일 서비스를 사용하는 경우 서비스 이름과 SMTP 사용자 이름 및 암호를 추가하고 나머지는 제거할 수 있습니다. 구역. 그렇지 않으면 다른 모든 옵션을 채우고 서비스 이름을 제거해도 계속 작동합니다. 메일 옵션에 대한 Ghosts 문서에서 더 많은 메일 옵션을 확인할 수 있습니다.

    위에서 설명한 모든 바인드 마운트에 대한 디렉토리를 생성합니다(이전에 인증서를 생성할 때 이미 생성된 /etc/letsencrypt 제외).

    $ cd ~/ghost
    $ mkdir content
    $ mkdir mysql
    $ sudo mkdir -p /usr/share/nginx/html
    

    Nginx 도커 이미지 생성

    우리가 만든 Docker Compose 파일은 Nginx Docker 이미지에 의존합니다. 작동하려면 Ghost와 함께 작동할 Nginx용 사용자 정의 구성 파일을 포함해야 합니다.

    현재 디렉터리에 이 이미지에 대한 디렉터리를 만듭니다.

    $ mkdir nginx
    

    이 디렉터리에 Dockerfile이라는 파일을 만듭니다.

    $ touch nginx/Dockerfile
    

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

    FROM nginx:latest
    RUN rm /etc/nginx/conf.d/default.conf
    COPY ghost.conf /etc/nginx/conf.d
    

    위의 코드는 최신 Nginx 이미지를 사용하도록 Docker에 지시합니다. 또한 기본 Nginx 구성 파일을 삭제하고 Ghost CMS용으로 생성한 사용자 정의 구성 파일을 복사합니다.

    nginx 디렉터리에 ghost.conf라는 파일을 만듭니다.

    $ touch nginx/ghost.conf
    

    ghost.conf 파일에 다음 코드를 붙여넣습니다. example.com의 모든 인스턴스를 도메인으로 바꿉니다.

    server {
      listen 80;
      listen [::]:80;
      server_name example.com;
      # Useful for Let's Encrypt
      location /.well-known/acme-challenge/ { root /usr/share/nginx/html; allow all; }
      location / { return 301 https://$server_name$request_uri; }
    }
    
    server {
      listen 443 ssl http2;
      listen [::]:443 ssl http2;
      server_name example.com;
        
      access_log /var/log/nginx/ghost.access.log;
      error_log /var/log/nginx/ghost.error.log;
      client_max_body_size 20m;
    
      ssl_protocols TLSv1.2 TLSv1.3;
      ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
      ssl_prefer_server_ciphers on;
      ssl_session_timeout 1d;
      ssl_session_cache shared:SSL:10m;
    
      ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
      location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://ghost:2368;
      }
    }
    

    위의 구성은 모든 HTTP 요청을 HTTPS로 리디렉션하고 도메인을 통해 서비스를 제공하는 Ghost 서비스의 프록시 역할을 합니다.

    5단계 - 사이트 실행

    ghost 디렉토리에서 다음 명령을 실행하여 Ghost 서비스를 시작하십시오.

    $ docker-compose up -d
    

    이제 웹 브라우저에서 https://example.com을 열어 설치를 확인할 수 있습니다. Docker가 모든 서비스를 활성화하는 데 몇 분 정도 걸릴 수 있으므로 블로그가 바로 표시되지 않으면 새로고침해야 할 수 있습니다.

    사이트가 브라우저에 표시되지 않으면 Docker 로그를 검토해야 합니다. 그러기 위해서는 먼저 컨테이너를 닫으십시오.

    $ cd ghost
    $ docker-compose down
    

    연결된 상태에서 Docker Compose를 실행하여 각 컨테이너에서 생성된 로그를 확인합니다.

    $ docker-compose up
    

    컨테이너를 종료하고 bash 프롬프트로 돌아가려면 CTRL+C를 누릅니다. 문제 해결을 마치면 컨테이너를 다시 실행할 수 있으며 이번에는 블로그가 표시됩니다.

    6단계 - 설정 완료

    Ghost 블로그 설정을 완료하려면 브라우저에서 https://example.com/ghost를 방문하세요. 블로그 도메인 끝에 있는 추가 /ghost는 Ghosts 관리자 패널로 리디렉션하거나 이 경우 처음으로 액세스하는 설정이므로 설정합니다.

    여기에서 관리자 계정을 만들고 블로그 제목을 선택해야 합니다.

    지금 건너뛰기로 선택한 경우에도 나중에 할 수 있는 블로그의 추가 직원이나 공동 작업자를 초대할 수도 있습니다.

    설정이 끝나면 Ghosts 관리 패널이 표시됩니다.

    어두운 모드로 전환하려면 설정 페이지 하단의 설정 톱니바퀴 버튼 옆에 있는 토글 스위치를 클릭하면 됩니다.

    기본적으로 Ghost를 탐색하고 사용하는 데 도움이 되는 몇 가지 기본 게시물이 표시됩니다. 게시를 취소하거나 삭제하고 게시를 시작할 수 있습니다.

    7단계 - 고스트 업데이트

    Docker 작성 파일에서 Ghost 블로그를 쉽게 업데이트할 수 있도록 설치 시 사용 가능한 최신 버전의 Ghost를 가져옵니다.

    업데이트하려면 컨테이너를 종료하고 최신 이미지를 가져온 다음 컨테이너를 다시 실행해야 합니다.

    $ docker-compose down
    $ docker-compose pull && docker-compose up -d
    

    8단계 - Lets Encrypt SSL 인증서 갱신

    Lets Encrypt 인증서는 90일 동안만 유효합니다. 따라서 인증서를 자동으로 갱신하는 cronjob을 설정해야 합니다.

    편집기에서 Crontab을 엽니다.

    $ sudo crontab -e
    

    매일 오후 11시에 Certbot을 실행할 다음 줄을 끝에 붙여넣습니다. example.com을 귀하의 도메인으로 바꾸십시오.

    0 23 * * *   certbot certonly -n --webroot -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'
    

    매일 오후 11시에 실행한다고 해서 Certbot이 만료 날짜가 30일 이내인 경우에만 인증서를 갱신하기 때문에 인증서가 매일 갱신된다는 의미는 아닙니다. 이것을 매일 밤 실행하면 만료되기 전에 스크립트에 여러 번 시도할 수 있는 기회가 주어집니다.

    위의 명령은 성공적인 갱신 후 Docker 컨테이너 내부의 Nginx 서버도 다시 시작합니다.

    Certbot의 --dry-run 옵션을 사용하여 cronjob을 테스트할 수 있습니다.

    $ sudo bash -c "certbot certonly -n --webroot --dry-run -w /usr/share/nginx/html -d example.com --deploy-hook='docker exec ghost_nginx_1 nginx -s reload'"
    

    결론

    이것으로 Docker를 사용하여 Ubuntu 20.04 기반 서버에서 Ghost CMS를 설정하는 방법에 대한 자습서를 마칩니다. 질문이나 피드백이 있으면 아래 의견에 공유하십시오.