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.