Skip to content

Instantly share code, notes, and snippets.

@mike1011
Forked from yosukehasumi/readme.md
Last active October 22, 2021 15:17
Show Gist options
  • Save mike1011/b852fa50894cccd1296bfef52eb23a04 to your computer and use it in GitHub Desktop.
Save mike1011/b852fa50894cccd1296bfef52eb23a04 to your computer and use it in GitHub Desktop.

Revisions

  1. mike1011 revised this gist Oct 22, 2021. 1 changed file with 18 additions and 7 deletions.
    25 changes: 18 additions & 7 deletions readme.md
    Original file line number Diff line number Diff line change
    @@ -6,10 +6,11 @@
    4. ElasticSearch
    5. RVM
    6. Rails
    7. Postgres
    8. Capistrano
    9. Let's Encrypt
    10. Firewall
    7. Redis
    8. Postgres
    9. Capistrano
    10. Let's Encrypt
    11. Firewall


    ## Droplet
    @@ -332,9 +333,19 @@ Add your local key to the server, if this doesn't work just add your local publi
    ssh-copy-id [email protected]
    ```

    ## 7. Redis

    Install Redis

    ## 7. Postgres
    ```
    sudo apt-get install redis-server
    ```
    Run redis in the background
    ```
    sudo redis-server --daemonize yes
    ```

    ## 8. Postgres
    [How To Install and Use PostgreSQL on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-16-04)

    Install Postgres
    @@ -370,7 +381,7 @@ libpq has to be installed separately
    sudo apt-get install libpq-dev
    ```

    ## 8. Capistrano
    ## 9. Capistrano

    Add gems to deployment

    @@ -509,7 +520,7 @@ sudo apt-get install nodejs
    ```


    ## 9 Let's Encrypt
    ## 10 Let's Encrypt
    [How To Secure Nginx with Let's Encrypt on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04)

    Install Certbot
  2. @yosukehasumi yosukehasumi revised this gist May 23, 2017. 1 changed file with 10 additions and 10 deletions.
    20 changes: 10 additions & 10 deletions readme.md
    Original file line number Diff line number Diff line change
    @@ -15,7 +15,7 @@
    ## Droplet
    Create a new, start with the smallest droplet. Use **Ubuntu 16.04**, log in as **root**.

    ##1. Create non-root user 'rails'
    ## 1. Create non-root user 'rails'
    [Initial Server Setup with Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04)

    create user 'rails'
    @@ -50,7 +50,7 @@ ln -s /var/www/html html
    ```


    ##2. Swapfile
    ## 2. Swapfile
    [How To Add Swap Space on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04)

    Check swapfile
    @@ -114,7 +114,7 @@ sudo cp /etc/fstab /etc/fstab.bak;
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
    ```

    ##3. NGINX
    ## 3. NGINX
    [How To Install Nginx on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04)

    Install NGINX
    @@ -180,7 +180,7 @@ sudo systemctl restart nginx
    ```/var/log/nginx/error.log``` Any Nginx errors will be recorded in this log.


    ##4. ElasticSearch
    ## 4. ElasticSearch
    [How To Install and Configure Elasticsearch on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-16-04)
    Elastic search requires at least 2GB of ram to work for some reason.

    @@ -256,7 +256,7 @@ Status
    sudo systemctl status elasticsearch.service
    ```

    ##5. RVM
    ## 5. RVM

    [How To Install Ruby on Rails with RVM on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rvm-on-ubuntu-16-04)

    @@ -296,7 +296,7 @@ Install your Ruby VERSION
    rvm install VERSION --default
    ```

    ##6. Rails
    ## 6. Rails
    [Deploying a Rails App on Ubuntu 14.04 with Capistrano, Nginx, and Puma](https://www.digitalocean.com/community/tutorials/deploying-a-rails-app-on-ubuntu-14-04-with-capistrano-nginx-and-puma)

    Install Rails and bundler
    @@ -334,7 +334,7 @@ ssh-copy-id [email protected]



    ##7. Postgres
    ## 7. Postgres
    [How To Install and Use PostgreSQL on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-16-04)

    Install Postgres
    @@ -370,7 +370,7 @@ libpq has to be installed separately
    sudo apt-get install libpq-dev
    ```

    ##8. Capistrano
    ## 8. Capistrano

    Add gems to deployment

    @@ -509,7 +509,7 @@ sudo apt-get install nodejs
    ```


    ##9 Let's Encrypt
    ## 9 Let's Encrypt
    [How To Secure Nginx with Let's Encrypt on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04)

    Install Certbot
    @@ -601,7 +601,7 @@ add_header X-Content-Type-Options nosniff;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ```

    ##Nginx Server finalization
    ## Nginx Server finalization
    [How To Secure Nginx with Let's Encrypt on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04)

    create a new Nginx config file
  3. @yosukehasumi yosukehasumi revised this gist May 23, 2017. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion readme.md
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    #DigitalOcean Rails/Ubuntu/NGINX (16.04) Setup
    # DigitalOcean Rails/Ubuntu/NGINX (16.04) Setup

    1. Setup
    2. Swapfile
  4. @yosukehasumi yosukehasumi created this gist May 23, 2017.
    679 changes: 679 additions & 0 deletions readme.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,679 @@
    #DigitalOcean Rails/Ubuntu/NGINX (16.04) Setup

    1. Setup
    2. Swapfile
    3. NGINX
    4. ElasticSearch
    5. RVM
    6. Rails
    7. Postgres
    8. Capistrano
    9. Let's Encrypt
    10. Firewall


    ## Droplet
    Create a new, start with the smallest droplet. Use **Ubuntu 16.04**, log in as **root**.

    ##1. Create non-root user 'rails'
    [Initial Server Setup with Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04)

    create user 'rails'

    ```
    adduser rails
    ```

    Add to sudoers group

    ```
    usermod -aG sudo rails
    ```

    Switch user to 'rails'

    ```
    su - rails
    ```

    Create ssh key

    ```
    ssh-keygen
    ```

    Create sym link for webroot

    ```
    cd ~
    ln -s /var/www/html html
    ```


    ##2. Swapfile
    [How To Add Swap Space on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-16-04)

    Check swapfile

    ```
    free -h
    ```

    Check freespace

    ```
    df -h
    ```

    Create a 4gb Swap File

    ```
    sudo fallocate -l 4G /swapfile
    ```

    Verify

    ```
    ls -lh /swapfile
    ```

    Lock it down

    ```
    sudo chmod 600 /swapfile
    ```

    Make it swap

    ```
    sudo mkswap /swapfile
    ```

    Enable it

    ```
    sudo swapon /swapfile
    ```

    Verify

    ```
    sudo swapon --show
    ```

    Check swapfile

    ```
    free -h
    ```

    Make it permanent

    ```
    sudo cp /etc/fstab /etc/fstab.bak;
    echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
    ```

    ##3. NGINX
    [How To Install Nginx on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04)

    Install NGINX

    ```
    sudo apt-get update
    sudo apt-get install nginx
    ```

    Check status

    ```
    systemctl status nginx
    ```

    Tweak UFW firewall

    ```
    sudo ufw allow 'OpenSSH'
    sudo ufw allow 'Nginx Full'
    sudo ufw enable
    sudo ufw status
    ```

    Install CURL, get your IP, and check that you can request a page in your browser!

    ```
    sudo apt-get install curl
    curl -4 icanhazip.com
    ```

    **Actions***

    ```
    sudo systemctl start nginx
    ```

    ```
    sudo systemctl stop nginx
    ```

    ```
    sudo systemctl restart nginx
    ```


    **Server Configuration**

    ```/etc/nginx``` - The nginx configuration directory. All of the Nginx configuration files reside here.

    ```/etc/nginx/nginx.conf``` The main Nginx configuration file. This can be modified to make changes to the Nginx global configuration.

    ```/etc/nginx/sites-available/``` The directory where per-site "server blocks" can be stored. Nginx will not use the configuration files found in this directory unless they are linked to the sites-enabled directory (see below). Typically, all server block configuration is done in this directory, and then enabled by linking to the other directory.

    ```/etc/nginx/sites-enabled/``` The directory where enabled per-site "server blocks" are stored. Typically, these are created by linking to configuration files found in the sites-available directory.

    ```/etc/nginx/snippets``` This directory contains configuration fragments that can be included elsewhere in the Nginx configuration. Potentially repeatable configuration segments are good candidates for refactoring into snippets.

    **Server Logs**

    ```/var/log/nginx/access.log``` Every request to your web server is recorded in this log file unless Nginx is configured to do otherwise.

    ```/var/log/nginx/error.log``` Any Nginx errors will be recorded in this log.


    ##4. ElasticSearch
    [How To Install and Configure Elasticsearch on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-16-04)
    Elastic search requires at least 2GB of ram to work for some reason.

    Install JAVA

    ```
    sudo add-apt-repository ppa:webupd8team/java
    sudo apt-get install oracle-java8-installer
    ```

    Get ElasticSearch

    ```
    sudo apt-get update
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.deb
    ```

    Install

    ```
    sudo dpkg -i elasticsearch-5.4.0.deb
    ```

    Remove DEB file

    ```
    rm elasticsearch-5.4.0.deb
    ```

    Enable

    ```
    sudo systemctl enable elasticsearch.service
    ```

    Configure

    ```
    sudo nano /etc/elasticsearch/elasticsearch.yml
    ```

    Edit Config File

    ```
    ...
    cluster.name: mycluster1
    node.name: "My First Node"
    ...
    ```

    Restart

    ```
    sudo systemctl start elasticsearch.service
    ```

    Tweak UFW firewall

    ```
    sudo ufw allow from 127.0.0.1 to any port 9200
    sudo ufw status
    ```

    Test

    ```
    curl -X GET 'http://localhost:9200'
    ```

    Status

    ```
    sudo systemctl status elasticsearch.service
    ```

    ##5. RVM

    [How To Install Ruby on Rails with RVM on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-ruby-on-rails-with-rvm-on-ubuntu-16-04)

    Add key

    ```
    gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
    ```

    Move to a writeable directory

    ```
    cd /tmp
    ```

    Get latest Ruby

    ```
    curl -sSL https://get.rvm.io -o rvm.sh
    ```

    Compile

    ```
    cat /tmp/rvm.sh | bash -s stable --rails
    ```

    Reload your source file

    ```
    source /etc/profile.d/rvm.sh
    ```

    Install your Ruby VERSION

    ```
    rvm install VERSION --default
    ```

    ##6. Rails
    [Deploying a Rails App on Ubuntu 14.04 with Capistrano, Nginx, and Puma](https://www.digitalocean.com/community/tutorials/deploying-a-rails-app-on-ubuntu-14-04-with-capistrano-nginx-and-puma)

    Install Rails and bundler

    ```
    gem install rails -v '5.0.1' -V --no-ri --no-rdoc
    gem install bundler -V --no-ri --no-rdoc
    ```

    Authorize your server to read from your repo, you'll have to add a deployment key to your repo. To do this you must copy your ```~/.ssh/id_rsa.pub``` file to your repo (make sure this is your deployment user, eg. ```rails```)

    ```
    ssh -T [email protected]
    ssh -T [email protected]
    ssh -T [email protected]
    ```

    Change Permissions on html directory

    ```
    sudo chown rails:rails /var/www/html/
    ```

    Clone repo

    ```
    git clone [email protected]:gituser/example.git
    ```

    Add your local key to the server, if this doesn't work just add your local public key (id_rsa.pub) to ```/home/rails/.ssh/authorized_keys```

    ```
    ssh-copy-id [email protected]
    ```



    ##7. Postgres
    [How To Install and Use PostgreSQL on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-16-04)

    Install Postgres

    ```
    sudo apt-get update
    sudo apt-get install postgresql postgresql-contrib
    ```

    Create 'rails' postgres user

    ```
    sudo -i -u postgres
    createuser --interactive
    ```

    Make it look like this:

    ```
    Enter name of role to add: rails
    Shall the new role be a superuser? (y/n) y
    ```

    Create the database for rails user

    ```
    createdb rails
    ```

    libpq has to be installed separately

    ```
    sudo apt-get install libpq-dev
    ```

    ##8. Capistrano

    Add gems to deployment

    ```
    group :development do
    gem 'capistrano'
    gem 'capistrano-rails'
    gem 'capistrano-rvm'
    gem 'capistrano3-puma', github: 'seuros/capistrano-puma'
    gem 'capistrano-bundler'
    gem 'capistrano-rails-console'
    end
    ```

    Install Capistrano

    ```
    cap install
    ```

    Capfile

    ```
    require 'capistrano/setup'
    require 'capistrano/deploy'
    require 'capistrano/rails'
    require 'capistrano/rvm'
    require 'capistrano/bundler'
    require 'capistrano/puma'
    require 'capistrano/scm/git'
    require 'capistrano/rails/console'
    set :rvm_type, :user
    set :rvm_ruby_version, '2.3.1'
    install_plugin Capistrano::Puma
    install_plugin Capistrano::SCM::Git
    Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
    ```

    Deploy.rb, replace (APP_NAME)

    ```
    lock "3.8.1"
    set :application, "APP_NAME"
    set :repo_url, "[email protected]:gituser/example.git"
    set :deploy_to, "/home/rails/html"
    set :pty, true
    set :puma_conf, "#{shared_path}/config/puma.rb"
    append :linked_files, "config/database.yml", "config/secrets.yml", ".env"
    append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"
    ```

    Production.rb, replace SERVER_IP

    ```
    server 'SERVER_IP', user: 'rails', roles: %w{app db web}
    ```

    Create shared config files

    ```
    mkdir -p /var/www/html/shared/config
    touch /var/www/html/shared/config/database.yml
    touch /var/www/html/shared/config/secrets.yml
    touch /var/www/html/shared/config/puma.rb
    touch /home/rails/html/shared/.env
    ```

    Copy config in databse.yml

    ```
    production:
    adapter: postgresql
    encoding: unicode
    pool: 5
    database: APP_PRODUCTION
    username: rails
    url: localhost
    password: <%= ENV['DATABASE_PASSWORD'] %>
    ```

    Copy config into secrets.yml

    ```
    production:
    secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
    ```

    Copy config into .env

    ```
    SECRET_KEY_BASE=mysupersecretkeybase
    DATABASE_URL=127.0.0.1
    DATABASE_PASSWORD=mysupersecretdatabasepassword
    ```

    Copy config in puma.rb

    ```
    #!/usr/bin/env puma
    directory '/home/rails/html/current'
    rackup "/home/rails/html/current/config.ru"
    environment 'production'
    tag ''
    pidfile "/home/rails/html/shared/tmp/pids/puma.pid"
    state_path "/home/rails/html/shared/tmp/pids/puma.state"
    stdout_redirect '/home/rails/html/shared/log/puma_access.log', '/home/rails/html/shared/log/puma_error.log', true
    threads 0,16
    bind 'unix:///home/rails/html/shared/tmp/sockets/puma.sock'
    workers 0
    prune_bundler
    on_restart do
    puts 'Refreshing Gemfile'
    ENV["BUNDLE_GEMFILE"] = "/home/rails/html/current/Gemfile"
    end
    ```

    May need Node.js for Javascript Runtime

    ```
    sudo apt-get install nodejs
    ```


    ##9 Let's Encrypt
    [How To Secure Nginx with Let's Encrypt on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04)

    Install Certbot

    ```
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
    sudo apt-get install certbot
    ```

    Edit NGINX

    ```
    sudo nano /etc/nginx/sites-available/default
    ```

    Inside the server block, add this location block

    ```
    location ~ /.well-known {
    allow all;
    }
    ```

    Check your NGINX config file

    ```
    sudo nginx -t
    ```

    Restart NGINX

    ```
    sudo systemctl restart nginx
    ```

    Get your cert (make sure you know your webroot)

    ```
    sudo certbot certonly --webroot --webroot-path=/var/www/html -d example.com -d www.example.com
    ```

    Generate strong diff

    ```
    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
    ```

    Create configuration snippet

    ```
    sudo nano /etc/nginx/snippets/ssl-example.com.conf
    ```

    Paste in your certificates

    ```
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ```

    Create strong encryption params

    ```
    sudo nano /etc/nginx/snippets/ssl-params.conf
    ```

    Paste in params

    ```
    # from https://cipherli.st/
    # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    # disable HSTS header for now
    #add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ```

    ##Nginx Server finalization
    [How To Secure Nginx with Let's Encrypt on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04)

    create a new Nginx config file

    ```
    touch /etc/nginx/sites-available/rails
    chmod 644 rails
    ```

    Update your APPLICATIONSOCKET.sock, server_name, snippet location

    ```
    upstream app_server {
    server unix:///home/rails/html/shared/tmp/sockets/APPLICATIONSOCKET.sock fail_timeout=0;
    }
    server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name EXAMPLE.COM;
    return 301 https://$server_name$request_uri;
    }
    server {
    # SSL configuration
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include snippets/ssl-example.com.conf;
    include snippets/ssl-params.conf;
    root /home/rails/html/current/public;
    index index.htm index.html;
    location / {
    try_files $uri/index.html $uri.html $uri @app;
    }
    location ~* ^.+\.(jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|mp3|flv|mpeg|avi)$ {
    try_files $uri @app;
    }
    location @app {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
    }
    location ~ /.well-known {
    allow all;
    }
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
    }
    ```

    Update symobolic link

    ```
    cd /etc/nginx/sites-enabled
    rm default
    ln -s /etc/nginx/sites-available/rails default
    ```

    Restart NGINX

    ```
    sudo systemctl restart nginx
    ```