Discourse für die macOS-Entwicklung mit asdf und docker-compose installieren

Hinweis: Dies ist eine Installationsanleitung für eine nicht unterstützte Entwicklungsumgebung. Die offiziell unterstützten Anleitungen für macOS finden Sie hier (nativ) und hier (Docker). Gehen Sie auf eigenes Risiko vor.

Das Ziel dieser Anleitung ist es, Postgres und Redis zu containerisieren, Ruby jedoch außerhalb der Container zu halten.

Ich habe den Ansatz Discourse für die Entwicklung mit Docker ausprobiert, aber er war auf meinem Rechner einfach zu langsam.

Anschließend habe ich mir die Anleitung für die Discourse-Entwicklung auf macOS angesehen. Aber das erste, was das Skript tat, war die Installation von brew. brew mag zwar großartig sein, aber ich verwende seit langem MacPorts und möchte weiterhin erfolgreich der Installation von brew widerstehen. Außerdem führte dieses Skript auch globale Installationen von Dingen wie PostgreSQL und Redis durch, die ich lieber projektweise verwalten möchte.

Hier ist also, was bei mir mit einer Kombination aus asdf und docker-compose funktioniert hat. Das Ergebnis ist eine Art Mittelweg zwischen den beiden oben beschriebenen Ansätzen. Postgres und Redis werden in einem Container mit docker-compose ausgeführt, damit sie auf die offiziellen Versionen und Installationen von Discourse in der Produktion festgelegt werden können. Rails läuft direkt auf der Hardware. Diese Kombination ist für mich deutlich reaktionsschneller. Ihre Ergebnisse können abweichen (YMMV).

Wenn Sie mitmachen möchten, benötigen Sie sowohl asdf als auch Docker auf Ihrem Rechner installiert. (OMG, asdf ist wirklich fantastisch… Sie sollten es sich definitiv holen, wenn Sie Interesse daran haben, viele verschiedene Entwicklungsumgebungen einfach zu verwalten. Es ersetzt renv, nvm… scheinbar fast alles außer jenv.)

Wenn Sie sich ansehen, was das macOS-Installations-Skript gemacht hat, können Sie die installierten Komponenten in drei Kategorien einteilen:

  • Kommandozeilen-Umgebungen und Tools wie ruby und yarn. Wir installieren diese und legen ihre Versionen mit asdf auf unser Projektverzeichnis fest.
  • Dienste – speziell Postgres und Redis. Wir installieren diese mit Docker Compose, ebenfalls damit wir ihre Versionen auf das festlegen können, was wir für dieses Projekt benötigen, und eine Entwicklungsumgebung haben, die wir einfach starten und stoppen können.
  • Sonstiges – hauptsächlich Bibliotheken für Bildmanipulation wie ImageMagick und Optimierung. Diese können mit brew, port oder direkt aus dem Quellcode installiert werden.

Außerdem müssen wir unsere Entwicklungsumgebung leicht neu konfigurieren, um eine Verbindung zum von docker-compose ausgeführten Postgres-Server herzustellen.

Discourse-Quellcode

Alle folgenden Schritte sollten im Discourse-Quellcode-Verzeichnis ausgeführt werden:

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

Das ist wichtig, da dies der Ort ist, an dem asdf seine .tool-versions-Konfigurationsdatei speichert und wo wir unsere docker-compose.yml-Datei für Docker erstellen werden.

asdf

Es gibt drei Dinge, die wir mit asdf installieren müssen: ruby, yarn und postgres. Zum Glück macht asdf es einfach, alle auf einmal zu installieren und die Versionen auf unser Projektverzeichnis festzulegen. Erstellen Sie zunächst .tool-versions mit folgendem Inhalt:

yarn 1.22.2
ruby 2.6.5
postgres 10.12

Führen Sie dann einfach asdf install aus.

Jetzt sollten Sie in der Lage sein, die in dem Skript und später in den Anweisungen enthaltenen Schritte zur Installation von Ruby-Bibliotheken auszuführen:

gem update --system
gem install bundler
gem install rails
gem install mailcatcher
gem install pg -- --with-pg-config=$HOME/.asdf/installs/postgres/10.12/bin/pg_config
bundle install

Möglicherweise müssen Sie den Pfad zu pg_config anpassen, je nachdem, wo Sie asdf installiert haben.

docker-compose.yml

Als Nächstes müssen wir unsere docker-compose.yml-Datei erstellen, die so konfiguriert ist, dass Redis und Postgres gestartet werden. Meine sieht wie folgt aus:

version: "3"
networks:
  discourse:
    driver: bridge
services:
  data:
    image: "geoffreychallen/discourse_data:latest"
    command: /sbin/boot
    ports:
      - "5432:5432"
      - "6379:6379"
    volumes:
      - "data_shared:/shared/"
      - "data_logs:/var/log/"
    networks:
      - discourse
volumes:
  data_shared:
    driver: local
  data_logs:
    driver: local

Danke an @pfaffman für den Vorschlag, einen standardmäßigen Discourse-Datencontainer zu verwenden. geoffreychallen/discourse_data:latest wurde aus Discourse Docker erstellt. Ich habe die Beispiel-data.yml-Datei mit zwei Änderungen verwendet. Erstens habe ich das Passwort des Discourse-Benutzers auf „discourse

5 „Gefällt mir“