déployer une application web django

a marqué ce sujet comme résolu.

Bonjour,

J’essaie de déployer un site web sous django. J’ai suivi le tuto de ZdS

J’en suis au stade où je peux taper l’addresse du site dans un navigateur, ce qui m’amène sur

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

Donc a priori, Nginx fonctionne. Je pense que je suis bon du côté de supervizor et gunicorn et j’ai l’impression que le problème viens de postgresql.

Voici l’erreur donnée par gunicorn:

psycopg2.OperationalError: connection to server at "[domaine]" ([ipv6]), port 5432 failed: FATAL:  no pg_hba.conf entry for host "[ipv6]", user "[user]", database "[db]", SSL on

J’ai essayé de modifier le fichiers pg_hba.conf en ajoutant

host [db] [user] [domaine] trust

ou

host [db] [user] [ipv6] trust

ainsi que quelques autres tests. Ça ne change rien à part que je n’arrive même plus à me connecter en local :

psql: error: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

et le message d’erreur du log de gunicorn devient :

psycopg2.OperationalError: connection to server at "[domaine]" (ipv6), port 5432 failed: Connection refused
        Is the server running on that host and accepting TCP/IP connections?

Ça commence à faire quelques heures que je tourne en rond. Si quelqu’un à une solution…

en vous remerciant.

Je me demande s’il n’y a pas des questions de droit d’accès linux au milieux.

pour le moment j’ai mis

host all all all trust

le temps de résoudre le problème. Je n’ai plus de message d’erreur dans mes logs en faisant cela, mais je n’arrive toujours pas à me connecter.

voici mon setting.py (enfin la partie qui change en prod)

# SECURITY WARNING: keep the secret key used in production secret!
with open('/etc/[domaine]/secret_key.txt') as f:
    SECRET_KEY = f.read().strip()


# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['[domaine].fr', 
                 'localhost',
                 '[ipv6]']

# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
with open('/etc/[domaine]/db_parameters.txt') as f:
    DATABASES = {
        'default': {
            'ENGINE': f.readline().strip(),
            'NAME': f.readline().strip(),
            'USER': f.readline().strip(),
            'PASSWORD': f.readline().strip(),
            'HOST': '127.0.0.1',  # Aussi testé avec '[domaine].fr'
            'PORT': f.readline().strip(),
        }
    }

# DbBackup parameters:
# ====================
DBBACKUP_STORAGE = 'django.core.files.storage.FileSystemStorage'
DBBACKUP_STORAGE_OPTIONS = {'location': '../../db_backup/'}
DBBACKUP_CONNECTORS = {
    'default': {
        'HOST': 'localhost'
    }
}

ma config site available/enabled :

upstream [domaine] {
  server     unix:/tmp/gunicorn.[domaine].sock fail_timeout=30s;
}

server {
  listen                80; # SSL n’est pas encore configuré donc uniquement le port 80

  server_name           [domaine].fr;

  access_log            /var/log/nginx/[domaine].log;
  error_log             /var/log/nginx/[domaine].error.log;

  location /static/ {
    alias  /home/[user]/django/[domaine]/blog/static/;
  }
}

Et supervisor :

[program:[domaine]]
environment=DJANGO_SETTINGS_MODULE='Website.settings'
directory=/home/[user]/django/[domaine]/
command=/home/[user]/django/venv/bin/gunicorn --bind unix:/tmp/gunicorn.[domaine].sock --bind 127.0.0.1:8010 --workers 2 --log-file /var/log/gunicorn.[domaine].log Website.wsgi:application
autostart=true
autorestart=true
stdout_logfile=/var/log/[domaine].log
stderr_logfile=/var/log/[domaine].err.log

avec à chaque fois les vrais valeurs pour [domaine], [user] et [ipv6], bien évidement.

À noter que [user] correspond aussi à un utilisateur linux, sans droits roots (appelons le "webmaster").

nginx, supervisor et postgre sont lancés par un autre utilisateur admin, avec sudo. Est-ce que ce n’est pas ça qui bloque ?

Aussi, lorsque je fait curl localhost:8010, je n’ai aucune réponse. Si je fais curl localhost:8010/articles/ j’ai la page d’erreur 404 de mon site (la version customisée), ce qui est très étrange : ça signifie qu’il arrive à se connecter, mais pas à suivre l’url ???

En revanche, depuis un navigateur, j’ai toujours la page nginx à la racine, et un 404 standard (donc pas la page custom du site) à [domaine].fr/articles

J’aurai donc tendance à pensé qu’il y a au moins deux problèmes.

EDIT : En passant momentanément à DEBUG = True, j’ai pu constaté qu’il y avait des petits problèmes mes vues. Des petits trucs qui fonctionnent bien avec une base de données déjà rempli, mais qui ne fonctionne plus avec une base de données vide. Bon à la limite c’est pas trop grave, c’est un problème que j’arriverai à résoudre.

Du coup si cherche à charger une page statique en local (curl localhost:8010/contact/ par exemple), ça fonctionne normalement. Mais j’ai toujours mon problème à travers le navigateur d’une machine distante.

+0 -0

Ok, j’ai rajouté

location / {
           proxy_pass http://unix:/tmp/gunicorn.[domaine].sock;
           proxy_set_header X-Real-IP $remote_addr; # get real Client IP
      }

à la conf de nginx et les requêtes statiques fonctionnent. Si quelqu’un à une explication sur pourquoi le upstream ne fonctionne pas, ça m’intéresse.

En revanches, les formulaires ne fonctionnent pas. J’ai une erreur

Interdit (403)

La vérification CSRF a échoué. La requête a été interrompue.

J’ai rajouté CSRF_TRUSTED_ORIGINS=['[domaine].fr'] à mon setting.py, mais ça n’as rien changé.

# settings.__init__.py:

#from .dev import *
from .prod import *
from .common import *

settings.prod.py c’est celui que j’ai posté plus haut dans le topic.

# settings.common.py:

from pathlib import Path
from datetime import datetime

BASE_DIR = Path(__file__).resolve().parent.parent

STATIC_URL = 'static/'
STATIC_ROOT = 'static'

MEDIA_URL = 'medias/'  # Base url to serve media files
MEDIA_ROOT = 'medias/'  # Path where media is stored


INSTALLED_APPS = [
    'gunicorn',
    'configuration.apps.ConfigConfig',
    'blog.apps.BlogConfig',
    'blog.templatetags',
    'comments.apps.CommentsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.postgres',
    'django.contrib.humanize',
    'markdownx',
    'taggit',
    'reversion',
    'dbbackup',
    'solo',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]


ROOT_URLCONF = 'Website.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'Website.wsgi.application'

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


LANGUAGE_CODE = 'fr-fr'
TIME_ZONE = 'Europe/Paris'
USE_I18N = True
USE_TZ = True
USE_L10N = True
USE_THOUSANDS_SEPARATOR = True


DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.core.context_processors.tz",
    "django.contrib.messages.context_processors.messages",
    "blog.context_processors.views_list",
)


DEFAULT_FROM_EMAIL = 'no-reply@domaine.fr'
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'


# Taggit parameters:
# ==================
TAGGIT_CASE_INSENSITIVE = True
TAGGIT_STRIP_UNICODE_WHEN_SLUGIFYING = True


# Django-markdownx parameters:
# ============================
MARKDOWNX_MARKDOWN_EXTENSIONS = [
    'markdown.extensions.extra',
    'markdown.extensions.codehilite',
    'markdown.extensions.toc',
    'markdown.extensions.admonition',
    'markdown_del_ins',
    'markdown_katex',
    'mdx_linkify',
]


MARKDOWNX_MARKDOWNIFY_FUNCTION = 'markdownx.utils.markdownify'
MARKDOWNX_MEDIA_PATH = datetime.now().strftime('markdownx/%Y/%m/%d')

LOGIN_URL = "/admin/login"
+0 -0

ok, j’ai trouvé l’erreur : le manage.py migrate n’avait pas migré les differentes apps. J’ai du faire manage.py migrate add pour chacune des applications séparément.

Donc erreur crsf semble résolue et j’arrive à me connecter au pages nécessitant une lecture dans la bdd.

Restent comme problèmes :

  • l’activation de lets-encrypt: en suivant le tutoriel officiel, je suis bloqué à l’étape sudo snap install core qui me retourne : error: cannot install "core": persistent network error: Post "https://api.snapcraft.io/v2/snaps/refresh": dial tcp 185.125.188.54:443: connect: network is unreachable
  • les url des différentes pages retournent une 404 si je ne mets pas le \ à la fin. Bon, c’est assez secondaire ça.
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte