Instalar Discourse para desarrollo usando Docker

Desde mi VM de Ubuntu pude hacer ping a rubygems.org. No sé si hay una forma de verificar si el contenedor de Docker puede hacerlo. Creo que solo hice ping a la versión HTTP, no a HTTPS, aunque. Lo menciono por si el problema está relacionado con eso. (Una de las páginas que vi al buscar en Google sugería cambiar HTTPS por HTTP, pero no es como si pudiera hacer eso, ya que el comportamiento definido está en algún lugar dentro del contenedor de Docker.)

1 me gusta

He probado las opciones de MacOS.

Primero, usando la Opción 2, Homebrew. Sin embargo, tuve problemas ya que no todas las dependencias se instalaron con el comando de esta guía. https://medium.com/@yutafujii_59175/a-complete-one-by-one-guide-to-install-docker-on-your-mac-os-using-homebrew-e818eb4cfc3 me ayudó a avanzar un poco más.

Ahora estoy atascado en el Paso 2 d/boot_dev --init:

Migrating database...

rake aborted!

PG::ConnectionBad: could not connect to server: No such file or directory

Is the server running locally and accepting

connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

/src/lib/site_settings/db_provider.rb:61:in `table_exists?'

/src/lib/site_settings/db_provider.rb:16:in `all'

/src/lib/site_settings/defaults_provider.rb:29:in `db_all'

/src/lib/site_setting_extension.rb:277:in `block in refresh!'

/src/lib/site_setting_extension.rb:274:in `synchronize'

/src/lib/site_setting_extension.rb:274:in `refresh!'

/src/lib/site_setting_extension.rb:495:in `block in setup_methods'

/src/config/initializers/004-message_bus.rb:120:in `<main>'

/src/config/environment.rb:7:in `<main>'

/usr/local/bin/bundle:23:in `load'

/usr/local/bin/bundle:23:in `<main>'

Tasks: TOP => db:migrate => db:load_config => environment

(See full trace by running task with --trace)

Luego descargué el archivo .dmg, pero como soy nuevo en Docker, no entiendo qué hacer a partir de ahí. Sería genial tener una descripción un poco más detallada de la opción para macOS.

Gracias.

1 me gusta

En macOS, una vez que instales Docker desde el archivo .dmg, asegúrate de que esté ejecutándose: debería aparecer un icono en la barra de herramientas de macOS que puedes usar para verificar su estado. Luego, sigue literalmente los pasos del primer mensaje (clonar, etc.). Publica aquí si encuentras algún problema al seguir ese camino.

Ten en cuenta que, si has instalado Docker con Homebrew anteriormente, podría ser una buena idea desinstalar esa versión de Docker primero, o al menos asegurarte de que no se esté ejecutando. Yo nunca he instalado Docker con Homebrew, así que no puedo dar consejos sobre eso.

2 Me gusta

Gracias.

He usado el icono y abierto el panel de control de Docker. No encontré ningún contenedor en ejecución allí, aunque en la línea de comandos pude ver varios contenedores activos. Me preguntaba si debía iniciar sesión para usar el panel de control de Docker. ¿O tal vez este comportamiento se debe a que hay varias versiones de Docker instaladas: una vía Homebrew y otra mediante Desktop (.dmg)?

Mientras tanto, he logrado configurar Discourse en DigitalOcean, lo cual funciona sin problemas y es suficiente para mis necesidades.

1 me gusta

El DMG instala Docker, no Discourse. No agregará ningún contenedor inicialmente.

A partir de ahí, puedes seguir la guía de Docker.

2 Me gusta

Al ejecutar el comando anterior (en un Mac), obtengo este error:

Se produjo un error al instalar cppjieba_rb (0.3.3) y Bundler no puede continuar.

Asegúrate de que `gem install cppjieba_rb -v '0.3.3' --source 'https://rubygems.org/'` se ejecute correctamente

antes de ejecutar bundler.

¿Tienes alguna sugerencia? No entiendo exactamente cuál es el problema. La instalación individual de la gem tampoco funciona (incluso con sudo).

Además, ¿por qué hay que instalar las gems si estoy ejecutando una imagen de Docker? Eso debería haber sido preinstalado por completo, ¿verdad?

ACTUALIZACIÓN: SOLUCIONADO

Cloné en ~/repos/discourse, pero debería haber sido en ~/discourse. Ahora funciona perfectamente.

3 Me gusta

Si recibes este error al ejecutar d/unicorn:

Could not find aws-partitions-1.284.0 in any of the sources
Run `bundle install` to install missing gems.

puedes solucionarlo ejecutando:

docker exec -it -u discourse:discourse discourse_dev /bin/bash -c "cd /src && USER=discourse RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 LD_PRELOAD=/usr/lib/libjemalloc.so RAILS_ENV=${RAILS_ENV:=development} bundle install"

después de lo cual d/boot_dev se ejecutará correctamente.

3 Me gusta

Más sencillo

d/boot_dev
d/bundle install

Tenemos asistentes para todas las tareas habituales.

5 Me gusta

En el OP se lee:

El flujo de desarrollo de Docker admite enlaces simbólicos en el directorio plugins/

¿A qué enlazamos simbólicamente el directorio de plugins en este contexto? ¡Gracias!

1 me gusta
cd plugins
ln -s /full/path/to/your/plugin .
ln -s ~/src/my-great-plugin # por ejemplo
6 Me gusta

Ah, gracias, solo quería hacer un enlace simbólico al directorio de plugins en este contexto.

1 me gusta

Por lo general, no se enlaza simbólicamente un directorio completo para este flujo de trabajo, ya que normalmente se desea un control granular sobre qué complementos están en el ámbito durante una ejecución.

4 Me gusta

Hola, estoy usando esta guía y funciona bien, pero mi preocupación es que cada vez que ejecuto d/boot_dev comienza a descargar varias cosas. ¿Cómo puedo descargar solo una vez los archivos necesarios y conservarlos para el siguiente arranque? Mi sistema operativo es Ubuntu 20.04.

1 me gusta

Intenté instalar en un sistema Mint 20 nuevo. Docker está disponible:

terrapop@terrapop:/var$ docker version
Client: Docker Engine - Community
 Version:           19.03.12

terrapop@terrapop:/var/discourse$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
     Active: active (running) since Mon 2020-08-24 19:03:48 CEST; 31min ago

Luego cloné Discourse:

sudo git clone GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub /var/discourse
cd /var/discourse

Sin embargo, d/boot_dev --init da como resultado:

d/boot_dev --init

bash: d/boot_dev: No existe el archivo o el directorio

¿Alguien?

1 me gusta

Actualización: Ahora he añadido nuestras claves de API de SendGrid al archivo app.yml e inicializado la aplicación mediante ./launcher, por lo que ahora se ejecuta en localhost. ¿Será posible que todos esos comandos d/ en la publicación original estén desactualizados? Aun así, no lo entiendo. La aplicación se está ejecutando ahora en Docker en mi computadora Ubuntu (Mint) en localhost, igual que en el entorno de staging en Digital Ocean. Queremos desarrollar en localhost con la aplicación ejecutándose mediante Docker y enlaces simbólicos para los plugins, pero no estoy seguro de si ahora está lista como debería, ya que no puedo ejecutar esos comandos d/ de ninguna manera. ¿Podría alguien ayudar? Gracias.

Actualización: Fue mi culpa. Tomé el enlace de git para producción:

git clone GitHub - discourse/discourse_docker: A Docker image for Discourse · GitHub /var/discourse

En lugar de:

git clone GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub

:cowboy_hat_face:

Sin embargo…

Ahora me encuentro con nuevos problemas. Solo puedo clonar en /var como superusuario/root en Ubuntu Mint 20 (UID 0). Así que, cuando clono y ejecuto d/boot_dev --init, todo se descarga y comienza sin problemas, pero en una etapa posterior el script lanza un error de permisos porque espera ejecutar algo con UID 1000, que es el primer usuario creado en Mint, es decir, mi cuenta personal (terrapop), y no root. ¿Cómo puedo solucionar este problema?

Solución: Más simple de lo que pensé. Solo hay que crear un nuevo directorio www en var. Cambiar el propietario (chown) y los permisos (chmod) del directorio www a tu primer usuario en Mint y continuar como se indica en las publicaciones de la entrada original. Ahora funciona. Feliz.

2 Me gusta

Por alguna razón, los enlaces simbólicos a mis directorios de origen de plugins no funcionaban y tuve que mover/copiar manualmente los directorios de origen de los plugins al directorio plugins para que aparecieran en /admin/plugins después de reiniciar el contenedor de Docker.

¿Quizás hubo un cambio en la forma en que Docker admite los enlaces simbólicos? Estoy ejecutando docker-ce 19.03.12 en Ubuntu.

1 me gusta

Yo también lo experimenté recientemente con Docker Desktop para Mac.

1 me gusta

Hice los mismos pasos en un droplet de DO de $5. Todo salió bien. Ahora, ¿cómo expongo mi sitio para poder acceder a él?

P.D. Funciona con ngrok. Aún no funciona con el proxy inverso de nginx hacia el puerto 9292

Gracias por esto. Puedes hacerlo en el servidor y evitar configurar el proxy inverso de nginx. ¡Disfrutando la configuración de d/o con Docker + VS Code remoto :slight_smile:!

Usa d/unicorn -D para ejecutar unicorn como un daemon, de modo que el shell siga siendo utilizable después de iniciar el servidor.

Además, necesitas al menos un droplet de DO de $10.

3 Me gusta

Estoy en un Mac con zsh (en iTerm2) y cuando intento usar un enlace simbólico para el desarrollo de plugins, me encuentro atascado con estos errores:

readlink: opción ilegal -- f
uso: readlink [-n] [archivo ...]

Esto se debe a que la implementación de Mac del comando readlink es ligeramente diferente a la de GNU.

La forma más sencilla de solucionarlo es hacer lo siguiente:

# brew install coreutils
# ln -s "$(which greadlink)" "$(dirname "$(which greadlink)")/readlink"

Esto te permitirá utilizar una versión compatible de readlink.

Recuerda que necesitas tener el valor de dirname "$(which greadlink)" en tu variable PATH en una posición anterior a /usr/bin (donde suele estar el readlink original). En mi caso, PATH es algo como /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:... y el enlace simbólico a greadlink está en /usr/local/bin.

Referencia: Fixing "readlink: illegal option -- f" error on a Mac

5 Me gusta

Para ejecutar un conjunto de pruebas de un solo plugin, puedes hacerlo de la siguiente manera:

# d/rake "plugin:spec[NOMBRE_DEL_PLUGIN]"
1 me gusta