{ "nodes": [{ "uri": "https:\/\/log.exos.ninja\/3F", "content": "# Instalando Sentry con docker + systemd\r\n\r\nHace un tiempo hab\u00eda hecho un post de [como instalar Sentry en Ubuntu server](http:\/\/log.exodica.com.ar\/5) y lo hac\u00eda utilizando VirtualEnv2 y Supervisord.\r\n\r\nAhora mucho tiempo despu\u00e9s necesitaba instalar un Sentry y como no me quer\u00eda complicar ya que este tipo de software suele ser bastante dif\u00edcil de instalar, decid\u00ed buscar la forma de hacerlo con Docker.\r\n\r\nEn el post \"[Configurando Dropbox con Docker en Archlinux (+ systemd)](http:\/\/log.exodica.com.ar\/3v)\" explico como hacer un unit file de systemd para levantarlo como servicio, pero en este caso hay que levantar varios containers, se hace un poco mas complejo.\r\n\r\nPrimero que nada esto lo hice siguiendo [la gu\u00eda oficial del container](https:\/\/hub.docker.com\/_\/sentry\/) mas otras m\u00e1s[\u00b9](https:\/\/hub.docker.com\/_\/redis\/)[\u00b2](https:\/\/hub.docker.com\/_\/postgres\/) personalizando un par de cosas.\r\n\r\nPrimero que nada tenemos que generar un secret code, el container de sentry tiene una opci\u00f3n para esto:\r\n\r\n $ docker run --rm sentry config generate-secret-key\r\n\r\nEsto de paso nos descargar\u00e1 el container de sentry.\r\n\r\nAhora necesitamos dos cosas:\r\n\r\n* Servidor Redis\r\n* Servidor Postgres \r\n\r\nEn la gu\u00eda oficial los levanta de forma muy simple, pero mi objetivo es que esto quede funcionando en producci\u00f3n, as\u00ed que primero que nada vamos a crear un directorio donde ir\u00e1n los datos de nuestros containers:\r\n\r\n $ mkdir -p \/srv\/sentry\/{redis,postgres,sentry}\/data\r\n\r\nDe ese modo ya podemos crear vol\u00famenes luego.\r\n\r\n## Levantando Redis\r\n\r\nPrimero que nada el servidor redis es el mas simple de levantar:\r\n\r\n $ docker run -d --name=sentry-redis -v \/srv\/sentry\/redis\/redis.conf:\/usr\/local\/etc\/redis\/redis.conf -v \/srv\/redis\/data:\/data redis redis-server \/usr\/local\/etc\/redis\/redis.conf\r\n\r\nEn este caso podemos crear un archivo en ```\/srv\/sentry\/redis\/redis.conf``` y configurar a gusto nuestro redis.\r\n\r\n## Levantando Postgres\r\n\r\nAhora necesitamos nuestro postgres, este tiene un par mas de opciones, primero necesitamos definir una contrase\u00f1a, yo utilic\u00e9 mi propia herramienta para generar contrase\u00f1as llamada [genpasswd](http:\/\/genpasswd.js.org\/):\r\n\r\n $ genpasswd -al 40\r\n wnDny5y9HnfQL0qG06fPwSEpTQhH9Eh2RZ55wzrq\r\n $ docker run -d --name=sentry-postgres -e POSTGRES_PASSWORD=wnDny5y9HnfQL0qG06fPwSEpTQhH9Eh2RZ55wzrq -e POSTGRES_USER=sentry -e PGDATA=\/data -v \/srv\/sentry\/postgres\/data:\/data postgres\r\n\r\nLa primera vez que lo corremos, aparte de descargarlo si no lo tenemos, va a ser crear el \u00e1rbol de directorio donde guardar\u00e1 las bases de datos, utilizando nuestro volumen en ```\/srv\/sentry\/postgres\/data```.\r\n\r\n## Creamos la base de datos de nuestro Sentry\r\n\r\nYa teniendo levantados ambos servidores, vamos a crear la base de datos, esto lo hacemos con el siguiente comando:\r\n\r\n $ docker run -it --rm -e SENTRY_SECRET_KEY='7DzdS*si^b4@v]Pxr%idPx=j\"5\"wP6' --link sentry-postgres:postgres --link sentry-redis:redis sentry upgrade\r\n\r\nEsto puede tardar un rato, y al final nos preguntar\u00e1 si queremos crear un usuario (por eso es importante ejecutarlo en modo interactivo con ```-it```), podemos crear nuestro usuario admin de esa forma siguiendo los pasos, pero si por alg\u00fan motivo te equivocas, no pasa nada, despu\u00e9s podemos crear otros.\r\n\r\n> Nota: Record\u00e1 que ```7DzdS*si^b4@v]Pxr%idPx=j\"5\"wP6``` es el valor que nos devolvi\u00f3 el comando ```generate-secret-key```, **no uses el mismo que este y genera el tuyo propio**!!! \r\n\r\n## Creamos usuarios\r\n\r\nSi quer\u00e9s agregar mas usuarios o te equivocaste en el paso anterior, podemos crear usuarios con:\r\n\r\n $ docker run -it --rm -e SENTRY_SECRET_KEY='7DzdS*si^b4@v]Pxr%idPx=j\"5\"wP6' --link sentry-redis:redis --link sentry-postgres:postgres sentry createuser\r\n\r\n## Levantamos Sentry\r\n\r\nAhora que ya tenemos todo creado, vamos a levantar nuestro servidor, y ya lo podemos probar, aunque lo primero que nos va a preguntar es la ruta definitiva, con dominio y todo, esto es importante y dif\u00edcil de modificar despu\u00e9s, as\u00ed que intenta acceder desde dicho dominio.\r\n\r\n $ docker run --rm --name=sentry-sentry -e SENTRY_SECRET_KEY='7DzdS*si^b4@v]Pxr%idPx=j\"5\"wP6' -e --link sentry-redis:redis --link sentry-postgres:postgres -p 8000:9000 sentry\r\n\r\nEn este caso, exportamos el puerto ```8000``` que va a ir al ```9000``` del container, por lo que podemos comprobarlo entrando a ```http:\/\/ip_o_host:8000```.\r\n\r\n> Nota: Puede que te aparezca un cartel diciendo que no est\u00e1n funcionando los workers de celery, esto es porque tenemos que correr otras dos instancias del container, pero lo veremos despu\u00e9s.\r\n\r\n## Generando el unit file\r\n\r\nBueno lo que vamos a hacer para nuestro unit file, es similar a lo que hice para levantar dropbox en el mencionado anteriormente tutorial, pero vamos a tener que levantar tanto los containers de redis, postgres, y 3 de sentry.\r\n\r\nCreamos el archivo ```\/etc\/systemd\/system\/sentry.service ``` con el siguiente contenido:\r\n\r\n [Unit]\r\n Description=sentry\r\n After=network.target docker.socket\r\n Requires=docker.socket\r\n\r\n [Service]\r\n TimeoutStartSec=0\r\n Restart=always\r\n\r\n # Detenemos (si los hay) y eliminamos las insntancias anteriores:\r\n\r\n ExecStartPre=-\/usr\/bin\/docker stop sentry-redis\r\n ExecStartPre=-\/usr\/bin\/docker stop sentry-postgres\r\n ExecStartPre=-\/usr\/bin\/docker stop sentry-sentry\r\n ExecStartPre=-\/usr\/bin\/docker stop sentry-cron\r\n ExecStartPre=-\/usr\/bin\/docker stop sentry-worker\r\n ExecStartPre=-\/usr\/bin\/docker rm sentry-redis\r\n ExecStartPre=-\/usr\/bin\/docker rm sentry-postgres\r\n ExecStartPre=-\/usr\/bin\/docker rm sentry-sentry\r\n ExecStartPre=-\/usr\/bin\/docker rm sentry-cron\r\n ExecStartPre=-\/usr\/bin\/docker rm sentry-worker\r\n\r\n # Levantamos Redis\r\n\r\n ExecStartPre=\/usr\/bin\/docker run -d --name=sentry-redis -v \/srv\/sentry\/redis\/redis.conf:\/usr\/local\/etc\/redis\/redis.conf -v \/srv\/redis\/data:\/data redis redis-server \/usr\/local\/etc\/redis\/redis.co\r\n nf\r\n\r\n # Levantamos postgres\r\n\r\n ExecStartPre=\/usr\/bin\/docker run -d --name=sentry-postgres -e POSTGRES_PASSWORD=wnDny5y9HnfQL0qG06fPwSEpTQhH9Eh2RZ55wzrq -e POSTGRES_USER=sentry -e PGDATA=\/data -v \/srv\/sentry\/postgres\/data:\/data postgres\r\n\r\n # Levantamos Sentry\r\n\r\n ExecStartPre=\/usr\/bin\/docker run -d --name=sentry-cron -e SENTRY_SECRET_KEY='7DzdS*si^b4@v]Pxr%idPx=j\"5\"wP6' --link sentry-redis:redis --link sentry-postgres:postgres sentry run cron\r\n\r\n ExecStartPre=\/usr\/bin\/docker run -d --name=sentry-worker -e SENTRY_SECRET_KEY='7DzdS*si^b4@v]Pxr%idPx=j\"5\"wP6' --link sentry-redis:redis --link sentry-postgres:postgres sentry run worker\r\n\r\n ExecStart=\/usr\/bin\/docker run --rm --name=sentry-sentry -e SENTRY_SECRET_KEY='7DzdS*si^b4@v]Pxr%idPx=j\"5\"wP6' --link sentry-redis:redis --link sentry-postgres:postgres -p 8000:9000 sentry\r\n\r\n # Despues de detener la instancia de docker, nos aseguramos de detener todas las demas y de borrarlas\r\n\r\n ExecStopPost=-\/usr\/bin\/docker stop sentry-redis\r\n ExecStopPost=-\/usr\/bin\/docker stop sentry-sentry\r\n ExecStopPost=-\/usr\/bin\/docker stop sentry-postgres \r\n ExecStopPost=-\/usr\/bin\/docker stop sentry-cron\r\n ExecStopPost=-\/usr\/bin\/docker stop sentry-worker\r\n\r\n ExecStopPost=-\/usr\/bin\/docker rm sentry-redis\r\n ExecStopPost=-\/usr\/bin\/docker rm sentry-postgres \r\n ExecStopPost=-\/usr\/bin\/docker rm sentry-sentry\r\n ExecStopPost=-\/usr\/bin\/docker rm sentry-cron\r\n ExecStopPost=-\/usr\/bin\/docker rm sentry-worker\r\n\r\n [Install]\r\n Also=docker.socket\r\n WantedBy=multi-user.target\r\n\r\nCon esto ya podemos levantar todo con systemd, de la siguiente manera:\r\n\r\n $ systemctl start sentry\r\n\r\nY si queremos que lo haga en el arranque del sistema:\r\n\r\n $ systemctl enable sentry\r\n\r\nSi por alg\u00fan motivo no levanta, se puede ver mas detallado haciendo:\r\n\r\n $ journalctl -xefu sentry\r\n\r\n## Proxiando con Nginx\r\n\r\nEsto es simple ya que lo tenemos levantado en el puerto ```8000```, as\u00ed que solo tenemos que hacer un proxy reverso a ese puerto.\r\n\r\nTe recomiendo seguir mi gu\u00eda de [Configurando un SSL gratis con Let's Encrypt en Nginx](http:\/\/log.exodica.com.ar\/3A) ya que de yapa tendr\u00e1s SSL gratuito.", "created": "2016-09-29 05:40:17"}] }