Configuração de implantação de Discourse de opinião do MKJ

Fui executando um fórum Discourse com uma quantidade considerável de conteúdo e muitas imagens nos últimos anos. Maker Forums tem mais de 100 GB de imagens e mais de 400.000 publicações, das quais uma quantidade substancial foi importada, principalmente do Google+, e o restante foi criado no site. Esta publicação descreve elementos de como configurei o Maker Forums e, mais tarde, algumas outras instâncias do Discourse. É o que eu gostaria de ter sabido quando comecei, e que usei para ajudar outras pessoas a evitar algumas das mesmas armadilhas em suas próprias instâncias do Discourse.

Hora de atingir um público mais amplo.

:warning: Aviso: Se você não se sentir confortável trabalhando como administrador de sistemas Linux, este guia provavelmente não é para você. Eu nem mesmo estou ciente de todas as maneiras pelas quais ele pressupõe conhecimento sobre Linux. Se isso parecer esclarecedor para ler, você pode ser o público-alvo. Se parecer confuso para ler, você provavelmente não é o público-alvo. Se isso parecer trabalho, considere pagar para que a CDCK ou @pfaffman executem o Discourse para você; eles sabem o que estão fazendo. Ou comece com um site gratuito discourse.group e depois pague pelo que você for crescendo. :warning:

:warning: Como se isso não fosse suficiente: tenho mais experiência em Linux do que em Discourse. Minhas opiniões não vêm com garantia. Se tentar seguir meus conselhos fizer algo seu quebrar (seu fórum Discourse, seu sistema host ou seu coração), você fica com as duas peças, com todas as arestas cortantes. Não tenho planos de fornecer qualquer tipo de suporte para o conteúdo desta publicação. :warning:

Planejo (mas não prometo) manter este documento atualizado com minhas práticas cobrindo as instâncias do Discourse nas quais participo da manutenção. Isso está escrito na forma de conselho, mas a intenção é principalmente como conselho para mim mesmo e para quaisquer administradores que herdem implantações do Discourse pelas quais fui responsável. Caso contrário, você deve considerá-lo como um ponto de partida para sua própria pesquisa para determinar como deseja implantar o Discourse.

Configuração do Sistema

Use um sistema operacional derivado do CentOS ou Ubuntu LTS. Qualquer coisa que suporte Docker provavelmente pode ser feita para funcionar, mas usei esses dois.

Docker

Sou usuário do Fedora. Fui o primeiro Líder do Projeto Fedora na Red Hat, e eu preferiria muito executar o Discourse por cima do Podman, porque opino que seu modelo de segurança é preferível ao do Docker. No entanto, as implantações do Discourse são suportadas apenas no Docker, e você será um verdadeiro pioneiro se tentar executar por cima de qualquer outra coisa. (Pode, um dia, funcionar com Podman usando podman-compose se o docker-compose for suportado.)

Agora que o Docker suporta cgroups v2, você pode instalar as compilações oficiais do Docker em um sistema derivado do CentOS:

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install --allowerasing docker-ce docker-ce-cli

(Inclua --allowerasing devido a um conflito com podman, runc e buildah que podem já estar instalados; eles precisam ser removidos para instalar o docker.)

systemctl enable --now docker

Testei isso com AlmaLinux 9.

Segurança

Esta seção realmente não tem nada a ver com o Discourse per se, mas faz parte da minha prática normal de segurança. Não permita acesso ao shell apenas com senha a nenhum sistema na rede, incluindo uma VM executando o Discourse. Configure o acesso baseado em SSH usando uma chave SSH criptografada com frase de passe, e configure o servidor ssh em sua VM para não permitir acesso por senha.

laptop$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/.../.ssh/id_rsa):
Enter passphrase (empty for no passphrase): ALGUMA FRASE LONGA
Enter same passphrase again: ALGUMA FRASE LONGA
Your identification has been saved in .ssh/id_rsa
Your public key has been saved in .ssh/id_rsa.pub

As distribuições Linux normalmente são configuradas para lembrar a frase de passe na memória, então você só precisa digitá-la uma vez por inicialização. O Windows não é tão conveniente; você pode considerar usar o Pageant com o PuTTY para fazer o mesmo.

Primeiro, valide que o SSH entrante funciona sem senha. Só depois disso, no servidor, modifique o arquivo /etc/ssh/sshd_config e encontre a linha PasswordAuthentication. Defina como no para desabilitar o acesso por senha entrante.

PasswordAuthentication no

Firewall

Você precisará deixar as portas 80 e 443 geralmente abertas para o letsencrypt gerar e renovar seus certificados SSL, mesmo antes de seu Discourse estar aberto ao público.

Se você estiver usando firewalld, estes comandos realizarão isso:

firewall-cmd --add-service http --add-service https --zone public
firewall-cmd --runtime-to-permanent

Dispositivo e sistema de arquivos separados

Faça com que /var/discourse/shared seja um dispositivo separado com seu próprio sistema de arquivos, com 20 GB de espaço mais pelo menos o dobro do espaço que você precisa para imagens; adicione mais espaço se for usar prometheus. Se o dispositivo for fácil de expandir depois (como LVM ou qualquer armazenamento em bloco na nuvem como AWS elastic block storage) você pode monitorar e aumentá-lo conforme necessário; caso contrário, seja generoso no início. Se você estiver usando um dispositivo de armazenamento em bloco de rede, não coloque uma tabela de partições nele. Usá-lo sem uma tabela de partições tornará mais fácil expandir; você não precisará modificar uma tabela de partições. Em muitos casos, você poderá expandir sem nenhuma interrupção do sistema.

No Maker Forums, este é um dispositivo de armazenamento em bloco de rede conectado à VM na qual o Maker Forums está sendo executado. Em outro fórum Discourse, é um Volume de Armazenamento em Bloco da Digital Ocean. Na Amazon, seria o AWS Elastic Block Storage. Em meu sistema de teste executando uma VM KVM sob libvirt no Fedora, é um volume LVM no host Fedora exportado para a VM AlmaLinux como um disco virtual. Em cada caso, eu poderia criar uma nova VM, copiar arquivos-chave para ela, parar a VM antiga, anexar o volume /var/discourse/shared à nova VM e estar de volta funcionando em minutos. Isso torna as atualizações do sistema operacional na VM relativamente de baixo risco.

Certifique-se de começar com pelo menos 25 GB no sistema de arquivos raiz para sua VM, não incluindo nenhum espaço para /var/discourse/shared. Isso será usado para todos os contêineres docker, e o lançador do discourse falhará se houver menos de 5 GB livres a qualquer momento. Você também quer bastante espaço disponível para atualizações do sistema. Se você não tiver espaço em disco suficiente, isso é difícil de recuperar.

Na configuração do site, defina force_https, mas leve em conta os avisos. Configure-o em teste, antes de tornar um site Discourse público. Observe que mesmo com force_https você precisa da porta 80 aberta, tanto para redirecionar para SSL na porta 443 quanto para renovar seu certificado SSL do letsencrypt. (No entanto, se você estiver usando cloudflare, use seu recurso em vez disso; relata-se que não é compatível com force_https no Discourse.)

Configuração do Kernel

Redis (um dos componentes-chave nos quais o Discourse é construído) recomenda fortemente desabilitar páginas transparentes gigantes ao usar persistência em disco (o que o Discourse faz), e eu também permito supercomprometimento de memória.

echo 'w /sys/kernel/mm/transparent_hugepage/enabled - - - - never
w /sys/kernel/mm/transparent_hugepage/defrag  - - - - never' > /etc/tmpfiles.d/thp.conf
systemd-tmpfiles --create
echo 'vm.overcommit_memory=1' > /etc/sysctl.d/90-vm_overcommit_memory.conf
sysctl --system

Instalação do Discourse

Enquanto a instalação padrão é um único contêiner, isso faz com que cada atualização, recomendada mensalmente, seja tipicamente uma interrupção de 10-15 minutos se feita a partir da linha de comando, o que é necessário para algumas atualizações, incluindo aquelas que atualizam as ferramentas sobre as quais o Discourse é construído, por segurança ou novos recursos, ou quando a atualização ao vivo pela interface do usuário falha por qualquer motivo. Você pode reduzir essa interrupção na prática com a instalação de dois contêineres.

Instalação de dois contêineres

Inicie a configuração com dois contêineres.

./discourse-setup --two-container --skip-rebuild
${EDITOR:-nano} containers/data.yml
./launcher rebuild data
# minha preferência é usar app.yml, mas você pode ficar com web_only.yml, leia o texto
mv containers/web_only.yml containers/app.yml
${EDITOR:-nano} containers/app.yml
./launcher rebuild app

Isso torna a interrupção do sistema necessária a cada poucos meses muito curta, raramente perceptível; muitos usuários não notarão nada se não clicarem ou rolarem o conteúdo durante a interrupção. Isso facilita a aplicação da maioria das atualizações de segurança; é apenas um pico em vez de aproximadamente 15 minutos reconstruindo tudo. O processo a seguir funciona para a maioria das atualizações e tipicamente dá aproximadamente 30-90 segundos de interrupção, dependendo principalmente do desempenho do sistema host e do conjunto de plugins instalados.

cd /var/discourse
git pull
./launcher bootstrap app
./launcher destroy app && ./launcher start app
./launcher cleanup

Não demore entre as invocações de bootstrap e destroy/start. Raramente (talvez uma ou duas vezes por ano na prática), as migrações de banco de dados feitas perto do final da fase de bootstrap causarão erros mais ou menos sérios para os usuários do aplicativo, devido ao código mais antigo acessando o banco de dados atualizado.

Isso significa que quando você atualiza o Discourse, você também precisa verificar se deve atualizar o contêiner de dados, mas isso raramente é necessário (geralmente espere uma ou duas vezes por ano). Dependendo do conteúdo de seus contêineres de dados e aplicativos e da velocidade do sistema, isso resultará tipicamente em uma interrupção entre 5 e 20 minutos.

cd /var/discourse
git pull
./launcher stop app
./launcher rebuild data
./launcher rebuild app

Para mais informações sobre quando atualizar o contêiner de dados, veja:

(Em minhas próprias implantações, escolhi pessoalmente chamar o contêiner web_only de app tanto porque é mais fácil de digitar quanto porque torna a maioria das instruções mais fáceis de seguir. Isso não é padrão, mas continuo apreciando a facilidade de uso. No entanto, foi trabalho extra, e funciona para mim porque sei o que está acontecendo. Se isso soa mal para você, fique com o web_only padrão para uma implantação multi-contêiner.)

Observe que em algum ponto no futuro, o Docker pode forçá-lo a fazer uma migração para uma nova configuração para conectar seus contêineres:

Se você tiver 4 GB ou mais de memória, ou vários CPUs, leia os conselhos em:

Cronograma de Atualização

Acompanhe a tag release-notes (Clique em release-notes e clique no sino no canto superior direito; eu uso “Acompanhando a Primeira Postagem”) e/ou adicione https://meta.discourse.org/tag/release-notes.rss ao seu feed RSS para saber quando há lançamentos. Leia as notas de lançamento antes de atualizar. Se houver uma mudança no banco de dados, as notas de lançamento mencionarão isso. Elas também destacarão lançamentos que contêm atualizações de segurança. Leia todas as notas de lançamento, mesmo que você pule a atualização real para alguma versão; se você não ler as notas de lançamento de um lançamento que atualiza o banco de dados, você pode perder instruções de atualização do banco de dados nas notas de lançamento que não leu.

Correio

O correio ainda é uma das principais maneiras de manter as pessoas conectadas. Configure o correio de saída e entrada para fazer o correio funcionar para você. Se você tiver problemas, veja:

Continue se comunicando

O Maker Forums viu visitantes ocasionais que estão ausentes por longos períodos antes de retornar. Por padrão, o Discourse para de enviar e-mails de resumo após um ano. Considere definir o suppress_digest_email_after_days para algo maior que o padrão de 365 dias se você quiser incentivar visitantes ocasionais a voltar quando virem algo novo e interessante. Eu o fiz substancialmente maior para o Maker Forums para apoiar visitantes ocasionais se mantendo atualizados. Ler e-mails de resumo é uma maneira válida de “lurkar” em um fórum, e você nunca sabe quando algo vai despertar o interesse de alguém em contribuir.

Da mesma forma, por padrão, usuários sem privilégios que não interagiram muito (nível de confiança 0 sem publicações) são eventualmente excluídos após 730 dias sem fazer login. Defina "limpar usuários inativos após diasup/backup-config

restic --cache-dir=/var/restic
backup
/etc
/root
/var/discourse
/opt/backup
–exclude /var/discourse/shared/data/postgres_data

restic --cache-dir=/var/restic forget
–prune --keep-hourly 24 --keep-daily 7 --keep-monthly 3
EOF

chmod +x backup


Esses detalhes variarão dependendo do destino do restic. Nem todos usam variáveis de ambiente da AWS, então leia a documentação do restic.

```shell
# cat > backup-config <<EOF
### Esses detalhes dependem de qual destino do restic você configurar, então altere-os
export AWS_ACCESS_KEY_ID=sua-chave-aqui
export AWS_SECRET_ACCESS_KEY=mesma
export RESTIC_PASSWORD_FILE=/root/restic-password
export RESTIC_REPOSITORY=veja-a-documentação-do-restic
EOF
# {$EDITOR:-nano} /root/restic-password

Você precisará armazenar uma cópia do que colocou em /root/restic-password, caso contrário, não poderá ler os backups! Use seu cofre de senhas.

Por fim, crie alguns serviços, inicialize o repositório do restic e defina um temporizador para que os backups comecem.

# cat > /etc/systemd/system/backup.service <<EOF
[Unit]
Description=Backup para destino remoto
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
StandardOutput=file:/var/log/backup.out
StandardError=file:/var/log/backup.err
WorkingDirectory=/var/discourse
ExecStart=/opt/backup/backup

[Install]
WantedBy=multi-user.target
EOF
# cat > /etc/systemd/system/backup.timer <<EOF
[Unit]
Description=Backups regulares do sistema

[Timer]
Persistent=true
OnCalendar=00/4:30:00
Unit=backup.service

[Install]
WantedBy=timers.target
EOF

# systemctl daemon-reload
# . /opt/backup/backup-config
# restic init
# /opt/backup/backup
# systemctl enable backup.timer

Após esse processo, você deverá conseguir ver que criou seu backup inicial.

# restic snapshots

Usei com sucesso backups do restic feitos dessa maneira para mover um servidor Discourse de um sistema para outro usando o comando restic restore.

Backups de imagens em streaming com minio

Como alternativa ao Restic, embora os backups de banco de dados possam ser armazenados no S3, não há backup de imagens no S3 separado do serviço de imagens do S3. Uma alternativa é usar o minio-client para copiar imagens para qualquer armazenamento semelhante ao S3. Isso pode ser muitos destinos semelhantes ao S3, incluindo S3 e minio, mas não DigitalOcean Spaces porque é construído sobre o sistema de arquivos Ceph, que não implementa a API ListObjectsV2 da mesma maneira que o S3.

No S3, crie um bucket que bloqueie o acesso público (PermissõesBloquear acesso público é a maneira fácil de fazer isso corretamente na AWS).

Instale o minio-client (mc) de alguma forma. Aqui está uma maneira.

curl https://dl.min.io/client/mc/release/linux-amd64/mc > /usr/local/bin/mc && chmod +x /usr/local/bin/mc

Configure o minio-client com um alias chamado backup usando um comando como este:

# mc alias set backup https://s3.amazonaws.com ACCESSKEY SECRETKEY --api S3v4
# mc mirror /var/discourse/shared/standalone/uploads backup/UPLOADS-BACKUP-BUCKET

Em seguida, crie um serviço /etc/systemd/system/backup-uploads.service como este

[Unit]
Description=Sincronização de backup remoto quase em tempo real de uploads do discourse
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=600
User=root
ExecStart=/usr/local/bin/mc mirror --overwrite -a --watch /var/discourse/shared/app/uploads backup/UPLOADS-BACKUP-BUCKET

[Install]
WantedBy=multi-user.target

Observe que UPLOADS-BACKUP-BUCKET aqui deve ser um bucket diferente do s3_backup_bucket no qual você configura o discourse para fazer upload de backups de banco de dados. Além disso, observe que o caminho será /var/discourse/shared/web_only/uploads se você usar a implantação multi-container padrão.

# systemctl enable backup-uploads
# systemctl start backup-uploads
# journalctl -fu backup-uploads

Faça upload de uma imagem de teste e verifique se você vê linhas indicando o backup bem-sucedido das imagens original e otimizada. Control-C sairá do modo de acompanhamento no journalctl.

Recuperação

Nunca precisei testar esse plano até o momento desta escrita. Este resumo pode estar omitindo algo.

  • Restaure todos os arquivos backupados em geral
  • Inicie o nginx (agora sua página de manutenção será exibida)
  • Faça uma implantação normal do Discourse usando os arquivos restaurados em /var/discourse/containers
  • Instale o minio-client em /usr/local/bin/mc se você não o restaurou dos backups
  • Se você não fez backup de /root/mc, configure o alias de backup # mc alias set backup https://s3.amazonaws.com ACCESSKEY SECRETKEY --api S3v4
  • # mc cp backup/UPLOADS-BACKUP-BUCKET /var/discourse/shared/app/uploads
  • Restaure o backup de banco de dados mais recente; recomendo que você Restore a backup from the command line
  • Apenas após confirmar que o site está operacional, reconfigure o backup de uploads para o S3 conforme documentado acima.

Backups em streaming do postgresql

No futuro, posso criar, testar e fornecer uma configuração para permitir o uso de arquivamento contínuo de WAL para transmitir backups do Postgres quase instantâneos com o minio-client usando o archive-command no postgresql, semelhante aos backups de uploads em streaming.

Monitoramento de desempenho

Existem pelo menos duas abordagens para monitoramento de desempenho.

Container Prometheus

Configure o prometheus, colocando os logs do prometheus em /var/discourse/shared/prometheus se você estiver executando-o no mesmo sistema. Os arquivos do Prometheus podem crescer muito, e você não quer que eles preencham o sistema de arquivos raiz; você também provavelmente quer levá-los consigo se mover para um sistema host mais novo (seja atualizando para uma VM maior ou uma VM com uma instalação de sistema operacional mais recente).

Se você implantar o prometheus no sistema discourse (ou em qualquer outro lugar na internet pública), configure a segurança na frente dele. Instalado dessa forma, uma opção seria a configuração do nginx como esta:

  location /prometheus/ {
    auth_basic "Prometheus";
    auth_basic_user_file /etc/nginx/prometheus-htpasswd;
    proxy_pass http://localhost:9090/;
  }

Sysstat

Se o Prometheus for demais, considere usar o sysstat em vez disso.

  • dnf install sysstat (ou apt install sysstat no debian e derivados)
  • systemctl enable --now sysstat
  • systemctl enable --now sysstat-collect.timer
  • systemctl enable --now sysstat-summary.timer
  • systemctl edit sysstat-collect.timer e altere OnCalendar=*:00/10 para OnCalendar=*:00/2
  • Se /etc/default/sysstat existir, altere false para true

Após isso, o comando sar poderá informar se você está ficando sem recursos de vez em quando.

Outros Recursos

Aqui está uma discussão complementar (e mais compacta) sobre o uso do Discourse internamente como forma principal de comunicação interna.

54 curtidas

Olá, obrigado por este tutorial

Quais são sua CPU atual (núcleos) e RAM?
Quais são suas configurações atuais:

  db_shared_buffers: "xGB"
  db_work_mem: "xMB"
  UNICORN_WORKERS:

2 vCPUs (Xeon L5640), 4 GB de RAM — mas, graças à importação massiva, temos mais conteúdo por usuário simultâneo do que o típico Discourse construído inteiramente de forma orgânica. Raramente temos mais de 5 usuários simultâneos.

Atualmente, não configurei db_work_mem no data.yml, mas parece que está definido como 10 MB em /etc/postgresql/13/main/postgresql.conf. No meu data.yml, defini db_shared_buffers: "768MB", mas agora vejo que /etc/postgresql/13/main/postgresql.conf no meu container de dados diz shared_buffers = 512MB, o que me surpreende. Aparentemente, não reconstruí meu container de dados após minha última alteração. :roll_eyes: Fiz a alteração de configuração antes de adicionar o Prometheus (que usa mais memória), então, antes de alterar isso, provavelmente vou mover o Prometheus para fora dessa instância de servidor.

No aplicativo, configurei UNICORN_WORKERS: 4

1 curtida

obrigado @mcdanlj por todos esses brindes. Algum conselho sobre manutenção periódica/agendada? como reinicializações semanais/mensais? ou monitoramento de subida/descida com reinicialização automática? Alguma outra manutenção periódica manual ou automatizada?

1 curtida

@jaffadog Fique de olho na tag release-notes (é o sino no canto superior direito; eu uso “Assistindo a Primeira Postagem”) e/ou adicione https://meta.discourse.org/tag/release-notes.rss ao seu feed RSS para saber quando houver lançamentos. Isso é tipicamente mensal para o aplicativo, o que cobre reinicializações mensais. Eu não reinicio com mais frequência em um cronograma. Além disso:

Se você usa letsencrypt e mail_receiver, provavelmente deve configurá-lo para reiniciar o mail_receiver após obter um novo certificado.

É tudo o que me vem à mente no momento. Obrigado por perguntar, e incorporei como acompanhar release-notes e mais detalhes sobre reinicializações no texto principal. Acho que tudo agora está totalmente coberto na postagem original.

Eu aumentei as instruções de atualização para buscar atualizações em /var/discourse a fim de alterar a versão da imagem base, pois, ao analisar Update base image for polkit vulnerability, percebi que não ser explícito sobre esta etapa poderia ser enganoso. Eu estava pensando nisso como uma daquelas coisas que fazem parte da documentação de linha de base. O script launcher contém uma referência específica à versão da imagem base e, até que você execute git pull, você estará construindo sobre uma imagem base mais antiga e não executando o que foi testado. (Procure por image= perto do topo do arquivo.)

1 curtida

É pior do que isso: ele é configurado por padrão para excluir contas inativas de nível 0 após algum período. No meu caso, isso realmente não era o que eu queria! Verifique “limpar usuários inativos após dias” e defina para zero, ou um número realmente grande.

2 curtidas

Eu olhei para isso, mas, pelo que entendi, significa que eles nunca responderam ao fluxo de “confirme seu endereço de e-mail” e, portanto, não receberiam e-mails de qualquer maneira. Não acho que “inativo” aqui signifique “não fazer login no site”, mas gostaria de saber se estou enganado.

Não, “inativo” não significa active=false aqui.

Significa usuários onde todas as condições abaixo se aplicam:

  • nível de confiança 0
  • sem postagens
  • não é administrador, nem moderador
  • visto pela última vez há mais de X dias.

E sim, essa redação é realmente confusa, embora a configuração explique um pouco (“nível de confiança 0 sem nenhuma postagem”).

8 curtidas

Na verdade, eu estava confundindo configurações diferentes e tinha em mente “limpar usuários em staging não utilizados após X dias”. Eu já havia definido “limpar usuários inativos após X dias” para zero no Maker Forums há muito tempo e não mencionei isso aqui; devo ter esquecido em minha auditoria de configurações de site alteradas quando estava procurando por coisas que poderiam ser de interesse geral. Obrigado a ambos, @Ed_S e @RGJ! Atualizei a postagem com outro parágrafo sobre habilitar o “lurking”. :smiling_face:

4 curtidas

Olá @mcdanlj, obrigado pela sua excelente visão que você compartilha aqui. Em relação a uma instalação de 2 contêineres, estou confuso sobre como isso oferece uma vantagem na redução do tempo de inatividade durante as atualizações. Na minha instalação de teste, uma atualização via interface GUI /admin/upgrade#/upgrade/all leva vários minutos, como você descreve, mas o site permanece operacional para os usuários durante todo o processo.

Quando você tem que reconstruir a partir da linha de comando, a instalação dos dois contêineres permite que você inicialize a nova imagem enquanto a antiga continua em execução.

2 curtidas

Como sempre, o @pfaffman é mais rápido do que eu e entende do assunto. :smiley:

Eu nunca faço atualizações pela GUI. Dessa forma, toda vez que eu atualizo, incluo quaisquer atualizações de segurança do sistema nos contêineres subjacentes sobre os quais o Discourse está rodando. Isso não quer dizer que usar a GUI seja ruim, nem é uma recomendação para todos os outros. As atualizações da GUI têm um tempo de inatividade ligeiramente menor (reiniciar o contêiner da web faz o serviço bipar momentaneamente, o que é um dos vários motivos para considerar isso em conjunto com o nginx externo), então é uma troca, e eu escolhi o caminho menos percorrido.

Uma instalação de contêiner único tem interrupções mais longas com mais frequência, se você atualizar regularmente para atualizações de segurança, bem como para as atualizações ocasionais de versão do banco de dados, pois o Discourse aproveita os novos recursos do Postgresql. Sem revisar dados reais, minha intuição é que há um motivo para reconstruir isso 3-4 vezes por ano. Se essa quantidade de tempo de inatividade for aceitável do seu ponto de vista, não há muitos motivos para assumir a complexidade da implantação de 2 contêineres.

4 curtidas

Isso é muito gentil, mas o assunto são as suas opiniões. :wink:

Eu também não. Exceto com meu painel, que tem um monte de coisas extras no contêiner (como Ansible, e não me lembro exatamente o quê), e se alguém estiver fazendo uma atualização usando dashboard.literatecomputing.com e eu destruir esse contêiner, a reconstrução deles será encerrada, o que pode ser problemático. Então, tenho feito algumas atualizações do docker_manager ultimamente, e elas são muito boas.

Não exatamente. É pelo menos na maioria das vezes que, se houver uma nova imagem base, o docker_manager forçará você a obtê-la (pelo menos, ele tentará).

Isso está mais ou menos certo. Para constar, e não recomendo, mas interagi com um monte de gente que ficou anos sem fazer nenhuma atualização, sem nenhum problema.

1 curtida

Sim, não há dúvida de que as atualizações dentro do contêiner são bem implementadas!

Sim, era isso que eu queria dizer. :tada:

2 curtidas

Olá novamente, obrigado a ambos pela visão. Então, ainda estou tentando decidir o que fazer para minha configuração de produção. Entendo em teoria por que uma instalação de 2 contêineres levaria a menos tempo de inatividade. Mas ainda estou vendo muito pouco tempo de inatividade com o mecanismo de atualização da GUI. Acabei de cronometrar, tive uma atualização do docker-manager e o Discourse estava 22 commits atrás. Todo o processo levou menos de 5 minutos e durante todo o processo o fórum estava totalmente operacional. Concedido que não houve atualizações do PostgreSQL desta vez, mas se fosse necessário atualizá-lo também, eu estaria olhando para a quantidade máxima de tempo de inatividade, mesmo com o método de 2 contêineres, correto? Então, se estou entendendo corretamente, o método de 2 contêineres só reduz o tempo de inatividade quando um login SSH e a reconstrução do contêiner do aplicativo são necessários devido a uma alteração de configuração (adicionar/remover plugins, etc.)? Não prevejo mudanças frequentes na minha configuração de produção, então não vejo nenhuma redução potencial no tempo de inatividade no meu caso. Ou eu também preciso fazer login via SSH e reconstruir os contêineres para aplicar certos tipos de atualizações de recursos/segurança?

Tudo bem.

Sim, você tem o tempo de inatividade total toda vez que atualiza o postgresql (a cada um ou dois anos, suponho, mais atualizações de segurança para o próprio PostgreSQL, não que elas tenham sido tão frequentes).

Antes de mudar, tive algumas falhas ao fazer as atualizações da GUI, mas não me lembro mais dos detalhes; história antiga.

As atualizações da GUI não atualizam a imagem base, portanto, todas as atualizações de segurança no software fornecido, como o processamento de imagens, não serão aplicadas lá.

Eu gosto de reconstruir o contêiner do aplicativo rapidamente como meu modo normal para consumir atualizações de segurança para o contêiner do aplicativo quando disponíveis, para que eu nunca adie isso por 10 minutos de inatividade para reconstruir tudo. É por isso que git pull no launcher faz parte da primeira parte da aplicação de todas as atualizações; para que, se a imagem base com coisas como programas de processamento de imagem tiver sido atualizada, elas sejam aplicadas sem que eu precise pensar em perguntar se há atualizações de segurança a serem aplicadas. :smiling_face:

Mas, no final, eu pessoalmente acho a abordagem de dois contêineres mais simples para mim, e eu absolutamente não estou tentando convencer outras pessoas a usá-la. Se não parecer mais simples para você com base em seu conhecimento e experiência, não o faça apenas porque meu guia pessoal e opinativo o identifica como útil em um determinado contexto. :grin:

2 curtidas

Entendi! :wink: Eu também costumo ter opiniões fortes sobre detalhes de implementação de tecnologia, mas aprecio sua perspectiva adicional.

Hmm, então isso ainda é verdade?

De qualquer forma, em minha experiência com fóruns tradicionais instalados sem containerização em uma pilha LAMP/LEMP, o vetor de vulnerabilidade/ataque típico que leva a sites comprometidos no mundo real é quase sempre no código do aplicativo web ou em um de seus frameworks de desenvolvimento web. Portanto, eu tendo a ter um senso maior de urgência em relação às atualizações do codebase do Discourse, que parecem ser tratadas pela GUI, então acho que estou pendendo para esse lado.


A propósito, sobre o assunto de tempo de inatividade, uma rápida menção ao Clear Linux: Comecei a testá-lo devido às suas otimizações de baixo nível em pura computação numérica para tentar economizar algumas horas no meu enorme processo de importação de fórum. Pode haver de fato algumas melhorias de velocidade para esse caso, mas, em geral, santo Deus, é incrivelmente rápido para reiniciar, especialmente como um convidado KVM. Na camada mais barata de VPS, posso reiniciar e fazer login novamente no SSH em pouco menos de 5 segundos. Portanto, estou ansioso para usá-lo quando houver atualizações importantes do sistema operacional host.

Sim. Mas algumas vezes por ano você precisa fazer uma reconstrução pela linha de comando porque algum componente no contêiner foi atualizado. E então você terá de 5 a 15 minutos de inatividade. Eu praticamente só faço atualizações pela linha de comando (exceto no meu painel, onde posso atualizar apenas o plugin do painel várias vezes ao dia), e tenho vários clientes para os quais faço essas atualizações pela linha de comando quando são necessárias (presumivelmente eles estão fazendo atualizações pela interface web, mas muitas vezes não o fazem).

2 curtidas

O painel do Discourse notifica especificamente sobre esse tipo de atualização necessária? Ou devo ficar de olho nos PSAs do Debian?