2016-11-11 70 views
0

我在VPS上運行Piwik來記錄我運行的Web應用程序的使用情況統計信息。我目前已經將它部署爲手動安裝,並且最近已經開始Docker化它的任務。根據十二個要素應用原則,我想將其設置爲動態讀取數據庫憑證,可能來自容器中的環境變量;這將允許我使用相同的圖像,無論環境如何。如何動態修改Piwik數據庫連接?

但是,我正在努力解決如何做到這一點。當我看到它有四種方法:

  1. <?php echo getenv('PIWIK_DATABASE_USER') ?>語句到config.ini.php配置文件。但是,這會導致錯誤,我想知道這實際上只是一個INI文件,而不是一個PHP文件。看來other folksstruggled with this too
  2. 重置全局常量PIWIK_USER_PATH以使用引導腳本指向不同的配置/臨時基礎文件夾。我相當肯定這會工作,但是我最不喜歡的解決方案,因爲如果我想創建一個新環境或更改現有環境,我必須重新構建容器圖像。
  3. 使用插件或引導系統來捕捉database credentials event並改變它們在使用之前
  4. 使用插件或引導系統覆蓋使用Config::getInstance()->__set()的配置。

所以,似乎引導設備或插件是一個很好的方法。我可以讀取一個bootstrap.php,但它看起來像在引導過程中很早就被調用,並且此時單身人士未被填充。例如,如果我嘗試在這裏使用(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() 
    { 
    } 
} 

(注意臨時echo輸出的東西在Web應用程序隨機上課的時候被Piwik包括在內)。

這是我打開它的配置:

PluginsInstalled[] = "DatabaseConfiguration" 

One logged issue這個包括從貢獻者的報價通過私人顧問開展必要的工作。但是,我希望自己做必要的黑客攻擊!

回答

1

這個問題原來是一個很好的橡皮鴨!這是我的解決方案。我使用插件的方式,它只需要一些額外的配置。

特別是我在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開發者是否會讓我將這個功能添加到他們的插件列表中。