注:Dokku项目自本指南编写以来发生了重大变化。 以下说明可能无法反映Dokku项目的当前状态。
介绍
在开发应用程序一个显著的障碍是提供一个健全的和简单的方法来部署您的成品。Dokku是平台即服务解决方案,使您能够快速部署和一个单独的服务器上配置的应用到生产环境。
Dokku与Heroku类似,可以部署到远程服务器。 不同的是,Dokku被部署到单个个人服务器,并且非常轻量级。 Dokku使用Docker(一种Linux容器系统)来轻松管理其部署。
在本指南中,我们将介绍如何使用DigitalOcean Dokku一键安装映像部署一个使用Dokku的Go应用程序。
第一步 - 创建Dokku Droplet
我们需要做的第一件事是创建包含我们的Dokku安装的VPS实例。 这是使用DigitalOcean Dokku应用程序设置简单。
点击“创建”按钮创建一个新的Droplet:
命名您的Droplet,并选择您要使用的大小和地区:
向下滚动并单击“应用程序”选项卡。 选择Dokku应用程序映像:
如果您有SSH密钥可用,请选择它们。 如果你还没有他们的配置,现在是一个伟大的时间来创建SSH密钥与DigitalOceanDroplet用 。 此步骤将帮助您以后。
点击“创建Droplet”。 将创建您的Dokku VPS实例。
一旦你的Droplet创建,你应该设置你的域名指向你的新DokkuDroplet。 你可以学习如何与DigitalOcean配置的域名在这里。
第二步 - 访问Droplet完成配置
您可以通过从Web浏览器访问您的VPS来完成您的Dokku配置。
如果您配置了一个域名以指向您的Dokku安装,您应该使用您喜爱的网络浏览器访问您的域名。 如果您没有配置域名,您可以使用您的Droplet的IP地址。
您将获得一个简单的配置页面。 这里有一些部分需要配置。
首先,检查公共密钥,你将可以从部署的计算机相匹配。 这意味着如果您的项目在您的家庭计算机上,您应该使用与该设置对应的公共密钥。
如果您在创建Droplet期间选择了多个SSH密钥进行嵌入,则只有第一个可用。 根据需要进行修改。
接下来,修改主机名外地来匹配您的域名。 如果您没有配置域名,请将其保留为您的IP地址。
选择希望引用应用程序的方式。 默认情况下,应用程序将如下所示:
http://your_domain.com:app_specific_port_number
如果选择“为应用程序使用虚拟主机命名”复选框,则可以使用虚拟主机访问您的应用程序:
http://app_name.your_domain.com
单击“完成设置”按钮完成配置。
第三步 - 使用Dokku部署您的Go Web App
现在你已经配置了DokkuDroplet,我们可以开始考虑如何部署我们的Go应用程序。
为了演示一些更复杂的功能,我们将Go应用程序接口与一个PostgreSQL数据库和打印一些行。
安装PostgreSQL插件并初始化应用程序数据库
Dokku坚持一种理念,即应用资源应该作为单独的,可互换的部分处理。 这意味着数据库不会紧密地合并到应用程序代码中,而是作为外部资源处理。
这允许您轻松地更改代码或数据库,而不会影响其他部分。 它们是分开的,但可以轻松,轻松地连接在一起。
Dokku通过插件系统实现这种功能。 Dokku有一个插件的完整列表 ,你可以用它来扩展核心程序的功能。 这意味着如果您的项目不需要它们提供的功能,您不必在生产服务器上包含无关的代码。
要直接从GitHub安装PostgreSQL插件,请运行:
dokku plugin:install https://github.com/dokku/dokku-postgres.git
如果发出dokku help
命令,可以看到Dokku已经纳入我们的环境中PostgreSQL的功能:
dokku help
. . .
plugins Print active plugins
postgres:create <app> Create a PostgreSQL container
postgres:delete <app> Delete specified PostgreSQL container
postgres:info <app> Display database informations
postgres:link <app> <db> Link an app to a PostgreSQL database
postgres:logs <app> Display last logs from PostgreSQL container
run <app> <cmd> Run a command in the environment of an application
. . .
我们有PostgreSQL命令可用,所以让我们为我们的应用程序创建一个数据库:
dokku postgres:create app_name
该app_name
这个命令是非常重要的。 它必须与您为项目选择的名称相匹配,如果您在Dokku配置期间设置虚拟主机,它将决定您将用于访问应用程序的URL:
http://app_name.your_domain.com
此命令将输出数据库的一些连接信息。 您可以随时通过键入以下内容进行访问:
dokku Postgres的:信息APP_NAME
在大多数情况下,你将不必直接使用这些信息,因为一旦你的申请被按下时,它会创建一个名为环境变量DATABASE_URL
,你可以用你的代码中连接到数据库。
使Go应用程序部署
在开发机器(具有与您在设置Dokku时选择的SSH密钥相匹配的SSH密钥的机器)中,我们将配置Go应用程序。 这台机器需要安装git才能正确连接到我们的Dokku服务器。
你可以找到关于如何对不同的平台上安装的git说明GitHub的软件 。 如果你在Ubuntu或Debian,你可以简单地键入:
sudo apt-get install git
为了让Go应用程序正确地挂钩到我们的Dokku环境中,我们需要使用几个库。 我们需要“OS”库,有机会获得DATABASE_URL
环境变量中,“网/ HTTP”图书馆服务于广大Web请求,与“数据库/ SQL”和“LIB / PQ”库来处理数据库交互。
而不是试图从头编写程序,让我们从GitHub克隆一个示例应用程序。 转到您的主目录并克隆它:
cd ~
git clone https://github.com/imchairmanm/go_test.git
切换到项目的目录:
cd go_test
在这里,我们可以看到一些东西,你的Go程序需要与Dokku正常工作。
Procfile:这个文件定义开始转到Web服务所需要的命令。 在这种情况下,该文件指向
web.go
一行的文件web: web.go
,这是我们的主要计划。.godir:此文件包含我们目前的目录,用来建立进口和路径等。
在我们的项目,我们的项目是在完全包含web.go
程序。 使用文本编辑器打开它以查看内部:
nano web.go
在程序的顶部,您将看到我上面提到的库的import语句:
package main import ( "os" "fmt" "net/http" _ "github.com/lib/pq" "database/sql" )
我们用这些线钩入我们的数据库。 怎么看os.Getenv("DATABASE_URL")
行内部变量分配给环境变量。 这是您将如何使用自己的应用程序连接到数据库。
dokku_db := os.Getenv("DATABASE_URL")
db, err = sql.Open("postgres", dokku_db)
if err != nil {
fmt.Printf("sql.Open error: %v\n", err)
return
}
defer db.Close()
文件的其余部分涉及创建表并向其写入一些初始数据。 完成后,关闭文件。
将Go应用程序部署到Dokku
由于我们从GitHub获得了这个项目,它已经受版本控制。 我们需要设置我们的DokkuDroplet作为git远程为我们的项目,使Git可以有效地推动。
这是通过这样的命令:
git remote add remote_name dokku@your_domain.com:app_name
在此命令, remote_name
可以是任何你选择。 它只是一个标签来引用远程Dokku机器。 在大多数情况下,“dokku”或“production”将是适当的名称。
该app_name
参数必须为数据库选择的名称相匹配。 如果您的应用程序没有使用后端数据库,那么您可以选择在网址中用于访问应用程序的名称。
现在我们的应用程序已经准备就绪,知道我们的Dokku服务器,我们可以简单地部署到远程服务器,在那里Dokku程序将接管和配置应用程序环境:
git push remote_name master
你应该看到一些看起来像这样的输出:
-----> app_name linked to postgresql/app_name database -----> Deploying here ... -----> Cleaning up ... =====> Application deployed: http://app_name.your_domain.com To dokku@your_domain.com:app_name * [new branch] master -> master
如果您在Web浏览器中访问该URL,您应该会看到程序的输出:
结论
您现在应该有一个由DokkuDroplet启动的示例Go应用程序。 虽然示例程序是相当混乱,它演示了使您的Go应用程序与像Dokku这样的Web部署应用程序很好地播放所需的一些步骤。 部署本身很容易,发生很快。