Prática recomendada para versionar o wp-config.php?

35

Existe uma prática recomendada para incluir seu wp-config.phparquivo no repositório de controle de versão?

Estou pensando em criar um novo site com esse tipo de configuração (semelhante a Alex King e Mark Jaquith ):

/index.php
/local-config.php
/wp-config.php
/wp/ (core)
/wp-content/ (plugins, themes, etc.)

Como posso fazer isso sem expor minhas senhas ao git, caso esse repositório se torne público?

Especialmente no post de Mark, parece que o local-config.php pode armazenar detalhes e senhas do banco de dados local, mas os de produção permanecem no wp-config.php. Isso é demais e devo deixar o wp-config.php sem versão?

jjeaton
fonte
Acho que o jeito que Mark Jaquith faz isso não é muito problemático e funciona bem e é um pouco melhor do que a resposta abaixo.
Wyck
Na IMO, tudo deve ser colocado sob controle de versão e o sistema deve ser capaz de lidar com ambientes diferentes, sem qualquer material invasivo, mantendo as coisas seguras e simples de trabalhar. Acabei de publicar como eu faço isso, que cobre todas as suas preocupações :) Entre em contato se tiver alguma dúvida sobre minha configuração.
Ashfame 23/05

Respostas:

45

Aqui está como eu faço isso e não encontrei nada melhor que isso. Eu mantenho uma versão diferente do arquivo wp-config.php sob controle de versão e, em seguida, mantenho um arquivo em um diretório acima, que contém todas as credenciais do banco de dados e sais / chaves. Também dessa maneira, sou capaz de distinguir entre o tipo de instalação que estou executando e fazer as coisas de maneira diferente com base nisso.

Aqui está o que wp-config.phpeu mantenho em git( https://gist.github.com/1923821 ):

<?php

/**
* Define type of server
*
* Depending on the type other stuff can be configured
* Note: Define them all, don't skip one if other is already defined
*/

define( 'DB_CREDENTIALS_PATH', dirname( ABSPATH ) ); // cache it for multiple use
define( 'WP_LOCAL_SERVER', file_exists( DB_CREDENTIALS_PATH . '/local-config.php' ) );
define( 'WP_DEV_SERVER', file_exists( DB_CREDENTIALS_PATH . '/dev-config.php' ) );
define( 'WP_STAGING_SERVER', file_exists( DB_CREDENTIALS_PATH . '/staging-config.php' ) );

/**
* Load DB credentials
*/

if ( WP_LOCAL_SERVER )
    require DB_CREDENTIALS_PATH . '/local-config.php';
elseif ( WP_DEV_SERVER )
    require DB_CREDENTIALS_PATH . '/dev-config.php';
elseif ( WP_STAGING_SERVER )
    require DB_CREDENTIALS_PATH . '/staging-config.php';
else
    require DB_CREDENTIALS_PATH . '/production-config.php';

/**
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*/

if ( ! defined( 'AUTH_KEY' ) )
    define('AUTH_KEY', '9*W=5&lt;Rw-)c].9}g?^[:!j]h+Efr&lt;y$&lt;YmV0XOo|lOIujEE}+[R}iAQZ :Sy3wN}');
if ( ! defined( 'SECURE_AUTH_KEY' ) )
    define('SECURE_AUTH_KEY', 'APge3~H;g+b0FyNF&amp;e`$=g?qj9@FQwqFe^Q4(@p#kDa=NR? $Z9|@v*a(tOj*B+.');
if ( ! defined( 'LOGGED_IN_KEY' ) )
    define('LOGGED_IN_KEY', '5l0+:WTpj8#[V|;&lt;Iw;%rkB(A}r++HwT|s[LW!.wt.=5J!b%Z{F1/[LxQ*d7J&gt;Cm');
if ( ! defined( 'NONCE_KEY' ) )
    define('NONCE_KEY', 'zO2cmQX`Kc~_XltJR&amp;T !Uc72=5Cc6`SxQ3;$f]#J)p&lt;/wwX&amp;7RTB2)K1Qn2Y*c0');
if ( ! defined( 'AUTH_SALT' ) )
    define('AUTH_SALT', 'je]#Yh=RN DCrP9/N=IX^,TWqvNsCZJ4f7@3,|@L]at .-,yc^-^+?0ZfcHjD,WV');
if ( ! defined( 'SECURE_AUTH_SALT' ) )
    define('SECURE_AUTH_SALT', '^`6z+F!|+$BmIp&gt;y}Kr7]0]Xb@&gt;2sGc&gt;Mk6,$5FycK;u.KU[Tw$345K9qoF}WV,-');
if ( ! defined( 'LOGGED_IN_SALT' ) )
    define('LOGGED_IN_SALT', 'a|+yZsR-k&lt;cSf@PQ~v82a_+{+hRCnL&amp;|aF|Z~yU&amp;V0IZ}Mrz@ND])YD22iUM[%Oc');
if ( ! defined( 'NONCE_SALT' ) )
    define('NONCE_SALT', '|1.e9Tx{fPv8D#IXO6[&lt;WY*,)+7+URp0~|:]uqiCOzu93b8,h4;iak+eIN7klkrW');

/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each a unique
* prefix. Only numbers, letters, and underscores please!
*/

$table_prefix = 'ft_';

/**
* WordPress Localized Language, defaults to English.
*
* Change this to localize WordPress. A corresponding MO file for the chosen
* language must be installed to wp-content/languages. For example, install
* de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
* language support.
*/

define( 'WPLANG', '' );

/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*/

if ( WP_LOCAL_SERVER || WP_DEV_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', true );

    define( 'SCRIPT_DEBUG', true );
    define( 'SAVEQUERIES', true );

} else if ( WP_STAGING_SERVER ) {

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_LOG', true ); // Stored in wp-content/debug.log
    define( 'WP_DEBUG_DISPLAY', false );

} else {

    define( 'WP_DEBUG', false );
}


/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

E aqui está o arquivo de configuração local, que eu mantenho um diretório acima da raiz do WordPress, e isso também o torna fora do diretório acessível da Web. Portanto, caso o apache pare de analisar arquivos PHP e comece a jogá-los fora, nossas credenciais de banco de dados ainda estarão seguras ( https: / /gist.github.com/1923848 ):

<?php

/**
 * WordPress config file to use one directory above WordPress root, when awesome version of wp-config.php is in use.
 *
 * Awesome wp-config.php file - https://gist.github.com/1923821
 */

/* WordPress Local Environment DB credentials */

define('DB_NAME', 'project_21');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

/* Keys & Salts */

define('AUTH_KEY',         '5H%)s-nQ,+fn0gwg/p1UjBTmCQ?l[8-!>Q{MW&?X3DM,OF;TaI<SOOTrl0+-@) *');
define('SECURE_AUTH_KEY',  '+%rr@,XIt-V+[.B9++uH1L,L+r)uq}5(:~=&4~Lk|.LV|y;R}fEo?G}+Sntf_JN}');
define('LOGGED_IN_KEY',    'Szv!gQm9#(L&TUD OnM`>sXGge:m1j`L2 5sO;hRNVhlN>IUED1/`%<[ly-GxVJ ');
define('NONCE_KEY',        'o-Jo;>G#-%~,[ki@REqXV%4^I.HDnc.3]P;e8];4pJt% $xe5K<aOb|a2*QKV4c-');
define('AUTH_SALT',        '8-tQb3d|W8,;Y_#mfuFB.1&b%U2fnlLD|F&yH).tLRX=ANEdNap{78o|9tqv6JPt');
define('SECURE_AUTH_SALT', 'RSa%^qd~T|@+!-;qgh,qK-GJ}zPpgxz#+@v6-I;BMwqT`TzGTtg_^n*ILxGOdbq4');
define('LOGGED_IN_SALT',   ']+XV)YK.Q-EU1vR [BT!Y$!d(J_[AO37OP[Fg[/esFx;6cI-L[^O|cvtw9F[;_*Q');
define('NONCE_SALT',       'iP{nTQBzy&f^hSbwBgyan.v9<+ErvAMi2ymLhz`Tl-fF?HXa(j<W`wA*8U3R#-|w');

Dessa forma, se o arquivo acima for nomeado local-config.php, meu sistema se comportará como uma instalação local. Se for nomeado staging-config.php, ele se comporta como uma instalação temporária e se for nomeado production-config.php. Isso me ajuda a ter diferentes valores de certas constantes, como a depuração tem valores diferentes em ambientes diferentes e ainda tem tudo no SCM (git). As possibilidades são infinitas e não há invasão necessária para diferentes ambientes.

Isso garante que você nunca revele informações confidenciais ao público de qualquer maneira, e eu as uso apenas para iniciar qualquer projeto em que trabalho, tenho chaves mais fortes por padrão e assim que as adiciono ao segundo arquivo de configuração, um diretório acima, esses são usados ​​em vez dos definidos aqui. Felicidade!

Ashfame
fonte
Eu gosto dessa abordagem, provavelmente vou acabar fazendo algo assim.
Jjeaton
Como você faz referência ao arquivo de configuração local no diretório pai do arquivo de configuração principal? Via um link simbólico ou via ../(ou seja ../filename) em algum lugar? - Não encontrei nenhum ../no wp-config.phparquivo principal .
KajMagnus
11
@KajMagnus A constante DB_CREDENTIALS_PATHfaz isso.
Ashfame
9

Como posso fazer isso sem expor minhas senhas ao git, caso esse repositório se torne público?

Se o seu wp-config.phparquivo estiver no controle de versão, as senhas que ele contiver também estarão no controle de versão. A única maneira de evitar isso é não colocar o arquivo no controle de versão.

Isso é demais e devo deixar o wp-config.php sem versão?

Meu pressentimento seria permanecer wp-config.phptotalmente não versionado. Mas existem algumas maneiras de contornar isso.

Extraia a parte wp-config.phpque contém suas senhas e hashes em um arquivo separado e include()no wp-config.phparquivo regular . Em seguida, coloque-o wp-config.phpsob controle de versão, mas mantenha seu include()arquivo separado.

wp-config.php:

<?php
/**
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, WordPress Language, and ABSPATH. You can find more information
 * by visiting {@link http://codex.wordpress.org/Editing_wp-config.php Editing
 * wp-config.php} Codex page. You can get the MySQL settings from your web host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don't have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

include( 'conf.php' );    

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = 'wp_';

/**
 * WordPress Localized Language, defaults to English.
 *
 * Change this to localize WordPress. A corresponding MO file for the chosen
 * language must be installed to wp-content/languages. For example, install
 * de_DE.mo to wp-content/languages and set WPLANG to 'de_DE' to enable German
 * language support.
 */
define('WPLANG', '');

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 */
define('WP_DEBUG', false);

/* That's all, stop editing! Happy blogging. */

/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

Agora você pode ver que senhas e hashes não estão incluídos wp-config.php.

conf.php:

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'database_name_here');

/** MySQL database username */
define('DB_USER', 'username_here');

/** MySQL database password */
define('DB_PASSWORD', 'password_here');

/** MySQL hostname */
define('DB_HOST', 'localhost');


/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

Mas, honestamente, neste momento você está apenas adicionando um nível redundante de abstração aqui. Todo o motivo wp-config.phpé separado em primeiro lugar, porque é específico do ambiente. Você não deve copiá-lo de um servidor local para produção de todo ... portanto, não deve estar sob controle de versão.

EAMann
fonte
Parece um trabalho extra, mas posso ver os benefícios em garantir que todas as configurações do wp-config estejam sincronizadas entre os ambientes.
Jjeaton
A divisão wp-config.phptem um benefício extra: você pode incluir conf.phpem um script que não seja do WP sem carregar todo o WordPress.
Tamlyn
4

O exemplo de Mark supõe que você esteja trabalhando com um repositório particular:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
  include( dirname( __FILE__ ) . '/local-config.php' );
  define( 'WP_LOCAL_DEV', true ); 
} else {
  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
}

Em vez de definir as credenciais, você pode facilmente criar um arquivo production-config.php e incluí-lo na verificação condicional:

if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) {
      include( dirname( __FILE__ ) . '/local-config.php' );
      define( 'WP_LOCAL_DEV', true ); 
    } else {
     include( dirname( __FILE__ ) . '/production-config.php' )
    }

Então, em seu production-config.php não-versionado:

  define( 'DB_NAME',     'production_db'       );
  define( 'DB_USER',     'production_user'     );
  define( 'DB_PASSWORD', 'production_password' );
  define( 'DB_HOST',     'production_db_host'  );
Chris_O
fonte
Mesmo que seja um repositório particular, eu não gostaria das senhas armazenadas nele e da flexibilidade de tornar o repositório público, se assim o desejasse. O production-config.php é provavelmente um bom caminho a percorrer.
Jjeaton
2

Você pode confirmar o wp-config.phparquivo no repositório sem suas seqüências secretas e, em seguida, execute:

git update-index --assume-unchanged wp-config.php

Isso fará com que o git assuma que o arquivo está inalterado.

getWeberForStackExchange
fonte
4
É bom saber que não estava ciente da assume-unchangedmudança, mas aqui estão meus dois pontos: (1) Se você adicionar o arquivo diretamente, ele será adicionado ao índice. Portanto, existe o risco de você acidentalmente adicioná-lo em algum momento. (2) A mesclagem de uma confirmação com esse sinalizador fará com que a mesclagem falhe normalmente, de modo que você possa manipulá-lo manualmente, o que torna a solução não elegante. Só pode ser usado para ignorar temporariamente as alterações enquanto algo como uma sessão de desenvolvimento. Aqui, leia mais - gitready.com/intermediate/2009/02/18/…
Ashfame