Discourse Erreur de passerelle après redémarrage

My server runs on in a Virtual Machine hosted by one of the major cloud providers.
I successfully installed discourse on it and it’s been running fine for the last month.
Today, I decided to change the specifications of my VM back to its original configuration(*) and rebooted. Upon startup, whilst everything else on my server is running fine, I’m getting a 502 Bad Gateway error when I attempt to access the discourse forum. Thinking the docker instance had not automatically started up, I SSHed into my server and ran ./launcher start app but got a message saying I had insufficient space remaining (5GB available), so I ran df -h which tells me I actually have 14GB available. So I ran ./launcher start app again, but this time I got a warning that docker was going to download stuff and to be patient. After some processing, I got the message Nothing to do, your container has already started!. However, my attempts to access the forum still returned 502 Bad Gateway.
After consulting this forum here, I decided to run ./launcher rebuild app and got the following errors, something to do with PostgreSQL:

    user@host:[16:48]:/var/discourse# ./launcher rebuild app
    Ensuring launcher is up to date
    Fetching origin
    Launcher is up-to-date
    Stopping old container
    + /usr/bin/docker stop -t 60 app
    app
    cd /pups && git pull && /pups/bin/pups --stdin
    Already up to date.
    I, [2020-07-01T07:19:42.821347 #1]  INFO -- : Loading --stdin
    I, [2020-07-01T07:19:42.831806 #1]  INFO -- : > locale-gen $LANG && update-locale
    I, [2020-07-01T07:19:42.879007 #1]  INFO -- : Generating locales (this might take a while)...
    Generation complete.
    
    I, [2020-07-01T07:19:42.879431 #1]  INFO -- : > mkdir -p /shared/postgres_run
    I, [2020-07-01T07:19:42.885054 #1]  INFO -- :
    I, [2020-07-01T07:19:42.885734 #1]  INFO -- : > chown postgres:postgres /shared/postgres_run
    I, [2020-07-01T07:19:42.891655 #1]  INFO -- :
    I, [2020-07-01T07:19:42.892269 #1]  INFO -- : > chmod 775 /shared/postgres_run
    I, [2020-07-01T07:19:42.898103 #1]  INFO -- :
    I, [2020-07-01T07:19:42.898942 #1]  INFO -- : > rm -fr /var/run/postgresql
    I, [2020-07-01T07:19:42.905607 #1]  INFO -- :
    I, [2020-07-01T07:19:42.906463 #1]  INFO -- : > ln -s /shared/postgres_run /var/run/postgresql
    I, [2020-07-01T07:19:42.912617 #1]  INFO -- :
    I, [2020-07-01T07:19:42.913233 #1]  INFO -- : > socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
    2020/07/01 07:19:42 socat[26] E connect(6, AF=1 "/shared/postgres_run/.s.PGSQL.5432", 36): No such file or directory
    I, [2020-07-01T07:19:42.925688 #1]  INFO -- :
    I, [2020-07-01T07:19:42.926081 #1]  INFO -- : > rm -fr /shared/postgres_run/.s*
    I, [2020-07-01T07:19:42.931174 #1]  INFO -- :
    I, [2020-07-01T07:19:42.931649 #1]  INFO -- : > rm -fr /shared/postgres_run/*.pid
    I, [2020-07-01T07:19:42.938152 #1]  INFO -- :
    I, [2020-07-01T07:19:42.938850 #1]  INFO -- : > mkdir -p /shared/postgres_run/12-main.pg_stat_tmp
    I, [2020-07-01T07:19:42.943575 #1]  INFO -- :
    I, [2020-07-01T07:19:42.944331 #1]  INFO -- : > chown postgres:postgres /shared/postgres_run/12-main.pg_stat_tmp
    I, [2020-07-01T07:19:42.949159 #1]  INFO -- :
    I, [2020-07-01T07:19:42.961190 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown:
    I, [2020-07-01T07:19:42.973345 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown:
    I, [2020-07-01T07:19:42.983929 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown:
    I, [2020-07-01T07:19:42.994843 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown:
    I, [2020-07-01T07:19:42.995487 #1]  INFO -- : > chown -R root /var/lib/postgresql/12/main
    I, [2020-07-01T07:19:44.012812 #1]  INFO -- :
    I, [2020-07-01T07:19:44.013656 #1]  INFO -- : > [ ! -e /shared/postgres_data ] && install -d -m 0755 -o postgres -g postgres /shared/postgres_data && sudo -E -u postgres /usr/lib/postgresql/12/bin/initdb -D /shared/postgres_data || exit 0
    I, [2020-07-01T07:19:44.019545 #1]  INFO -- :
    I, [2020-07-01T07:19:44.019872 #1]  INFO -- : > chown -R postgres:postgres /shared/postgres_data
    I, [2020-07-01T07:19:44.064432 #1]  INFO -- :
    I, [2020-07-01T07:19:44.065186 #1]  INFO -- : > chown -R postgres:postgres /var/run/postgresql
    I, [2020-07-01T07:19:44.071385 #1]  INFO -- :
    I, [2020-07-01T07:19:44.072196 #1]  INFO -- : > /root/upgrade_postgres
    I, [2020-07-01T07:19:44.084004 #1]  INFO -- :
    I, [2020-07-01T07:19:44.084662 #1]  INFO -- : > rm /root/upgrade_postgres
    I, [2020-07-01T07:19:44.090399 #1]  INFO -- :
    I, [2020-07-01T07:19:44.092280 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/12/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.093969 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.095204 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.095937 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.096695 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.097554 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.101971 #1]  INFO -- : > install -d -m 0755 -o postgres -g postgres /shared/postgres_backup
    I, [2020-07-01T07:19:44.112672 #1]  INFO -- :
    I, [2020-07-01T07:19:44.113831 #1]  INFO -- : Replacing (?-mix:#?max_wal_senders *=.*) with max_wal_senders = $db_max_wal_senders in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.114973 #1]  INFO -- : Replacing (?-mix:#?wal_level *=.*) with wal_level = $db_wal_level in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.116047 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.117033 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.118051 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/12/main/postgresql.conf
    I, [2020-07-01T07:19:44.119352 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/12/main/pg_hba.conf
    I, [2020-07-01T07:19:44.120299 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/12/main/pg_hba.conf
    I, [2020-07-01T07:19:44.121038 #1]  INFO -- : > HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/12/bin/postmaster -D /etc/postgresql/12/main
    I, [2020-07-01T07:19:44.126334 #1]  INFO -- : > sleep 5
    2020-07-01 07:19:44.157 UTC [49] LOG:  starting PostgreSQL 12.2 (Debian 12.2-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
    2020-07-01 07:19:44.158 UTC [49] LOG:  listening on IPv4 address "0.0.0.0", port 5432
    2020-07-01 07:19:44.158 UTC [49] LOG:  listening on IPv6 address "::", port 5432
    2020-07-01 07:19:44.161 UTC [49] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
    2020-07-01 07:19:44.162 UTC [49] FATAL:  could not map anonymous shared memory: Cannot allocate memory
    2020-07-01 07:19:44.162 UTC [49] HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 4423172096 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
    2020-07-01 07:19:44.162 UTC [49] LOG:  database system is shut down
    I, [2020-07-01T07:19:49.141762 #1]  INFO -- :
    I, [2020-07-01T07:19:49.142221 #1]  INFO -- : > su postgres -c 'createdb discourse' || true
    createdb: error: could not connect to database template1: 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"?
    I, [2020-07-01T07:19:49.227852 #1]  INFO -- :
    I, [2020-07-01T07:19:49.228226 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
    psql: error: could not connect to server: 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"?
    I, [2020-07-01T07:19:49.330486 #1]  INFO -- :
    I, [2020-07-01T07:19:49.330822 #1]  INFO -- : > su postgres -c 'psql discourse -c "grant all privileges on database discourse to discourse;"' || true
    psql: error: could not connect to server: 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"?
    I, [2020-07-01T07:19:49.425970 #1]  INFO -- :
    I, [2020-07-01T07:19:49.426356 #1]  INFO -- : > su postgres -c 'psql discourse -c "alter schema public owner to discourse;"'
    psql: error: could not connect to server: 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"?
    I, [2020-07-01T07:19:49.506638 #1]  INFO -- :
    I, [2020-07-01T07:19:49.507202 #1]  INFO -- : Terminating async processes
    
    
    FAILED
    --------------------
    Pups::ExecError: su postgres -c 'psql discourse -c "alter schema public owner to discourse;"' failed with return #<Process::Status: pid 75 exit 2>
    Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
    exec failed with the params "su postgres -c 'psql $db_name -c \"alter schema public owner to $db_user;\"'"
    eb41679f76cd749ccd8c84a7543365d093619b80df6fc6750b9349fb63565fa1
    ** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
    ./discourse-doctor may help diagnose the problem.
    user@host:[17:19]:/var/discourse#

Strangely, in spite of the errors above, running ./launcher start app produces no errors:

starting up existing container
+ /usr/bin/docker start app
app

With the instance running, I tried using ./launcher enter app to get into the container. (In my humble opinion the available tools in the container are very poor (yes I’m a nano user and like to have various aliases mapped; e.g. ll). I’m not able to find the physical path to the folders within the docker instance (as I would like to download them using a FTP client).

In /var/log/nginx/error.log I have the following error entry for each time I refresh my browser:

2020/07/01 07:44:16 [error] 646#646: *3 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xx.0.1, server: _, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3000/", host: "discourse.myDomain.com"

What could be the cause of my problem? Why is Postgre suddenly not functioning?

(*) A week after installing Discourse, I upgraded my server with more CPUs and memory. I needed to do this to run a video conference I hosted. With the conference done, I’ve gone back to my normal configuration. Note that I did not change the disk sizes at any point during the specification changes.

Cela est dû au fait que votre reconstruction actuelle du conteneur a échoué ; vous démarrez donc une version antérieure de votre app. C’est un comportement normal. Lorsqu’une reconstruction n’est pas couronnée de succès, le conteneur d’origine n’est généralement pas supprimé et l’image d’origine reste également disponible.

Concernant votre problème avec PG, vous devrez fournir à l’équipe plus de détails sur la configuration de votre application et de votre conteneur afin de bénéficier du meilleur support possible.

@neounix : Merci.

Je débute dans l’hébergement d’un forum Discourse, donc je ne suis pas sûr de savoir où chercher ni quoi surveiller. J’ai une installation essentiellement vanilla sans plugins ni autres modifications. J’ai défini certaines variables dans app.yml et j’utilise mon démon Apache2 existant comme proxy inverse pour rediriger le trafic Discourse, via un hôte virtuel séparé, vers le port localhost sur lequel Discourse est configuré pour écouter.
Pourriez-vous préciser quelles informations seraient utiles ? Existe-t-il une ressource que je pourrais consulter pour m’aider à déboguer ma situation ?

L’erreur principale se trouve dans le fichier de journal ci-dessus.

2020-07-01 07:19:44.162 UTC [49] FATAL:  échec du mappage de la mémoire partagée anonyme : Impossible d'allouer de la mémoire

2020-07-01 07:19:44.162 UTC [49] HINT:  Cette erreur signifie généralement que la demande de segment de mémoire partagée de PostgreSQL a dépassé la mémoire disponible, l'espace d'échange (swap) ou les pages géantes. Pour réduire la taille de la demande (actuellement 4423172096 octets), réduisez l'utilisation de la mémoire partagée par PostgreSQL, par exemple en diminuant shared_buffers ou max_connections.

J’ai vu cette erreur, mais je n’ai apporté aucune modification à app.yml. Où puis-je réduire shared_buffers ou max_connections, puisqu’ils ne figurent pas dans app.yml ? app.yml ne contient qu’un paramètre db_shared_buffers, mais il est défini sur la valeur par défaut « 4096 Mo », comme c’était toujours le cas (avant et après l’augmentation de la mémoire du serveur).

Vous devriez envisager de publier vos statistiques relatives à la mémoire.

Par exemple, sous Linux :

$ free -m
              total        used        free      shared  buff/cache   available
Mem:          64299       12955        9678         361       41664       50265
Swap:          7807          69        7738

et pour les statistiques Docker, publiez la sortie de

docker stats

etc.

L’erreur est liée à un manque de mémoire.

Les statistiques de mémoire du serveur sont :

              total        utilisé        libre      partagé  buff/cache   disponible
Mémoire:       3951        2236         414          86        1299        1308
Échange:        511         415          96

Statistiques de mémoire après enter app :

              total        utilisé        libre      partagé  buff/cache   disponible
Mémoire:       3951        2363         321          86        1266        1215
Échange:        511         415          96

L’exécution de docker stats > output.txt a produit :

        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT   % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 15.86%              6.48MiB / 3.859GiB   0.16%               20.3kB / 12.6kB     0B / 0B             25
        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT   % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 15.86%              6.48MiB / 3.859GiB   0.16%               20.3kB / 12.6kB     0B / 0B             25
        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT     % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 2.83%               6.539MiB / 3.859GiB   0.17%               20.3kB / 12.6kB     0B / 0B             25
        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT     % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 2.83%               6.539MiB / 3.859GiB   0.17%               20.3kB / 12.6kB     0B / 0B             25
        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT     % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 3.30%               6.477MiB / 3.859GiB   0.16%               20.3kB / 12.6kB     0B / 0B             25
        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT     % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 3.30%               6.477MiB / 3.859GiB   0.16%               20.3kB / 12.6kB     0B / 0B             25
        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT     % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 2.45%               6.535MiB / 3.859GiB   0.17%               20.3kB / 12.6kB     0B / 0B             25
        CONTAINER ID        NOM                 CPU %               UTILISATION MÉMOIRE / LIMIT     % MÉMOIRE               E/S RÉSEAU             E/S DISQUE           PIDS
       ca4c5f37894c        app                 2.45%               6.535MiB / 3.859GiB   0.17%               20.3kB / 12.6kB     0B / 0B             25

Bonjour @nap

Vous pouvez libérer beaucoup de mémoire en arrêtant puis en supprimant tous ces anciens conteneurs app.

Par exemple :

docker stop <container_id>
docker rm <container_id>

En supposant qu’ils ne sont pas en cours d’utilisation ?

Si tous sont en cours d’utilisation, vous devriez envisager d’augmenter la mémoire de ce serveur au-delà de 4 Go ; peut-être passer à 8 Go :slight_smile:

J’ai arrêté l’application avec ./launcher stop app, puis j’ai relancé docker stats. Aucun conteneur n’était listé.
Malheureusement, augmenter la mémoire implique de payer plus. Ce qui est frustrant pour le moment, c’est que cela fonctionnait le mois dernier avec 4 Go.

Et je ne suis même pas en mesure de recompiler pour le moment, ce qui ne devrait pas consommer autant de mémoire.

Sans le conteneur en cours d’exécution, les statistiques de mémoire sont les suivantes :

              total        used        free      shared  buff/cache   available
Mem:           3951        2207         169          91        1574        1332
Swap:           511         446          65

J’ai quelques répertoires intéressants dans ./var/lib/docker/overlay2/ :

e3e6cdfcc62c2e0b68ec91efxxxxx6c69212c95b5070f7b6b84e97edcb473ea2
64a04d1b97a18f51a5fdc536xxxxxf9473de0c2ccd1a2cc0d62e830164b5f2d8
355303c6af7bebff1163195c5xxxxx8fd1de6333e39adbcb573c7365673b6c85

Puis-je les supprimer ?

D’accord.

Je vois. J’étais occupé à travailler sur une autre tâche et n’ai pas remarqué que votre affichage montrait les statistiques pour le même conteneur et non pour plusieurs.

Que vous indique free -m maintenant que votre conteneur n’est pas en cours d’exécution ?

Je pense que les 4 Go de RAM sont suffisants pour un seul conteneur, c’est certain.

Non.

Ne supprimez pas ces fichiers Docker.

Le problème, d’après le message d’erreur, est lié à votre configuration Discourse PG 12. Je ne suis pas sûr de savoir comment le résoudre, car l’ajustement du fichier de configuration PG 12 pour Discourse n’est pas pris en charge, je pense.

Les experts du forum Meta auront de meilleures suggestions que moi, en particulier les équipes d’hébergement professionnel.

Ce que vous dites, c’est que cela est interne aux fichiers de la configuration Docker ? Et que le modifier manuellement entraînera des problèmes une fois le conteneur démarré ou mis à jour ?

@nap

Si vous effectuez une recherche Google avec le message d’erreur ci-dessus (entre guillemets), vous trouverez de nombreuses discussions directement pertinentes sur ce message d’erreur PostgreSQL exact.

J’espère que cela vous aidera.

Après avoir fait cela, avez-vous relancé ./discourse-setup ou modifié manuellement les paramètres de mémoire dans app.yml ? Que signifient db_shared_buffers, unicorn_workers et db_work_mem ?

Sauf que vous êtes derrière un proxy inverse, ce qui complique les choses. Il n’est pas clair que le proxy inverse soit en cause ici, mais cela rend la situation plus complexe.

Avez-vous plusieurs partitions ? Serait-il possible que la partition où Docker crée les images soit pleine ?

@pfaffman : Merci d’avoir pris le temps de jeter un coup d’œil.

Non, tout ce que j’ai fait, c’est ajouter une série de définitions de variables relatives au nom du site et à l’utilisation des tags.

db_shared_buffers est réglé à “4096MB”
unicorn_workers est réglé à 8
db_work_mem est commenté

J’ai une seule partition principale de 40 Go (14 Go libres), 512 Mo d’espace d’échange (swap) et une partition de 8 Go pour les sauvegardes (non montée).

Il semble que j’aie résolu le problème. Au début, j’ai essayé de réduire les tampons à 2 Go et les workers à 4, mais j’ai obtenu la même erreur. J’ai ensuite réduit les tampons à 1 Go, moment où rebuild a réussi et le forum est de nouveau en ligne.

Merci à tous !!