From 485068479c0f23ca5f1cce30d9b6e665d3e4cb9b Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 18 Feb 2015 02:24:50 -0500 Subject: [PATCH 1/3] [ci skip] add experimental linode stackscript --- contrib/stackscript.sh | 183 +++++++++++++++++++++++++ docs/getting-started/install/linode.md | 36 +++++ 2 files changed, 219 insertions(+) create mode 100644 contrib/stackscript.sh create mode 100644 docs/getting-started/install/linode.md diff --git a/contrib/stackscript.sh b/contrib/stackscript.sh new file mode 100644 index 000000000..7650176b2 --- /dev/null +++ b/contrib/stackscript.sh @@ -0,0 +1,183 @@ +#!/bin/bash +# +# +# + +function logit { + # Simple logging function that prepends an easy-to-find marker '=> ' and a timestamp to a message + TIMESTAMP=$(date -u +'%m/%d %H:%M:%S') + MSG="=> ${TIMESTAMP} $1" + echo ${MSG} +} + +function set_ssh_key { + if [ -n "${SSH_KEY}" ]; then + logit "Setting root ssh key" + mkdir -p /root/.ssh + chmod 700 /root/.ssh + echo "$SSH_KEY" > /root/.ssh/authorized_keys + chmod 600 /root/.ssh/authorized_keys + chown -R root:root /root/.ssh + fi +} + +function set_passwordless_ssh { + logit "Turn off password authentication and root login for SSH" + echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config + service ssh restart +} + +function system_primary_ip { + # returns the primary IP assigned to eth0 + ifconfig eth0 | awk -F: '/inet addr:/ {print $2}' | awk '{ print $1 }' +} + +function set_hostname { + logit "Set up hostname" + if [ -n "${HOSTNAME}" ]; then + echo $HOSTNAME > /etc/hostname + echo $IPADDR $FQDN $HOSTNAME >> /etc/hosts + else + system_primary_ip > /etc/hostname + echo "$(system_primary_ip) localhost" >> /etc/hosts + fi + + IPADDR=$(/sbin/ifconfig eth0 | awk '/inet / { print $2 }' | sed 's/addr://') + hostname -F /etc/hostname +} + +function postfix_install_loopback_only { + logit "Installing and configuring Postfix" + # Installs postfix and configure to listen only on the local interface. Also + # allows for local mail delivery + + echo "postfix postfix/destinations string localhost.localdomain, localhost" | debconf-set-selections + echo "postfix postfix/mailname string localhost" | debconf-set-selections + echo "postfix postfix/main_mailer_type select Internet Site" | debconf-set-selections + echo "postfix postfix/myhostname string localhost" | debconf-set-selections + sudo apt-get install -qq -y postfix > /dev/null 2>&1 + /usr/sbin/postconf -e "inet_interfaces = loopback-only" + #/usr/sbin/postconf -e "local_transport = error:local delivery is disabled" + + touch /tmp/restart-postfix +} + +function notify_install_via_email { + if [ -n "${NOTIFY_EMAIL}" ]; then + logit "Sending notification email to ${NOTIFY_EMAIL}" + /usr/sbin/sendmail "${NOTIFY_EMAIL}" < + +Your Dokku installation is complete and now ready to be configured: http://$(system_primary_ip) . Please visit this url to complete the setup of your Dokku instance. + +Enjoy using Dokku! +EOD + fi +} + +function notify_restart_via_email { + if [ -n "${NOTIFY_EMAIL}" ]; then + logit "Sending notification email to ${NOTIFY_EMAIL} of required restart" + /usr/sbin/sendmail "${NOTIFY_EMAIL}" < + +The following linode instance must be restarted: + + ${LINODE_LISHUSERNAME} + +Before restarting, please go to this url: + + https://manager.linode.com/linodes/dashboard/${LINODE_LISHUSERNAME} + +Then click "Edit" next to the selected configuration profile and make the following changes: + +- Change the "Kernel" option to the current "pv-grub" release +- Set the "Xenify Distro" option to "no" + +Then save your changes. Next, reboot the instance from the Linode Dashboard. You'll receive an email once the instance is available to continue the dokku installation. +EOD + fi +} + +function setup_linode { + logit "Installing via linode" + DEBIAN_FRONTEND=noninteractive apt-get install -qq -y linux-virtual + DEBIAN_FRONTEND=noninteractive apt-get purge -qq -y grub2 grub-pc + DEBIAN_FRONTEND=noninteractive apt-get install -qq -y grub + mkdir -p /boot/grub + update-grub -y + sed -i 's/kopt=root=UUID=.* ro/kopt=root=\/dev\/xvda console=hvc0 ro quiet/g' /boot/grub/menu.lst + sed -i 's/# groot=(hd0,0)/# groot=(hd0)/g' /boot/grub/menu.lst + update-grub + + cp /etc/rc.local /etc/rc.local-bak + cat << EOF > /etc/rc.local +#!/bin/sh -e +sudo apt-get update >> /root/setup_linode.txt 2>&1 +sudo apt-get install -y linux-image-extra-"$(uname -r)" >> /root/setup_linode.txt 2>&1 +modprobe aufs >> /root/setup_linode.txt 2>&1 + +sudo apt-get install -y apparmor cgroup-lite >> /root/setup_linode.txt 2>&1 + +sudo apt-get install -y dokku >> /root/setup_linode.txt 2>&1 + +# Clean up this script so it only runs once +rm -f /etc/rc.local +mv /etc/rc.local-bak /etc/rc.local +exit 0 +EOF + chmod +x /etc/rc.local +} + +function install_prerequisites { + sudo apt-get install -qq -y curl > /dev/null 2>&1 + + logit "Installing docker gpg key" + curl --silent https://get.docker.io/gpg 2> /dev/null | apt-key add - > /dev/null 2>&1 + + logit "Installing dokku gpg key" + curl --silent https://packagecloud.io/gpg.key 2> /dev/null | apt-key add - > /dev/null 2>&1 + + logit "Running apt-get update" + sudo apt-get update > /dev/null + + logit "Installing pre-requisites" + sudo apt-get install -qq -y apt-transport-https > /dev/null 2>&1 + + logit "Setting up apt repositories" + echo "deb http://get.docker.io/ubuntu docker main" > /etc/apt/sources.list.d/docker.list + echo "deb https://packagecloud.io/dokku/dokku/ubuntu/ trusty main" > /etc/apt/sources.list.d/dokku.list + + logit "Running apt-get update" + sudo apt-get update > /dev/null +} + +function install_dokku { + logit "Installing pre-requisites" + sudo apt-get install -qq -y linux-image-extra-"$(uname -r)" > /dev/null 2>&1 + + logit "Installing dokku" + sudo apt-get install -qq -y dokku > /dev/null 2>&1 + + logit "Done!" +} + +exec &> /root/stackscript.log + +set_ssh_key +set_passwordless_ssh +postfix_install_loopback_only +set_hostname +install_prerequisites + +if [ -n "$LINODE_ID" ]; then + setup_linode + notify_restart_via_email +else + install_dokku + notify_install_via_email +fi diff --git a/docs/getting-started/install/linode.md b/docs/getting-started/install/linode.md new file mode 100644 index 000000000..43ab3042b --- /dev/null +++ b/docs/getting-started/install/linode.md @@ -0,0 +1,36 @@ +# Installing on Linode + +Due to how Linode installs custom kernels, Linode instances *require* a reboot before they can fully work with Docker/Dokku. The Official Dokku StackScript should take care of this process for you, and will email notify you when the instance is running and you can proceed with installation. + +## Using StackScript + +Deploy using the following (experimental) Official StackScript: + +- https://www.linode.com/stackscripts/view/11348 + +## Without StackScript + +* Build a Ubuntu 13.04 instance + +* Follow these instructions: https://www.linode.com/docs/tools-reference/custom-kernels-distros/run-a-distributionsupplied-kernel-with-pvgrub#ubuntu-1304-raring + +* If `apt-get update` no longer works: + + * Verify if apt-get is trying to use ipv6 instead of ipv4 (e.g. you read something like "[Connecting to us.archive.ubuntu.com (2001:67c:1562::14)]" and apt-get would not proceed). In that case, follow these instructions: http://unix.stackexchange.com/questions/9940/convince-apt-get-not-to-use-ipv6-method (append "precedence ::ffff:0:0/96 100" to /etc/gai.conf) + + * OR: change `/etc/apt/sources.list` to one mentioned in http://mirrors.ubuntu.com/mirrors.txt + +* Run the following commands: + + ```shell + apt-get update + + apt-get install lxc wget bsdtar linux-image-extra-$(uname -r) + + modprobe aufs + ``` +* After this, you can install dokku the default way: + + ```shell + wget -qO- https://raw.github.com/progrium/dokku/master/bootstrap.sh | sudo bash + ``` From 914757360befcf43274cb6d4bdef7f131692bfc1 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 18 Feb 2015 02:25:41 -0500 Subject: [PATCH 2/3] [ci skip] add digitalocean-specific installation instructions --- docs/getting-started/install/digitalocean.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/getting-started/install/digitalocean.md diff --git a/docs/getting-started/install/digitalocean.md b/docs/getting-started/install/digitalocean.md new file mode 100644 index 000000000..04d2ae1d0 --- /dev/null +++ b/docs/getting-started/install/digitalocean.md @@ -0,0 +1,7 @@ +# Digital Ocean + +On Digital Ocean, there is a pre-made image that can be run for Dokku. You can choose to run this image on any sized droplet, though larger droplets will allow you to run larger applications. + +When choosing your Droplet configuration, please disable IPv6 on the droplet. There are known issues with IPv6 on Digital Ocean and Docker, and many have been reported to the Dokku issue tracker. + +If you would like to run Dokku on an IPv6 Digital Ocean Droplet, please consult [this guide](https://jeffloughridge.wordpress.com/2015/01/17/native-ipv6-functionality-in-docker/) for modifying Docker to run under the Digital Ocean IPv6 configuration. From 0822f122269aaf8764e3f56eb91bf07bb84a5e11 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Wed, 18 Feb 2015 02:26:12 -0500 Subject: [PATCH 3/3] [ci skip] Consolidate advanced-installation instructions and simplify the install guide Also move vagrant instructions into their own file --- docs/advanced-installation.md | 24 +++- docs/getting-started/install/vagrant.md | 39 +++++++ docs/installation.md | 149 +++--------------------- 3 files changed, 76 insertions(+), 136 deletions(-) create mode 100644 docs/getting-started/install/vagrant.md diff --git a/docs/advanced-installation.md b/docs/advanced-installation.md index 3a1648712..a2615b8f6 100644 --- a/docs/advanced-installation.md +++ b/docs/advanced-installation.md @@ -1,4 +1,10 @@ -#Advanced installation +# Advanced installation + +You can always install dokku straight from the latest - potentially unstable - master release via the following bash command: + +```shell +wget -qO- https://raw.github.com/progrium/dokku/master/bootstrap.sh | sudo bash +``` ## Development @@ -35,3 +41,19 @@ git clone https://github.com/progrium/dokku.git cd dokku sudo BUILD_STACK=true make install ``` + +## Configuring + +Once dokku is installed, if you are not using the web-installer, you'll want to configure a the virtualhost setup as well as the push user. If you do not, your installation will be considered incomplete and you will not be able to deploy applications. + +Set up a domain and a wildcard domain pointing to that host. Make sure `/home/dokku/VHOST` is set to this domain. By default it's set to whatever hostname the host has. This file is only created if the hostname can be resolved by dig (`dig +short $(hostname -f)`). Otherwise you have to create the file manually and set it to your preferred domain. If this file still is not present when you push your app, dokku will publish the app with a port number (i.e. `http://example.com:49154` - note the missing subdomain). + +You'll have to add a public key associated with a username by doing something like this from your local machine: + + $ cat ~/.ssh/id_rsa.pub | ssh dokku.me "sudo sshcommand acl-add dokku $USER" + +If you are using the vagrant installation, you can use the following command to add your public key to dokku: + + $ cat ~/.ssh/id_rsa.pub | make vagrant-acl-add + +That's it! diff --git a/docs/getting-started/install/vagrant.md b/docs/getting-started/install/vagrant.md new file mode 100644 index 000000000..adcf395ee --- /dev/null +++ b/docs/getting-started/install/vagrant.md @@ -0,0 +1,39 @@ +# Install Dokku using Vagrant + +- Download and install [VirtualBox](https://www.virtualbox.org/wiki/Downloads) +- Download and install [Vagrant](http://www.vagrantup.com/downloads.html) +- Clone Dokku + + ``` + git clone https://github.com/progrium/dokku.git + ``` + +- Setup SSH hosts in your `/etc/hosts` + + ``` + 10.0.0.2 dokku.me + ``` + +- Create VM + ``` + # Optional ENV arguments: + # - `BOX_NAME` + # - `BOX_URI` + # - `BOX_MEMORY` + # - `DOKKU_DOMAIN` + # - `DOKKU_IP`. + cd path/to/dokku + vagrant up + ``` +- Setup SSH Config in `~/.ssh/config`. The port listed here is usually correct, though you may want to verify that it is the same as the one listed in the output of `vagrant ssh-config dokku` + + ``` + Host dokku.me + Port 2222 + ``` + +- Copy your SSH key via `cat ~/.ssh/id_rsa.pub | pbcopy` and paste it into the dokku-installer at http://dokku.me . Change the `Hostname` field on the Dokku Setup screen to your domain and then check the box that says `Use virtualhost naming`. Then click *Finish Setup* to install your key. You'll be directed to application deployment instructions from here. + +You are now ready to deploy an app or install plugins. + +For a different, complete, example see https://github.com/RyanBalfanz/dokku-vagrant-example. diff --git a/docs/installation.md b/docs/installation.md index bc4c54752..47ee35112 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -11,144 +11,23 @@ Ubuntu 14.04 x64 x64. Ideally have a domain ready to point to your host. It's de To install the latest stable version of dokku, you can run the following bootstrapper command: ```shell +# This may need to be run twice wget -qO- https://raw.github.com/progrium/dokku/v0.3.15/bootstrap.sh | sudo DOKKU_TAG=v0.3.15 bash + +# Install the web installer. See `Configuring` under +# `Advanced Install Customization` if you wish to perform the +# rest of the install via CLI +cd /root/dokku && make dokku-installer + +# Go to your server's IP and follow the web installer ``` -## Configuring +For various reasons, certain hosting providers may have other steps that should be preferred to the above. If hosted on any of the following popular hosts, please follow the linked to instructions: -Set up a domain and a wildcard domain pointing to that host. Make sure `/home/dokku/VHOST` is set to this domain. By default it's set to whatever hostname the host has. This file is only created if the hostname can be resolved by dig (`dig +short $(hostname -f)`). Otherwise you have to create the file manually and set it to your preferred domain. If this file still is not present when you push your app, dokku will publish the app with a port number (i.e. `http://example.com:49154` - note the missing subdomain). +- [Digital Ocean Installation Notes](http://progrium.viewdocs.io/dokku/getting-started/install/digital-ocean) +- [Linode Installation Notes](http://progrium.viewdocs.io/dokku/getting-started/install/linode) -You'll have to add a public key associated with a username by doing something like this from your local machine: +As well, you may wish to customize your installation in some other fashion. or experiment with vagrant. The guides below should get you started: - $ cat ~/.ssh/id_rsa.pub | ssh dokku.me "sudo sshcommand acl-add dokku $USER" - -That's it! - -## Advanced installation - -### Development via bash script - -```shell -wget -qO- https://raw.github.com/progrium/dokku/master/bootstrap.sh | sudo bash -``` - -This may take around 5 minutes. Certainly better than the several hours it takes to bootstrap Cloud Foundry. - -You may also wish to take a look at the [advanced installation](http://progrium.viewdocs.io/dokku/advanced-installation) document for additional installation options. - -### Development From Source - -If you plan on developing dokku, the easiest way to install from your own repository is cloning -the repository and calling the install script. Example: - -```shell -git clone https://github.com/yourusername/dokku.git -cd dokku -sudo make install -``` - -The `Makefile` allows source URLs to be overridden to include customizations from your own -repositories. The `DOCKER_URL`, `PLUGINHOOK_URL`, `SSHCOMMAND_URL` and `STACK_URL` -environment variables may be set to override the defaults (see the `Makefile` for how these -apply). Example: - -```shell -sudo SSHCOMMAND_URL=https://raw.github.com/yourusername/sshcommand/master/sshcommand make install -``` - -### Bootstrap a server from your own repository - -The bootstrap script allows the dokku repository URL to be overridden to bootstrap a host from -your own clone of dokku using the `DOKKU_REPO` environment variable. Example: - -```shell -wget https://raw.github.com/progrium/dokku/master/bootstrap.sh -chmod +x bootstrap.sh -sudo DOKKU_REPO=https://github.com/yourusername/dokku.git ./bootstrap.sh -``` - -### Custom buildstep build - -Dokku ships with a pre-built version of the [buildstep](https://github.com/progrium/buildstep) component by -default. If you want to build your own version you can specify that with an env -variable. - -```shell -git clone https://github.com/progrium/dokku.git -cd dokku -sudo BUILD_STACK=true make install -``` - -### Install Dokku using Vagrant - -- Download and install [VirtualBox](https://www.virtualbox.org/wiki/Downloads) -- Download and install [Vagrant](http://www.vagrantup.com/downloads.html) -- Clone Dokku - - ``` - git clone https://github.com/progrium/dokku.git - ``` - -- Setup SSH hosts in your `/etc/hosts` - - ``` - 10.0.0.2 dokku.me - ``` - -- Create VM - ``` - # Optional ENV arguments: - # - `BOX_NAME` - # - `BOX_URI` - # - `BOX_MEMORY` - # - `DOKKU_DOMAIN` - # - `DOKKU_IP`. - cd path/to/dokku - vagrant up - ``` -- Setup SSH Config in `~/.ssh/config`. The port listed here is usually correct, though you may want to verify that it is the same as the one listed in the output of `vagrant ssh-config` - - ``` - Host dokku.me - Port 2222 - ``` - -- Copy your SSH key via `cat ~/.ssh/id_rsa.pub | pbcopy` and paste it into the dokku-installer at http://dokku.me . Change the `Hostname` field on the Dokku Setup screen to your domain and then check the box that says `Use virtualhost naming`. Then click *Finish Setup* to install your key. You'll be directed to application deployment instructions from here. - -You are now ready to deploy an app or install plugins. - -For a different, complete, example see https://github.com/RyanBalfanz/dokku-vagrant-example. - -### Installing on Linode - -#### Using StackScript - -Deploy using the following StackScript: -* https://www.linode.com/stackscripts/view/8552 - -#### Without StackScript - -* Build a Ubuntu 13.04 instance - -* Follow these instructions: https://www.linode.com/wiki/index.php/PV-GRUB#Ubuntu_12.04_Precise - -* If `apt-get update` no longer works: - - * Verify if apt-get is trying to use ipv6 instead of ipv4 (e.g. you read something like "[Connecting to us.archive.ubuntu.com (2001:67c:1562::14)]" and apt-get would not proceed). In that case, follow these instructions: http://unix.stackexchange.com/questions/9940/convince-apt-get-not-to-use-ipv6-method (append "precedence ::ffff:0:0/96 100" to /etc/gai.conf) - - * OR: change `/etc/apt/sources.list` to one mentioned in http://mirrors.ubuntu.com/mirrors.txt - -* Run the following commands: - - ```shell - apt-get update - - apt-get install lxc wget bsdtar linux-image-extra-$(uname -r) - - modprobe aufs - ``` -* After this, you can install dokku the default way: - - ```shell - wget -qO- https://raw.github.com/progrium/dokku/master/bootstrap.sh | sudo bash - ``` +- [Vagrant Installation Notes](http://progrium.viewdocs.io/dokku/getting-started/install/vagrant) +- [Advanced Install Customization](http://progrium.viewdocs.io/dokku/getting-started/install/advanced)