如何动态修改Matomo/Piwik个数据库连接?
How to modify Matomo/Piwik database connections dynamically?
我 运行 在 VPS 上使用 Piwik 来记录我 运行 网络应用程序的使用统计信息。我目前已经将它部署为手动安装,并且最近开始着手对它进行 Docker 化的任务。根据十二因素应用程序原则,我想将其设置为动态读取数据库凭据,可能来自容器中的环境变量;这将允许我使用相同的图像,而不管环境如何。
但是,我正在努力弄清楚如何做到这一点。在我看来,有四种方法:
- 将
<?php echo getenv('PIWIK_DATABASE_USER') ?>
语句放入 config.ini.php
配置文件。但是,这会导致错误,我想知道这是否实际上只是一个 INI 文件而不是 PHP 文件。好像other folks have struggled with this too.
- 使用 bootstrap 脚本重置全局常量
PIWIK_USER_PATH
以指向不同的 configuration/temp 基本文件夹。我相当确定这会奏效,但这是我最不喜欢的解决方案,因为如果我想创建一个新环境或更改现有环境,我必须重建容器映像。
- 使用插件或 bootstrap 系统捕获 database credentials event 并在使用前更改它们
- 使用插件或bootstrap系统使用
Config::getInstance()->__set()
覆盖配置。
因此,看来 bootstrap 设备或插件是一个不错的方法。我可以读取一个 bootstrap.php
,但看起来它在 bootstrap 过程中很早就被调用了,并且 Config
单例在那个时候没有被填充。例如,如果我在这里尝试使用 (4),我只会得到一个错误。我正在使用这个演示代码:
<?php
require_once 'vendor/autoload.php';
\Piwik\Config::getInstance()->database['host'] ='localhost';
这里是错误:
PHP Fatal error: Uncaught Piwik\Container\ContainerDoesNotExistException: The root container has not been created yet. in /var/www/html/core/Container/StaticContainer.php:40\nStack trace:\n#0 /var/www/html/core/Container/StaticContainer.php(80): Piwik\Container\StaticContainer::getContainer()\n#1 /var/www/html/core/Config.php(64): Piwik\Container\StaticContainer::get('Piwik\Config')\n#2 /var/www/html/bootstrap.php(4): Piwik\Config::getInstance()\n#3 /var/www/html/index.php(15): require_once('/var/www/html/b...')\n#4 {main}\n thrown in /var/www/html/core/Container/StaticContainer.php on line 40
我也试过一个演示插件,我在config.ini.php
中启用了它,但它似乎没有被包含或实例化,所以它的init()
方法不在改变任何事情的立场。这是插件代码:
<?php
// plugins/DatabaseConfiguration/DatabaseConfiguration.php
namespace Piwik\Plugins\DatabaseConfiguration;
echo "Hello";
class DatabaseConfiguration extends \Piwik\Plugin
{
protected function init()
{
}
}
(请注意,当 Piwik 包含 class 时,临时 echo
会在 Web 应用程序中随机输出一些内容。
这是我在配置中打开它:
PluginsInstalled[] = "DatabaseConfiguration"
One logged issue 这包括贡献者提供的通过私人咨询进行必要工作的提议。但是,我希望自己进行必要的黑客攻击!
这道题原来是个好橡皮鸭!这是我的解决方案。我使用的是插件方式,只是需要一些额外的配置。
特别是我在 global.ini.php
中遗漏了这些行:
; The below is appended to the global.ini.php config file
[Plugins]
Plugins[] = DatabaseConfiguration
即使还有另一个 [Plugins]
部分,这似乎工作正常,所以我在 Dockerfile
中做了一个追加:
# Inject settings file here
COPY config/config.ini.php /var/www/html/config/config.ini.php
COPY config/global.ini.php.append /tmp/global.ini.php.append
# Append the global config to the existing file (this did not seem to be settable
# in the standard config file)
RUN cat /tmp/global.ini.php.append >> /var/www/html/config/global.ini.php
如果能将它添加到 config.inc.php
中就好了,但它似乎对我不起作用。
最后在plugins/DatabaseConfiguration/DatabaseConfiguration.php
中安装了以下代码:
<?php
/**
* A Piwik plugin to set database credentials based on environment variables
*/
namespace Piwik\Plugins\DatabaseConfiguration;
class DatabaseConfiguration extends \Piwik\Plugin
{
public function registerEvents()
{
return [
'Db.getDatabaseConfig' => 'getDatabaseConfig'
];
}
public function getDatabaseConfig(&$dbConfig)
{
$dbConfig['host'] = getenv('PIWIK_DATABASE_HOST');
$dbConfig['dbname'] = getenv('PIWIK_DATABASE_NAME');
$dbConfig['username'] = getenv('PIWIK_DATABASE_USER');
$dbConfig['password'] = getenv('PIWIK_DATABASE_PASSWORD');
}
}
对于 Git 用户,此插件是 available here。
等我有空的时候,我会看看 Piwik 开发人员是否会让我将此功能添加到他们的插件列表中。
我 运行 在 VPS 上使用 Piwik 来记录我 运行 网络应用程序的使用统计信息。我目前已经将它部署为手动安装,并且最近开始着手对它进行 Docker 化的任务。根据十二因素应用程序原则,我想将其设置为动态读取数据库凭据,可能来自容器中的环境变量;这将允许我使用相同的图像,而不管环境如何。
但是,我正在努力弄清楚如何做到这一点。在我看来,有四种方法:
- 将
<?php echo getenv('PIWIK_DATABASE_USER') ?>
语句放入config.ini.php
配置文件。但是,这会导致错误,我想知道这是否实际上只是一个 INI 文件而不是 PHP 文件。好像other folks have struggled with this too. - 使用 bootstrap 脚本重置全局常量
PIWIK_USER_PATH
以指向不同的 configuration/temp 基本文件夹。我相当确定这会奏效,但这是我最不喜欢的解决方案,因为如果我想创建一个新环境或更改现有环境,我必须重建容器映像。 - 使用插件或 bootstrap 系统捕获 database credentials event 并在使用前更改它们
- 使用插件或bootstrap系统使用
Config::getInstance()->__set()
覆盖配置。
因此,看来 bootstrap 设备或插件是一个不错的方法。我可以读取一个 bootstrap.php
,但看起来它在 bootstrap 过程中很早就被调用了,并且 Config
单例在那个时候没有被填充。例如,如果我在这里尝试使用 (4),我只会得到一个错误。我正在使用这个演示代码:
<?php
require_once 'vendor/autoload.php';
\Piwik\Config::getInstance()->database['host'] ='localhost';
这里是错误:
PHP Fatal error: Uncaught Piwik\Container\ContainerDoesNotExistException: The root container has not been created yet. in /var/www/html/core/Container/StaticContainer.php:40\nStack trace:\n#0 /var/www/html/core/Container/StaticContainer.php(80): Piwik\Container\StaticContainer::getContainer()\n#1 /var/www/html/core/Config.php(64): Piwik\Container\StaticContainer::get('Piwik\Config')\n#2 /var/www/html/bootstrap.php(4): Piwik\Config::getInstance()\n#3 /var/www/html/index.php(15): require_once('/var/www/html/b...')\n#4 {main}\n thrown in /var/www/html/core/Container/StaticContainer.php on line 40
我也试过一个演示插件,我在config.ini.php
中启用了它,但它似乎没有被包含或实例化,所以它的init()
方法不在改变任何事情的立场。这是插件代码:
<?php
// plugins/DatabaseConfiguration/DatabaseConfiguration.php
namespace Piwik\Plugins\DatabaseConfiguration;
echo "Hello";
class DatabaseConfiguration extends \Piwik\Plugin
{
protected function init()
{
}
}
(请注意,当 Piwik 包含 class 时,临时 echo
会在 Web 应用程序中随机输出一些内容。
这是我在配置中打开它:
PluginsInstalled[] = "DatabaseConfiguration"
One logged issue 这包括贡献者提供的通过私人咨询进行必要工作的提议。但是,我希望自己进行必要的黑客攻击!
这道题原来是个好橡皮鸭!这是我的解决方案。我使用的是插件方式,只是需要一些额外的配置。
特别是我在 global.ini.php
中遗漏了这些行:
; The below is appended to the global.ini.php config file
[Plugins]
Plugins[] = DatabaseConfiguration
即使还有另一个 [Plugins]
部分,这似乎工作正常,所以我在 Dockerfile
中做了一个追加:
# Inject settings file here
COPY config/config.ini.php /var/www/html/config/config.ini.php
COPY config/global.ini.php.append /tmp/global.ini.php.append
# Append the global config to the existing file (this did not seem to be settable
# in the standard config file)
RUN cat /tmp/global.ini.php.append >> /var/www/html/config/global.ini.php
如果能将它添加到 config.inc.php
中就好了,但它似乎对我不起作用。
最后在plugins/DatabaseConfiguration/DatabaseConfiguration.php
中安装了以下代码:
<?php
/**
* A Piwik plugin to set database credentials based on environment variables
*/
namespace Piwik\Plugins\DatabaseConfiguration;
class DatabaseConfiguration extends \Piwik\Plugin
{
public function registerEvents()
{
return [
'Db.getDatabaseConfig' => 'getDatabaseConfig'
];
}
public function getDatabaseConfig(&$dbConfig)
{
$dbConfig['host'] = getenv('PIWIK_DATABASE_HOST');
$dbConfig['dbname'] = getenv('PIWIK_DATABASE_NAME');
$dbConfig['username'] = getenv('PIWIK_DATABASE_USER');
$dbConfig['password'] = getenv('PIWIK_DATABASE_PASSWORD');
}
}
对于 Git 用户,此插件是 available here。
等我有空的时候,我会看看 Piwik 开发人员是否会让我将此功能添加到他们的插件列表中。