Zum Hauptinhalt springen

Ruby Applikationen betreiben

Dieser Artikel beschreibt die empfohlene Konfiguration für den Betrieb von Ruby-Anwendungen auf den Managed Servern von Nine.

Docker Container

Wenn Sie Ihre Anwendung in einem Container auf einem Managed-Server ausführen möchten, so beachten Sie bitte folgenden Artikel zu Podman.

Klassisches Setup

1. rbenv Versionsverwaltung installieren

Wir empfehlen die Verwendung eines Ruby-Versionsmanagers wie z.B. rbenv. Damit sind Sie frei in der Wahl der Ruby-Version und nicht länger an die Versionen aus dem Ubuntu-Repository gebunden.

curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

2. Ruby-Version Installieren

Nun kann die gewünschte Ruby-Version installiert werden (hier 3.0.2):

rbenv install 3.0.2

Wenn Ihre Anwendung ein globales Gem benötigt, wie z. B. Rails, können Sie es jetzt ebenfalls installieren:

rbenv exec gem install rails

3. Anwendung deployen

Die Schritte zur Bereitstellung Ihrer Anwendung hängen natürlich von Ihrer Anwendung und den spezifischen Anforderungen ab.

Bei der Verwendung von Rails müssen Sie die Assets kompilieren, diese sowie die Anwendung auf den Server hochladen und die Ruby-Abhängigkeiten wie folgt installieren:

Führen Sie diese Befehle auf Ihrem lokalen Rechner aus

Assets kompilieren:

RAILS_ENV=production bundle exec rake assets:precompile

Dateien auf den Server kopieren:

rsync -a -v --delete --exclude='node_modules/*' --exclude='tmp/*' --exclude='vendor/*' --exclude='.git/*' ./ www-data@server.nine.ch:app/current

Sicherstellen, dass Abhängigkeiten installiert sind:

ssh www-data@server.nine.ch 'cd ~/app/current && ENV=production rbenv exec bundle install'

4. systemd-Dienst einrichten

Um sicherzustellen, dass ein Dienst weiterläuft, z.B. neu gestartet wird wenn er ausfällt oder nach einem Neustart des Servers wieder startet, empfehlen wir die Verwendung eines systemd user-Services.

Dieses Beispiel lädt Umgebungsvariablen aus ~/app/env und führt dann rails server -b localhost --log-to-stdout im Verzeichnis ~/app/current aus.

Der Befehl hängt von Ihrer Konfiguration ab. Im obigen Beispiel wird davon ausgegangen, dass Sie eine Rails-App ausführen.

Erstellen Sie die Service-Datei in ~/.config/systemd/user/rails-app.service.

[Unit]
Description=Application
After=network.target

[Service]
Type=simple
WorkingDirectory=%h/app/current

Environment=RAILS_ENV=production
Environment=PORT=3000

EnvironmentFile=%h/app/env

ExecStart=/usr/bin/rbenv exec rails server -b localhost --log-to-stdout

TimeoutSec=15
Restart=on-failure

[Install]
WantedBy=default.target

Und starten Sie dann den Dienst:

touch ~/app/env # ensure environment file exists
systemctl --user daemon-reload
systemctl --user enable rails-app.service
systemctl --user start rails-app.service

Ihre Anwendung sollte nun als Service registriert und gestartet sein:

$ systemctl --user status rails-app.service
● rails-app.service - Application
Loaded: loaded (/home/www-data/.config/systemd/user/rails-app.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-07-16 10:13:36 CEST; 5s ago
Main PID: 3615317 (ruby)
CGroup: /user.slice/user-33.slice/user@33.service/rails-app.service
└─3615317 puma 5.3.2 (tcp://localhost:3000) [current]

Jul 16 10:13:37 server rbenv[3615317]: => Run `bin/rails server --help` for more startup options
Jul 16 10:13:37 server rbenv[3615317]: Puma starting in single mode...
Jul 16 10:13:37 server rbenv[3615317]: * Puma version: 5.3.2 (ruby 3.0.2-p107) ("Sweetnighter")
Jul 16 10:13:37 server rbenv[3615317]: * Min threads: 5
Jul 16 10:13:37 server rbenv[3615317]: * Max threads: 5
Jul 16 10:13:37 server rbenv[3615317]: * Environment: production
Jul 16 10:13:37 server rbenv[3615317]: * PID: 3615317
Jul 16 10:13:37 server rbenv[3615317]: * Listening on http://127.0.0.1:3000
Jul 16 10:13:37 server rbenv[3615317]: * Listening on http://[::1]:3000
Jul 16 10:13:38 server rbenv[3615317]: Use Ctrl-C to stop

5. Webserver Konfigurieren

Die Anwendung läuft nun auf dem lokalen Port 3000. Um den Webserver zu konfigurieren, verwenden wir das CLI-Tool nine-manage-vhosts (weitere Informationen finden Sie im entsprechenden Support-Artikel).

Für diesen Anwendungszweck haben wir die Templates proxy und proxy_letsencrypt bereitgestellt.

Um SSL/TLS zu aktivieren, verwenden Sie das Template proxy_letsencrypt.

Um Ihre Applikation über den bestehenden Webserver anzusprechen, muss die PROXYPORT Variable als Parameter für --template-variable übergeben werden:

sudo nine-manage-vhosts virtual-host create example.com --template proxy --template-variable PROXYPORT=3000 --webroot ~/app/current/public
Virtual Host created: example.com
example.com
===========
DOMAIN: example.com
USER: www-data
WEBROOT: /home/www-data/app/current/public
TEMPLATE: proxy
TEMPLATE VARIABLES: PROXYPORT
3000
ALIASES: www.example.com
example.com.server.nine.ch

To see the configuration, use:sudo nine-manage-vhosts virtual-host show example.com

Anschliessend kann die Applikation von aussen gewohnt per Port 80 oder 443 angesprochen werden.