분류 기타

Adonis 웹 사이트 배포

컨텐츠 정보

  • 조회 56 (작성일 )

본문

사람들은 종종 모든 개발자가 애플리케이션을 원격 서버에 배포하는 방법을 알아야 한다고 생각합니다. 실제 사례는 많은 사람들이 웹 사이트를 프로덕션으로 밀어 붙이는 것을 편하지 않다는 것입니다.


이 기사에서는 Node.js 프레임 워크 AdonisJs를 예로 사용하지만 학습 할 개념은 노드와 유사한 언어 또는 프레임 워크에 대해 동일합니다.


1 단계 : 서버 생성 


가장 먼저 할 일은 서버를 만드는 것입니다. 사용할 수 있는 VPS (가상 사설 서버)가 없고 하나를 가져와야 한다고 가정 해 보겠습니다. 내 서버를 호스팅 하기 위해 Digital Ocean 서비스를 사용하고 있지만 모든 VPS에서 할 수 있습니다.


Digital Ocean "Create a Droplet"페이지에서 최신 버전의 Ubuntu와 내가 가질 수 있는 가장 작은 서버를 선택하고 있습니다. 이 서버는 여러 Adonis 애플리케이션을 실행하기에 충분합니다.


Digital Ocean interface to create a VPS 

기본적으로 다른 설정은 그대로 두고 타겟 고객과 가까운 지역을 선택해야 합니다.


2 단계 : 서버 보안 


VPS가 생성되고 사용 가능하면 SSH를 사용하여 연결하십시오.


> ssh root@IP_OF_YOUR_DROPLET


연결되면 가장 먼저 할 일은 서버를 보호하는 것입니다.


루트 비밀번호 변경 


passwd 명령을 입력하고 암호를 길고 복잡한 것으로 변경하십시오. 서버에서 작업 할 때 기억할 필요가 없습니다. 안전한 곳에 보관하십시오.


서버 업데이트 


방금 서버를 만든 경우에도 최신 상태가 아닐 수 있습니다. 다음 명령을 실행하십시오.


> apt update
> apt upgrade


자동 보안 업데이트 활성화 


보안 업데이트는 중요하며 자동화 할 수 있습니다. 보안 허점을 해결하기 위해 간단한 apt update 및 apt upgrade 명령을 실행하기 위해 매일 모든 서버에 연결할 필요가 없습니다.


> apt install unattended-upgrades
> vim /etc/apt/apt.conf.d/10periodic


다음과 같이 구성 파일을 업데이트하십시오.


APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";


fail2ban 설치 


fail2ban은 서버의 로그를 검사하고 악의적 인 행동 (너무 많은 암호 실패, 포트 검사 등)을 보여주는 IP를 차단하는 서비스입니다.


> apt install fail2ban


기본 구성은 대부분의 사람들에게 괜찮지만 수정하고 싶다면 설명서를 따르십시오.


사용자 생성 


루트 사용자로 작업해서는 안됩니다. 시스템을 위험에 빠뜨릴 수 있는 제한 없이 모든 권한을 가집니다. 사용자 이름 romain을 사용하고 있습니다. 자유롭게 변경하세요.


> useradd -m -s /bin/bash -G sudo romain
> passwd romain
> mkdir /home/romain/.ssh
> chmod 700 /home/romain/.ssh


위의 명령은 사용자 이름이 romain 인 새 사용자를 만들고 홈 디렉토리를 만들고 sudo 그룹에 추가했습니다. 이제 이 사용자로 서버에 연결할 수 있도록 SSH 키를 추가 할 수 있습니다.


> vim /home/romain/.ssh/authorized_keys
> chmod 400 /home/romain/.ssh/authorized_keys
> chown romain:romain /home/romain -R


계속하기 전에 이 사용자로 서버에 연결할 수 있는지 확인하십시오.


> exit  # Quit the SSH session
> ssh romain@IP_OF_YOUR_DROPLET



그런 다음 다음 명령을 실행하여 루트 명령에 대한 액세스 권한이 있는지 확인하십시오.


> sudo whoami # Should display root


잠금 SSH 


기본적으로 SSH를 사용하면 누구나 암호를 통해 연결하고 루트로 연결할 수 있습니다. 이를 비활성화하고 SSH 키만 사용하는 것이 좋습니다.


> sudo vim /etc/ssh/sshd_config


구성을 변경하려면 다음 행을 검색하고 수정하십시오.


PermitRootLogin no
PasswordAuthentication no


SSH 포트 변경 


SSH 서비스의 기본 포트를 변경하고 싶습니다. 우리는 로그인 무차별 대입으로부터 우리를 보호하기 위해 fail2ban을 가지고 있지만, 우리가 그들을 피한다면 더 좋을 것입니다.


로그인 시스템에 무차별 대입을 시도하는 거의 모든 봇은 기본 포트 인 22를 사용하여 SSH에 도달합니다.이 포트가 열려 있음을 감지하지 못하면 서버를 떠납니다.


여전히 /etc/ssh/sshd_config 파일에서 다음 행을 변경하십시오.


Port XXXXX


49152에서 65535까지의 포트를 선택하십시오. 사용 가능한 포트의 동적 및 개인 범위입니다.


그런 다음 SSH 데몬을 다시 시작하고 현재 세션을 종료 한 다음 사용자와 다시 연결할 수 있습니다.


> sudo service ssh restart
> exit # If you aren't disconnected
> ssh romain@IP_OF_YOUR_DROPLET -p XXXXX


업데이트 : 기본 SSH 포트를 변경하는 것은 몇 가지 이유로 나쁜 생각 일 수 있습니다. 이 기사에서 이에 대해 자세히 읽을 수 있습니다.


방화벽 설치 


Ubuntu는 훌륭한 방화벽 ufw와 함께 번들로 제공됩니다. 구성 해 보겠습니다.


> sudo ufw default allow outgoing
> sudo ufw default deny incoming
> sudo ufw allow XXXXX  # It's the port you used for your SSH configuration
> sudo ufw allow 80
> sudo ufw allow 443


SSH 포트를 올바르게 허용했는지 확인하십시오. 그렇지 않으면 서버에서 잠 깁니다!


마지막으로 다음 명령을 사용하여 방화벽을 활성화합니다.


sudo ufw enable


3 단계 : 배포 사용자 만들기 


이제 서버가 보호되고 개인 계정이 있으므로 서버 관리자가 웹 사이트를 배포하고 실행하는 데 사용할 배포 사용자를 만들 수 있습니다.


> sudo useradd -m -s /bin/bash deploy



아무도 직접 연결하지 않으므로 이 사용자에 대해 SSH 키를 설정할 필요가 없습니다. 다음 명령을 사용하여 이 사용자에 액세스 할 수 있습니다.


> sudo -i -u deploy


4 단계 : 필수 종속성 설치 Nginx 


Nginx는 웹 서버가 될 것입니다. 들어오는 HTTP (S) 요청을 로컬 포트로 프록시 하는 데 사용합니다.


> sudo apt install nginx


데이터베이스 관리 시스템 


애플리케이션은 종종 DBMS를 사용하여 데이터를 저장합니다. 이 기사에서는 MariaDB를 사용합니다. 다음 명령을 실행하여 설치 한 다음 구성 마법사를 따릅니다.


> sudo apt install mariadb-server


NVM 


이때 배포 사용자로 연결해야 합니다.


NVM은 노드 버전 관리자입니다. 우리가 사용하는 Node.js 버전을 설치하고 최신 상태로 유지하는 데 도움이 됩니다.


> curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash


그런 다음 프로필에 다음 줄을 추가합니다 (~ / bash_profile, ~ / .zshrc, ~ / profile 또는 ~ / .bashrc).


export NVM_DIR="${XDG_CONFIG_HOME/:-$HOME/.}nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm



이 작업을 수행 한 후 nvm 명령에 액세스하려면 셸을 다시 시작해야 합니다. 완료되면 다음 명령을 사용하여 최신 버전의 Node.js를 설치할 수 있습니다.


> nvm install node


PM2 


PM2는 애플리케이션을 영구적으로 유지하는 데 사용되는 노드 프로세스 관리자입니다.


> npm install pm2 -g


5 단계 : 애플리케이션 배포 


서버에 애플리케이션을 가져 오기 위해 저장소를 복제 할 때입니다! 배포 키를 사용하여 애플리케이션을 배포하는 것이 좋습니다. 서버가 코드를 가져올 수는 있지만 절대 푸시하지 않습니다.


git 공급자의 설명서에 따라 SSH 배포 키를 설정했으면 /home/deploy/www에 있는 저장소를 복제합니다.


> cd ~  # This takes us the the home folder of the current user
> mkdir www
> cd www
> git clone https://github.com/adonisjs/adonis-fullstack-app.git example.com
> cd example.com
> npm i --production


.env.example 파일을 복제하고 설정에 따라 값을 변경합니다.


> cp .env.example .env
> vim .env


마이그레이션과 시드를 실행할 때입니다.


> node ace migration:run --force
> node ace seed --force


다음 명령을 사용하여 애플리케이션이 문제없이 실행되는지 테스트합니다.


> node server.js  # Followed by Ctrl+C to kill it



6 단계 : Nginx 구성 


서버 로컬 네트워크에서 응용 프로그램에 연결할 수 있지만 외부 방문을 허용하는 것이 좋습니다! 댄스 플로어에서 역방향 프록시가 입력되는 곳입니다.


이 작업은 사용자와 함께 수행해야 합니다. 제 경우에는 romain입니다.


먼저 기본 구성을 삭제하고 웹 사이트에 대한 구성 파일을 만듭니다. 여기에 URL (example.com)로 이름을 지정하고 싶습니다.


> sudo rm /etc/nginx/sites-available/default
> sudo rm /etc/nginx/sites-enabled/default
> sudo vim /etc/nginx/sites-available/example.com


구성은 Nginx에게 수신 도메인을 수신하고 모든 요청을 애플리케이션 인 로컬 포트로 전달하도록 지시합니다.


server {
  listen 80 default_server;
  listen [::]:80 default_server;

  server_name example.com;

  # Our Node.js application
  location / {
    proxy_pass http://localhost:3333;
    proxy_http_version 1.1;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}


마지막으로 할 일은 이 구성을 활성화하고 애플리케이션을 시작하는 것입니다.


> sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
> sudo service nginx restart
> sudo -i -u deploy
> pm2 start /home/deploy/www/example.com/server.js --name app


DNS를 올바르게 설정했다면 애플리케이션에 액세스 할 수 있어야 합니다. 그렇지 않으면 listen 명령에서 default_server 지시문을 사용했기 때문에 서버의 IP에 도달하면 애플리케이션이 기본적으로 표시됩니다.


7 단계 : 스크립트를 통해 배포 자동화 


이제 애플리케이션이 프로덕션에서 실행되고 있으므로 향후 배포를 자동화하는 스크립트를 작성하려고 합니다.


> vim /home/deploy/www/deploy-example.sh


이 스크립트는 이전에 했던 작업을 간단히 수행합니다.


  1. 저장소에서 새로운 변경 사항을 가져옵니다.
  2. 새 종속성을 설치하십시오.
  3. 마이그레이션을 실행하십시오.
  4. 응용 프로그램을 다시 시작하십시오.


# Content of your script
cd ~/www/example.com
git pull
npm i --production
node ace migration:run --force
pm2 restart app


실행할 수 있도록 x 플래그를 추가하십시오.


> chmod +x /home/deploy/www/deploy-example.sh


이제 새 릴리스를 게시하려면 deploy 사용자로 deploy-example.sh 스크립트를 실행하십시오.


8 단계 : SSL 인증서 추가 


마지막으로 할 일은 클라이언트와 서버 간의 연결을 보호하기 위해 SSL 인증서를 추가하는 것입니다. Let 's Encrypt 인증서를 배포하는 웹 사이트에서 HTTPS를 자동으로 활성화하는 certbot을 사용합니다.


> sudo add-apt-repository universe
> sudo add-apt-repository ppa:certbot/certbot
> sudo apt update
> sudo apt install python-certbot-nginx


그런 다음 certbot을 실행하고 마법사에 따라 인증서를 생성하고 설정합니다.


> sudo certbot --nginx


https://dev.to/romainlanz/deploy-your-adonis-website-17ec