LesOlivex

Servicios informáticos



WordPress con dokku

Category : Administración, Dokku, Git, Herramientas, MySql, Wordpress ago 4th, 2019

VPS

Contratamos maquina virtual con OVH.

Al entrar nos muestra mensaje de error:

warning: setlocale: LC_ALL: cannot change locale (es_ES.UTF-8)

Entramos por ssh y configuramos locales.

sudo dpkg-reconfigure locales

Configuramos los DNS para que nuestro dominio apunte al servidor.

Tipo A, Host: @, TUIP, TTL: 900
Tipo CNAME, * www.TUDOMINIO.com 900

Instalación

Seguimos documentación de dokku

wget https://raw.githubusercontent.com/dokku/dokku/v0.17.9/bootstrap.sh
sudo DOKKU_TAG=v0.17.9 bash bootstrap.sh

http://IP_DE_LA_MAQUINA

Copiamos nuestra clave pública desde nuestro local en .ssh/id_rsa.pub en el formulario y guardamos.

Dokku instalado!!!!

Instalación wordpress

Desde maquina virtual

sudo dokku plugin:install https://github.com/dokku/dokku-mysql.git mysql
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git

dokku apps:create TUDOMINIO
dokku domains:add TUDOMINIO gaiamagrane.com
dokku domains:add TUDOMINIO www.gaiamagrane.com
dokku mysql:create gmdb

Creamos volúmenes:

mkdir -p /var/lib/dokku/data/storage/TUDOMINIO/uploads
mkdir -p /var/lib/dokku/data/storage/TUDOMINIO/plugins
mkdir -p /var/lib/dokku/data/storage/TUDOMINIO/languages

chmod -R 755 /var/lib/dokku/data/storage/

dokku storage:mount TUDOMINIO /var/lib/dokku/data/storage/gaiamagrane/plugins/:/app/wp-content/plugins/
dokku storage:mount TUDOMINIO /var/lib/dokku/data/storage/gaiamagrane/uploads/:/app/wp-content/uploads/
dokku storage:mount TUDOMINIO /var/lib/dokku/data/storage/gaiamagrane/languages/:/app/wp-content/languages

Conexión con base de datos en dokku

dokku mysql:link gmdb TUDOMINIO

Creado el enlace entre la aplicación y el servicio de la base de datos,
tendremos en el fichero .env de la aplicación la información para conectar con
ella en forma de variable de entorno que aprovecharemos más adelante para
recoger y conectar con la base de datos.

Desde local

Debemos tener una instancia de wordpress en local.

Para ello puedes ver el post WordPress en local don docker

Nos situamos en la carpeta donde tenemos nuestro wordpress local, en mi caso la
carpeta html y creamos .gitignore con el siguiente contenido:

.heroku/
.profile.d/
.composer/
.builders_run
.release
*.log
*.swp
*.back
*.bak
*.sql
*.sql.gz
~*
.htaccess
.maintenance
wp-content/blogs.dir/
wp-content/upgrade/
wp-content/backup-db/
wp-content/cache/
wp-content/backups/
wp-content/uploads/
secret/
vendor/
# En mi caso añado.
.magtrabajos

Nota

: En caso de tener problemas de permisos con la carpeta local de wordpress
podeis ejecutar el siguiente comando: sudo chown -R www-data:$USER html/

Creamos compser.json:

{
  "require": {
    "php": "~7",
    "ext-mbstring" : "*",
    "ext-gd": "*"
  },
  "scripts": {
    "post-install-cmd": [
      "chmod -R 777 wp-content"
    ]
  }
}

Creamos fichero nginx_app.conf:

# WordPress permalinks
location / {
  index index.php index.html;
  try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Deny access to any files with a .php extension in the uploads directory
# Works in sub-directory installs and also in multisite network
location ~* /(?:uploads|files)/.*.php$ {
  deny all;
}

#upload
client_max_body_size 100M;

#jetpack connection
fastcgi_buffers 8 32k;
fastcgi_buffer_size 64k;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

# enable gzip compression
gzip on;
# Minimum file size in bytes (really small files aren’t worth compressing)
gzip_min_length 1000;
# Compression level, 1-9
gzip_comp_level 2;
gzip_buffers 4 32k;
gzip_types text/plain application/javascript text/xml text/css image/svg+xml;
# Insert Vary: Accept-Encoding header, as specified in HTTP1.1 protocol
gzip_vary on;
# end gzip configuration

# Set time to expire for headers on assets
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg)$ {
  expires 1y;
}

# Sitemap url, for WordPress SEO plugin
#rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last;
#rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;

Creamos fichero custom_php.ini

upload_max_filesize = 50M
post_max_size = 50M

Creamos fichero Procfile:

web: vendor/bin/heroku-php-nginx -C nginx_app.conf -i custom_php.ini --verbose

Lanzamos composer update para que nos genere el composer.lock.

composer update

Iniciamos git y añadimos repositorio de dokku y subimos proyecto.

git init
git remote add dokku dokku@TUDOMINIO.com:gaiamagrane
git add .
git commit -am 'Init'
git push dokku master

En estos momentos tenemos la aplicación funcionando pero el fichero
wp.config.php de wordpress contiene la configuración local y nos da error de
conexión.

Vamos a modificar el fichero wp-config.php por el del proyecto dokku-wordpress
que nos permite coger la configuración de las variables de entorno y en local
cogerá las que tengamos en el fichero por defecto.

Contenido de wp-config.php:

/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

function fromenv($key, $default = null) {
  $value = getenv($key);
  if ($value === false) {
    $value = $default;
  }
  return $value;
}

$DSN = parse_url(fromenv('DATABASE_URL', 'mysql://username_here:password_here@localhost:3306/database_name_here'));

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', substr($DSN['path'], 1));

/** MySQL database username */
define('DB_USER', $DSN['user']);

/** MySQL database password */
define('DB_PASSWORD', $DSN['pass']);

/** MySQL hostname */
define('DB_HOST', $DSN['host']);

/** 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', '');

/**#@+
 * 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',         fromenv('AUTH_KEY', 'put your unique phrase here'));
define('SECURE_AUTH_KEY',  fromenv('SECURE_AUTH_KEY', 'put your unique phrase here'));
define('LOGGED_IN_KEY',    fromenv('LOGGED_IN_KEY', 'put your unique phrase here'));
define('NONCE_KEY',        fromenv('NONCE_KEY', 'put your unique phrase here'));
define('AUTH_SALT',        fromenv('AUTH_SALT', 'put your unique phrase here'));
define('SECURE_AUTH_SALT', fromenv('SECURE_AUTH_SALT', 'put your unique phrase here'));
define('LOGGED_IN_SALT',   fromenv('LOGGED_IN_SALT', 'put your unique phrase here'));
define('NONCE_SALT',       fromenv('NONCE_SALT', 'put your unique phrase here'));

/**#@-*/

/**
 * 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  = fromenv('TABLE_PREFIX', 'wp_');

/**
 * 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.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define('WP_DEBUG', (bool)fromenv('WP_DEBUG', false));

// If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
if ( isset($_SERVER['HTTP_X_FORWARDED_PROTO'] )
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' )
{
    $_SERVER['HTTPS'] = 'on';
}

/* 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');

Desde la web

http://TUDOMINIO.com

Y ya podemos hacer la configuración desde el dominio.

Ahora nos faltará como gestionar los cambios que hagamos en local
sobre nuestro tema personalizado o nuestros plugins ya que la idea
es que wordpress se actualice por si solo desde el servidor.

Configurar los keys y salts de seguridad

Vamos a https://api.wordpress.org/secret-key/1.1/salt/ para generar las claves.

Y las añadimos a la configuración del proyecto.

dokku config:set wp AUTH_KEY='...your key...'
dokku config:set wp SECURE_AUTH_KEY='...your key...'
dokku config:set wp LOGGED_IN_KEY='...your key...'
dokku config:set wp NONCE_KEY='...your key...'
dokku config:set wp AUTH_SALT='...your key...'
dokku config:set wp SECURE_AUTH_SALT='...your key...'
dokku config:set wp LOGGED_IN_SALT='...your key...'
dokku config:set wp NONCE_SALT='...your key...'

---------- <PENDIENTE> -----------------

Letsencrypt.

dokku config:set --no-restart TUDOMINIO DOKKU_LETSENCRYPT_EMAIL=TUCORREO@TUCORREO.com
dokku letsencrypt TUDOMINIO
dokku letsencrypt:auto-renew
dokku letsencrypt:cron-job --add

Varios

Importación de la base de datos.

En caso de querer importar nuestra base de datos local dokku.

Podemos crear nuestra copia de la base de datos desde adminer.

Subimos el fichero al servidor y ejecutamos:

cat wordpress.sql | ssh dokku@TUDOMINIO.com mysql:import gmdb < .

Nota: Tener en cuenta que será necesario cambiar las urls del fichero
antes de importar. Ejemplo: localhost:8002 por TUDOMINIO

Entrar a una consola de un container:

dokku run APLICACION bash

Lanzar comandos de dokku desde local:

ssh dokku@TUDOMINIO.com help

Referencias:

De branch a trunk en subversion

Category : subversion dic 21st, 2014

Añadir los cambios de una ramificación del proyecto a la rama principal.

Nos situamos en la copia local de la rama:

svn log --stop-on-copy

Recogemos la versión en la que se inicio la ramificación:

------------------------------------------------------------------------
r342 | eduardo | 2010-10-04 08:29:44 +0200 (lun 04 de oct de 2010) | 1 línea

Rama de programación

Nos vamos a la copia local de la rama principal y comprobamos cambios que se realizaran con --dry-run sin hacerlos:

svn merge --dry-run -r 342:HEAD file:///var/subversion/gcm/branches/eduardo

--- Fusionando r343 hasta r348 en «.»:
U    proyecto/File/es/Seccion/index.html
D    proye...

Realizamos los cambios definitivamente:

svn merge -r 342:HEAD file:///var/subversion/gcm/branches/eduardo

Actualizamos servidor de subversion:

svn ci

Conceptos basicos sobre subversion

Category : subversion dic 21st, 2014

Varios

checkout: Saca el fichero del repositorio y lo almacena localmente para poder trabajar con él.
checkin: Una vez realizados los cambios, volcamos el fichero al repositorio donde estará disponible para el resto de desarrolladores.
status: Indica el estado actual del fichero.
log: Saca un listado con las revisiones del fichero

Iniciando Subversion

svnadmin create /var/svn

Iniciando proyectos

Nos colocamos en directorio donde tenemos el proyecto y lo importamos svn mkdir file:///var/svn/gcm svn import gcm file:///var/svn/gcm
Actualizar con remoto

svn up

Volver a una versión anterior

svn up -r2

Volver atrás con un archivo concreto

svn update -r

Añadir de un golpe todos los ficheros con interrogante

#!/bin/bash
DIFS="$IFS" ; IFS=$'\n'
for x in $(svn status | grep ^? | awk -v FS='?      ' '{print $2}') ; do
svn add "$x"
done
IFS="$DIFS"

lo mismo con los borrados:

#!/bin/bash
DIFS="$IFS" ; IFS=$'\n'
for x in $(svn status | grep ^! | awk -v FS='!      ' '{print $2}') ; do
svn del "$x"
done
IFS="$DIFS"

Descartar archivos a tener en cuenta

Con svn propedit svn:ignore
, nos pedira una lista de rutas en formato de expresión regular para detectar los archivos o directorios que queremos descartar de ser tratados por subversión

Ejemplo para descartar archivos de log que actualmente estan en repositorio.

svn remove log/*
svn commit -m 'borrar todos los ficheros de log de subversion'
svn propset svn:ignore "*.log" log/
svn update log/
svn commit -m 'ignorar todos los ficheros en log/ que terminen en .log

Dividir proyectos

Teniendo Scripts, proyectos y gcm dentro de un mismo repositorio vamos a dividirlos

Primero creamos los proyectos:

svnadmin create /var/svn/Scripts
svnadmin create /var/svn/proyectos
svnadmin create /var/svn/gcm

Generamos copia del actual | filtramos | añadimos:

svnadmin dump /var/svn/ | svndumpfilter exclude proyectos Scripts | svnadmin load /var/svn/gcm
svnadmin dump /var/svn/ | svndumpfilter exclude proyectos gcm | svnadmin load /var/svn/Scripts
svnadmin dump /var/svn/ | svndumpfilter exclude Scripts gcm | svnadmin load /var/svn/proyectos

Enlaces relacionados

Un buen resumen

Git, comandos básicos

Category : Control de versiones, Git dic 21st, 2014

Iniciar control de versiones en proyecto existente

git init
git add .
git commit -m 'Iniciamos control de versiones'

Comandos básicos

git add &lt;archivo&gt;                                    # Añadir archivo
git mv &lt;archivo&gt; &lt;destino&gt;                      # Mover archivo
git rm &lt;archivo&gt;                                    # Borrar archivo
git status                                              # Ver estado de proyecto
git show                                               # Información sobre el último commit
git commit -m 'Descripción del cambio'       # Guardar el estado actual
git push                                               # Sube al servidor los cambios realizados
git pull                                                # Actualizar local con servidor

Configuración

git config --global user.name "Eduardo Magrané"
git config --global user.mail "email@dominio.com"

También podemos modificar directamente el fichero .gitconfig

Descartar directorios o archivos en git

Editar .git/info/exclude, ejemplo:

# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
docs
logs
tmp

Trabajando con ramas

Crear una rama

git branch rama_nueva

Borrar rama

git branch -d  rama

Entramos en ella

git checkout rama_nueva

Hacemos modificaciones que añadimos a git y commits sobre la rama

git add . 
git commit -a

Fusionamos la rama con el master

git checkout master 
git merge rama_nueva

Si nos encontramos en la situación de haber realizado cambios antes de ir a la rama deseada, mientras no hayamos realizado commit podemos movernos a la rama y llevarnos los cambios.

git checkout -b rama_de_trabajo

Hacemos commit en la rama con los cambios y al volver a la master estará como antes.

Tags con git

Tags anotados

Estos generan una copia exacta del estado del repositorio.:

git tag -a v1.0 -m 'Release v1.0'

Este objeto se creara en .git/objects y creará una referencia en .git/refs/tags/v1.0 que tendrá el SHA-1 del tag.

Tags ligeros

No generan un objeto tag como los anteriores, solo crea una referencia en .git/refs/tags/v2.0 que tendrá el SHA-1 del HEAD:

git tag v2.0

Moviendose entre Tags

Git nos permite movernos entre los tags como si fueran ramas pero sin la posibilidad de modificarlos.:

git checkout v2.0

Listar Tags:

git tags -l

git checkout v2.0

Compartir Tags (GitHub por ejemplo):

# todas las etiquetas
git push --tags

#una etiequeta en particular
git push origin v2.0

Visualizar el contenido de un Tag:

git show v1.0

Trabajando en grupo

Un ejemplo de metodología para trabajar en grupo es git-flow, estudiarla te permite entender mejor a git.

doxygen y github

Category : Control de versiones, Documentación de código dic 21st, 2014

La creación de archivos de documentación para doxygen suelen crearse con la extensión dox, lo cual nos permite separar el código de una documentación ampliada sobre la aplicación. El problema es que github no reconoce esta extensión pidiendonos que creemos un archivo readme.md para documentar los directorios.

La solución que he encontrado, es poner la extensión rst a estos archivos, doxygen generará igualmente la documentación y github no se quejará

Ignorar archivos con git

Category : Control de versiones, Git dic 21st, 2014

Si no queremos que git trabaje sobre algunos archivos de nuestra carpeta del proyecto podemos decirle que los ignore.

Editamos .git/info/exclude, un ejemplo:

# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
tags
proyecto/log
proyecto/cache
docs/
*.swp
cscope*

En caso de que ya tenga indexado un archivo que queremos ignorar hay que forzar el borrado de su cache.

git rm --cached <file>