{ "nodes": [{ "uri": "https:\/\/log.exos.ninja\/3v", "content": "# Configurando Dropbox con Docker en Archlinux (+ systemd)\r\n### Corriendo software privativo encapsulado con cgroups :)\r\n\r\nPara un trabajo necesito tener un directorio sincronizado con este servicio privativo, aunque soy usuario de [Syncthing](https:\/\/en.wikipedia.org\/wiki\/Syncthing) tengo que tenerlo corriendo por un cliente espec\u00edfico. No me gusta tener c\u00f3digo privativo compilado por una empresa en mi sistema, por un tema de seguridad *(paranoia)*. As\u00ed que decid\u00ed correrlo encapsulado en un container.\r\n\r\n> Nota: Este tutorial es para [Archlinux](http:\/\/log.exodica.com.ar\/?q=archlinux) pero puede ser f\u00e1cilmente adaptado a otras distribuciones, sobretodo si usan systemd.\r\n\r\nPrimero necesitamos tener docker instalado, no me voy a dar detalles de como instalarlo y configurarlo, as\u00ed que si es tu caso te recomiendo leer [la wiki de arch](https:\/\/wiki.archlinux.org\/index.php\/Docker) donde est\u00e1 mas que claro.\r\n\r\nEn fin, estoy usando la imagen hecha por [janeczku](https:\/\/hub.docker.com\/r\/janeczku\/dropbox\/) que anda bien y viene muy bien explicada, pueden seguir su gu\u00eda, pero igual voy a poner los pasos ac\u00e1.\r\n\r\n## Configurando inotify.max_user_watches\r\n\r\nEste paso es opcional, pero es una recomendaci\u00f3n de Dropbox para poder monitorear todos los subdirectorios dentro del directorio sincronizado. Esto lo deberemos hacer como root, editamos el archivo ```\/etc\/sysctl.d\/99-sysctl.conf``` (puede no existir) y agregamos (o modificamos):\r\n\r\n fs.inotify.max_user_watches=100000\r\n\r\nY luego refrescamos sysctl (como root, o con sudo):\r\n\r\n # sysctl -p \/etc\/sysctl.d\/99-sysctl.conf \r\n\r\n## Creando el container\r\n\r\nPrimero que nada para que el container se identifique con nuestro usuario, le puse de nombre ```dropbox-exos```, as\u00ed es identificable, en este caso necesitamos dos directorios, uno para el directorio sincronizado, y el otro para los datos de la cuenta:\r\n\r\n $ mkdir -p ~\/.config\/dropbox-docker\r\n $ mkdir ~\/dropbox\r\n\r\nEstos directorios pueden ser los que gusten, solo recuerden que tienen que existir ya que los pasaremos como vol\u00famenes a nuestro container.\r\n\r\nAhora, con la magia de docker, con simplemente correr un comando tendremos todo, pero primero tenemos que tener en cuenta, nuestro ```UID``` y ```GID``` para no tener problemas con los permisos de los archivos (recuerden que los ids manejados dentro del container no son los de nuestro sistema host), para sacar nuestros ids:\r\n\r\n $ id\r\n\r\nEse comando nos dir\u00e1 cuales son los valores, en mi caso ambos son ```1000``` *(que es el primer usuario creado)*. Una vez obtenido estos, corremos el comando *magico*:\r\n\r\n $ docker run -d --restart=always --name=dropbox-exos -e DBOX_UID=1000 -e DBOX_GID=1000 -v \/home\/exos\/.config\/dropbox-docker:\/dbox\/.dropbox -v \/home\/exos\/dropbox:\/dbox\/Dropbox janeczku\/dropbox\r\n\r\nEn este caso ```--name=dropbox-exos``` indica el nombre del container, que puede ser el que gusten, el resto de p\u00e1rametros creo que son claros para que son.\r\n\r\n## Configurando nuestra cuenta\r\n\r\nEste paso es bastante sencillo, ya que solo deberemos entrar a una url, y este paso solo lo haremos una sola vez (mientras el directorio de configuraci\u00f3n sea el mismo siempre). Para ver la salida del container corremos (usando el nombre que le hayan puesto, en mi caso es ```docker-exos```)*\r\n\r\n $ docker logs dropbox-exos \r\n\r\nEl resultado deber\u00eda ser parecido a este:\r\n\r\n This computer isn't linked to any Dropbox account...\r\n Please visit https:\/\/www.dropbox.com\/cli_link_nonce?nonce=..... to link this device.\r\n\r\nSi aparece varias veces no se hagan problema, es solo porque tira el mensajes cada x segundos.\r\n\r\nUna vez que entran en la url, siguen los pasos y listo. Para comprobar si tuvo efecto vuelven a ejecutar el comando anterior, si todo est\u00e1 bien, deber\u00eda mostrar:\r\n\r\n This computer is now linked to Dropbox. Welcome Fulano\r\n\r\nEsto ya va a empezar a sincronizar el directorio donde lo definimos.\r\n\r\n## Creamos el servicio systemd\r\n\r\nEn este caso vamos a hacerlo a nivel usuario, no sistema, sobretodo porque si por ejemplo usamos una [home cifrada](http:\/\/log.exodica.com.ar\/y) los directorios no existir\u00e1n antes de loguearnos, aparte de esta forma lo podemos manejar sin privilegios (igualmente necesitaremos estar en el grupo ```docker```).\r\n\r\nPrimero creamos el directorio para services personalizados (por si no existe)\r\n\r\n $ mkdir -p ~\/.local\/share\/systemd\/user\r\n\r\nLuego creamos el archivo ```~\/.local\/share\/systemd\/user\/dropbox-docker.service``` con el siguiente contenido:\r\n\r\n [Unit]\r\n Description=Dropbox exos container\r\n\r\n [Service]\r\n TimeoutStartSec=0\r\n Restart=always\r\n ExecStartPre=-\/usr\/bin\/docker stop dropbox-exos \r\n ExecStartPre=-\/usr\/bin\/docker rm dropbox-exos\r\n ExecStartPre=-\/usr\/bin\/docker pull janeczku\/dropbox\r\n ExecStart=\/usr\/bin\/docker run --rm --restart=always --name=dropbox-exos -e DBOX_UID=1000 -e DBOX_GID=1000 -v \/home\/exos\/.config\/dropbox-docker:\/dbox\/.dropbox -v \/home\/exos\/dropbox:\/dbox\/Dropbox janeczku\/dropbox\r\n\r\n [Install]\r\n WantedBy=multi-user.target\r\n\r\nUna vez creado el archivo, hacemos un *daemon-reload*:\r\n\r\n $ systemctl --user daemon-reload \r\n\r\nEstos destruir\u00e1 el container cada vez que se startee, y har\u00e1 un *pull* para obtener la \u00faltima versi\u00f3n de la imagen antes de arrancarla de nuevo. Que se destruya no quiere decir que se pierda la configuraci\u00f3n, ya que esta est\u00e1 montada desde los directorios que le pasamos, as\u00ed que cuando arranque dropbox deber\u00eda funcionar con la cuenta ya configurada.\r\n\r\nPara probar si esto funciona:\r\n\r\n $ systemctl --user start dropbox-docker\r\n $ systemctl --user status dropbox-docker\r\n\r\nSi todo va bien, podemos dejarlo habilitado para que arranque cada vez que nos logueamos:\r\n\r\n $ systemctl --user enable dropbox-docker\r\n\r\nDe esta forma nos quedar\u00e1 corriendo siempre, usando nuestra cuenta, pero corriendo en un container separado, si mas acceso a los directorios de configuraci\u00f3n y datos.\r\n\r\nTambi\u00e9n es una buena soluci\u00f3n para correr m\u00faltiples instancias de dropbox con un mismo usuario, o en el mismo sistema (como root). Las posibilidades son varias.\r\n\r\n## LAN Sync\r\n\r\nDropbox tiene una caracter\u00edstica para sincronizar por red local (LAN), \u00fatil si hay varias maquinas en le red con el mismo directorio sincronizando el\/los mismo\/s directorios, pero como nuestro Dropbox corre en un container, este tiene una ip interna de una red virtual separada de la nuestra, as\u00ed que esta caracter\u00edstica no funcionar\u00e1, para que funcione, deberemos usar la red del host, para eso, a la orden de ```execStart``` le podemos agregar el par\u00e1metro ```--net=\"host\"```.\r\n\r\nEspero que les sirva. Cualquier cosa pueden crearse un usuario y comentar.\r\n\r\nSaludos.", "created": "2016-06-09 02:15:16"}] }