如何在Debian上创建带有Cachet的状态页面8

Cachet是一种自托管状态页面,可替代托管服务,如StatusPage.io和Status.io。它可以帮助您沟通应用程序的运行时间和停机时间,并分享有关任何中断的信息。 在本教程中,我们将使用由Composer,SQLite和Nginx构建的基于Debian的Cachet的状态页面。

介绍

Cachet是一种自托管状态页面,可替代托管服务,如StatusPage.ioStatus.io 它可以帮助您沟通应用程序的运行时间和停机时间,并分享有关任何中断的信息。

它是用PHP编写的,所以如果你已经有一个LAMP或者LEMP服务器,那么很容易安装。 它有一个干净的界面,旨在响应,所以它可以在所有设备上工作。 在本教程中,我们将在Debian上设置一个带有Cachet的状态页面。 我们将使用的软件是:

  • 缓存状态页面本身
  • Composer来管理Cachet的PHP依赖关系
  • SQLite作为存储Cachet数据的数据库
  • Nginx服务状态页面

请注意,Cachet不会监视您的网站或服务器的停机时间; Cachet记录事件,可以通过Web界面或使用Cachet的API手动更新事件。 如果您正在寻找监控解决方案,请查看生产建筑:Web应用程序 - 监控教程。

先决条件

要遵循本教程,您将需要:

第1步 - 创建Cachet用户

首先要做的是创建一个单独的用户帐户来运行Cachet。 这将有额外的安全和隔离的好处。

sudo useradd --create-home --shell /bin/bash cachet

此命令将在/home/cachet的主目录创建一个名为cachet的用户,其shell将被设置为/bin/bash 默认值为/bin/sh ,但它的提示中没有提供足够的信息。 它将是一个无密码的用户,它将具有专用于Cachet将使用的组件的权限。

现在创建用户,让我们安装PHP依赖关系。

第2步 - 安装PHP依赖关系

接下来,我们需要安装Cachet的依赖项,这是一些PHP包以及wgetunzip ,Composer用来下载和解压缩PHP库。

sudo apt-get install \
  php5-fpm php5-curl php5-apcu php5-readline \
  php5-mcrypt php5-apcu php5-cli php5-gd php5-sqlite\
  wget unzip

您可以从官方PHP扩展列表中了解有关任何单个软件包的更多信息。

现在我们来配置php-fpm ,FastCGI Process Manager。 Nginx将使用它来代理对Cachet的请求。

首先,创建将承载php-fpm需要的Cachet信息的文件。 打开/etc/php5/fpm/pool.d/cachet.confnano或您喜欢的编辑器。

sudo nano /etc/php5/fpm/pool.d/cachet.conf

贴在下面:

/etc/php5/fpm/pool.d/cachet.conf
[cachet]
user = cachet
group = cachet
listen.owner = www-data
listen.group = www-data
listen = /var/run/php5-fpm-cachet.sock
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
request_terminate_timeout = 120s
pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 10s
pm.max_requests = 500
chdir = /

保存并关闭文件。

您可以在关于如何使用Nginx和Php-fpm安全地托管多个网站的文章中阅读有关这些设置的更多信息,但这是以下文件中的每一行:

  • [cachet]是池的名称。 每个池必须有一个唯一的名称
  • usergroup是Linux用户和新池将在其下运行的组。 它与我们在第1步中创建的用户相同。
  • listen.ownerlisten.group定义监听器的所有权,即新的php-fpm池的套接字。 Nginx必须能够读取这个套接字,所以我们使用的是www-data用户和组。
  • listen指定每个池的套接字文件的唯一位置。
  • php_admin_value允许您设置自定义PHP配置值。 在这里,我们使用它可以运行Linux命令的禁用功能( exec,passthru,shell_exec,system )。
  • php_admin_flagphp_admin_flag类似,但它只是布尔值的开关,即onoff 我们将禁用允许PHP脚本打开远程文件的PHP函数allow_url_fopen ,并且可以被攻击者使用。
  • pm选项允许您配置池的性能。 我们将其设置为ondemand ,它提供了一个平衡,以保持内存使用率低,并且是合理的默认值。 如果你有足够的内存,那么你可以将其设置为static 如果您有很多CPU线程可以使用,那么dynamic可能是一个更好的选择。
  • chdir选项应该是/ which是文件系统的根目录。 除非您使用其他重要选项( chroot ),否则不应更改此选项。

重新启动php-fpm以使更改生效。

sudo systemctl restart php5-fpm

如果尚未完成,请启用php-fpm服务,以便在服务器重新启动时自动启动:

sudo systemctl enable php5-fpm

现在安装了一般的PHP包,我们来下载Cachet。

第3步 - 下载Cachet

Cachet的源代码托管在GitHub上。 这样可以轻松地使用Git来下载,安装和 - 我们稍后会看到 - 升级它。

接下来的几个步骤应该跟随作为cachet用户,所以切换到它。

sudo su - cachet

将克隆Cachet的源代码导入名为www的新目录。

git clone https://github.com/cachethq/Cachet.git www

完成之后,浏览到Cachet源代码所在的新目录。

cd www

从这一点开始,您就拥有了Cachet开发的所有历史,包括Git分支和标签。 您可以从Cachet的发布页面看到最新的稳定版本,但您也可以在此目录中查看Git标签。

在发布时,最新的稳定版本的Cachet是v2.3.11。 使用Git查看该版本:

git checkout v2.3.11

接下来,让我们熟悉Cachet的配置文件。

第4步 - 配置Cachet

Cachet需要一个名为.env的配置文件,它必须出现在Cachet才能启动。 在其中,您可以配置Cachet用于其设置的环境变量。

我们来复制Cachet附带的备份配置示例。

cp .env.example .env

我们将在这里添加两个配置:一个用于配置数据库,另一个用于配置邮件服务器。

对于数据库,我们将使用SQLite。 它易于配置,不需要安装任何其他服务器组件。

首先,创建将托管我们的数据库的空文件:

touch ./database/database.sqlite

接下来,使用nano或您最喜欢的编辑器打开.env ,以配置数据库设置。

nano .env

因为我们将使用SQLite,我们需要删除很多设置。 找到以DB_开头的设置块:

原来的.env
. . .
DB_DRIVER=mysql
DB_HOST=localhost
DB_DATABASE=cachet
DB_USERNAME=homestead
DB_PASSWORD=secret
DB_PORT=null
DB_PREFIX=null
. . .

删除除DB_DRIVER行以外的所有内容,并将其从mysql更改为sqlite

更新.env
. . .
DB_DRIVER=sqlite
. . .

注意: 如果您正在使用另一个数据库(如MySQL或PostgreSQL),可以检查Cachet的数据库选项,以获取所有可能的数据库驱动程序名称。

接下来,您需要填写MAIL_*设置的SMTP服务器详细信息:

.ENV
. . .
MAIL_HOST=smtp.example.com
MAIL_PORT=25
MAIL_USERNAME=smtp_username
MAIL_PASSWORD=smtp_password
MAIL_ADDRESS=notifications@example.com
MAIL_NAME="Status Page"
. . .

哪里:

  • MAIL_HOST应该是您的邮件服务器的URL。
  • MAIL_PORT应该是邮件服务器监听的端口(通常为25 )。
  • MAIL_USERNAME应该是SMTP帐户设置的用户名(通常是整个电子邮件地址)。
  • MAIL_PASSWORD应该是SMTP帐户设置的密码。
  • MAIL_ADDRESS应该是发送给订阅者的通知的电子邮件地址。
  • MAIL_NAME是发送给订阅者的电子邮件中的名称。 请注意,任何带有空格的值都应包含在双引号内。

您可以在mail.php源代码Laravel 的相应邮件文档中了解有关Cachet邮件驱动程序的更多信息。

完成文件编辑后,保存并退出。 接下来,您需要设置Cachet的数据库。

第5步 - 迁移数据库

Cachet依赖的PHP库由Composer处理。 首先,确保你在正确的目录。

cd /home/cachet/www

然后运行Composer并安装依赖项,不包括用于开发目的的依赖项。 根据您的互联网连接速度,这可能需要一些时间。

composer install --no-interaction --no-dev -o --no-scripts

创建数据库模式并运行迁移。

php artisan migrate

注意:在最新的稳定版本( 2.3.11 )中,使用SQLite时会出现一个错误 ,需要您在其他任何操作之前运行migrate命令。

询问时键入yes 你会看到这样的输出:

**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

Migration table created successfully.
Migrated: 2015_01_05_201324_CreateComponentGroupsTable
...
Migrated: 2016_06_02_075012_AlterTableMetricsAddOrderColumn
Migrated: 2016_06_05_091615_create_cache_table

下一个命令, php artisan app:install ,对数据库进行备份,运行迁移,并自动生成Cachet用于其所有加密的应用程序密钥(即APP_KEY中的APP_KEY值)。

警告:在生产环境中安装并开始使用Cachet后,切勿更改.env文件中的APP_KEY值。 这将导致您的所有加密/散列数据丢失。 仅使用php artisan app:install命令一次。 因此,保留.env的备份是个好主意。

完成安装。

php artisan app:install

输出将如下所示:

Clearing settings cache...
Settings cache cleared!
. . .
Clearing cache...
Application cache cleared!
Cache cleared!

作为最后一个主动的步骤,删除Cachet的缓存以避免500错误。

rm -rf bootstrap/cache/*

现在数据库已经准备就绪,我们可以配置Cachet的任务队列。

第6步 - 配置任务队列

Cachet使用一个队列来调度需要异步运行的任务,比如发送电子邮件。 推荐的方法是使用Supervisor ,一个进程管理器,它提供一个一致的界面,通过该界面可以监视和控制进程。

首先,确保您注销了用户的会话,并切换回sudo非root用户。

exit

安装主管

sudo apt-get install supervisor

然后创建将包含Supervisor从Cachet需要的信息的文件。 打开/etc/supervisor/conf.d/cachet.conf

sudo nano /etc/supervisor/conf.d/cachet.conf

该文件告诉主管如何运行和管理其进程。 您可以在Ubuntu和Debian VPS中如何安装和管理主管的文章中阅读有关Supervisor的更多信息。

并添加以下内容。 如果您使用不同的级别,请确保更新Cachet的目录和用户名。

/etc/supervisor/conf.d/cachet.conf
[program:cachet-queue]
command=php artisan queue:work --daemon --delay=1 --sleep=1 --tries=3
directory=/home/cachet/www/
redirect_stderr=true
autostart=true
autorestart=true
user=cachet

保存并关闭文件,然后重新启动主管。

sudo systemctl restart supervisor

启用S​​upervisor服务,以便在服务器重新启动时自动启动。

sudo systemctl enable supervisor

数据库和任务队列就绪; 要设置的下一个组件是Web服务器。

第7步 - 配置Nginx

我们将使用Nginx作为与php-fpm交谈的Web服务器代理。 先决条件部分有关于如何使用Let's Encrypt颁发的TLS证书设置Nginx的教程。

我们添加CacheT所需的Nginx配置文件。 打开/etc/nginx/sites-available/cachet.confnano或您最喜爱的编辑器。

sudo nano /etc/nginx/sites-available/cachet.conf

这是文件的全文,您应该复制并粘贴。请确保用您的域名替换example.com 下面更详细地描述每个部分的功能。

/etc/nginx/sites-available/cachet.conf
server {
    server_name  example.com;
    listen 80;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443;
    server_name  example.com;

    root /home/cachet/www/public;
    index index.php;

    ssl on;
    ## Location of the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ## From https://cipherli.st/
    ## and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ## Disable preloading HSTS for now.  You can use the commented out header line that includes
    ## the "preload" directive if you understand the implications.
    #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    ssl_buffer_size 1400;

    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm-cachet.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_keep_conn on;
    }
}

这是这个文件的每个部分。

第一个server块将所有HTTP流量重定向到HTTPS:

部分cachet.conf
server {
    server_name example.com;
    listen 80;
    return 301 https://$server_name$request_uri;
}

. . .

第二个server块包含有关此设置的特定信息,如SSL详细信息和php-fpm配置。

root指令告诉Nginx Cachet的根目录。 应该指向public目录,因为我们在/home/cachet/www/克隆了Cachet,最终成为root /home/cachet/www/public;

部分cachet.conf
. . .
server {
    listen 443;
    server_name  example.com;

    root /home/cachet/www/public;
    index index.php;
    . . .
}

SSL证书存在于Let's Encrypt目录中,该目录应以您的域名命名:

部分cachet.conf
. . .
server {
    . . .
    ssl on;
    ## Location of the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    . . .
}

其余的SSL选项直接从Nginx和我们的加密教程中获取

部分cachet.conf
. . .
server {
    . . .
    ## From https://cipherli.st/
    ## and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ## Disable preloading HSTS for now.  You can use the commented out header line that includes
    ## the "preload" directive if you understand the implications.
    #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    ssl_buffer_size 1400;

    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    . . .
}

location ~ \.php$部分告诉Nginx如何提供PHP文件。 最重要的部分是指向我们在创建/etc/php5/fpm/pool.d/cachet.conf时使用的Unix套接字文件。 具体来说,这是/var/run/php5-fpm-cachet.sock

部分cachet.conf
. . .
server {
    . . .
    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm-cachet.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_keep_conn on;
    }
}

保存并关闭文件,如果你还没有。

现在,创建了Nginx的Cachet配置,为sites-enabledsites-enabled目录创建一个符号链接,因为这是Nginx看起来并选择要使用的配置文件的位置:

sudo ln -s /etc/nginx/sites-available/cachet.conf /etc/nginx/sites-enabled/cachet.conf

重新启动Nginx以使更改生效。

sudo systemctl restart nginx

并启用Nginx服务,以便在服务器重新启动时自动启动。

sudo systemctl enable nginx

而已! 如果您现在浏览浏览器中的域名,您将看到Cachet的设置页面。 我们来看看吧

第8步 - 完成Cachet的初始设置

Cachet的其余设置通过浏览器中的GUI完成。 它包括设置站点名称和时区以及创建管理员帐户。 有三个步骤(设置环境,状态页面和管理员帐户),您可以随时在Cachet设置仪表板中更改配置。

环境设置

第一个配置步骤是环境设置。

注意:我们使用的Cachet版本有一个错误 ,即使您已经在.env设置了电子邮件设置,即使环境设置页面中也没有显示电子邮件设置。 这将在2.4版中修复。

字段应填写如下:

  • 缓存驱动程序应为ACP(u)
  • 会话驱动程序应为ACP(u)
  • 邮件驱动程序应该是SMTP
  • 邮件主机应该是您的电子邮件服务器地址。
  • 邮件地址应该是发送订户的通知的电子邮件地址。
  • 邮件用户名应该是SMTP帐户设置的用户名(通常是整个电子邮件地址)。
  • 邮件密码应为SMTP帐户设置的密码。

单击下一步转到下一步。

状态页面设置

在本节中,您将设置站点名称,站点域名,时区和语言。

注意: Cachet支持许多语言,但它是一个社区驱动的项目,这意味着非英语语言中可能会有一些非翻译的字符串。 您可以查看支持的语言列表 ,其中还包括已翻译内容的百分比。

字段应填写如下:

  • 网站名称:将显示在仪表板中的名称。
  • 站点域:您为Cachet选择的FQDN。
  • 选择您的时区:根据观众选择时区。 一个很好的默认是选择UTC。
  • 选择您的语言:选择Cachet界面将使用的语言。
  • 显示对Cachet的支持:如果选择此选项,则通过Cachet消息显示在公用仪表板的页脚。

单击下一步转到下一步。

管理员帐户设置

最后,设置管理员帐号。 选择您的用户名,并输入有效的电子邮件地址和强大的密码。

单击完成设置以保存所有更改。

完成安装

在“完成设置”页面上,您将被告知Cachet已成功配置。 您现在可以点击“返回仪表板”按钮,使用您的管理员凭据登录,并访问Cachet的仪表板页面。

Cachet现在已经完全设置和运行。 最后一步将介绍如何在将来升级Cachet。

第9步 - 升级Cachet

使用Git可以在新版本的Cachet出来时非常容易升级。 所有您需要做的是检出相关标签,然后运行数据库迁移。

注意:在尝试升级到新版本之前,始终最好备份Cachet及其数据库。 对于SQLite,您只需复制database/database.sqlite文件。

首先,切换到cachet用户,并转到Cachet的安装目录。

sudo su - cachet
cd /home/cachet/www

您可以选择打开维护页面。

php artisan down

从GitHub获取最新的Cachet代码。

git fetch --all

并列出所有标签。

git tag -l

您将看到所有当前标签以字母v开头。 您可能会注意到某些是beta或Release Candidate(RC)状态。 因为这是一个生产服务器,你可以忽略它们。 您还可以访问Cachet发行页 ,查看最新的标签。

当您找到要用于升级的标签时,请使用Git查看该标签。 例如,如果要升级到2.4.0版本,则可以使用:

git checkout v2.4.0

在继续之前删除Cachet的缓存。

rm -rf bootstrap/cache{,t}/*

接下来,升级Composer依赖项,通常包含错误修复,性能增强和新功能。

composer install --no-interaction --no-dev -o --no-scripts

最后,运行迁移。

php artisan app:update

如果您打开了维护页面,则可以再次启用访问。

php artisan up

新版本的Cachet将会启动并运行。

结论

您已经使用SQLite设置了带有SSL的Cachet,并且知道如何保持与Git的一致。 您可以选择其他数据库,如MySQL或PostgreSQL。 要了解更多的Cachet选项,请查看官方的Cachet文档