Rails 7 새 프로덕션 설치: 0에서 배포(Ubuntu 20.04 에디션)

16671 단어 ubunturailsnginxdevops
이것은 셸 액세스 권한이 있는 새로운 Ubuntu 20.04 서버에 노드 파이프라인이 없는 새로운 Rails 7 앱을 설치하는 방법입니다.

재료:
  • 우분투 20.04
  • rbenv 및 Ruby 3.0.3
  • Node.js가 없는 Rails 7
  • Postgres 및 Redis
  • Nginx, Passenger, Capistrano

  • 참고: 대문자를 자신의 설정 세부 정보로 바꾸십시오.
    참고 2: vim을 사용하여 파일을 편집합니다. 익숙하지 않은 경우 vimnano 또는 선택한 다른 편집기로 대체할 수 있고 대체해야 합니다.
    참고 3: 항상 임의의 긴 암호를 사용하고 응용 프로그램 간에 공유하거나 분실하지 마십시오. 또한 공개 저장소에 암호화되지 않은 비밀을 커밋하지 마십시오.

    This recipe works for me, but I would love to hear your thoughts on how it went for you! If something breaks or you do it differently, leave a comment below so I and the community can discuss and help out.


    SSH 설정


    현지의



    $ ssh root@SERVER_IP_ADDRESS
      # Enter password
    

    원격



    $ adduser deploy
      # Create password, skip rest
    $ adduser deploy sudo
    $ exit
    

    로컬 - (선택 사항) 더 쉬운 로그인을 위해 ssh 키 추가



      # You need a ssh-key generated beforehand, run command
      # below if you never did that before and follow instructions
      # ssh-keygen 
    $ ssh-copy-id deploy@SERVER_IP_ADDRESS
      # Enter password
    $ ssh deploy@SERVER_IP_ADDRESS
    

    원격 - (선택 사항) ssh를 통한 루트 로그인 허용 안 함



    $ sudo vim /etc/ssh/sshd_config
      # Set line 'PermitRootLogin yes' to 'PermitRootLogin no'
    $ sudo service sshd restart  
    

    원격 - (선택 사항) 호스트 이름 설정



    $ sudo hostnamectl set-hostname HOSTNAME
    $ sudo hostnamectl
    

    rbenv 및 Ruby 설치


    원격



    $ sudo apt update; sudo apt upgrade -y
    $ sudo apt install rbenv
    $ rbenv init
      # Follow instructions: append 'eval "$(rbenv init -)"' to ~/.bashrc
    $ source ~/.bashrc # or disconnect and reconnect
    $ mkdir -p "$(rbenv root)"/plugins
    $ sudo apt install git
    $ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
    $ git clone https://github.com/rbenv/rbenv-vars.git "$(rbenv root)"/plugins/rbenv-vars
    $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash
    $ rbenv install 3.0.3
    



    Image by rawpixel


    웹서버 설정


    Nginx 설치(원격)



    $ sudo apt install nginx
    

    승객 설치(원격)



    $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
    $ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger focal main > /etc/apt/sources.list.d/passenger.list'
    $ sudo apt install ca-certificates 
    $ sudo apt update
    $ sudo apt install libnginx-mod-http-passenger
    $ if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi
    $ sudo ls /etc/nginx/conf.d/mod-http-passenger.conf
      # Verify that file exists
    $ sudo vim /etc/nginx/conf.d/mod-http-passenger.conf
      # Change passenger_ruby line to to following (without #): 
      # passenger_ruby /home/deploy/.rbenv/shims/ruby;
    $ sudo service nginx restart
    $ sudo /usr/bin/passenger-config validate-install
    $ sudo /usr/sbin/passenger-memory-stats
    

    구성 Nginx(원격)



    $ sudo rm /etc/nginx/sites-enabled/default
    $ sudo vim /etc/nginx/sites-available/APPNAME
    

    아래에 내용 삽입

    server {
      listen 80;
      listen [::]:80;
    
      server_name YOUR_DOMAIN.ORG;
      # If you deploy without DNS and SSL, you could leave servername blank like below
      # server_name _;
      root /home/deploy/APPNAME/current/public;
      client_max_body_size 10m; # Set max upload size
    
      passenger_enabled on;
      passenger_app_env production;
      passenger_env_var RUBYOPT '-r bundler/setup'; # Cf issue: https://github.com/phusion/passenger/issues/2409
    
      # Uncomment if you use ActionCable and/or Turbo Streams
      # location /cable {
      #   passenger_app_group_name APPNAME_ws;
      #   passenger_force_max_concurrent_requests_per_process 0;
      # }  
    
      location ~ ^/assets {
        expires max;
        gzip_static on;
      }
    }
    



    $ sudo ln -s /etc/nginx/sites-available/APPNAME ../sites-enabled/APPNAME
    $ sudo service nginx reload
    




    Image by rawpixel



    데이터베이스 설정



    Postgres 설치(원격)




    $ sudo apt install postgresql postgresql-contrib libpq-dev
    $ sudo service postgresql@12-main status
    $ sudo su - postgres
    $ createuser --pwprompt deploy
      # Enter password
    $ createdb -O deploy DBNAME
      # check db existence with 'psql' then '\l', quit with '\q'
    $ exit
    


    Redis 설치(원격) - ActionCable 또는 Turbo Streams를 사용하지 않는 경우 건너뛰기




    $ sudo apt install redis
    $ sudo service redis-server status
    




    Image by rawpixel



    배포 도구 구성 - Capistrano



    현지의


    Gemfile에 추가

    group :development do
      # ...
      gem 'capistrano'
      gem 'capistrano-rails'
      gem 'capistrano-passenger'
      gem 'capistrano-rbenv'
    end
    



    $ bundle install
    $ bundle exec cap install STAGES=production
    

    Capfile에 추가

    require 'capistrano/rails'
    require 'capistrano/passenger'
    require 'capistrano/rbenv'
    
    set :rbenv_type, :user
    set :rbenv_ruby, '3.0.3'
    


    편집config/deploy.rb
    set :application, "APPNAME"
    set :repo_url, "[email protected]:USERNAME/APPNAME.git"
    # Also works with non-github repos, I roll my own gitolite server
    set :deploy_to, "/home/deploy/#{fetch :application}"
    set :rbenv_prefix, '/usr/bin/rbenv exec' # Cf issue: https://github.com/capistrano/rbenv/issues/96
    append :linked_dirs, 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', '.bundle', 'public/system', 'public/uploads'
    


    편집config/deploy/production.rb
    server 'IP ADDRESS or DOMAIN', user: 'deploy', roles: %w{app db web}
    


    Parts of this section are inspired from GoRails



    전개



    원격 - 환경 변수 준비




    $ mkdir ~/APPNAME
    $ vim ~/APPNAME/.rbenv-vars
      # Set envvars like
      # DATABASE_URL=postgresql://deploy:[email protected]/APPNAME
        # This above can also be set in your database.yml file in your rails project if you prefer...
      # RAILS_MASTER_KEY=YOUR_KEY_IN_master.key
      # SECRET_KEY_BASE=SOME_OTHER_RANDOM_KEY
    


    로컬 - 배포! 🍾🍾🍾




    $ bundle exec cap production deploy
      # Go visit your page already!
    


    원격 - 콘솔에 연결




    $ cd APPNAME/current
    $ bundle exec rails c
      # You need to have the debug gem in prod env enabled! (Gemfile)
    




    Image by rawpixel



    DevOps 도구 상자



    이러한 도구는 DevOps 게임을 최신 상태로 유지하는 데 도움이 됩니다. 다른 권장 사항이 있는 경우 아래에 의견을 남겨주세요.

    원격




    $ top
    $ netstat -nlp
    $ tail -100 PATH_TO_LOGFILE
    $ hostnamectl
    $ df -h
    $ sudo du -h -d 1 /
    


    현지의




    $ dig DOMAIN
    


    보너스 #1 - SSL 설치



    사전에 DNS A-레코드를 설정해야 합니다.

    원격 - Certbot 설치




    $ sudo apt install snapd
    $ sudo snap install core; sudo snap refresh core
    $ sudo snap install --classic certbot
    $ sudo ln -s /snap/bin/certbot /usr/bin/certbot
    $ sudo certbot --nginx
    


    보너스 #2 - HTTP2 활성화



    원격




    $ sudo vim /etc/nginx/sites-available/APPNAME
      # Add http2 to listem command, see below
      # listen [::]:443 ssl http2 ipv6only=on;
      # listen 443 ssl http2;
    $ sudo service nginx restart
    


    마지막 배포는 어땠나요? 아니면 첫 배포를 계획 중인가요? 넘어야 했던 가장 큰 장애물은 무엇이었습니까? 당신은 다른 무엇을하고 있습니까? 아래 토론에 자유롭게 참여하십시오.

    Top image by rawpixel

    좋은 웹페이지 즐겨찾기