Packages

Create cloud portable Elixir and Phoenix apps. Write once, use everywhere!

Current section

Files

Jump to
nomad lib mix tasks deployment remote_deploy.ex
Raw

lib/mix/tasks/deployment/remote_deploy.ex

defmodule Nomad.RemoteDeploy do
alias Nomad.{DeploymentScript, UpstartScript, NginxScript, RemoteSetupScript}
@moduledoc """
Transfers the production release to the remote host and sets up the
host's environment, the application and the remote NGINX Web Server.
"""
@doc """
Deploys the production release to the remote host.
"""
def run do
{_, 0} =
if Mix.Shell.IO.yes? "Do you want to setup the remote host?" do
:ok = build_remote_setup_script
{_, 0} = transfer_remote_setup_script
execute_remote_setup_script
end
:ok = build_deployment_script
:ok = build_upstart_script
:ok = build_nginx_script
{_, 0} = deploy_to_remote_host
{_, 0} = transfer_deployment_script
{_, 0} = transfer_upstart_script
{_, 0} = transfer_nginx_script
{_, 0} = execute_remote_deployment_script
:ok = local_cleanup
remote_cleanup
end
defp deploy_to_remote_host do
System.cmd "scp", [
"-i",
System.get_env("SSH_KEY"),
"rel/#{System.get_env("APP_NAME")}/releases/0.0.1/#{System.get_env("APP_NAME")}.tar.gz",
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}:/home/#{System.get_env("USERNAME")}"
]
end
defp transfer_deployment_script do
Mix.Shell.IO.info "Going to transfer the after deployment script."
System.cmd "scp", [
"-i",
System.get_env("SSH_KEY"),
"after_deploy.sh",
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}:/home/#{System.get_env("USERNAME")}"
]
end
defp transfer_upstart_script do
Mix.Shell.IO.info "Going to transfer the Upstart script."
System.cmd "scp", [
"-i",
System.get_env("SSH_KEY"),
"#{System.get_env("APP_NAME")}.conf",
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}:/home/#{System.get_env("USERNAME")}" # Then must be moved to etc/init/
]
command = "base64 -w0 mv #{System.get_env("APP_NAME")}.conf /etc/init"
System.cmd "ssh", [
"-t",
"-i",
System.get_env("SSH_KEY"),
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}",
"echo #{command} | base64 -d | sudo bash"
]
end
defp transfer_nginx_script do
Mix.Shell.IO.info "Going to transfer the NGINX script."
System.cmd "scp", [
"-i",
System.get_env("SSH_KEY"),
"#{System.get_env("APP_NAME")}",
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}:/home/#{System.get_env("USERNAME")}" # then must be moved to /etc/nginx/sites-available"
]
end
defp transfer_remote_setup_script do
Mix.Shell.IO.info "Going to transfer the remote setup script."
System.cmd "scp", [
"-i",
System.get_env("SSH_KEY"),
"remote_setup.sh",
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}:/home/#{System.get_env("USERNAME")}"
]
end
defp execute_remote_setup_script do
Mix.Shell.IO.info "Going to run the remote setup script."
System.cmd "ssh", [
"-i",
System.get_env("SSH_KEY"),
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}",
"chmod 700 remote_setup.sh;./remote_setup.sh"
]
end
defp execute_remote_deployment_script do
Mix.Shell.IO.info "Going to run the remote script."
System.cmd "ssh", [
"-i",
System.get_env("SSH_KEY"),
"#{System.get_env("USERNAME")}@#{System.get_env("HOST")}",
"chmod 700 after_deploy.sh;./after_deploy.sh"
]
end
defp build_deployment_script do
DeploymentScript.build_script
end
defp build_remote_setup_script do
RemoteSetupScript.build_script
end
defp build_upstart_script do
UpstartScript.build_script
end
defp build_nginx_script do
NginxScript.build_script
end
defp local_cleanup do
Mix.Shell.IO.info "Cleaning up local dir."
{_, 0} = System.cmd "rm", ["-rf", "rel"]
:ok = DeploymentScript.delete_script
:ok = UpstartScript.delete_script
:ok = RemoteSetupScript.delete_script
end
defp remote_cleanup do
Mix.Shell.IO.info "Cleaning up remote dir."
System.cmd "ssh", ["#{System.get_env("USERNAME")}@#{System.get_env("HOST")}",
"rm -rf after_deploy.sh #{System.get_env("APP_NAME")}.tar.gz"
]
end
end