Instalar Discourse para desarrollo usando Docker

Desarrollando con Docker

Dado que Discourse se ejecuta en Docker, deberías poder ejecutar Discourse directamente desde tu directorio fuente usando un contenedor de desarrollo de Discourse.

:white_check_mark: Ventajas: No hay necesidad de instalar dependencias del sistema, ni configuración alguna para configurar rápidamente un entorno de desarrollo.

:x: Desventajas: Será ligeramente más lento que el entorno de desarrollo nativo en Ubuntu, y mucho más lento que una instalación nativa en MacOS.

Ver también Developing Discourse using a Dev Container

Paso 1: Instalar Docker

Ubuntu

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

19.10

sudo apt-get install docker.io
sudo usermod -a -G docker $USER
sudo reboot

Windows WSL: Ubuntu

Puedes ejecutar los comandos anteriores dentro de WSL pero debes tener todos los archivos dentro del sistema de archivos de WSL. Por ejemplo, funciona bien si está dentro de ~/discourse pero falla si se coloca dentro de /mnt/c/discourse.

MacOS

:warning: La imagen docker de desarrollo de Discourse solo está disponible para arquitecturas x86_64. Las Macs M1 son capaces de iniciar la imagen usando emulación de arquitectura, pero es poco probable que Discourse arranque debido a la falta de soporte para inotify en QEMU.

En su lugar, deberías usar Install Discourse on macOS for development

Opción 1: Descargar un .dmg empaquetado desde Docker store
Opción 2: brew install docker

Paso 2: Iniciar Contenedor

Clona el repositorio de Discourse en tu dispositivo local.

git clone https://github.com/discourse/discourse.git
cd discourse

(desde la raíz de tu fuente)

d/boot_dev --init
    # espera mientras:
    #   - se instalan las dependencias,
    #   - se migra la base de datos, y
    #   - se crea un usuario administrador (necesitarás interactuar con esto)

# En una terminal:
d/rails s

# Y en una terminal separada
d/ember-cli

…luego abre un navegador en http://localhost:4200 y ¡listo!, deberías ver Discourse.

Symlinks de Plugins

El flujo de desarrollo de Docker soporta symlinks bajo el directorio plugins/, con la siguiente advertencia:

Siempre que se cree un nuevo symlink de plugin, el contenedor Docker debe reiniciarse con:

d/shutdown_dev; d/boot_dev

Notas:

  • Para probar correos electrónicos, ejecuta MailHog:

    d/mailhog
    
  • Si faltan gems, ejecuta:

    d/bundle install
    
  • Si se necesita una migración de la base de datos:

    d/rake db:migrate RAILS_ENV=development
    
  • Cuando termines, puedes optar por detener el contenedor Docker con:

    d/shutdown_dev
    
  • Los datos se persisten entre las invocaciones del contenedor en el directorio tmp/postgres de tu raíz fuente. Si por alguna razón quieres reiniciar tu base de datos, ejecuta:

    sudo rm -fr data
    
  • Si ves errores como “permission denied while trying to connect to Docker”, ejecuta:

    run `sudo usermod -aG docker ${USER}`
    sudo service docker restart
    
  • Si deseas exponer globalmente los puertos del contenedor a la red (desactivado por defecto) usa:

    d/boot_dev -p
    
  • El Dockerfile proviene de discourse/discourse_docker en GitHub, en particular image/discourse_dev.

Ejecutar Pruebas

d/rake autospec

Para ejecutar pruebas de plugins específicos, también puedes hacer algo como esto:

d/rake plugin:spec["discourse-follow"]

O incluso algo como esto para ser aún más específico:

my-machine:~/discourse$ d/shell
discourse@discourse:/src$ RAILS_ENV=test /src/bin/rspec plugins/discourse-follow/spec/lib/updater_spec.rb:37

Este documento está controlado por versión: sugiere cambios en github.

72 Me gusta
Using a launcher built docker image in docker-compose
IDE and comfortable DEV environment for newbies
Docker install on MacOS
How to install Discourse locally?
Installing Discourse for macOS Development Using asdf and docker-compose
Discourse developement environment setup
Discourse on local pc
External database ENV VARs not documented (external PG Port, external Redis ENV VARs)
How to Install Discourse on LocalHost in Windows?
Unicode (Russian) username validation fails randomly
Qunit in Docker
Is it possible to use a local plugin directory with a docker install?
Is it possible to use a local plugin directory with a docker install?
Problem with development on Windows with Docker and mounted volume
[Resolved] Recent change breaks connectivity in Docker (+ non-Docker)
How might we better structure #howto?
Apple M1 for discourse development
How to open via internal IP?
Fast, efficient plugin development with Docker dev install (Windows WSL2)
How do I install a stable version of Discourse on Docker locally?
Backup fails on localhost with docker
How do I install a stable version of Discourse on Docker locally?
Problems with understanding the development of Discourse
Need to create custom static page as home page
Docker new licensing
Install Discourse Docker on Ubuntu 11
Backup restore failing on clean dev docker env: FATAL: Peer authentication failed for user “postgres”
Install Discourse on macOS for development
Can't build Discourse on Ubuntu 20.10
Installing discourse for development is failing
Create, download, and restore a backup of your Discourse database
Set up a local Discourse Development Environment?
How do you install Discourse using Windows 10 Docker Desktop?
NoMethodError: undefined method `min_tags_from_required_group'
Install plugins in your non-Docker development environment
NoMethodError: undefined method `min_tags_from_required_group'
Error installing `bullseye-backports` when trying to install for Development
What I should do for migration from Cusdis to Discourse
Migrate a MyBB forum to Discourse
Local installation internal use only
Maintaining an up-to-date development environment
PG::UndefinedTable: ERROR: relation "pg_range" does not exist
Docker-compose.yml to run discourse locally
Allow subscription of predetermined length
Cannot load any images “Uncaught (in promise) no-response: no-response”
Discovery document is missing
What are the benefits of a dev environment?
Installing Discourse on windows using Docker Desktop
'Arrive at topic' info missing from email when re-sending invites
External database ENV VARs not documented (external PG Port, external Redis ENV VARs)
How to troubleshoot database errors in an outdated plugin?
Error when building: discourse does not support compiling scss/sass files via sprockets
Integration into custom auth system where emails are not unique?
Installer un environnement developpement discourse sur windows
Contributing to Discourse development
Install Discourse on Ubuntu or Debian for Development
There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path
Tags rearranged, triggering an extra edit
Ember addons are resolving as incorrect peer dependencies. -- fixed by removing "content-tag@3.1.0": "patches/content-tag@3.1.0.patch",
Trying to install Discourse on portainer but it's not pulling the base container
Developing Discourse using a Dev Container
Subscribe to post an ad
Postgres doesn't seem to be running when running Discourse locally using Docker
Discourse OpenID Connect (OIDC)
How can I install Discourse on Windows? Getting restarting (100) error
Dev environment: recommended way to bootstrap the first admin account without email?
Dev environment: recommended way to bootstrap the first admin account without email?
Total newbie struggling to preview the signup modal with my test theme, what am I missing?
Configure Discourse to use a separate PostgreSQL server
Installing discourse follow plugin in development (boot_dev) setup — no app.yml file
Discourse API developers docker-compose basic image
Which is the better option to self-host?
Using a launcher built docker image in docker-compose
Without any coding knowledge, is it possible to install and maintain Discourse?
I want to install a plugin for development, what should I do?
Can't uninstall on Ubuntu 18.04
Developing Discourse using a Dev Container
Using a launcher built docker image in docker-compose
Bundle install fails after adding gem "mysql2" and gem "reverse_markdown"
Issue in setup discourse on ubuntu server
`script/osx_dev` script is pretty broken
Can't set up dev environment due to cppjieba_rb failing to install
I want to install a plugin for development, what should I do?
Stuck in infinite loop in Mac terminal after source ~/.bashrc
Install on macOS – Failure: Scheduler::Defer can pause and resume
Install on macOS – Failure: Scheduler::Defer can pause and resume
Install Discourse for Development using Docker is Failed
OAuth2 and Microsoft ADFS
Migrate a phpBB3 forum to Discourse
Availability of OpenID Connect in hosted plans
Can't set up dev environment due to cppjieba_rb failing to install
Adding command line tools support for user api keys
Adding command line tools support for user api keys
Discourse redirects to the OAuth server after loading `/?authComplete=true`
Hello from Gitpod! (installing on google cloud + automated dev setup)

¡Es muy fácil de configurar! Gracias.

Sin embargo, me sorprende lo lenta que es la instalación local. ¿Hay alguna forma de ajustar las especificaciones del contenedor? Esperaba cierto retraso, pero quizás no uno tan drástico…

Gracias de nuevo.

7 Me gusta

Estoy intentando usar Docker en Windows 10 y tengo una pregunta sobre la guía. Ya tengo Docker instalado y puede ejecutar un contenedor de Ubuntu (con básicamente nada instalado en el contenedor). Esta guía de Docker solo dice que clones el repositorio a continuación, pero no puedo hacerlo ya que el contenedor no tiene git instalado.

En este punto, ¿debería simplemente seguir la Guía de Ubuntu e instalar todos los requisitos previos en el contenedor? ¿O debería estar usando la imagen discourse_dev referenciada en Github? Parece que esta guía está omitiendo muchos pasos, pero nunca he usado Docker antes, así que quizás me estoy perdiendo algo.

4 Me gusta

Creo que lo que te está confundiendo es que estás intentando clonar el repositorio dentro del contenedor, pero el git clone debe hacerse en tu máquina. Así que si ya tienes git instalado localmente, estás cerca de hacerlo funcionar.

3 Me gusta

De hecho, hice eso primero, lo cual es bueno. Así que ya tengo una copia del repositorio en mi máquina local.

¿Tengo acceso automático a mi sistema de archivos del host desde el contenedor de Docker? Creo que me confundí en parte con d/boot_dev --init porque no sabía qué era la parte d/ (por ejemplo, no veo una carpeta llamada d en el repositorio, aunque sí veo boot_dev).

3 Me gusta

El d está en el repositorio (baja un poco más); no es una carpeta, sino un enlace simbólico a bin/docker. Deberías obtenerlo si haces un git clone.

No he utilizado esta configuración extensivamente yo mismo, pero entiendo que editas los archivos de origen directamente en tu sistema de archivos anfitrión (que acabas de extraer) y los contenedores de Docker lo montan y se ejecutan desde él. Los scripts d/* realizarán la mayor parte del trabajo de configuración de Docker por ti.

6 Me gusta

Gracias por eso. Ni siquiera se me ocurrió mirar más allá de las carpetas. Creo que tengo suficiente información para dar otra vuelta a esto.

3 Me gusta

Sigo teniendo algo mal. Entre este tema, aquí, y aquí, en ningún lado se indica claramente qué comando de docker ejecutar. Me decanté por docker run -ti -v LocalRepoPath:/src discourse/discourse_dev, lo que inicializó un montón de cosas y aparentemente montó el repositorio en /src. Pero no puedo ejecutar d/boot_dev --init por alguna razón. Incluso solo ejecutar ls en el directorio principal del repositorio me da:

ls: no se puede acceder a 'adminjs': Error de entrada/salida
ls: no se puede acceder a 'd': Error de entrada/salida
ls: no se puede acceder a 'jsapp': Error de entrada/salida

¿Alguien sabe qué está pasando aquí?

3 Me gusta

Puede que estés complicando esto demasiado: el tutorial en el primer mensaje ya tiene todo lo necesario para empezar.

Los comandos d/* se encargarán de toda la magia de los comandos de Docker para que no tengas que hacerlo tú. Una vez que hayas clonado el repositorio, los comandos d/boot_dev --init y d/unicorn (que se ejecutan en la máquina anfitriona) deberían ser suficientes para que http://localhost:9292 funcione. Esos scripts llamarán a Docker para generar el contenedor e iniciarlo por ti. El comando d/shutdown_dev lo detendrá.

Si estás recibiendo esos errores mientras navegas por los archivos del repositorio en la máquina anfitriona, entonces algo más parece estar mal con tu sistema de archivos. ¿Quizás se te ha acabado el espacio en el disco?

4 Me gusta

suspiro, veo. Pensé que esos tenían que ejecutarse en Docker. Dicho esto, d/boot_dev --init aparentemente no funciona en Windows en PowerShell (lo cual, supongo, es la razón por la que esta guía de Docker solo menciona hosts en Mac y Ubuntu). Intenté ejecutar el comando en mi subsistema de Linux (v1), pero, por supuesto, falla en el paso de Docker ya que instalé Docker en Windows, no en el subsistema de Linux.


A continuación, intenté ejecutarlo en Git Bash para Windows. No pude ejecutar d/boot_dev --init (error “d/boot_dev: Es un directorio”), pero sí pude ejecutar bin/docker/boot_dev --init. Esto avanzó bastante, realizando varias descargas, pero luego falló con:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error de respuesta del daemon: Montaje denegado:
La ruta de origen “PathToRepo/data/postgres;C”
no existe y no es conocida por Docker.

Creo que pude superar eso escapando la ruta de montaje, según:
https://stackoverflow.com/questions/50608301/docker-mounted-volume-adds-c-to-end-of-windows-path-when-translating-from-linux

Después de eso, obtuve este error:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error de respuesta del daemon: Falló la creación del runtime OCI: container_linux.go:346: el proceso de inicio del contenedor causó “exec: "C:/Program Files/Git/sbin/boot": stat C:/Program Files/Git/sbin/boot: no existe el archivo o directorio”: desconocido.

C:/Program Files/Git/sbin/boot no existe en mi sistema de archivos, así que supongo que el error no es sorprendente. Lo único que menciona sbin/boot en el archivo boot_dev es esta parte del comando de Docker: discourse/discourse_dev:release /sbin/boot.

Y eso es básicamente en lo que estoy ahora mismo… No sé realmente qué intentar a partir de aquí.

3 Me gusta

Me temo que hasta ahí puedo ayudarte, ya que no estoy familiarizado con Windows.

Quizás @rishabh pueda confirmar si esto debería funcionar también en Windows y actualizar los pasos faltantes para ello (o añadir una nota si no funciona).

3 Me gusta

@sam ¿Es lo que estoy intentando hacer una forma remotamente viable de ejecutar Discourse para desarrollo? En el hilo de desarrollo en Windows mencionaste que lo habías intentado, pero hasta ahora no ha ido muy bien. Los contenedores básicos de Ubuntu (no específicos de Discourse) funcionan técnicamente, pero no los comandos específicos mencionados en la publicación original de este hilo.

Originalmente me comentaste esto:

Así que, a menos que tengas alguna sugerencia para ayudarme a superar los problemas que estoy teniendo con Docker en Windows, probablemente sea mejor que corte mis pérdidas y lo ejecute en una máquina virtual Ubuntu usando algo como Virtual Box.

2 Me gusta

Muchos de nosotros estamos en el anillo lento sin ningún problema. Los juegos funcionan, Steam funciona, todo funciona.

Entiendo el miedo, pero realmente no es algo grave. De todos modos, si esto te resulta demasiado intimidante, te recomiendo usar una máquina virtual tradicional como Hyper-V o VirtualBox. Instala Docker allí y utiliza nuestra configuración de desarrollo con Docker.

6 Me gusta

Si este no fuera mi ordenador principal (y único), me uniría a ustedes en el anillo lento, pero no puedo correr ese riesgo. Así que optaré por una máquina virtual tradicional con Docker. Gracias de nuevo por el consejo. Espero tener algo funcionando pronto.

¿Qué sería suficiente en cuanto a espacio en disco y RAM para asignar a la máquina virtual? Estaba pensando en tal vez 16 GB de espacio en disco y 4 GB de RAM, pero quería consultar primero.

1 me gusta

Eso probablemente sería suficiente; la mejor manera de encontrar la receta ideal es experimentar.

6 Me gusta

¡Bien, estoy cerca de hacer que esto funcione de verdad! Tengo una instancia local ejecutándose con Docker en una máquina virtual Ubuntu. Supongo que solo debo ejecutar d/boot_dev --init la primera vez y, después, simplemente d/boot_dev. ¿Es eso correcto? La razón de mi pregunta es que d/unicorn funciona cuando incluyo --init, pero no funciona cuando omito --init de d/boot_dev. Cuando falla al iniciar, obtengo el error:

No se pudo encontrar aws-partitions-1.270.0 en ninguna de las fuentes.
Ejecuta bundle install para instalar las gemas faltantes.

Pero luego, al ejecutar bundle install, falla con:

actionview_precompiler-0.2.2 requiere una versión de Ruby >= 2.6, lo cual es incompatible con la versión actual, ruby 2.5.1p57.

¿Hay una versión específica de Ruby a la que debería actualizar? ¿O hay algo más ocurriendo?


Mi máquina virtual es Ubuntu 18.04 (LTS) y esta vez pude seguir directamente las instrucciones del OP, así que no estoy seguro de dónde podría haberme equivocado (si es que algo está mal).

2 Me gusta

No usarías bundle install, usarías d/bundle install. Quieres instalar el bundle dentro del contenedor; la máquina virtual no necesita Ruby.

4 Me gusta

Sí, tenía la sensación de que era así, solo que no sabía cuál era la forma correcta de ejecutarlo en el contenedor. ¡Gracias de nuevo por la ayuda!

2 Me gusta

He descargado la última versión del repositorio y, como de costumbre, d/unicorn me indica: “Ejecuta bundle install para instalar las gems faltantes.”. Sin embargo, esta vez, al ejecutar d/bundle install, obtengo lo siguiente:

Obteniendo el índice de fuentes desde https://rubygems.org/

Reintentando el obtentor debido a un error (2/4): Bundler::HTTPError No se pudieron obtener las especificaciones desde https://rubygems.org/

Reintentando el obtentor debido a un error (3/4): Bundler::HTTPError No se pudieron obtener las especificaciones desde https://rubygems.org/

Reintentando el obtentor debido a un error (4/4): Bundler::HTTPError No se pudieron obtener las especificaciones desde https://rubygems.org/

No se pudieron obtener las especificaciones desde https://rubygems.org/

Por lo tanto, no puedo ejecutar Discourse en este momento. No tengo idea de si esto está relacionado con la descarga (directa o indirectamente) o si se trata de algo completamente ajeno. Buscar el error en Google no ha sido particularmente útil, así que no sé cómo proceder.

1 me gusta

¿Pudiste acceder a rubygems.org?

1 me gusta