跳转至

config.inc.php深入

web/config.inc.php 是每个 MRBS 安装实例自己的配置文件。它定义站点特有的行为,通常还包含敏感信息。请将其作为生产配置管理,而不是当作应用程序源文件。

创建文件

MRBS 运送web/config.inc.php-sample,但故意不运送活动的config.inc.php。

cd /var/www/mrbs
cp config.inc.php-sample config.inc.php

从同一 MRBS 版本中的示例开始。不要将旧样本原样保留。

如何加载配置

共享引导程序按以下顺序加载配置:

  1. systemdefaults.inc.php
  2. areadefaults.inc.php
  3. config.inc.php
  4. site_config.inc
  5. 内部验证和兼容性处理

后面的分配会覆盖前面的分配。这就是为什么短的 config.inc.php 可以在不修改发布文件的情况下替换应用程序默认值。

flowchart LR
  System[System defaults] --> Area[New-area defaults]
  Area --> Local[config.inc.php]
  Local --> Site[Site-specific config]
  Site --> Check[Validation and compatibility]

Important

已存储在数据库中的面积值可通过房间进行编辑。更改 areadefaults.inc.php 或覆盖 config.inc.php 不会重写现有区域。

PHP语法

该配置是可执行的PHP。每个语句都以分号结尾。字符串可以使用单引号或双引号:

$timezone = 'Europe/Berlin';
$default_view = "week";
$kiosk_mode_enabled = false;
$search["count"] = 30;

使用真正的 PHP 布尔值,而不是字符串:

$mail_settings['disabled'] = false;   // Correct
$mail_settings['disabled'] = "false"; // Wrong: this is a non-empty string

数组可以使用受支持的 PHP 语法:

$auth['admin'] = array('alice', 'bob');
$report_open_areas = [1, 3];

不要添加结束 ?> 标签。它可能会引入意外输出并破坏标头或 cookie。

最低设置

新站点通常需要房间时区和数据库连接:

$timezone = 'Europe/Berlin';

$dbsys = 'mysql';
$db_host = 'localhost';
$db_database = 'mrbs';
$db_login = 'mrbs';
$db_password = 'replace-this-password';
$db_tbl_prefix = 'mrbs_';
$db_persist = false;

使用房间所在的时区。它可能与服务器时区不同。

数据库配置

选择数据库

$dbsys = 'mysql'; // MySQL or MariaDB

或:

$dbsys = 'pgsql'; // PostgreSQL

连接行为

localhost可以根据驱动程序选择Unix套接字。使用 127.0.0.1 强制 TCP MySQL。可以单独指定非标准端口:

$db_host = '127.0.0.1';
$db_port = 3306;

PostgreSQL 具有多个模式的安装可以设置:

$db_schema = 'public';

表前缀必须与安装的架构匹配:

$db_tbl_prefix = 'mrbs_';

默认情况下禁用持久连接。仅在衡量实际需求并了解它们与事务和锁的交互后才启用它们。

URL 和反向代理设置

MRBS 通常从请求中获取其 URL。当反向代理、路径前缀或不寻常的虚拟主机设置使其变得不可靠时,请从 systemdefaults.inc.php 复制相关 URL 设置并设置显式公共基础。

外部 URL 必须使用用户看到的方案和主机。配置代理以传递受信任的方案和主机信息,并拒绝不受信任的主机标头。

更改 URL 行为后,测试:

  • 登录后重定向;
  • 电子邮件中的链接;
  • iCalendar URL;
  • 信息亭出口链接;
  • 多站点链接;和
  • HTTP-到-HTTPS重定向。

身份验证和会话

身份验证验证身份; session 方法获取并保留它。

$auth["type"] = "db";
$auth["session"] = "php";

外部系统添加自己的设置,例如:

$auth["type"] = "ldap";
$auth["session"] = "php";

请勿将示例用户或密码复制到生产环境中。明确映射管理员访问权限并测试普通用户和管理员。请参阅认证。

访问控制

$auth下的设置控制公众可见性和特权预订行为:

$auth['deny_public_access'] = true;
$auth['only_admin_can_book'] = false;
$auth['admin_must_obey_policies'] = true;

一起查看相关设置。公共日历、公共报告、信息亭和私人预订可以公开不同的信息。

日历和界面

常见的全局覆盖包括:

$default_view = 'week';
$weekstarts = 1;                 // Monday
$display_mincals = true;
$show_timeline = true;
$kiosk_mode_enabled = false;

日期和时间格式是区域设置感知的。覆盖格式时复制完整的相关 $datetime_formats 条目,而不是部分重建它。

预订规则

许多预订规则都属于一个区域并在数据库中进行管理。全局设置可以跨区域施加限制或限制能力。

将策略覆盖保留在一个明确标记的部分中,并记录业务原因:

// Facilities policy: every user may hold at most 20 future bookings.
$max_per_interval_global_enabled['future'] = true;
$max_per_interval_global['future'] = 20;

在策略边界测试定期预订、多日预订和管理员预订。

电子邮件

选择发送方式,并配置发件人、收件人、事件和连接:

$mail_settings['admin_backend'] = 'smtp';
$mail_settings['from'] = 'mrbs@example.org';
$mail_settings['booker'] = true;

$smtp_settings['host'] = 'mail.example.org';
$smtp_settings['port'] = 587;
$smtp_settings['auth'] = true;
$smtp_settings['secure'] = 'tls';
$smtp_settings['username'] = 'mrbs@example.org';
$smtp_settings['password'] = 'replace-this-password';

保持证书验证启用。请参阅电子邮件通知。

语言和当地用语

仅当浏览器协商不合适时才设置固定的默认语言:

$default_language_tokens = 'de';

覆盖单个标签而不进行编辑web/lang/lang.*:

$vocab_override['en']['mrbs'] = 'Resource Booking';
$vocab_override['de']['mrbs'] = 'Ressourcenbuchung';
$vocab_override['fr']['mrbs'] = 'Réservation de ressources';
$vocab_override['es']['mrbs'] = 'Reserva de recursos';

使用 $vocab_override 可以在升级过程中保留本地措辞。 文本和翻译 涵盖了完整的工作流程。

自定义字段

自定义数据库列可以通过配置进行标记和调整:

$vocab_override['en']['room.coffee_machine'] = 'Coffee machine';
$select_options['entry.catering'] = array(
    'c' => 'Coffee',
    's' => 'Sandwiches',
    'h' => 'Hot lunch'
);
$is_mandatory_field['entry.catering'] = true;
$is_private_field['entry.refreshments'] = true;

必须首先完成数据库更改。 entry 自定义列需要 repeat 中的相同列。有关支持的类型、模式示例、验证、隐私、字段顺序和测试,请参阅自定义字段。

包含另一个文件中的机密

config.inc.php 可以包含另一个文件,但路径必须是绝对路径:

require '/etc/mrbs/database-secrets.php';

被包含的文件应只返回或赋予预期值,并确保 PHP 进程可读取。请将其放在 Web 服务器的公共文档根目录之外。

环境变量也可以显式读取:

$db_password = getenv('MRBS_DB_PASSWORD');

验证所需值是否存在,而不是默默地接受空秘密。

多站点

多站点使用全局配置以及sites/<site>/下的特定于站点的配置。至少,每个站点都需要一个独立的表前缀:

$multisite = true;
$db_tbl_prefix = 'berlin_';

身份验证、邮件、主题和其他设置可能因站点而异。请参阅多站点。

调试

仅暂时启用调试行为,切勿将其暴露给不受信任的用户。特定于集成的调试输出可以包含目录数据、标头、邮件服务器详细信息或个人信息。

保持禁用凭证日志记录:

$auth['log_credentials'] = false;

升级安全维护

对于每个 MRBS 升级:

  1. 备份活动配置。
  2. 从新版本的config.inc.php-sample开始。
  3. 将旧的覆盖与新的默认值进行比较。
  4. 仅传输有意设置。
  5. 删除兼容性检查报告的过时变量。
  6. 运行语法验证和功能测试。

避免将完整的旧默认设置复制到新配置中;这隐藏了新的默认值并使以后的升级变得困难。

验证清单

php -l /var/www/mrbs/config.inc.php

然后验证:

  • 帮助上的应用程序和数据库版本;
  • 数据库连接和表前缀;
  • 房间时区和夏令时行为;
  • 登录、注销、到期和管理员映射;
  • 公共和私人观点;
  • 创建、编辑、删除、重复和策略边界;
  • 电子邮件发件人、收件人和 TLS;
  • 使用报告、导出、信息亭和多站点;和
  • 没有密码或私人数据的日志。

推荐的文件布局

保持文件简短并分组:

<?php
declare(strict_types=1);
namespace MRBS;

// Timezone
$timezone = 'Europe/Berlin';

// Database
$dbsys = 'mysql';
// ...

// Authentication
$auth['type'] = 'db';
$auth['session'] = 'php';

// Site-specific overrides
// ...

每个不明显的覆盖都应该解释为什么安装需要它。