十、部署我们的程序

我们的应用现在可以部署了。 在本章中,我们将看到如何在不同的服务器上部署我们的应用,使其公开,并向世界展示我们所构建的内容。

Meteor 使得在它自己的服务器基础设施上很容易部署应用。 它是免费且快速的,但可能不适用于生产环境。 因此,我们将着眼于手动部署以及一些构建在任何 Node.js 服务器上的伟大工具。

在本章中,我们将涵盖以下主题:

  • 注册一个 Meteor 开发者帐户
  • 部署在 Meteor 自己的服务器基础设施
  • 手动捆绑和部署 Meteor
  • 使用 Demeteorizer 部署
  • Deploying using Meteor Up

    注释

    如果你想拥有完整的应用在这本书中我们构建部署,从这本书的网页下载的代码在 https://www.packtpub.com/books/content/support/17713 或从 GitHub 库 https://github.com/frozeman/book-building-single-page-web-apps-with-meteor/tree/chapter10

    这段代码没有创建虚拟文章的部分,所以您可以在自己的服务器上开始一个干净的博客。

在 meteor.com 上部署

Meteor 提供了自己的托管环境,每个人都可以通过一个命令免费部署应用。 为了部署应用,Meteor 为我们创建了一个开发者账户,以便我们以后管理和部署应用。 首先,让我们执行以下步骤来部署我们的应用meteor.com:

  1. Deploying on a subdomain of meteor.com is as simple as running the following command in the terminal from our app's folder:

    ``` $ meteor deploy myCoolNewBlog

    ```

    我们可以自由选择要部署的子域。 如果myCoolNewBlog.meteor.com已经被占用,Meteor 会要求我们登录所有者的账户,覆盖当前部署的应用,否则我们将不得不选择另一个名字。

  2. If the domain name is free, Meteor will ask us to provide an e-mail address so that it can create a developer account for us. After entering the e-mail address, we will receive an e-mail with a link to set up our Meteor Developer account, as shown in the following screenshot:

    Deploying on meteor.com

  3. To create our account, we need to follow the link given by Meteor so that we can fully set up our account by adding a username and a password, as shown in the next screenshot:

    Deploying on meteor.com

  4. 之后我们,我们获得开发者账户的页面,我们可以添加电子邮件地址,检查我们最后的登录和授权其他 Meteor 开发人员登录到我们的应用(尽管我们必须添加accounts-meteor-developer包第一)。

  5. 现在,为了最终部署我们的应用,我们需要在终端使用$ meteor login用我们的 Meteor Developer 账号登录,输入我们的凭证,再次运行deploy命令:

    ``` $ meteor deploy myCoolNewBlog

    ```

  6. Using the $ meteor authorized –add <username> command, we can allow other Meteor developers to deploy to our app's subdomain, as shown in the following screenshot:

    Deploying on meteor.com

  7. 如果我们想更新我们部署的应用,我们可以简单地运行$ meteor deploy从我们的应用的文件夹。 Meteor 会问我们要证件,然后我们就可以部署我们的应用了。

如果我们在朋友的电脑上,并想使用我们的 Meteor 帐户,我们可以使用$ meteor login。 Meteor 会让我们保持登录,每个人都可以重新部署我们的任何应用。 当我们完成时,我们需要确保使用$ meteor logout

通过域名在 meteor.com 上部署

我们也可以在meteor.com上托管我们的应用,但可以定义我们自己的域名。

要做到这一点,我们只需使用我们的域名部署,如下所示:

$ meteor deploy mydomain.com

这将宿主的应用在 Meteor。com,但没有直接 URL,如:myapp.meteor.com

点定义域 Meteor 的应用服务器,我们需要改变的记录我们的域名的 IP 地址origin.meteor.com(107.22.210.133写这本书的时候),origin.meteor.comCNAME记录。 您可以在您在 DNS 配置下注册域的提供商处进行此操作。

**Meteor 将得到一个请求从我们的域和内部重定向到我们的应用所在的服务器。

备份和恢复 Meteor 网托管的数据库

如果您曾经需要备份数据库或将其移动到另一个服务器,您可以使用以下命令获取部署数据库的临时 Mongo 数据库凭据:

$ meteor mongo myapp.meteor.com –url

这将得到如下凭证:

mongodb://client-ID:xyz@production-db-b1.meteor.io:27017/yourapp_meteor_com

然后你可以使用前面输出的凭据来备份你的数据库,使用mongodump:

$ mongodump -h production-db-b1.meteor.io --port 27017 --username client-ID --password xyz --db yourapp_meteor_com

这将在您所在的位置创建一个名为dump/yourapp_meteor_com的文件夹,并将数据库的转储文件放在其中。

要将它恢复到另一个服务器,使用mongorestore,最后一个参数是存放数据库转储的文件夹:

$ mongorestore -h mymongoserver.com --port 27017 --username myuser --password xyz --db my_new_database dump/yourapp_meteor_com

如果您只是想将数据放入本地 Meteor 应用的数据库,使用$ meteor启动 Meteor 服务器,并运行以下命令:

$ mongorestore --port 3001

部署在其他服务器上

Meteor 的免费托管很棒,但当涉及到在生产中使用应用时,我们想要控制我们正在使用的服务器。

Meteor 允许我们创建一个应用包,这样我们就可以将它部署到任何 Node.js 服务器上。 唯一的缺点是我们需要自己安装某些依赖项。 此外,还有两个包可以让应用的部署变得和 Meteor 本身一样简单,尽管它们的配置仍然是必需的。

捆绑应用

为了在我们自己的服务器上部署我们的应用,我们需要一个安装了最新版本 Node.js 和 NPM 的 Linux 服务器。 服务器应该具有与我们将在其上创建 bundle 的本地机器相同的平台。 如果您想将应用部署到另一个平台上,请参阅下一节。 现在让我们通过执行以下步骤来构建应用:

  1. 如果我们的服务器符合上述要求,我们可以进入我们的应用的文件夹在我们的本地机器上运行以下命令:
  2. 这将创建myAppBuildFolder,其中有一个*.tar.gz文件。 然后,我们可以将该文件上传到服务器,并在~/Sites/myApp下提取它。 然后我们进入解压的文件夹并运行以下命令:
  3. This will install all the NPM dependencies. After they're installed, we set the necessary environment variables:

    ``` $ export MONGO_URL='mongodb://user:password@host:port/databasename' $ export ROOT_URL='http://example.com' $ export MAIL_URL='smtp://user:password@mailhost:port/' $ export PORT=8080

    ```

    export命令用于设置MONGO_URLROOT_URLMAIL_URL环境变量。

  4. 由于这种手动部署没有预先安装 MongoDB,我们需要在我们的机器上安装它,或者使用一个托管服务,比如 Compose(http://mongohq.com)。 如果我们宁愿自己在服务器上安装 MongoDB,我们可以遵循http://docs.mongodb.org/manual/installation的指南。

  5. The ROOT_URL variable should be the URL of the domain pointing to our server. If our app sends e-mails, we can additionally set our own SMTP server or use a service such as Mailgun (http://mailgun.com) and change the SMTP host in the MAIL_URL variable.

    我们还可以使用PORT环境变量指定要运行应用的端口。 如果我们不设置PORT变量,它将默认使用80端口。

  6. After we set these variables, we go to the root folder of our app and start the server using the following command:

    ``` $ node main.js

    ```

    提示

    如果你想确保你的应用重新启动以防它崩溃或者当服务器重新启动时,看看foreverNPM 包,它是在https://github.com/nodejitsu/forever上解释的。

如果一切顺利,我们的应用应该可以在<your server's ip>:8080

如果我们在手动部署应用时遇到麻烦,我们可以使用下一种方法。

使用除流器部署

使用$ meteor build的缺点是大多数节点模块已经编译过了,因此会在服务器环境中导致问题。 因此出现了 Demeteorizer,它非常类似于$ meteor build,但将额外解包,并创建一个package.json文件,其中包含所有节点依赖项和项目的正确节点版本。 以下是我们如何使用除 Meteor:

  1. Demeteorizer comes as an NPM package, which we can install using the following command:

    ``` $ npm install -g demeteorizer

    ```

    注释

    如果npm文件夹没有权限,请在执行命令前使用sudo

  2. 现在我们可以进入我们的应用的文件夹,并输入以下命令:

  3. 这将输出准备分发应用到my-meteor-blog-converted文件夹。 我们只需将此文件夹复制到服务器,设置前面描述的相同的环境变量,并运行以下命令:

这将在我们指定的端口上启动我们的应用。

使用 Meteor Up 进行部署

前面的步骤帮助我们将应用部署到自己的服务器上,但这种方法仍然需要我们构建、上传和设置环境变量。

Meteor Up(mup)旨在使部署如同$ meteor deploy运行一样简单。 然而,如果我们想要使用 Meteor Up,我们需要在服务器上拥有完整的管理权限。

此外,这允许我们在应用崩溃时使用foreverNPM 包自动重启应用,以及在服务器重启时使用upstartNPM 包启动应用。 我们还可以恢复到以前部署的版本,这为在生产环境上部署提供了良好的基础。

注释

下一步是为更高级的开发人员准备的,因为他们需要在服务器机器上设置sudo权限。 因此,如果您在部署方面没有经验,可以考虑使用模数(http://modulus.io)这样的服务,它使用自己的命令行工具提供在线 Meteor 部署,可在https://modulus.io/codex/meteor_apps上获得。

Meteor Up 将设置服务器并部署我们的应用如下:

  1. 要在本地机器上安装mup,我们输入以下命令:

    ``` $ npm install -g mup

    ```

  2. 现在我们需要为我们的部署配置创建一个文件夹,它可以在我们的应用所在的文件夹:

    ``` $ mkdir ~/my-meteor-blog-deployment $ cd ~/my-meteor-blog-deployment $ mup init

    ```

  3. Meteor Up 为我们创建了一个配置文件,如下所示:

  4. 现在我们可以编辑这个文件以适应我们的服务器环境。
  5. First, we will add the SSH server authentication. We can provide either our RSA key file or a username and a password. If we want to use the latter, we need to install sshpass, a tool used to provide SSH passwords without using the command line:

    "servers": [ { "host": "myServer.com", "username": "johndoe", "password": "xyz" // or pem file (ssh based authentication) //"pem": "~/.ssh/id_rsa" } ],

    注释

    安装sshpass我们的环境,我们可以遵循的步骤在 https://gist.github.com/arunoda/7790979,或者如果你在 Mac OS X 上,看看 http://www.hashbangcode.com/blog/installing-sshpass-osx-mavericks。

  6. Next, we can set some options, such as choosing to install MongoDB on the server. If we use a service such as Compose, we will set it to false:

    "setupMongo": false,

    如果我们已经在服务器上安装了 Node.js,我们也会将下一个选项设置为false:

    "setupNode": false,

    如果我们想提到一个特定的 Node.js 版本,我们可以如下设置:

    "nodeVersion": "0.10.25",

    Meteor Up 也可以为我们安装 PhantomJS,如果我们使用 Meteor 的蜘蛛包,这是必要的,这使得我们的应用可以被搜索引擎抓取:

    "setupPhantom": true,

    在下一个选项中,我们将设置应用的名称,它可以与应用的文件夹名称相同:

    "appName": "my-meteor-blog",

    最后,我们将指向本地应用文件夹,以便 Meteor Up 知道该部署什么:

    "app": "~/my-meteor-blog",

  7. Meteor Up 还让我们预设所有必要的环境变量,如正确的MONGO_URL变量:

    "env": { "ROOT_URL": "http://myServer.com", "MONGO_URL": "mongodb://user:password@host:port/databasename", "PORT": 8080 },


设置服务器

为了使用 Meteor up 设置服务器,我们需要对sudo进行无密码访问。 设置服务器的步骤如下:

  1. 为了启用无密码访问,我们需要将当前用户添加到服务器的sudo组:

    ``` $ sudo adduser sudo

    ```

  2. 然后将NOPASSWD添加到sudoers文件中:

    ``` $ sudo visudo

    ```

  3. 现在用以下行替换%sudo ALL=(ALL) ALL行:

    ``` %sudo ALL=(ALL) NOPASSWD:ALL

    ```

使用 mup 部署

如果一切正常,我们可以设置我们的服务器。 以下步骤解释了我们如何使用mup进行部署:

  1. Run the following command from inside the local my-meteor-blog-deployment folder:

    ``` $ mup setup

    ```

    这将配置我们的服务器并安装配置文件中选择的所有需求。

    一旦这个过程完成,我们可以在任何时候部署我们的应用,通过运行以下命令从相同的文件夹:

    ``` $ mup deploy

    ```

通过这种方式,我们也可以通过创建带有两个不同应用名称的两个独立 Meteor Up 配置创建生产和登台环境,并将其部署到相同的服务器上。

展望

目前,Meteor 将本地部署限制在自己的服务器上,对环境的控制有限。 计划中的是一个名为Galaxy的企业级服务器基础设施,将使 Meteor 应用的部署和扩展像 Meteor 本身一样简单。

尽管如此,由于 Meteor 的简单性和强大的社区,我们已经有了一套丰富的工具,可以部署到任何基于 node .js 的主机和 PaaS 环境中。

注释

例如,如果我们想在 Heroku 上部署,我们可以在https://github.com/jordansissel/heroku-buildpack-meteor上查看 Jordan Sissel 的构建包。

小结

在这一章中,我们学习了如何部署 Meteor,以及如何在 Meteor 自己的服务器基础设施上简单部署。 我们还使用了 Demeteorizer 和 Meteor Up 等工具来部署我们自己的服务器基础设施。

要了解更多关于具体部署方法的信息,请查看以下资源:

你可以找到完整的示例代码的应用,为部署做好准备,在 https://www.packtpub.com/books/content/support/17713 或在 GitHub 上 https://github.com/frozeman/book-building-single-page-web-apps-with-meteor/tree/chapter10

在下一章,我们将创建一个我们之前创建的ReactiveTimer对象的包,并将其发布到 Meteor 的官方包库。**