Publicera Elixir-projekt

Få allt på plats som du behöver för att kunna produktionssätta dina elixir-projekt!

  1. Skaffa konto hos digitalocean.

  2. Generera api-nyckel för åtkomst via terminalen digitalocean-api-in-menu

Alternativ 1: Följ dessa steg
(Samma steg som finns i scripten i alternativ 2, men att du gör det manuellt, och att vi visa bilder och har med tydliga förklaringar kring varje steg)
(Kan vara bra att göra en gång eller två, och den gången det blir fel - då vänder du dig kanske gladeligen till alternativ 2 som är en samling script som gör allting åt dig.)

Alternativ 2: Automatisera processen:

  1. Skapa/spara dessa script:

create-new-user-deployer.sh

#!/bin/bash

# Create a new user deployer
PASSWORD=my_chosen_password
/usr/sbin/useradd -m deployer # https://askubuntu.com/questions/94060/run-adduser-non-interactively
echo deployer:$PASSWORD | chpasswd

# Create .ssh folder as deployer
su -c "mkdir /home/deployer/.ssh" deployer

# Initiate empty authorized_keys as deployer
su -c "touch /home/deployer/.ssh/authorized_keys" deployer

# Copy over authorized keys from root to deployer
cat /root/.ssh/authorized_keys >> /home/deployer/.ssh/authorized_keys


När du ser /steps/ i filnamnet, så betyder det att filen ska ligga i mappen “steps”.

/steps/update-etc-hosts.sh

#!/bin/bash
HOST="dev.dittprojekt.se"
echo $droplet_IP
echo "hej!"

# sed -i "/$HOST/ s/.*
sudo sed -i '' "/$HOST/ s/.*/$droplet_IP\ $HOST/g" /etc/hosts
## Explanation:
## sed -i "/$HOST/ s/.*/$IP\t$HOST/g" /etc/hosts means in the line which contains $HOST replace everything .* by $IP tab $HOST.
## https://stackoverflow.com/questions/28457543/sed-replace-ip-in-hosts-file-using-hostname-as-pattern#answer-28459928
## make it work @ osx
## https://stackoverflow.com/questions/16745988/sed-command-with-i-option-in-place-editing-works-fine-on-ubuntu-but-not-mac#answer-44864004


steps/install-nginx

#!/bin/bash
echo ""
echo "Installing nginx"
echo ""

# yes är ett program som säger svarar "yes" till alla frågor som kommer upp.
yes | sudo -S apt-get install nginx
sleep 2s

# Setup folder for projects
# sudo mkdir -p /var/www
sudo chown -R deployer:deployer /var/www

echo ""
echo "Finished. nginx installed"
echo ""


/steps/install-postgres.sh

#!/bin/bash
echo ""
echo ""
echo ""
echo "Installing postgres"
echo ""

# Install postgres
yes | sudo apt-get install postgresql-9.6
sleep 1s
ps -ef | grep postgre
sleep 1s
sudo su - postgres
sleep 1s
createuser -d -s deployer
sleep 1s
createdb deployer
## Useful commands: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-9-4-on-debian-8#useful-commands

# Sätt postgres-användarens lösenord till postgres, så att en ny phoenix app fungerar med defaultinställningarna.. Ska ju såklart ändras så att jag t.ex. använder deployer istället direkt nästa ggn!
psql -c "ALTER USER postgres PASSWORD 'postgres';"


# postgres-användaren har ju inte sudo-rättigheter, och det blev strul sista jag försökte
# sudo su tillbaka till förra användaren - vill inte lira, kör detta som deployer
logout
whoami
sleep 3s
# back as deployer? :)
sudo /etc/init.d/postgresql restart
#https://github.com/elixir-ecto/ecto/issues/1207

echo ""
echo "Finished. Postgres installed."
echo ""
echo ""


steps/install-elixir

#!/bin/bash
# Install erlang
### A mix of instructions from these two pages:
### https://elixir-lang.org/install.html
### https://www.digitalocean.com/community/tutorials/how-to-automate-elixir-phoenix-deployment-with-distillery-and-edeliver-on-ubuntu-16-04#step-2-%E2%80%94-installing-elixir-and-phoenix-on-the-production-server
### https://www.erlang-solutions.com/resources/download.html
### https://hexdocs.pm/phoenix/installation.html#content

## Add Erlang Solutions repo:
# wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
# DEBIAN_FRONTEND=noninteractive sudo dpkg -i erlang-solutions_1.0_all.deb
## Why DEBIAN_FRONTEND=noninteractive? - because I was running into this:
## https://askubuntu.com/questions/506158/unable-to-initialize-frontend-dialog-when-using-ssh

## Install the Erlang/OTP platform and all of its applications:
sudo apt-get update
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sleep 1s
yes | sudo dpkg -i erlang-solutions_1.0_all.deb
sleep 1s

yes | sudo apt-get update
yes | sudo apt-get install erlang
yes | sudo apt-get install erlang-parsetools
sleep 1s
yes | sudo apt-get install esl-erlang
sleep 1s

yes | sudo apt-get install dialog # https://github.com/moby/moby/issues/27988
### I get warnings - but perhaps they can be ignored? Searching for information about "Setting up erlang-solutions (1.0) ...  debconf: unable to initialize frontend: Dialog"
### didn't get me anywhere
### Or do they break the script, and so elixir is not installed?

## Install elixir
yes | sudo apt-get install elixir
sleep 2s
echo ""
echo "Finished installing elixir"
echo ""

yes | sudo apt-get install erlang-inets
yes | mix local.hex

## Lägger till elixir path, eftersom det rekommenderades här:
## https://elixir-lang.org/install.html#setting-path-environment-variable
## Hur hitta /path/to/elixir/bin ?!??
## Jo! Kör:
## find . -name "elixir"
## Så kanske du hittar t.ex. /usr/local/lib/elixir/, /usr/local/lib/elixir/bin/
echo 'export PATH="$PATH:/urs/local/lib/elixir/bin"' >>~/.bash_profile
rm ~/erlang-solutions_1.0_all.deb

# Install nodejs (Phoenix dependency)
# sudo apt-get update - so recently run, it really shouldn't be needed again?
yes | sudo apt-get install build-essential libssl-dev
yes | sudo apt-get install curl
yes | curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
yes | sudo apt-get install nodejs

# Tror att jag löste detta i install-postgres! Ta bort detta när allting lirar! :D
# Starta om postgres, så att det lirar med lösenordet!
# sudo /etc/init.d/postgresql restart

# Setup brunch - needed for compiling (?) assets in phoenix projects.
sleep 1s
yes | sudo npm install -g brunch

# Usually in install-nginx, skipping for faster testing of why script is failing
sudo mkdir -p /var/www
sudo chown -R deployer:deployer /var/www
echo ""


  • 4. Skapa och kör detta script:
  • initiate-vps.sh

    #!/bin/bash
    
    DROPLET_NAME=fyndigtNamn
    droplet_created=$(doctl compute droplet create $DROPLET_NAME --size 1gb --image debian-9-x64 --region fra1 --ssh-keys 87:bb:51:6e:30:19:32:11:c8:13:ed:85:81:a1:ca:22 --ssh-keys 07:fa:5c:78:65:60:2e:cc:79:36:f2:47:39:41:11:4b)
    droplet_created_id=$(echo "$droplet_created" | sed -n 2p | grep -Eo '^[^ ]+')
    echo "Droplet created with ID: $droplet_created_id"
    echo ""
    echo "Let's wait a minute or so to let digitalocean connect the droplet to an IP"
    sleep 4s
    echo "Waiit"
    sleep 4s
    echo "fooor"
    sleep 4s
    echo "iiiit"
    sleep 2s
    echo "Go!"
    echo ""
    doctl compute droplet get $droplet_created_id
    echo ""
    droplet_IP=$(doctl compute droplet get $droplet_created_id | sed -n 2p | grep -Eo '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')
    echo "Droplet IP address: $droplet_IP"
    echo ""
    echo "Adding $droplet_IP dev.bunko.se to /etc/hosts"
    source ./steps/update-etc-hosts.sh
    echo "Seems digitalocean needs some more time to open up ports and to get everything into place. Let's wait just a little bit more."
    sleep 20s
    echo ""
    
    # Add user deployer
    ssh -o "StrictHostKeyChecking no" root@$droplet_IP 'bash -s' < create-new-user-deployer.sh
    
    # Prepare settings for deployer user to be able to install smoothly with sudo
    ssh -o "StrictHostKeyChecking no" root@$droplet_IP 'bash -s' < steps/give-deployer-sudo-rights.sh
    
    Install what we need as deployer
    ssh -o "StrictHostKeyChecking no" deployer@$droplet_IP 'bash -s' < steps/install-nginx.sh
    ssh -o "StrictHostKeyChecking no" deployer@$droplet_IP 'bash -s' < steps/install-postgres.sh
    ssh -o "StrictHostKeyChecking no" deployer@$droplet_IP 'bash -s' < steps/install-elixir.sh
    
    
    ssh -o "StrictHostKeyChecking no" root@$droplet_IP
    

    # prod # produktion # vps # värd (host)

    Vem ligger bakom denna kurs?

    Victoria Wagman som har arbetat som lärare i webbutveckling, och idag arbetar som programmerare hos 46elks.

    Detta material byggs upp lite i taget.