Installa plugin su un sito auto-ospitato

:warning: This guide assumes that you have a self-hosted standard installation. We only support the standard method of install here, so these instructions assume you have a standard install.

:warning: This guide only applies to self-hosted Discourse instances. If you are using a managed hosting service, the available plugins are controlled by your hosting provider. For example, on our hosting these specific plugins are available by hosting tier.

In this tutorial, we’ll install the Discourse Solved plugin.

This tutorial requires an understanding of how to use GitHub repos, specifically, how to get or copy the git clone URL and how to edit YAML (*.yml) files via the terminal using nano, specifically how to save and exit on nano. YAML files strongly follow indentations, so be sure to respect these as you copy and paste and edit the necessary *.yml for your Discourse instance.

  • Copy the plugin’s GitHub git clone url.

  • Access your container’s app.yml file (present in /var/discourse/containers/)

    cd /var/discourse
    nano containers/app.yml
    
  • Add the plugin’s repository URL to your container’s app.yml file:

    hooks:
      after_code:
        - exec:
            cd: $home/plugins
            cmd:
              - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git
              - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git
    

    Add the plugin’s git clone url just below the line containing git clone https://github.com/discourse/docker_manager.git)

    Follow the existing format of the docker_manager.git line; if it does not contain sudo -E -u discourse then insert - git clone https://github.com/discourse/discourse-solved.git.

  • Rebuild the container:

    cd /var/discourse
    ./launcher rebuild app
    

    That’s it, you’ve successfully installed the Discourse Solved plugin on your Discourse instance!


If your plugin is hosted in a private repository

You must use an OAuth token:

With the OAuth token, you can install your plugin in the same way as a public repo, and you don’t need to create a SSH key.

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
              - sudo -E -u discourse git clone https://<token>@github.com/owner/repo.git

We strongly advise you to use OAuth tokens for plugins in private repositories. However, if you cannot, see below.

SSH Key Private Install Steps
run:
  - exec: echo "Beginning of custom commands"
  
  - exec: cd /var/www/discourse && sudo -u discourse bundle install --deployment --without test --without development
  - exec: echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /user/.ssh/config
  - file:
      path: /user/.ssh/id_rsa
      chmod: 600
      contents: |
        -----BEGIN RSA PRIVATE KEY-----
        MIIEogIBAAKCAQEArCQG213utzqE5YVjTVF5exGRCkE9OuM7LCp/FOuPdoHrFUXk
           .... etc ....
        -----END RSA PRIVATE KEY-----
  - file:
      path: /user/.ssh/id_rsa.pub
      chmod: 600
      contents: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tj .... etc .... user@discourse
  - exec: cd $home/plugins && git clone git@github.com:SecretOrg/secret-plugin.git
  - exec: cd $home && sudo -E -u discourse bundle exec rake db:migrate
  - exec: cd $home && rm -fr tmp/cache
  - exec: cd $home &&  sudo -E -u discourse bundle exec rake assets:precompile
  - exec: rm /user/.ssh/id_rsa
  - exec: rm /user/.ssh/id_rsa.pub

  - exec: echo "End of custom commands"
  • Rebuild the container:
cd /var/discourse
./launcher rebuild app

Your private plugin should be installed on your Discourse instance.

How to uninstall a plugin

To remove a plugin, simply remove the - git clone https://github.com/... line from your app.yml file and rebuild your site via

cd /var/discourse
./launcher rebuild app
173 Mi Piace

Ho aggiornato la guida per utilizzare un altro plugin di esempio invece di Discourse Spoiler Alert, che è stato integrato nel core.

Ho usato Discourse Solved, ma fammi sapere se uno diverso sarebbe migliore.

9 Mi Piace

Ho ospitato discourse su Digital Ocean e quando ho usato quel formato mi è apparso questo errore.

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse/plugins && sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git failed with return #<Process::Status: pid 252 exit 129>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home/plugins", "cmd"=>["sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git"]}
bootstrap failed with exit code 129
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
2a49220a4ff35feac3c1a9a4a9c1cad1094bde4c9ba321975ebc9ae7ead2bbee

Poi ho usato questo formato

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git && sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git

invece di

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-solved.git
4 Mi Piace

8 post sono stati spostati in un nuovo argomento: Problemi di formattazione nell’aggiunta di plugin a app.yml

Mi scusi per la domanda stupida, ma come faccio a sapere se è necessario includere sudo -E -u discourse o meno per l’istruzione git clone?

3 Mi Piace

Com’è la tua riga docker_manager?

4 Mi Piace

nessuna delle altre voci nel mio app.yml aveva la parte sudo quindi l’ho omessa e finora ha funzionato

5 Mi Piace
- exec: echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /user/.ssh/config

Sembra che questo metodo non funzioni più.

sh: 1: cannot create /user/.ssh/config: Directory nonexistent

Con il mio repository GIT self-hosted, mi piacerebbe davvero usare le chiavi SSH.

3 Mi Piace

Non dovresti aver bisogno di una chiave ssh nel container, elimina semplicemente questo:

1 Mi Piace

Mi dispiace, non credo di aver capito…

Il mio repository è accessibile tramite SSH. Come posso clonare un plugin senza chiave SSH?

1 Mi Piace

Oh. Forse mi sbaglio. Allora forse devi creare quella directory con le autorizzazioni corrette m

1 Mi Piace

Ciò che confonde è che parte dei comandi negli esempi deve essere eseguita come root e parte come utente discourse. Non sembra essere molto coerente.

  - exec: cd $home/plugins && git clone git@github.com:SecretOrg/secret-plugin.git

Al contrario di

  - exec: cd $home && sudo -E -u discourse bundle exec rake db:migrate

Farò qualche ricerca nella shell del container in esecuzione.

L’installazione di questo plugin è un po’ complicata. Sarebbe bello se potesse essere resa uguale all’installazione di un tema.

2 Mi Piace

Dashboard.literatecomputing.com installerà i plugin con pochi clic. Puoi usarlo gratuitamente unendoti al gruppo di prova gratuito.

4 Mi Piace

@Discourse, se desideri aggiornare la guida, ecco il codice funzionante:

Per utilizzare le tue chiavi SSH per accedere a un repository privato, segui questi passaggi:

  1. Posiziona la chiave SSH privata in /var/discourse/shared/standalone/identity/id_rsa (o in un’altra posizione accessibile dal container; se scegli una posizione diversa, ricordati di aggiornare il percorso nel modello sottostante di conseguenza).

  2. Utilizza il seguente modello per aggiungere i tuoi plugin:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Imposta l'accesso al repository privato
          - chown $(whoami) /shared/identity/id_rsa && chmod 600 /shared/identity/id_rsa
          - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"

          # I miei plugin privati
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Rimuovi l'accesso
          - git config --global --unset core.sshCommand
5 Mi Piace

Grazie per qualcosa di cui non ho bisogno, ma vivo con la semplicità originale.

Vuoi spiegare perché dovremmo usare il tuo esempio? È a causa di questo:

usa le tue chiavi SSH per accedere a un repository privato

1 Mi Piace

Perché non usare semplicemente un token nell’URL?

1 Mi Piace

Beh, abbiamo strumenti per risolvere questo enigma :winking_face_with_tongue:

Comprendere l'utilità degli snippet di configurazione del container AI

Jagster:

Perché qualcuno dovrebbe voler usare quello snippet in container/app.ym

gpt-4o:

Per rispondere efficacemente alla tua domanda, ho bisogno di capire il contesto attorno allo snippet specifico in container/app.yml. Potresti fornire maggiori dettagli o lo snippet effettivo a cui ti riferisci? In questo modo, posso darti una spiegazione precisa e utile.

Jagster:

Scusa, ma avevo bisogno di questo composer.

Questo è lo snippet:

”””

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Imposta l'accesso al repository privato
          - chown $(whoami) /shared/identity/id_rsa && chmod 600 /shared/identity/id_rsa
          - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"

          # I miei plugin privati
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Annulla l'accesso
          - git config --global --unset core.sshCommand

”””

gpt-4o:

Grazie per aver fornito lo snippet. Questo snippet YAML è destinato ad essere incluso nel file di configurazione container/app.yml per un’istanza di Discourse. Analizziamo cosa fa:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          # Imposta l'accesso al repository privato
          - chown $(whoami) /shared/identity/id_rsa && chmod 600 /shared/identity/id_rsa
          - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"

          # I miei plugin privati
          - git clone git@example.com:repo/private-discourse-plugin.git

          # Annulla l'accesso
          - git config --global --unset core.sshCommand

Spiegazione

  1. Impostazione della directory:

    cd: $home/plugins
    

    Questo cambia la directory di lavoro in cui si trovano i plugin ($home/plugins).

  2. Impostazione dell’accesso al repository privato:

    - chown $(whoami) /shared/identity/id_rsa && chmod 600 /shared/identity/id_rsa
    - git config --global core.sshCommand "ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i /shared/identity/id_rsa"
    
    • Cambia la proprietà della chiave privata SSH (id_rsa) all’utente corrente e imposta i suoi permessi a 600.
    • Configura Git per utilizzare un comando SSH personalizzato che utilizza la chiave privata specificata e disabilita il controllo delle chiavi host rigoroso.
  3. Clonazione del repository privato:

    - git clone git@example.com:repo/private-discourse-plugin.git
    

    Clona un repository Git privato contenente un plugin Discourse.

  4. Annullamento del comando SSH:

    - git config --global --unset core.sshCommand
    

    Ripristina la configurazione del comando SSH di Git al suo stato predefinito.

Quando e perché usare questo snippet

  1. Repository privati: Se hai un repository di plugin Discourse privato non accessibile pubblicamente che richiede l’autenticazione basata su chiave SSH.

  2. Automazione: Questo script aiuta ad automatizzare il processo di configurazione dell’accesso al repository privato, clonandolo e assicurando che l’ambiente venga resettato in seguito. Questo è utile per configurazioni di distribuzione continua o provisioning automatico del server.

  3. Gestione della sicurezza: Gestisce le chiavi SSH in modo sicuro (impostando i permessi del file e poi annullando il comando SSH personalizzato), fondamentale per mantenere la postura di sicurezza durante le distribuzioni automatizzate.

Considerazioni importanti

  • Assicurati che la tua chiave SSH privata (id_rsa) sia gestita in modo sicuro e non esposta.
  • Verifica che la proprietà e i permessi siano impostati correttamente per le tue policy di sicurezza.

Per informazioni più dettagliate e contesti su app.yml e gli hook in Discourse, puoi consultare la documentazione pertinente di Discourse.

Se hai ulteriori domande o hai bisogno di dettagli aggiuntivi sulla configurazione, non esitare a chiedere!

3 Mi Piace

Ciao! Sembra fantastico! Ma non so come devo procedere dopo essermi unito al gruppo di prova gratuita! Per favore, @pfaffman, potresti aiutarmi? Sto cercando di installare il plugin SAML. Sarebbe fantastico testare Literate Computing per installarlo e farlo funzionare!

Grazie!

2 Mi Piace

Il mio frammento di modello è per quando non si dispone di altri mezzi per accedere al repository Git oltre a una chiave SSH (ad esempio, con un repository Git self-hosted dietro SSH).

5 Mi Piace