Bootcamp: Hilfe beim Aufbau der Produktion.

Erstellt am 17. Okt. 2019  ·  12Kommentare  ·  Quelle: vitorfs/bootcamp

Hallo, ich versuche Bootcamp als soziales Netzwerk für Forscher an meiner Universität aufzubauen. Aufgrund einiger Einschränkungen kann ich Caddy derzeit jedoch nicht als Reverse-Proxy für die Bereitstellung verwenden. Stattdessen verwende ich nginx. Können Sie mir, falls möglich, eine Anleitung geben, welche Parameter ich für die Produktionsumgebung angeben muss. Ich habe die Datei env.example gesehen, aber da das Projekt neu für mich ist, weiß ich nicht, wie alles miteinander verbunden ist. Ich hänge mit folgendem Fehler fest

manage.py runworker: error: the following arguments are required: channels

Jede Hilfe wird geschätzt.

Support discussion help wanted

Hilfreichster Kommentar

In meinem Fall verwende ich Python 3.7.1 auf einem Ubuntu-Server-Rechner

Optionale Setup-Python-Version
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Bei diesem Befehl hat Python 3.7.1 meine erste Priorität

Installieren Sie zuerst die Umgebung auf dem Computer
sudo -H pip3 install virtualenv

cd /home/pages um in den richtigen Ordner zu wechseln

mkdir bootcamp um den Projektordner zu erstellen

cd bootcamp/

env erstellen
virtualenv bootcampenv
Aktivieren Sie Ihre Umgebung
source bootcampenv/bin/activate

installl gunicorn
pip3 install gunicorn

gehe zurück zum Seitenverzeichnis
cd ..
und erstelle einen Ordner für das Bootcamp-Projekt

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

Und installieren Sie die Anforderungen
pip install -U -r requirements/production.txt

Wenn Sie verschiedene Datenbanken oder ähnliches verwenden, starten Sie die Migration und sammeln Sie statische

Firewall aktualisieren, um Port 8000 . zuzulassen
sudo ufw allow 8000

erstelle gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi

einen System-Socket erstellen
sudo nano /etc/systemd/system/gunicorn.socket

[Einheit]
Description=gunicorn.sock

[Steckdose]
ListenStream=/run/gunicorn.sock

[Installieren]
WantedBy=sockets.target

einen Dienst erstellen
sudo nano /etc/systemd/system/gunicorn.service

[Einheit]
Description=gunicorn daemon
Benötigt=gunicorn.socket
After=network.target

[Service]
Benutzer=Seiten
Gruppe=www-daten
WorkingDirectory=/home/pages/bootcampprojectdir/bootcampenv/bin/gunicorn
--access-logfile -
--Arbeiter 3
--bind unix:run/gunicorn.sock
settings.wsgi.application

[Installieren]
WantedBy=multi-user.target

alles aktivieren
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

prüfen Sie
file /run/gunicorn.sock
Wenn Sie keinen Fehler haben, ist es in Ordnung

Status überprüfen
sudo systemctl status gunicorn.socket

Service prüfen
curl --unix-socket /run/gunicorn.sock localhost

Wenn Sie keinen HTML-Code sehen, etwas mit dem gunicorn.service

Stellen Sie sicher, dass der Dienst ausgeführt wird
sudo systemctl status gunicorn

Wann ist alles in Ordnung, nächster Schritt NGinx übergeben an gunicorn
nginx installieren
sudo apt install nginx

Erstellen Sie eine Site in nginx
einen Dienst erstellen
sudo nano /etc/nginx/sites-available/bootcampproject

Server {
hören 80;
Servername 99.99.99.99

  location = /favicon.ico { access_log off; log_not_found off; }
  location /static/ {
        root /home/pages/bootcampprojectdir;
  }

Lage / {
schließe proxy_params ein;
proxy_pass http://unix :/run/gunicorn.sock;
}
}

Speichern und kopieren Sie diese Datei auf Sites-enabled
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

und prüfe das nginx-Setup

sudo nginx -t

Wenn keine Fehler auftreten, starten Sie nginx neu
sudo systemctl restart nginx

nginx-Firewall-Ports hinzufügen, aber zuerst den Port 8000 aus dem Test löschen

sudo ufw delete allow 8000

nginx hinzufügen
sudo ufw allow 'Nginx Full'

Alle 12 Kommentare

Hi,
Ich benutze keinen Caddy. Ich verwende Gunicorn für alle meine Django-Projekte.

Hast du alle Voraussetzungen installiert?
Kanäle>=2.1.1 # https://github.com/django/channels
channel-redis>=2.2.1 # https://github.com/django/channels_redis

Sie können über die Konsole überprüfen

$ python -c "import channels"
$ echo $?

0 bedeutet, existiert
1 bedeutet, Modul existiert nicht im System

Kanäle installiert ist. Ich stoße jetzt auf ein anderes Problem. Hier sind meine Docker-Datei und .env. Ich habe ein Problem mit dem Arbeiterservice. Nicht sicher, was es tut. Ich weiß Ihre Hilfe wirklich zu schätzen, Ihr Projekt ist sehr interessant und kann vielen Menschen an meiner Universität helfen, wenn es in Produktion geht.

env.txt

docker-compose.txt

Hier ist das Fehlerprotokoll.

worker_1    | /usr/local/lib/python3.6/site-packages/daphne/server.py:13: UserWarning: Something has already installed a non-asyncio Twisted reactor. Attempting to uninstall it; you can fix this warning by importing daphne.server early in your codebase or finding the package that imports Twisted and importing it later on.
worker_1    |   UserWarning,
django_1    | DEBUG 2019-10-17 21:28:37,751 base 1 140450066271560 Configuring Raven for host: https://sentry.io
worker_1    | DEBUG 2019-10-17 21:28:35,663 base 1 140638836505928 Configuring Raven for host: https://sentry.io
worker_1    | Running worker for channels ['channels', 'notifications']
worker_1    | DEBUG 2019-10-17 21:28:36,297 base 1 140638836505928 Sending message of length 5534 to https://sentry.io/api/1782977/store/
worker_1    | Traceback (most recent call last):
worker_1    |   File "manage.py", line 30, in <module>
worker_1    |     execute_from_command_line(sys.argv)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
worker_1    |     utility.execute()
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 375, in execute
worker_1    |     self.fetch_command(subcommand).run_from_argv(self.argv)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 323, in run_from_argv
worker_1    |     self.execute(*args, **cmd_options)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/django/core/management/base.py", line 364, in execute
worker_1    |     output = self.handle(*args, **options)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/management/commands/runworker.py", line 46, in handle
worker_1    |     worker.run()
worker_1    |   File "/usr/local/lib/python3.6/site-packages/asgiref/server.py", line 60, in run
worker_1    |     event_loop.run_until_complete(self.handle())
worker_1    |   File "/usr/local/lib/python3.6/asyncio/base_events.py", line 484, in run_until_complete
worker_1    |     return future.result()
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in handle
worker_1    |     [listener.result() for listener in listeners]
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 30, in <listcomp>
worker_1    |     [listener.result() for listener in listeners]
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels/worker.py", line 37, in listener
worker_1    |     message = await self.channel_layer.receive(channel)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 461, in receive
worker_1    |     return (await self.receive_single(channel))[1]

änderung in deiner umgebung
REDIS_URL=redis://127.0.0.1:6379

Können Sie mir zeigen, wie der Worker-Dienst konfiguriert wird? Und warum brauchen wir es? Neu in diesem Projekt, also nicht sicher, wo Sie nach diesen Informationen suchen sollen

äh, es ist viel. Das ist nicht in einigen Minuten erledigt...

Bitte prüfen Sie zunächst, ob Sie alle Voraussetzungen in Ihrer Serverumgebung installiert haben

pip install -U -r requirements/production.txt

Zweitens arbeitet Ihr Projekt auf lokaler Ebene?

Das Konfigurieren eines Projekts ist ohne alle Dateien nicht möglich. Und ich bin nicht der Beste, um es zu konfigurieren. Ich kann meine Konfiguration überprüfen und freigeben, aber dies ist NICHT für das Bootcamp getestet und freigegeben. Möglicherweise benötigen Sie zusätzliche Einstellungen.

Ich starte den Dienst mit Docker Compose. Die lokale Bereitstellung funktioniert gut, aber production.yml ist eine ganz andere Sache. Ich beziehe Redis, Daphne, Postgres ein. Wenn Sie irgendwo eine Docker-Compose-Datei zur Hand haben, teilen Sie diese bitte mit. Vielen Dank

Holen Sie sich Outlook für iOS https://aka.ms/o0ukef


Von: samazaphikel [email protected]
Gesendet: Donnerstag, 17. Oktober 2019 17:30 Uhr
An: vitorfs / bootcamp [email protected]
Cc: Tri Minh Pham [email protected] ; Autor [email protected]
Betreff: Re: [vitorfs/bootcamp] Hilfe beim Einrichten der Produktion. (#193)

äh, es ist viel. Das ist nicht in einigen Minuten erledigt...

Bitte prüfen Sie zunächst, ob Sie alle Voraussetzungen in Ihrer Serverumgebung installiert haben

pip install -U -r requirements/production.txt

Zweitens arbeitet Ihr Projekt auf lokaler Ebene?

Das Konfigurieren eines Projekts ist ohne alle Dateien nicht möglich. Und ich bin nicht der Beste, um es zu konfigurieren. Ich kann meine Konfiguration überprüfen und freigeben, aber dies ist NICHT für das Bootcamp getestet und freigegeben. Möglicherweise benötigen Sie zusätzliche Einstellungen.


Sie erhalten dies, weil Sie den Thread verfasst haben.
Antworten Sie auf diese E - Mail direkt, sehen sie auf GitHub https://github.com/vitorfs/bootcamp/issues/193?email_source=notifications&email_token=ADEK4AB5JEUP5LQ4APTJ6ITQPDOLFA5CNFSM4JB4YOCKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBRVI2A#issuecomment-543380584 oder abmelden https://github.com/notifications/unsubscribe- auth/ADEK4ADBCG24WLWIT3IM6OLQPDOLFANCNFSM4JB4YOCA .

In meinem Fall verwende ich Python 3.7.1 auf einem Ubuntu-Server-Rechner

Optionale Setup-Python-Version
sudo update alternatives --install /usr/bin/python/ python /usr/bin/python3.7.1

Bei diesem Befehl hat Python 3.7.1 meine erste Priorität

Installieren Sie zuerst die Umgebung auf dem Computer
sudo -H pip3 install virtualenv

cd /home/pages um in den richtigen Ordner zu wechseln

mkdir bootcamp um den Projektordner zu erstellen

cd bootcamp/

env erstellen
virtualenv bootcampenv
Aktivieren Sie Ihre Umgebung
source bootcampenv/bin/activate

installl gunicorn
pip3 install gunicorn

gehe zurück zum Seitenverzeichnis
cd ..
und erstelle einen Ordner für das Bootcamp-Projekt

django-admin startproject bootcampprojectdir

cd bootcampprojectdir

Und installieren Sie die Anforderungen
pip install -U -r requirements/production.txt

Wenn Sie verschiedene Datenbanken oder ähnliches verwenden, starten Sie die Migration und sammeln Sie statische

Firewall aktualisieren, um Port 8000 . zuzulassen
sudo ufw allow 8000

erstelle gunicorn wsgi
gunicorn --bind 0.0.0.0:8000 settings.wsgi

einen System-Socket erstellen
sudo nano /etc/systemd/system/gunicorn.socket

[Einheit]
Description=gunicorn.sock

[Steckdose]
ListenStream=/run/gunicorn.sock

[Installieren]
WantedBy=sockets.target

einen Dienst erstellen
sudo nano /etc/systemd/system/gunicorn.service

[Einheit]
Description=gunicorn daemon
Benötigt=gunicorn.socket
After=network.target

[Service]
Benutzer=Seiten
Gruppe=www-daten
WorkingDirectory=/home/pages/bootcampprojectdir/bootcampenv/bin/gunicorn
--access-logfile -
--Arbeiter 3
--bind unix:run/gunicorn.sock
settings.wsgi.application

[Installieren]
WantedBy=multi-user.target

alles aktivieren
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

prüfen Sie
file /run/gunicorn.sock
Wenn Sie keinen Fehler haben, ist es in Ordnung

Status überprüfen
sudo systemctl status gunicorn.socket

Service prüfen
curl --unix-socket /run/gunicorn.sock localhost

Wenn Sie keinen HTML-Code sehen, etwas mit dem gunicorn.service

Stellen Sie sicher, dass der Dienst ausgeführt wird
sudo systemctl status gunicorn

Wann ist alles in Ordnung, nächster Schritt NGinx übergeben an gunicorn
nginx installieren
sudo apt install nginx

Erstellen Sie eine Site in nginx
einen Dienst erstellen
sudo nano /etc/nginx/sites-available/bootcampproject

Server {
hören 80;
Servername 99.99.99.99

  location = /favicon.ico { access_log off; log_not_found off; }
  location /static/ {
        root /home/pages/bootcampprojectdir;
  }

Lage / {
schließe proxy_params ein;
proxy_pass http://unix :/run/gunicorn.sock;
}
}

Speichern und kopieren Sie diese Datei auf Sites-enabled
sudo ln -s /etc/nginx/sites-available/bootcampproject /etc/nginx/sites/enabled

und prüfe das nginx-Setup

sudo nginx -t

Wenn keine Fehler auftreten, starten Sie nginx neu
sudo systemctl restart nginx

nginx-Firewall-Ports hinzufügen, aber zuerst den Port 8000 aus dem Test löschen

sudo ufw delete allow 8000

nginx hinzufügen
sudo ufw allow 'Nginx Full'

Hallo @phamminhtris Ich freue mich, dass Sie das Projekt verwenden und es nützlich finden. Es gibt zwei Hauptmethoden zum Bereitstellen des Projekts in einer Produktionsumgebung. Der erste würde Docker verwenden, aber es hat seine Vorbehalte und erfordert offensichtlich eine gewisse Vertrautheit mit Docker und docker-compose . Ich bin alles andere als ein Experte und benutze es deshalb nur für die Entwicklung, aber vielleicht findest du hier etwas nützliches .

Die andere Möglichkeit besteht darin, das Projekt so zu implementieren, wie es ist, was "einfacher" ist (oder Sie können zumindest mehr Ressourcen und Anleitungen finden, um es bereitzustellen). Denken Sie nur daran, Ihre .env Datei mit den erforderlichen Variablen zu laden. Sie können die mitgelieferte Beispielversion verwenden, um zu verstehen, wie sie deklariert werden.

Reicht es, nur Gunicorn als einzigen Server zu verwenden? Ich habe gesehen, dass einige der Funktionen einen ASGI-Anwendungsserver wie daphne benötigen, um Web-Socket-Verkehr zu bedienen. Bitte korrigiert mich, wenn ich falsch liege. Vielen Dank für Ihre freundliche Hilfe. Schätze das wirklich.

Bei Nginx kommen zuerst Anfragen aus dem Internet an. Es kann diese sehr schnell verarbeiten und ist normalerweise so konfiguriert, dass nur die Anfragen durchgelassen werden, die wirklich bei Ihrer Webanwendung ankommen müssen.

Gunicorn übersetzt Anfragen, die es von Nginx erhält, in ein Format, das Ihre Webanwendung verarbeiten kann, und stellt sicher, dass Ihr Code bei Bedarf ausgeführt wird.

Jeder kann etwas tun, was der andere nicht kann.
Nginx ist ein Webserver und Reverse-Proxy. Es ist hochgradig optimiert für all die Dinge, die ein Webserver tun muss.

Kümmere dich um das Domainnamen-Routing (entscheidet, wohin Anfragen gehen sollen oder ob eine Fehlerantwort in Ordnung ist)
Statische Dateien bereitstellen
Bearbeiten Sie viele eingehende Anfragen gleichzeitig
Umgang mit langsamen Clients
Leitet Anfragen, die dynamisch sein müssen, an Gunicorn weiter
SSL beenden (https passiert hier)
Sparen Sie Rechenressourcen (CPU und Speicher) im Vergleich zu Ihrem Python-Code
Und vieles mehr, wenn Sie es entsprechend konfigurieren (Load-Balancing, Caching, …)

Gunicorn
Sobald Nginx entscheidet, dass eine bestimmte Anfrage an Gunicorn weitergeleitet werden soll (aufgrund der von Ihnen konfigurierten Regeln).

Gunicorn ist hochgradig optimiert und verfügt über viele praktische Funktionen.

Ausführen eines Pools von Workerprozessen/Threads (Ausführen Ihres Codes!)
Übersetzt Anfragen, die von Nginx eingehen, um WSGI-kompatibel zu sein
Übersetzen Sie die WSGI-Antworten Ihrer App in die richtigen http-Antworten
Ruft tatsächlich Ihren Python-Code auf, wenn eine Anfrage eingeht
Gunicorn kann mit vielen verschiedenen Webservern kommunizieren
Gunicorn ist nur einer von vielen gültigen WSGI-Servern. Es ist Ihrer App egal, welche Sie verwenden, und Nginx ist es auch egal.

Ich verstehe das obige. Allerdings ist dieses Projekt protokollmäßig etwas ganz Besonderes. Es dient zur Benachrichtigung über Websocket und meines Wissens benötigen wir mehr als ein normales Gunicorn und Nginx, um die App zu steuern? Wenn ich das lokale Docker Compose ausführe, stelle ich fest, dass /notifications nicht zu funktionieren scheint. Ich weiß, dass ich viel verlange, aber ich weiß deine Zeit und Mühe wirklich zu schätzen, mir @samazaphikel zu helfen. Werde die lokale Konfiguration (kein docker-compose, docker) ausprobieren, einfach Ubuntu entlarven und sehen, ob das funktioniert. Danke euch allen

Sehr hilfreiche Anleitung. Schließen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Allan-Nava picture Allan-Nava  ·  14Kommentare

Shekharnunia picture Shekharnunia  ·  6Kommentare

norouzzadeh picture norouzzadeh  ·  3Kommentare

sebastian-code picture sebastian-code  ·  11Kommentare

mwanjajoel picture mwanjajoel  ·  5Kommentare