介绍
Cachet 是一种自托管状态页面,可替代 StatusPage.io 和 Status.io 等托管服务。 它可以帮助您传达应用程序的正常运行时间和停机时间,并共享有关任何中断的信息。
它是用 PHP 编写的,因此如果您已经有 LAMP 或 LEMP 服务器,安装起来很容易。 它具有干净的界面,旨在响应迅速,因此可以在所有设备上运行。 在本教程中,我们将在 Debian 上使用 Cachet 设置状态页面。 我们将使用的软件堆栈是:
- Cachet 用于状态页面本身
- Composer 管理 Cachet 的 PHP 依赖
- SQLite 作为存储Cachet数据的数据库
- Nginx 服务状态页
请注意,Cachet 不会监控您的网站或服务器的停机时间; Cachet 记录事件,可以通过 Web 界面或使用 Cachet 的 API 手动更新。 如果您正在寻找监控解决方案,请查看 Building for Production:Web 应用程序 - 监控 教程。
先决条件
要遵循本教程,您将需要:
- 按照 Initial Server Setup with Debian 8 教程设置一台 Debian 8 服务器,包括 sudo 非 root 用户。 Cachet 可以使用 512MB 的内存,但 1GB 或更多会提供最佳性能。
- 具有 A 记录的完全限定域名 (FQDN),将您的域指向服务器的 IPv4 地址。 您可以在 Namecheap 上购买 FQDN 或在 Freenom 上免费获得一个,您可以按照 this hostname tutorial 了解如何设置 DNS 记录的详细信息。
- 使用 Let's Encrypt 安装和设置 Nginx。 您可以按照 How To Install Nginx on Debian 8 教程安装 Nginx,然后按照 How To Secure Nginx with Let's Encrypt on Debian 8 的前两个步骤设置 Let's Encrypt . 可以跳过其余步骤,因为我们将为 Cachet 创建自己的配置文件。
- 按照 如何在 Debian 8 上安装和使用 Composer 的步骤 1 和 2 安装 Composer。
- Git 按照 如何在 Debian 8 上安装 Git 的第 1 步安装,因此您可以从 GitHub 拉取 Cachet 的源代码。
- SMTP 服务器,因此 Cachet 可以向订阅者发送事件电子邮件,并向在 Cachet 界面中创建的用户发送密码提醒。 例如,您可以 使用 Postfix 作为仅发送 SMTP 服务器,或使用第三方提供商,如 Mailgun。
第 1 步 - 创建 Cachet 用户
首先要做的是创建一个单独的用户帐户来运行 Cachet。 这将具有安全性和隔离性的额外好处。
sudo useradd --create-home --shell /bin/bash cachet
此命令将创建一个名为 cachet 的用户,其主目录位于 /home/cachet
,其 shell 将设置为 /bin/bash
。 默认值为 /bin/sh
,但在其提示中没有提供足够的信息。 它将是一个无密码用户,将拥有 Cachet 将使用的组件的专有权限。
现在用户已创建,让我们安装 PHP 依赖项。
第 2 步 — 安装 PHP 依赖项
接下来,我们需要安装 Cachet 的依赖包,它们是一些 PHP 包以及 Composer 用来下载和解压 PHP 库的 wget
和 unzip
。
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 进程管理器。 Nginx 将使用它来代理对 Cachet 的请求。
首先,创建将托管 php-fpm
需要的 Cachet 信息的文件。 使用 nano
或您喜欢的编辑器打开 /etc/php5/fpm/pool.d/cachet.conf
。
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]
是池的名称。 每个池必须有一个唯一的名称user
和group
是 Linux 用户和新池将在其下运行的组。 它与我们在步骤 1 中创建的用户相同。listen.owner
和listen.group
定义了监听器的所有权,即 新php-fpm
池的套接字。 Nginx 必须能够读取此套接字,因此我们使用的是 www-data 用户和组。listen
为每个池指定套接字文件的唯一位置。php_admin_value
允许您设置自定义 PHP 配置值。 在这里,我们使用它禁用可以运行 Linux 命令的功能(exec,passthru,shell_exec,system
)。php_admin_flag
与php_admin_value
类似,但只是布尔值的开关,即on
和off
。 我们将禁用 PHP 函数allow_url_fopen
,它允许 PHP 脚本打开远程文件并可能被攻击者使用。pm
选项允许您配置池的性能。 我们已将其设置为ondemand
,它提供了一个平衡以保持低内存使用,并且是一个合理的默认值。 如果您有足够的内存,则可以将其设置为static
。 如果您有很多 CPU 线程要使用,那么dynamic
可能是更好的选择。chdir
选项应该是/
这是文件系统的根。 除非您使用另一个重要选项(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 并安装依赖项,不包括用于开发目的的依赖项。 根据您的 Internet 连接速度,这可能需要一些时间。
composer install --no-interaction --no-dev -o --no-scripts
创建数据库模式并运行迁移。
php artisan migrate
注意:在最新的稳定版本(2.3.11
)中,在使用SQLite时存在一个错误,需要您先运行migrate
命令别的。
询问时键入 yes
。 你会看到这样的输出:
Output************************************** * 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
备份数据库,运行迁移,并自动生成应用程序密钥(即 .env
中的 APP_KEY
值,Cachet 用于其所有加密。
警告: 在生产环境中安装并开始使用 Cachet 后,切勿更改 .env
文件中的 APP_KEY
值。 这将导致您的所有加密/散列数据丢失。 仅使用一次 php artisan app:install
命令。 因此,最好保留 .env
的备份。
完成安装。
php artisan app:install
输出将如下所示:
OutputClearing settings cache... Settings cache cleared! . . . Clearing cache... Application cache cleared! Cache cleared!
作为最后的主动步骤,删除 Cachet 的缓存以避免 500 错误。
rm -rf bootstrap/cache/*
现在数据库已经准备好了,我们可以配置Cachet的任务队列了。
第 6 步 — 配置任务队列
Cachet 使用队列来调度需要异步运行的任务,例如发送电子邮件。 推荐的方法是使用Supervisor,一个提供一致接口的进程管理器,通过它可以监控和控制进程。
首先,确保您退出 cachet 用户的会话并切换回您的 sudo 非 root 用户。
exit
安装主管。
sudo apt-get install supervisor
然后创建包含 Supervisor 需要从 Cachet 获取的信息的文件。 打开 /etc/supervisor/conf.d/cachet.conf
。
sudo nano /etc/supervisor/conf.d/cachet.conf
这个文件告诉 Supervisor 如何运行和管理它的进程。 您可以在文章 How To Install and Manage Supervisor on 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
保存并关闭文件,然后重新启动 Supervisor。
sudo systemctl restart supervisor
启用 Supervisor 服务,以便在服务器重新启动时自动启动。
sudo systemctl enable supervisor
数据库和任务队列都准备好了; 下一个要设置的组件是 Web 服务器。
第 7 步 — 配置 Nginx
我们将使用 Nginx 作为与 php-fpm
对话的 Web 服务器代理。 先决条件部分包含有关如何使用 Let's Encrypt 颁发的 TLS 证书设置 Nginx 的教程。
让我们添加 Cachet 所需的 Nginx 配置文件。 使用 nano
或您喜欢的编辑器打开 /etc/nginx/sites-available/cachet.conf
。
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 和 Let's Encrypt 教程 :
部分 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-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)。
- Session Driver 应该是 ACP(u)。
- Mail Driver 应该是 SMTP。
- Mail Host 应该是您的电子邮件服务器地址。
- Mail From Address 应该是向订阅者发送通知的电子邮件地址。
- Mail Username 应该是 SMTP 帐户设置的用户名(通常是您的整个电子邮件地址)。
- Mail Password 应该是 SMTP 帐户设置的密码。
点击下一步进入下一步。
状态页面设置
在本节中,您将设置站点名称、站点域、时区和语言。
注意: Cachet 支持多种语言,但它是一个社区驱动的项目,这意味着在非英语语言中可能存在一些未翻译的字符串。 您可以查看支持的语言列表,其中还包括翻译内容的百分比。
字段应填写如下:
- 站点名称: 将出现在仪表板中的名称。
- 站点域: 您为 Cachet 选择的 FQDN。
- 选择您的时区: 根据您的受众选择一个时区。 一个好的默认值是选择 UTC。
- 选择你的语言:选择Cachet的界面将使用的语言。
- 显示对 Cachet 的支持: 如果选择此选项,则在公共仪表板的页脚处将显示 Powered by Cachet 消息。
点击下一步进入下一步。
管理员帐户设置
最后,设置管理员帐户。 选择您的用户名,然后输入有效的电子邮件地址和强密码。
单击 完成设置 以保存所有更改。
完成设置
在 Complete Setup 页面上,您将被告知 Cachet 已成功配置。 您现在可以单击 进入仪表板 按钮以使用您的管理员凭据登录并访问 Cachet 的仪表板页面。
Cachet 现在已完全设置并正常运行。 最后一步涵盖了将来如何升级 Cachet。
第 9 步 — 升级 Cachet
当新版本的 Cachet 出现时,使用 Git 可以非常轻松地进行升级。 您需要做的就是签出相关标签,然后运行数据库迁移。
注意: 在尝试升级到新版本之前备份 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 文档 。