如何用CapRover建立你自己的PaaS

简介

平台即服务(PaaS)是基于云的服务,有助于消除开发应用程序的成本和复杂性。像HerokuGoogle App EngineAWS Elastic Beanstalk这样的服务,允许开发者完全在云中建立、运行和操作应用程序,并使用预建的软件组件帮助快速创建和扩展应用程序。

这些服务的问题是,随着方便的使用性,价格也随之提高。一旦你离开免费层(例如Heroku),它就开始变得昂贵。如果你想在你的服务中添加一个数据库作为附加组件,你必须更深入地挖掘你的口袋。

如果有一种选择,可以在你喜欢的任何基础设施上实施你自己的PaaS,并具有典型的PaaS服务的优点和大幅降低的成本,那会怎么样?让我向你介绍CapRover--一个开源的DIY PaaS。

什么是CapRover?

CapRover是一个易于使用的应用程序/数据库部署和网络服务器管理器,适用于各种应用程序,如Node.js、Ruby、PHP、Postgres和MongoDB。它运行速度快,而且非常强大,因为它在用户友好界面的背后使用了Docker、Nginx、LetsEncrypt和NetData。

CapRover通过关注你的应用程序而不是底层基础设施来帮助你提高生产力。此外,利用CapRover的 "一键式应用",你只需点击一个按钮就可以设置Postgres、MongoDB、Plausible Analytics或PGAdmin等应用。

CapRover vs Heroku

CapRover是Heroku的一个优秀替代品。Heroku是一个平台即服务(PaaS),使开发者能够完全在云中构建、运行和操作应用程序。自推出以来,Heroku已经帮助大量的开发者提高了他们的生产力,并更容易部署应用程序。

然而,Heroku也有弊端。伟大的可用性是有代价的。虽然Heroku确实提供了一个免费层,但如果你想运行一个生产就绪的应用程序,你将需要使用他们的一个付费层。这些层级的价格相当昂贵,而且绝对是基于可用性因素,特别是与你购买虚拟专用服务器(VPS)得到的相同规格相比。此外,Heroku免费层上的每个应用程序在不活动30分钟左右就会进入睡眠状态。

如果有一种方法可以在你自己的VPS上实现你自己的Heroku版本呢?让我们来谈谈CapRover,我们自己的私有的、开源的、免费的PaaS。

这些是CapRover的一些伟大功能。

  • CLI用于自动化和脚本编写
  • Web GUI,可访问性和便利性
  • 无锁定性。您可以移除CapRover,而您的应用程序可以继续工作。
  • 容器化和集群的Docker Swarm引擎
  • 引擎盖下的Nginx(完全可定制的模板)用于负载平衡
  • 引擎盖下的Let's Encrypt用于免费SSL(HTTPS)。

安装CapRover并部署你的第一个应用

在本教程中,我们的目标是教你在自己的VPS上安装CapRover,然后演示如何通过流畅的CI/CD流程部署Node.js和Postgres应用程序,这样当我们推送到主分支时,我们的应用程序会自动重建。

前提条件

  • 你已经购买了一个虚拟专用服务器(VPS)。
  • 你已经购买了一个域名
  • 在你的本地机器上安装了Node.js和npm
  • 对Docker的基本了解
  • 对Node.js的基本了解
  • 对Linux命令的基本了解
  • 对如何生成SSH密钥的基本了解

购买VPS和选择操作系统

CapRover官方网站建议您的VPS至少有1GB的内存,以避免构建过程中出现问题。有许多云服务提供商,如Digital Ocean、Vultr、Hetzner或Linode,你可以购买一个VPS,每月只需3美元起。

CapRover是在Ubuntu 18.04上测试的。CapRover官方网站建议Ubuntu 18.04而不是Ubuntu 20,以减少你的生产问题。Ubuntu 18.04至少在2023年之前会继续收到更新。

在本教程中,我将使用来自Hetzner的CX11 VPS,它有1个vCPU,2GB内存,20GB磁盘空间,20TB流量,每月只需花费3美元。

设置您的VPS

您的VPS刚开箱时不包含任何东西,除了您的操作系统之外。在我们安装CapRover之前,我们首先要确保我们安装了所有必要的工具,使我们能够做到这一点。幸运的是,我们真正需要的东西是Docker。

Docker是一个容器引擎,它使用Linux内核功能,如命名空间和控制组,在操作系统之上创建容器(在这里了解更多信息)。

如果你没有听说过Docker,我强烈建议你在安装和使用CapRover之前学习一下基础知识。这也将极大地提高你的开发效率。

安装Docker

好吧,让我们来安装Docker社区版(Docker CE)。

下面的代码将更新apt软件包索引,并安装允许apt通过HTTPS使用存储库的软件包。

sudo apt-get update

sudo apt-get install \\
    apt-transport-https \\
    ca-certificates \\
    curl \\
    gnupg-agent \\
    software-properties-common

复制代码

添加Docker的官方GPG(GNU Privacy Guard)密钥。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

复制代码

再次更新apt软件包索引,并为你的Ubuntu 18.04安装最新版本的Docker引擎和Containerd。

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

复制代码

运行docker -v ,查看你的Docker版本,并检查安装是否成功。

最后,我们可以用这个简单的命令神奇地安装CapRover。

docker run -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover

复制代码

如果你使用Digital Ocean,你也可以使用他们的One-Clickdroplet,它会自动为你安装CapRover。

配置域名

接下来,我们要把我们的域名指向我们的VPS。

首先,我们必须找到我们VPS的公共(或外部)IP地址。您可以在您的VPS用户界面上轻松找到该IP地址。

Screenshot of IP address in CapRover

接下来,去您的域名注册商的网站。登录,并导航到您的域名的DNS设置。我们将使用一个子域,我们将通过A记录指向我们的VPS。

Screenshot of A Record with same IP address

我们在这里使用一个通配符子域,这允许我们的应用程序通过 yourApplicationName.server.yourDomainName.com访问(注意,你不必在这里使用.server ,你可以使用任何你想要的名字)。

配置防火墙

防火墙是一种网络安全设备,它监控传入和传出的网络流量,并根据定义的安全规则集决定是否允许或阻止特定流量。为了使CapRover正常工作并与外界通信,我们需要确保打开适当的端口。根据CapRover的官方网站,它使用。

  • 80 TCP用于普通的HTTP连接
  • 443 TCP,用于安全的HTTPS连接
  • 3000 TCP用于Captain的初始安装(一旦Captain被连接到一个域,就会被阻止)。
  • 996 TCP,用于Docker注册中心的安全HTTPS连接
  • 7946 TCP/UDP用于容器网络发现
  • 4789 用于容器覆盖网络的TCP/UDP
  • 2377 用于Docker Swarm API的TCP/UDP

我们将使用Ubuntu UFW(Uncomplicated Firewall)的默认防火墙配置工具来设置我们的防火墙。

首先,启用防火墙。

sudo ufw enable
复制代码

然后,允许前面提到的端口。

sudo ufw allow 80,443,3000,996,7946,4789,2377/tcp
sudo ufw allow 7946,4789,2377/udp

复制代码

你可以运行ufw status ,检查你的防火墙的当前状态。

你可能已经注意到,像Digital Ocean或Hetzner这样的供应商在他们的网站上为你的VPS提供一个专门的防火墙部分。这些被称为云防火墙。云防火墙在流量到达你的服务器之前就进行过滤。这在DDoS攻击的情况下可能是非常有利的,因为恶意的流量甚至不会到达你的VPS。如果你设置了云防火墙,就没有必要启用像UFW这样的软件防火墙。因为设置云防火墙主要取决于供应商的用户界面,我们在本教程中使用UFW。

初始化CapRover

我们几乎准备好了!在你的本地机器上(在我的例子中是Macbook Pro),让我们通过npm安装CapRover CLI,然后设置好服务器。

安装CapRover CLI。

npm i -g caprover
复制代码

现在我们可以运行设置命令。根据一些输入,CapRover将让我们配置一个新的安全密码(默认是captain42)以及一个SSL证书,以便我们可以启用HTTPS。

caprover serversetup
复制代码

下面是一个输出示例。

Setup CapRover machine on your server...

? have you already started CapRover container on your server? Yes
? IP address of your server: [yourIPAddress]
? CapRover server root domain: server.[yourDomainName].com
? new CapRover password (min 8 characters): [hidden]
? enter new CapRover password again: [hidden]
? "valid" email address to get certificate and enable HTTPS: [[email protected]]
? CapRover machine name, with whom the login credentials are stored locally: [yourCustomCapRoverMachineName]

CapRover server setup completed: it is available as [yourCustomCapRoverMachineName] at https://captain.server.[yourDomainName].com

For more details and docs see CapRover.com

复制代码

我们现在可以导航到 [https://captain.server.[yourDomainName].com](https://captain.server.[yourDomainName].com):

Screenshot of CapRover login screen

让我们用新的安全密码登录。

CapRover "Create New App" screen

祝贺你!你的CapRover PaaS现在已经成功了。您的CapRover PaaS现在已经启动并运行。

在CapRover上托管应用程序

现在你已经建立了自己的PaaS,我们可以在上面托管你的第一个Node.js应用程序。

本节的目标是托管一个基本的Node.js应用,它与Postgres数据库相连。此外,我们想把它设置成在我们推送到主分支时自动重建和部署我们的应用程序。

我们将使用Github上的一个示例项目。如果你想了解更多关于如何用这个技术栈创建CRUD Rest API的信息,请查看这个教程

首先,我从Github上git克隆了这个项目,并将其推送到我自己的Github账户上的一个新的私有仓库。

这个例子项目为一个基本的Express.js应用提供了支架,它与Postgres数据库相连。正如你所看到的,在根文件夹中,我们有一个Dockerfile ,以及docker-compose.yml

虽然我们通常只需运行Docker Compose文件就可以了,但为了让它与CapRover一起工作,我们必须要改变一些东西。CapRover只是一个围绕Docker的薄层。它使用Docker来构建和运行你的应用程序,它通过Docker API来完成。

尽管Docker Compose是Docker CLI的一个功能,但它在Docker API中是不可用的。这意味着CapRover不能处理Docker Compose文件。有一些方法可以解决这个问题,但我们可以在这个限制条件下工作。

下面是我们要做的事情。

  1. 用CapRover的 "一键式 "应用程序建立一个Postgres数据库
  2. 创建一个captain-definition 文件
  3. 在CapRover界面中创建一个新的自定义应用程序
  4. 调整我们的Postgres配置
  5. 连接我们的Github repo并进行部署

1.用CapRover的一键式应用程序设置Postgres数据库

选择一键式应用,并选择PostgreSQL应用。

CapRover One Click Apps screen with PostgresSQL selected

然后,输入数据库的详细信息(如数据库名称、用户名和密码)。

CapRover PostgreSQL screen with app details filled in

安装完成后,数据库将以srv-captain--YOUR_CONTAINER_NAME ,端口为5432,供其他CapRover应用程序使用。在我们的例子中,它是srv-captain--tutorial-postgres-db

2.创建一个captain-definition 文件

CapRover的关键组成部分之一是 [captain-definition](https://caprover.com/docs/captain-definition-file.html)文件,它位于项目的根部。该文件告诉CapRover实际要做什么。

在我们的例子中,我们想告诉它运行Dockerfile ,它也在我们项目的根目录下。创建该文件并添加。

{
  "schemaVersion": 2,
  "dockerfilePath": "./Dockerfile"
 }

复制代码

根据CapRover官方网站,"schemaVersion" 始终是2。

3.在CapRover界面内创建一个新的自定义应用程序

接下来,我们要用CapRover的界面创建一个自定义应用程序。只要给你的应用程序起个名字,然后点击创建新的应用程序按钮。在我们的案例中,我们的Node应用程序是无状态的,因为它与Postgres数据库进行通信。因此,我们不需要勾选具有持久性数据的复选框。

CapRover Create A New App screen

HTTP设置选项卡中,我们将启用HTTPS以及强制HTTPS,将所有HTTP流量重定向到HTTPS,以确保最大的安全性。最后但同样重要的是,我们必须添加我们的应用程序运行的端口。在我们的例子中,它是3000端口。

HTTP settings tab in CapRover interface

4.调整我们的Postgres配置

index.ts 里面,让我们添加。

const client = new Client({
  user: "admin",
  password: "test123",
  host: "srv-captain--tutorial-postgres-db",
  database: "my-db"
});

复制代码

5.连接我们的Github repo并进行部署

现在让我们把CapRover连接到Github repo,这样每当我们推送到主分支时,就会自动构建新的版本。连接到Github是一个两步过程。

首先,我们必须从Github repo获得一个部署密钥。在你的VPS或本地机器上用ssh-keygen ,生成一个新的公/私钥对。

然后,在你的Github repo上,导航到设置/部署密钥。在这里你应该输入你的公钥。

Screenshot of Github Rep on Deploy keys tab

回到CapRover界面的部署选项卡下,我们将首先输入我们的仓库位置,格式为github.com/user/repository 。此外,你可以指定你的分支名称。例如,如果你想让你的应用程序在你推送到dev 分支时都能构建,只需输入dev

最后但同样重要的是,我们必须添加我们的私钥,而不是用户名和密码。我强烈建议你这样做,因为这样做更安全。

Deploy from Github screen in CapRover with SSH Key filled in

为了更加安全,CapRover官方网站建议你使用服务账户。你可以在这里阅读更多关于CapRover的最佳做法。

点击 "保存和更新",等待您的网络钩子URL生成。

很好!现在,最后一步是复制这个URL,并导航到Github上我们的Repo的设置页面。在Webhooks下,简单地添加一个新的Webhook,其URL是CapRover为你生成的。你可以让其余的字段保持原样。

一旦你保存了你的webhook,你的应用程序将自动在CapRover上构建。

最后,我们可以检查出 [https://example-node-postgres-api.server.sevendegrees.io/ping](https://example-node-postgres-api.server.sevendegrees.io/ping)并看到一切都在顺利地运行。

恭喜你,我们已经成功地建立了一个连接到Postgres数据库的Node.js项目,每当我们推送到主分支时,它就会自动重建。所有这些都是在不到一个小时的时间里完成的,而且每月只需支付三美元的费用。

一般安全提示

与Heroku不同,你要对你的服务器上发生的一切负责。因此,你应该把你的VPS的安全视为你的最高优先事项。

下面是我建议你做的一些事情。

  • 保持你的服务器是最新的
  • 使用SSH密钥进行登录
  • 使用一个强大的密码
  • 改变默认的SSH端口
  • 设置一个防火墙
  • 备份你的服务器
  • 设置监控

记住,你的服务器安全的关键是建立安全层,使黑客更难侵入你的系统。层数越多,难度就越大。没有任何系统会是百分之百的安全,但你需要确保在这方面投入最大的努力。

总结

在本教程中,我们了解了什么是CapRover,如何在不到一个小时的时间内建立自己的平台即服务,以及如何通过部署一个简单的Node.js和Postgres应用程序来部署生产就绪的应用程序。

这只是触及了你能用CapRover做的事情的表面。我强烈建议你查看他们的官方文档以了解更多。

如果你有任何问题,请在下面的评论中告诉我。

How to set up your own PaaS with CapRover一文首次出现在LogRocket博客上。

Guess you like

Origin juejin.im/post/7068160034597208101