Instalar Discourse para desenvolvimento usando Docker

Desenvolvimento usando Docker

Como o Discourse é executado no Docker, você deve ser capaz de executar o Discourse diretamente do seu diretório de origem usando um contêiner de desenvolvimento do Discourse.

:white_check_mark: Prós: Não há necessidade de instalar nenhuma dependência do sistema, nenhuma configuração necessária para configurar rapidamente um ambiente de desenvolvimento.

:x: Contras: Será um pouco mais lento que o ambiente de desenvolvimento nativo no Ubuntu e muito mais lento que uma instalação nativa no MacOS.

Veja também Developing Discourse using a Dev Container

Passo 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

Você pode executar os comandos acima dentro do WSL, mas deve ter todos os arquivos dentro do sistema de arquivos do WSL. Por exemplo, funciona perfeitamente se estiver dentro de ~/discourse, mas falha se estiver localizado dentro de /mnt/c/discourse.

MacOS

:warning: A imagem docker de desenvolvimento do Discourse está disponível apenas para arquiteturas x86_64. Macs M1 são capazes de iniciar a imagem usando emulação de arquitetura, mas é improvável que o Discourse inicie devido à falta de suporte a inotify no QEMU.

Em vez disso, você deve usar Install Discourse on macOS for development

Opção 1: Baixe um .dmg empacotado da Docker store
Opção 2: brew install docker

Passo 2: Iniciar Contêiner

Clone o repositório Discourse no seu dispositivo local.

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

(a partir da sua raiz de origem)

d/boot_dev --init
    # espere enquanto:
    #   - as dependências são instaladas,
    #   - o banco de dados é migrado, e
    #   - um usuário administrador é criado (você precisará interagir com isso)

# Em um terminal:
d/rails s

# E em um terminal separado
d/ember-cli

…então abra um navegador em http://localhost:4200 e voilà!, você deve ver o Discourse.

Symlinks de Plugins

O fluxo de desenvolvimento Docker suporta symlinks sob o diretório plugins/, com a seguinte ressalva:

Sempre que um novo symlink de plugin for criado, o contêiner Docker deve ser reiniciado com:

d/shutdown_dev; d/boot_dev

Notas:

  • Para testar e-mails, execute o MailHog:

    d/mailhog
    
  • Se houver gems faltando, execute:

    d/bundle install
    
  • Se uma migração de banco de dados for necessária:

    d/rake db:migrate RAILS_ENV=development
    
  • Quando terminar, você pode optar por encerrar o contêiner Docker com:

    d/shutdown_dev
    
  • Os dados são persistidos entre as invocações do contêiner no diretório tmp/postgres da sua raiz de origem. Se por algum motivo você quiser redefinir seu banco de dados, execute:

    sudo rm -fr data
    
  • Se você vir erros como “permission denied while trying to connect to Docker”, execute:

    run `sudo usermod -aG docker ${USER}`
    sudo service docker restart
    
  • Se você deseja expor globalmente as portas do contêiner para a rede (desativado por padrão), use:

    d/boot_dev -p
    
  • O Dockerfile vem de discourse/discourse_docker no GitHub, em particular image/discourse_dev.

Executando Testes

d/rake autospec

Para executar testes de plugins específicos, você também pode fazer algo como:

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

Ou até mesmo algo como isto para ser ainda mais 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 é controlado por versão - sugira alterações no github.

72 curtidas
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)

Configurar é realmente muito fácil! Obrigado.

No entanto, estou surpreso com o quão lenta é a instalação local. Há alguma maneira de ajustar as especificações do contêiner? Eu esperava uma lentidão, mas talvez não tão drástica…

Obrigado novamente.

7 curtidas

Estou tentando usar o Docker no Windows 10 e tenho uma dúvida sobre o guia. Já instalei o Docker e ele consegue executar um container do Ubuntu (com basicamente nada instalado dentro dele). Este guia do Docker apenas diz para clonar o repositório em seguida, mas não consigo fazer isso porque o container não tem o git instalado.

Neste ponto, devo apenas seguir o Guia do Ubuntu e instalar todos os pré-requisitos no container? Ou devo usar a imagem discourse_dev referenciada no Github? Parece que este guia está pulando muitas etapas, mas nunca usei o Docker antes, então talvez esteja perdendo algo.

4 curtidas

Acho que o que está te confundindo é que você está tentando clonar o repositório dentro do container, mas o git clone deve ser feito na sua máquina. Então, se você já tem o git instalado localmente, está quase conseguindo fazer funcionar.

3 curtidas

Na verdade, eu fiz isso primeiro, o que é bom. Então, já tenho uma cópia do repositório na minha máquina local.

Tenho acesso automático ao sistema de arquivos do host a partir do contêiner Docker? Acredito que fiquei meio confuso com d/boot_dev --init, porque não sabia o que era a parte d/ (não vejo, por exemplo, uma pasta chamada d no repositório, embora eu veja boot_dev).

3 curtidas

O d está no repositório (role mais para baixo) — não é uma pasta, mas um link simbólico para bin/docker. Você deve obtê-lo ao fazer o git clone.

Eu não usei essa configuração extensivamente, mas entendo que você edita os arquivos de fonte diretamente no seu sistema de arquivos do host (que você acabou de fazer checkout) e os contêineres do docker montam esse diretório e executam a partir dele. Os scripts d/* farão a maior parte do trabalho de configuração do docker para você.

6 curtidas

Obrigado por isso. Eu nem pensei em olhar além das pastas. Acho que tenho informações suficientes para dar outra passada nisso.

3 curtidas

Ainda estou cometendo algum erro. Entre este tópico, aqui, e aqui, em lugar nenhum é especificado qual comando docker executar. Optei por docker run -ti -v LocalRepoPath:/src discourse/discourse_dev, o que inicializou uma série de coisas e aparentemente montou o repositório em /src. Mas, por algum motivo, não consigo executar d/boot_dev --init. Mesmo apenas executando ls no diretório raiz do repositório, recebo:

ls: não foi possível acessar 'adminjs': Erro de entrada/saída
ls: não foi possível acessar 'd': Erro de entrada/saída
ls: não foi possível acessar 'jsapp': Erro de entrada/saída

Alguém sabe o que está acontecendo aqui?

3 curtidas

Você pode estar complicando demais: o tutorial no primeiro post já tem tudo o que você precisa para começar.

Os comandos d/* farão toda a mágica do Docker para que você não precise. Depois de clonar o repositório, os comandos d/boot_dev --init e d/unicorn (que você executa na máquina host) devem ser suficientes para fazer o http://localhost:9292 funcionar. Esses scripts chamarão o Docker para gerar o contêiner e iniciá-lo para você. O d/shutdown_dev irá pará-lo.

Se você está recebendo esses erros ao navegar pelos arquivos do repositório na máquina host, então algo mais parece estar errado com seu sistema de arquivos. Será que você ficou sem espaço em disco?

4 curtidas

suspiro, entendi. Eu achava que eles precisavam ser executados dentro do Docker. Dito isso, d/boot_dev --init aparentemente não funciona no Windows no PowerShell (o que, suponho, é a razão pela qual este guia do Docker menciona apenas hosts Mac e Ubuntu). Tentei executar o comando no meu subsistema Linux (v1), mas, claro, falhou na etapa do Docker, já que instalei o Docker no Windows, e não no subsistema Linux.


Em seguida, tentei executá-lo no Git Bash para Windows. Não consegui executar d/boot_dev --init (erro “d/boot_dev: Is a directory”), mas consegui executar bin/docker/boot_dev --init. Isso avançou bastante, realizando várias baixadas, mas então falhou com

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: Mount denied:
O caminho de origem “PathToRepo/data/postgres;C”
não existe e não é conhecido pelo Docker.

Acredito que consegui superar isso escapando do caminho de montagem, conforme:
https://stackoverflow.com/questions/50608301/docker-mounted-volume-adds-c-to-end-of-windows-path-when-translating-from-linux

Após isso, obtive este erro:

C:\Program Files\Docker\Docker\resources\bin\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused “exec: "C:/Program Files/Git/sbin/boot": stat C:/Program Files/Git/sbin/boot: no such file or directory”: unknown.

C:/Program Files/Git/sbin/boot não existe no meu sistema de arquivos, então acho que o erro não é surpreendente. A única coisa que menciona sbin/boot no arquivo boot_dev é esta parte do comando docker: discourse/discourse_dev:release /sbin/boot.

E é basicamente aí que estou agora… Não sei muito bem o que tentar neste ponto.

3 curtidas

Receio que essa seja a extensão da minha ajuda, pois não estou familiarizado com o Windows.

Talvez @rishabh possa confirmar se isso deveria funcionar no Windows também e atualizar as etapas ausentes para isso (ou adicionar uma nota caso não funcione).

3 curtidas

@sam, o que estou tentando fazer é realmente uma maneira remotamente suportada de executar o Discourse para desenvolvimento? Na thread de desenvolvimento no Windows, você mencionou tentar isso, mas as coisas não têm corrido muito bem até agora. Contêineres Ubuntu básicos (não específicos do Discourse) funcionam tecnicamente, mas não os comandos específicos mencionados na mensagem original deste tópico.

Você originalmente me disse o seguinte:

Portanto, a menos que você tenha uma sugestão para me ajudar a resolver os problemas que estou enfrentando com o Docker no Windows, provavelmente será melhor para mim cortar minhas perdas e executá-lo em uma VM Ubuntu usando algo como o VirtualBox.

2 curtidas

Muitos de nós estamos no anel lento sem nenhum problema. Jogos funcionam, o Steam funciona, tudo funciona.

Entendo o receio, mas realmente não é algo tão grave. De qualquer forma, se isso for muito assustador para você, recomendo usar uma máquina virtual tradicional, como o Hyper-V ou o VirtualBox. Instale o Docker nela e utilize nossa configuração de desenvolvimento com Docker.

6 curtidas

Se este não fosse meu computador principal (e único), eu me juntaria a vocês no ringue lento, mas simplesmente não posso correr esse risco. Então, vou optar por uma VM tradicional com Docker. Obrigado novamente pelo conselho. Espero ter algo funcionando em breve.

O que seria suficiente para espaço em disco e RAM alocados à VM? Estava pensando em talvez 16 GB de espaço em disco e 4 GB de RAM, mas queria verificar antes.

1 curtida

Isso provavelmente seria o suficiente. A melhor maneira de encontrar a receita ideal é experimentar.

6 curtidas

Tudo bem, estou quase conseguindo fazer isso funcionar de verdade. Tenho uma instância local rodando usando Docker em uma VM Ubuntu. Acredito que devo executar d/boot_dev --init apenas na primeira vez e, depois disso, apenas d/boot_dev. Isso está correto? A razão da minha pergunta é que d/unicorn funciona quando incluo --init, mas não funciona quando omito o --init do d/boot_dev. Quando ele falha ao iniciar, recebo o erro:

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

Mas então, ao executar bundle install, ele falha com:

actionview_precompiler-0.2.2 requires ruby version >= 2.6, which is incompatible with the current version, ruby 2.5.1p57

Existe uma versão específica do Ruby para a qual devo atualizar? Ou há algo mais acontecendo?


Minha VM é Ubuntu 18.04 (LTS) e, desta vez, consegui seguir diretamente as instruções do OP, então não tenho certeza de onde posso ter errado (se é que algo está errado).

2 curtidas

Você não usaria bundle install, você usaria d/bundle install. Você quer instalar o bundle dentro do contêiner; a máquina virtual não precisa do Ruby.

4 curtidas

Sim, eu tinha a impressão de que era isso, só não sabia qual era a maneira correta de executá-lo no container. Obrigado novamente pela ajuda!

2 curtidas

Baixei a versão mais recente do repositório e, como de costume, d/unicorn me diz: “Execute bundle install para instalar os gems ausentes.”. No entanto, desta vez, ao executar d/bundle install, recebo a seguinte mensagem:

Obtendo índice de fontes de https://rubygems.org/

Retentando o fetcher devido a erro (2/4): Bundler::HTTPError Não foi possível obter as especificações de https://rubygems.org/

Retentando o fetcher devido a erro (3/4): Bundler::HTTPError Não foi possível obter as especificações de https://rubygems.org/

Retentando o fetcher devido a erro (4/4): Bundler::HTTPError Não foi possível obter as especificações de https://rubygems.org/

Não foi possível obter as especificações de https://rubygems.org/

Portanto, não consigo executar o Discourse no momento. Não tenho ideia se isso está relacionado ao pull (direta ou indiretamente) ou se é algo completamente não relacionado. Pesquisar o erro no Google não foi particularmente útil, então não sei como prosseguir.

1 curtida

Você conseguiu acessar o rubygems.org?

1 curtida