[GH-ISSUE #1201] uWSGI sometimes does not restart crashed sendreports/sendalerts processes #814

Open
opened 2026-02-25 23:43:40 +03:00 by kerem · 7 comments
Owner

Originally created by @heikoh81 on GitHub (Aug 18, 2025).
Original GitHub issue: https://github.com/healthchecks/healthchecks/issues/1201

Hi,

I have dockerized healthchecks 3.10 with mariadb-backend (healthchecks/healthchecks:v3.10) running locally for my homelab.
I have set up Email-notification with weekly reports.
For several months, I only get 2 weekly notification after restart of container, then no more weekly reports. This has happened for several times now. As far as I know even with older versions of healthchecks (3.7) (because this problem was the reason for my update to 3.10).

I just sent a test mail, which works.
Then I checked Account Settings -> Email reports (Weekly on Mondays Remind me daily), and at the very bottom I see this:

"Next weekly report date is August 4, 2025."
-> The today date is August 18, 2025 !!!

For some reason, the "next report date" does not get updated.
And I think this is the reason why I don't get weekly notifications!

For testing, I manually restarted the container --> I immediately got my weekly report, and "Next weekly report date is August 25, 2025."

I could create a cronjob for restart of the container every tuesday, however, I think if this is a bug this should be fixed within healthchecks, as I don't like manual fixed that get forgotten over time... :-)
But maybe this is only a problem only on my setup? I have a minimal standard Debian VM running on Proxmox that is used only for Docker.

Any help,
Thanks,

Heiko

Originally created by @heikoh81 on GitHub (Aug 18, 2025). Original GitHub issue: https://github.com/healthchecks/healthchecks/issues/1201 Hi, I have dockerized healthchecks 3.10 with mariadb-backend (healthchecks/healthchecks:v3.10) running locally for my homelab. I have set up Email-notification with weekly reports. For several months, I only get 2 weekly notification after restart of container, then no more weekly reports. This has happened for several times now. As far as I know even with older versions of healthchecks (3.7) (because this problem was the reason for my update to 3.10). I just sent a test mail, which works. Then I checked Account Settings -> Email reports (Weekly on Mondays Remind me daily), and at the very bottom I see this: "Next weekly report date is August 4, 2025." -> The today date is August 18, 2025 !!! For some reason, the "next report date" does not get updated. And I think this is the reason why I don't get weekly notifications! For testing, I manually restarted the container --> I immediately got my weekly report, and "Next weekly report date is August 25, 2025." I could create a cronjob for restart of the container every tuesday, however, I think if this is a bug this should be fixed within healthchecks, as I don't like manual fixed that get forgotten over time... :-) But maybe this is only a problem only on my setup? I have a minimal standard Debian VM running on Proxmox that is used only for Docker. Any help, Thanks, Heiko
Author
Owner

@cuu508 commented on GitHub (Aug 20, 2025):

Thanks for the report.

Reports are sent by the manage.py sendreports management command. This command is run on container startup automatically by uwsgi.

If sendreports throws an exception and exits, uwsgi restarts it automatically. From your description it sounds like the sendreports command somehow gets stuck (not sure how or why), but does not crash.

What container image are you using?

Do you have access to historic docker logs? Can you check for logs around the time the report was supposed to be sent (sometime August 4, 2025)?

<!-- gh-comment-id:3204292992 --> @cuu508 commented on GitHub (Aug 20, 2025): Thanks for the report. Reports are sent by the `manage.py sendreports` management command. This command is run on container startup [automatically by uwsgi](https://github.com/healthchecks/healthchecks/blob/41e2e694c0211f614ba51ca084901d64e9b72d34/docker/uwsgi.ini#L32). If `sendreports` throws an exception and exits, uwsgi restarts it automatically. From your description it sounds like the `sendreports` command somehow gets stuck (not sure how or why), but does not crash. What container image are you using? Do you have access to historic docker logs? Can you check for logs around the time the report *was supposed* to be sent (sometime August 4, 2025)?
Author
Owner

@heikoh81 commented on GitHub (Aug 20, 2025):

Hi,

thanks for your reply.
I'm using the standard container provided on docker hub:

docker run \
  -d \
  --name=healthchecks \
  -p 0.0.0.0:8001:8000 \
  --restart unless-stopped \
  -e ALLOWED_HOSTS=192.168.179.20 \
  -e DB=mysql \
  -e DB_NAME=healthchecks \
  -e DB_HOST=192.168.179.22 \
  -e DB_PASSWORD=secret \
  -e DB_PORT=3306 \
  -e DB_USER=root \
  -e DEBUG=False \
  -e DEFAULT_FROM_EMAIL=rpi@secret.de \
  -e PING_BODY_LIMIT=250000 \
  -e EMAIL_HOST=secret.de \
  -e EMAIL_HOST_PASSWORD=secret \
  -e EMAIL_HOST_USER=rpi@secret.de \
  -e EMAIL_PORT=587 \
  -e EMAIL_USE_TLS=True \
  -e SECRET_KEY=secret \
  -e SITE_ROOT=http://192.168.179.20:8001 \
healthchecks/healthchecks:v3.10

docker log

2025-06-23T09:56:20.101062122Z Operations to perform:
2025-06-23T09:56:20.101119891Z   Apply all migrations: accounts, admin, api, auth, contenttypes, logs, payments, sessions
2025-06-23T09:56:20.123969655Z Running migrations:
2025-06-23T09:56:20.134705788Z   Applying accounts.0049_convert_email_lowercase... OK
2025-06-23T09:56:20.150587703Z   Applying api.0113_alter_channel_kind... OK
2025-06-23T09:56:20.229911422Z   Applying api.0114_flip_reason... OK
2025-06-23T09:56:20.301485882Z   Applying api.0115_flip_api_flip_owner_created... OK
2025-06-23T09:56:20.326649530Z   Applying api.0116_alter_check_badge_key... OK
2025-06-23T09:56:20.396136647Z   Applying api.0117_fill_badge_key... OK
2025-06-23T09:56:20.559274307Z   Applying api.0118_alter_check_badge_key... OK
2025-06-23T09:56:22.245955065Z sendreports is now running
2025-06-23T09:56:22.246921484Z sendalerts is now running
2025-06-30T07:45:35.719236758Z Sent monthly report to mail@secret.de
2025-07-07T08:39:01.077546811Z Sent monthly report to mail@secret.de
2025-07-14T07:33:28.235892414Z Sent monthly report to mail@secret.de
2025-07-21T07:47:48.827350067Z Sent monthly report to mail@secret.de
2025-07-22T12:39:47.989994182Z Terminated, finishing...
2025-07-22T12:39:48.933408291Z Terminated, finishing...
2025-07-22T12:39:49.007450589Z Done.
2025-07-22T12:39:49.718439542Z Done.
2025-07-22T12:40:27.827281232Z sendreports is now running
2025-07-22T12:40:27.864492217Z sendalerts is now running
2025-08-13T01:32:24.681791242Z e2598da9-d901-4507-af39-ac5dd01ff44e goes down
2025-08-13T01:32:24.681828288Z   cf3b506c (email) OK in 0.2s
2025-08-14T01:31:00.656494572Z e2598da9-d901-4507-af39-ac5dd01ff44e goes up
2025-08-14T01:31:00.656522879Z   cf3b506c (email) OK in 0.0s
2025-08-18T09:32:03.152690157Z Operations to perform:
2025-08-18T09:32:03.152735143Z   Apply all migrations: accounts, admin, api, auth, contenttypes, logs, payments, sessions
2025-08-18T09:32:03.184648827Z Running migrations:
2025-08-18T09:32:03.184696108Z   No migrations to apply.
2025-08-18T09:32:03.210767766Z   Your models in app(s): 'api' have changes that are not yet reflected in a migration, and so won't be applied.
2025-08-18T09:32:03.210817875Z   Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
2025-08-18T09:32:05.754317502Z sendalerts is now running
2025-08-18T09:32:05.759933382Z sendreports is now running
2025-08-18T09:32:06.538502351Z Sent monthly report to mail@secret.de

I found 2 log entries where something with manage.py seems to go wrong.
This is for 2025-07-22. Don't know what happend here but probably the container was restarted by myself.

{"log":"[pid: 9|app: 0|req: 14423/57697] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:36:59 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 3 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:36:59.007948971Z"}
{"log":"[pid: 11|app: 0|req: 14428/57698] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:37:59 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 2 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:37:59.202373061Z"}
{"log":"[pid: 10|app: 0|req: 14423/57699] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:38:59 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 2 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:38:59.390909234Z"}
{"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:39:47.96410089Z"}
{"log":"[uwsgi-daemons] stopping daemon (pid: 13): ./manage.py sendalerts --skip-checks\n","stream":"stderr","time":"2025-07-22T12:39:47.964132812Z"}
{"log":"Terminated, finishing...\n","stream":"stdout","time":"2025-07-22T12:39:47.989994182Z"}
{"log":"[uwsgi-daemons] stopping daemon (pid: 14): ./manage.py sendreports --loop --skip-checks\n","stream":"stderr","time":"2025-07-22T12:39:48.933119266Z"}
{"log":"Terminated, finishing...\n","stream":"stdout","time":"2025-07-22T12:39:48.933408291Z"}
{"log":"Done.\n","stream":"stdout","time":"2025-07-22T12:39:49.007450589Z"}
{"log":"Done.\n","stream":"stdout","time":"2025-07-22T12:39:49.718439542Z"}
{"log":"worker 1 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933388908Z"}
{"log":"worker 2 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933447104Z"}
{"log":"worker 3 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933456769Z"}
{"log":"worker 4 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933462925Z"}
{"log":"goodbye to uWSGI.\n","stream":"stderr","time":"2025-07-22T12:39:49.933468483Z"}
{"log":"[uWSGI] getting INI configuration from /opt/healthchecks/docker/uwsgi.ini\n","stream":"stderr","time":"2025-07-22T12:40:18.827249399Z"}
{"log":"[uwsgi-static] added check for static-collected/\n","stream":"stderr","time":"2025-07-22T12:40:18.830250679Z"}
{"log":"*** Starting uWSGI 2.0.29 (64bit) on [Tue Jul 22 12:40:18 2025] ***\n","stream":"stderr","time":"2025-07-22T12:40:18.863629884Z"}
{"log":"compiled with version: 12.2.0 on 09 May 2025 08:14:17\n","stream":"stderr","time":"2025-07-22T12:40:18.863686747Z"}
{"log":"os: Linux-6.1.0-22-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.94-1 (2024-06-21)\n","stream":"stderr","time":"2025-07-22T12:40:18.863692839Z"}
{"log":"nodename: 78cfdaa467ea\n","stream":"stderr","time":"2025-07-22T12:40:18.8636978Z"}
{"log":"machine: x86_64\n","stream":"stderr","time":"2025-07-22T12:40:18.863702559Z"}
{"log":"clock source: unix\n","stream":"stderr","time":"2025-07-22T12:40:18.863707108Z"}
{"log":"pcre jit disabled\n","stream":"stderr","time":"2025-07-22T12:40:18.863711555Z"}
{"log":"detected number of CPU cores: 2\n","stream":"stderr","time":"2025-07-22T12:40:18.863715935Z"}
{"log":"current working directory: /opt/healthchecks\n","stream":"stderr","time":"2025-07-22T12:40:18.863720596Z"}
{"log":"detected binary path: /usr/local/bin/uwsgi\n","stream":"stderr","time":"2025-07-22T12:40:18.863725063Z"}
{"log":"chdir() to /opt/healthchecks\n","stream":"stderr","time":"2025-07-22T12:40:18.863729465Z"}
{"log":"your memory page size is 4096 bytes\n","stream":"stderr","time":"2025-07-22T12:40:18.86373378Z"}
{"log":"detected max file descriptor number: 10000\n","stream":"stderr","time":"2025-07-22T12:40:18.863750991Z"}
{"log":"!!! no /etc/mime.types file found !!!\n","stream":"stderr","time":"2025-07-22T12:40:18.863768279Z"}
{"log":"lock engine: pthread robust mutexes\n","stream":"stderr","time":"2025-07-22T12:40:18.863773888Z"}
{"log":"thunder lock: enabled\n","stream":"stderr","time":"2025-07-22T12:40:18.863888751Z"}
{"log":"uwsgi socket 0 bound to TCP address :8000 fd 3\n","stream":"stderr","time":"2025-07-22T12:40:18.864634868Z"}
{"log":"Python version: 3.13.0 (main, Dec  3 2024, 02:26:48) [GCC 12.2.0]\n","stream":"stderr","time":"2025-07-22T12:40:18.864651567Z"}
{"log":"Python main interpreter initialized at 0x7fcc45135a60\n","stream":"stderr","time":"2025-07-22T12:40:18.936667409Z"}
{"log":"python threads support enabled\n","stream":"stderr","time":"2025-07-22T12:40:18.936699119Z"}
{"log":"your server socket listen backlog is limited to 100 connections\n","stream":"stderr","time":"2025-07-22T12:40:18.93670617Z"}
{"log":"your mercy for graceful operations on workers is 60 seconds\n","stream":"stderr","time":"2025-07-22T12:40:18.936711103Z"}
{"log":"setting request body buffering size to 16192 bytes\n","stream":"stderr","time":"2025-07-22T12:40:18.936715622Z"}
{"log":"mapped 588920 bytes (575 KB) for 4 cores\n","stream":"stderr","time":"2025-07-22T12:40:18.936719996Z"}
{"log":"*** Operational MODE: preforking ***\n","stream":"stderr","time":"2025-07-22T12:40:18.936724342Z"}
{"log":"running \"exec:./manage.py migrate\" (pre app)...\n","stream":"stderr","time":"2025-07-22T12:40:18.941694914Z"}
{"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2025-07-22T12:40:23.676210681Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 279, in ensure_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.676240633Z"}
{"log":"    self.connect()\n","stream":"stderr","time":"2025-07-22T12:40:23.676247128Z"}
{"log":"    ~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.676252117Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.676256809Z"}
{"log":"    return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.676261641Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 256, in connect\n","stream":"stderr","time":"2025-07-22T12:40:23.676266306Z"}
{"log":"    self.connection = self.get_new_connection(conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.676271292Z"}
{"log":"                      ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.676276249Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.67628101Z"}
{"log":"    return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.676285983Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 256, in get_new_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.676290682Z"}
{"log":"    connection = Database.connect(**conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.676295694Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/MySQLdb/__init__.py\", line 121, in Connect\n","stream":"stderr","time":"2025-07-22T12:40:23.676300607Z"}
{"log":"    return Connection(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.67630541Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/MySQLdb/connections.py\", line 200, in __init__\n","stream":"stderr","time":"2025-07-22T12:40:23.676310382Z"}
{"log":"    super().__init__(*args, **kwargs2)\n","stream":"stderr","time":"2025-07-22T12:40:23.67631534Z"}
{"log":"    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.676319888Z"}
{"log":"MySQLdb.OperationalError: (2013, \"Lost connection to server at 'handshake: reading initial communication packet', system error: 115\")\n","stream":"stderr","time":"2025-07-22T12:40:23.676324364Z"}
{"log":"\n","stream":"stderr","time":"2025-07-22T12:40:23.67634005Z"}
{"log":"The above exception was the direct cause of the following exception:\n","stream":"stderr","time":"2025-07-22T12:40:23.67634505Z"}
{"log":"\n","stream":"stderr","time":"2025-07-22T12:40:23.676349904Z"}
{"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2025-07-22T12:40:23.676354412Z"}
{"log":"  File \"/opt/healthchecks/./manage.py\", line 17, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-22T12:40:23.692410507Z"}
{"log":"    raise e\n","stream":"stderr","time":"2025-07-22T12:40:23.692436606Z"}
{"log":"  File \"/opt/healthchecks/./manage.py\", line 13, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-22T12:40:23.692442913Z"}
{"log":"    execute_from_command_line(sys.argv)\n","stream":"stderr","time":"2025-07-22T12:40:23.692448488Z"}
{"log":"    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692453275Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 442, in execute_from_command_line\n","stream":"stderr","time":"2025-07-22T12:40:23.692457965Z"}
{"log":"    utility.execute()\n","stream":"stderr","time":"2025-07-22T12:40:23.692462963Z"}
{"log":"    ~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692467473Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 436, in execute\n","stream":"stderr","time":"2025-07-22T12:40:23.692472277Z"}
{"log":"    self.fetch_command(subcommand).run_from_argv(self.argv)\n","stream":"stderr","time":"2025-07-22T12:40:23.692477117Z"}
{"log":"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692481772Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 416, in run_from_argv\n","stream":"stderr","time":"2025-07-22T12:40:23.692486442Z"}
{"log":"    self.execute(*args, **cmd_options)\n","stream":"stderr","time":"2025-07-22T12:40:23.692491306Z"}
{"log":"    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692495826Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 457, in execute\n","stream":"stderr","time":"2025-07-22T12:40:23.692500331Z"}
{"log":"    self.check(**check_kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692505144Z"}
{"log":"    ~~~~~~~~~~^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692509772Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 492, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692514211Z"}
{"log":"    all_issues = checks.run_checks(\n","stream":"stderr","time":"2025-07-22T12:40:23.692518873Z"}
{"log":"        app_configs=app_configs,\n","stream":"stderr","time":"2025-07-22T12:40:23.692523427Z"}
{"log":"    ...\u003c2 lines\u003e...\n","stream":"stderr","time":"2025-07-22T12:40:23.692527911Z"}
{"log":"        databases=databases,\n","stream":"stderr","time":"2025-07-22T12:40:23.692532967Z"}
{"log":"    )\n","stream":"stderr","time":"2025-07-22T12:40:23.692537552Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/checks/registry.py\", line 89, in run_checks\n","stream":"stderr","time":"2025-07-22T12:40:23.692541945Z"}
{"log":"    new_errors = check(app_configs=app_configs, databases=databases)\n","stream":"stderr","time":"2025-07-22T12:40:23.692546998Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/checks/model_checks.py\", line 36, in check_all_models\n","stream":"stderr","time":"2025-07-22T12:40:23.692551786Z"}
{"log":"    errors.extend(model.check(**kwargs))\n","stream":"stderr","time":"2025-07-22T12:40:23.692556639Z"}
{"log":"                  ~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692561206Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/models/base.py\", line 1719, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692576975Z"}
{"log":"    *cls._check_fields(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.692582587Z"}
{"log":"     ~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692587154Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/models/base.py\", line 1914, in _check_fields\n","stream":"stderr","time":"2025-07-22T12:40:23.692591859Z"}
{"log":"    errors.extend(field.check(**kwargs))\n","stream":"stderr","time":"2025-07-22T12:40:23.692596736Z"}
{"log":"                  ~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.69260149Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 2793, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692606157Z"}
{"log":"    *super().check(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.692610961Z"}
{"log":"     ~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692617772Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 2071, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692622658Z"}
{"log":"    *super().check(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.69262745Z"}
{"log":"     ~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692632Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 274, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692636623Z"}
{"log":"    *self._check_backend_specific_checks(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.692641342Z"}
{"log":"     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692645941Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 489, in _check_backend_specific_checks\n","stream":"stderr","time":"2025-07-22T12:40:23.692650584Z"}
{"log":"    errors.extend(connections[alias].validation.check_field(self, **kwargs))\n","stream":"stderr","time":"2025-07-22T12:40:23.692655393Z"}
{"log":"                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692659974Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/validation.py\", line 25, in check_field\n","stream":"stderr","time":"2025-07-22T12:40:23.692664585Z"}
{"log":"    field_type = field.db_type(self.connection)\n","stream":"stderr","time":"2025-07-22T12:40:23.692669372Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 879, in db_type\n","stream":"stderr","time":"2025-07-22T12:40:23.692673874Z"}
{"log":"    column_type = connection.data_types[self.get_internal_type()]\n","stream":"stderr","time":"2025-07-22T12:40:23.692678489Z"}
{"log":"                  ^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692683039Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692687516Z"}
{"log":"    res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692692182Z"}
{"log":"                                         ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692696808Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 141, in data_types\n","stream":"stderr","time":"2025-07-22T12:40:23.692701352Z"}
{"log":"    if self.features.has_native_uuid_field:\n","stream":"stderr","time":"2025-07-22T12:40:23.692705968Z"}
{"log":"       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692710431Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692714916Z"}
{"log":"    res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692724839Z"}
{"log":"                                         ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692729583Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/features.py\", line 310, in has_native_uuid_field\n","stream":"stderr","time":"2025-07-22T12:40:23.692734227Z"}
{"log":"    is_mariadb = self.connection.mysql_is_mariadb\n","stream":"stderr","time":"2025-07-22T12:40:23.692739088Z"}
{"log":"                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692746251Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692750942Z"}
{"log":"    res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692756612Z"}
{"log":"                                         ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692761446Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 444, in mysql_is_mariadb\n","stream":"stderr","time":"2025-07-22T12:40:23.69276676Z"}
{"log":"    return \"mariadb\" in self.mysql_server_info.lower()\n","stream":"stderr","time":"2025-07-22T12:40:23.692772055Z"}
{"log":"                        ^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692777294Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692781918Z"}
{"log":"    res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692786675Z"}
{"log":"                                         ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692791136Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 430, in mysql_server_info\n","stream":"stderr","time":"2025-07-22T12:40:23.692795687Z"}
{"log":"    return self.mysql_server_data[\"version\"]\n","stream":"stderr","time":"2025-07-22T12:40:23.692800416Z"}
{"log":"           ^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.69280501Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692809497Z"}
{"log":"    res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692814295Z"}
{"log":"                                         ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692831679Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 404, in mysql_server_data\n","stream":"stderr","time":"2025-07-22T12:40:23.692836948Z"}
{"log":"    with self.temporary_connection() as cursor:\n","stream":"stderr","time":"2025-07-22T12:40:23.692841648Z"}
{"log":"         ~~~~~~~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692846181Z"}
{"log":"  File \"/usr/local/lib/python3.13/contextlib.py\", line 141, in __enter__\n","stream":"stderr","time":"2025-07-22T12:40:23.692850683Z"}
{"log":"    return next(self.gen)\n","stream":"stderr","time":"2025-07-22T12:40:23.692855286Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 695, in temporary_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692859796Z"}
{"log":"    with self.cursor() as cursor:\n","stream":"stderr","time":"2025-07-22T12:40:23.692864644Z"}
{"log":"         ~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692869207Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692873806Z"}
{"log":"    return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692881913Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 320, in cursor\n","stream":"stderr","time":"2025-07-22T12:40:23.692886639Z"}
{"log":"    return self._cursor()\n","stream":"stderr","time":"2025-07-22T12:40:23.69289138Z"}
{"log":"           ~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692895835Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 296, in _cursor\n","stream":"stderr","time":"2025-07-22T12:40:23.692900371Z"}
{"log":"    self.ensure_connection()\n","stream":"stderr","time":"2025-07-22T12:40:23.69290512Z"}
{"log":"    ~~~~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692909756Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692914249Z"}
{"log":"    return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692918903Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 278, in ensure_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692924061Z"}
{"log":"    with self.wrap_database_errors:\n","stream":"stderr","time":"2025-07-22T12:40:23.692928837Z"}
{"log":"         ^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692933289Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/utils.py\", line 91, in __exit__\n","stream":"stderr","time":"2025-07-22T12:40:23.692937718Z"}
{"log":"    raise dj_exc_value.with_traceback(traceback) from exc_value\n","stream":"stderr","time":"2025-07-22T12:40:23.692942375Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 279, in ensure_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692946918Z"}
{"log":"    self.connect()\n","stream":"stderr","time":"2025-07-22T12:40:23.692951577Z"}
{"log":"    ~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692956042Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692960542Z"}
{"log":"    return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692965267Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 256, in connect\n","stream":"stderr","time":"2025-07-22T12:40:23.692969738Z"}
{"log":"    self.connection = self.get_new_connection(conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.692974495Z"}
{"log":"                      ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692979105Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692983711Z"}
{"log":"    return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692988517Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 256, in get_new_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692993099Z"}
{"log":"    connection = Database.connect(**conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.692997907Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/MySQLdb/__init__.py\", line 121, in Connect\n","stream":"stderr","time":"2025-07-22T12:40:23.693002671Z"}
{"log":"    return Connection(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.693007478Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/MySQLdb/connections.py\", line 200, in __init__\n","stream":"stderr","time":"2025-07-22T12:40:23.693012182Z"}
{"log":"    super().__init__(*args, **kwargs2)\n","stream":"stderr","time":"2025-07-22T12:40:23.693016982Z"}
{"log":"    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.693021638Z"}
{"log":"django.db.utils.OperationalError: (2013, \"Lost connection to server at 'handshake: reading initial communication packet', system error: 115\")\n","stream":"stderr","time":"2025-07-22T12:40:23.693030392Z"}
{"log":"command \"./manage.py migrate\" exited with non-zero code: 1\n","stream":"stderr","time":"2025-07-22T12:40:24.561928748Z"}
{"log":"Tue Jul 22 12:40:24 2025 - FATAL hook failed, destroying instance\n","stream":"stderr","time":"2025-07-22T12:40:24.561987912Z"}
{"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:40:24.562005844Z"}
{"log":"WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7fcc45135a60 pid: 1 (default app)\n","stream":"stderr","time":"2025-07-22T12:40:25.887913732Z"}
{"log":"*** uWSGI is running in multiple interpreter mode ***\n","stream":"stderr","time":"2025-07-22T12:40:25.888079416Z"}
{"log":"spawned uWSGI master process (pid: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.888153129Z"}
{"log":"spawned uWSGI worker 1 (pid: 16, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.890350862Z"}
{"log":"spawned uWSGI worker 2 (pid: 17, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.892040386Z"}
{"log":"spawned uWSGI worker 3 (pid: 18, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.893679674Z"}
{"log":"spawned uWSGI worker 4 (pid: 19, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.89548555Z"}
{"log":"[uwsgi-daemons] spawning \"./manage.py sendreports --loop --skip-checks\" (uid: 999 gid: 999)\n","stream":"stderr","time":"2025-07-22T12:40:25.91165214Z"}
{"log":"[uwsgi-daemons] spawning \"./manage.py sendalerts --skip-checks\" (uid: 999 gid: 999)\n","stream":"stderr","time":"2025-07-22T12:40:25.943630553Z"}
{"log":"[pid: 16|app: 0|req: 1/1] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:40:25 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 645 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:40:26.544030038Z"}
{"log":"sendreports is now running\n","stream":"stdout","time":"2025-07-22T12:40:27.827281232Z"}
{"log":"sendalerts is now running\n","stream":"stdout","time":"2025-07-22T12:40:27.864492217Z"}
{"log":"[pid: 18|app: 0|req: 1/2] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:41:26 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 151 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:41:26.872055008Z"}
{"log":"[pid: 17|app: 0|req: 1/3] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:42:27 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 170 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:42:27.236874154Z"}
{"log":"[pid: 19|app: 0|req: 1/4] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:43:27 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 156 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:43:27.552953468Z"}

Then on 2025-07-28 something goes wrong again, and after that, there is no more entry found for manage.py until my manual restart of the container when I started posting this issue.

{"log":"[pid: 16|app: 0|req: 2277/9105] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:24:47 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 8 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:24:47.935980854Z"}
{"log":"[pid: 18|app: 0|req: 2277/9106] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:25:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 4 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:25:48.167608792Z"}
{"log":"[pid: 17|app: 0|req: 2277/9107] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:26:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 3 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:26:48.345447273Z"}
{"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2025-07-28T07:27:18.492533367Z"}
{"log":"  File \"/opt/healthchecks/./manage.py\", line 17, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-28T07:27:18.495433895Z"}
{"log":"    raise e\n","stream":"stderr","time":"2025-07-28T07:27:18.495465164Z"}
{"log":"  File \"/opt/healthchecks/./manage.py\", line 13, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-28T07:27:18.495472693Z"}
{"log":"    execute_from_command_line(sys.argv)\n","stream":"stderr","time":"2025-07-28T07:27:18.495479442Z"}
{"log":"    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.49548547Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 442, in execute_from_command_line\n","stream":"stderr","time":"2025-07-28T07:27:18.495491388Z"}
{"log":"    utility.execute()\n","stream":"stderr","time":"2025-07-28T07:27:18.495497393Z"}
{"log":"    ~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495503075Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 436, in execute\n","stream":"stderr","time":"2025-07-28T07:27:18.49552427Z"}
{"log":"    self.fetch_command(subcommand).run_from_argv(self.argv)\n","stream":"stderr","time":"2025-07-28T07:27:18.495530732Z"}
{"log":"    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495536455Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 416, in run_from_argv\n","stream":"stderr","time":"2025-07-28T07:27:18.495541981Z"}
{"log":"    self.execute(*args, **cmd_options)\n","stream":"stderr","time":"2025-07-28T07:27:18.495547651Z"}
{"log":"    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495553197Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 460, in execute\n","stream":"stderr","time":"2025-07-28T07:27:18.495558586Z"}
{"log":"    output = self.handle(*args, **options)\n","stream":"stderr","time":"2025-07-28T07:27:18.495564083Z"}
{"log":"  File \"/opt/healthchecks/hc/api/management/commands/sendreports.py\", line 106, in handle\n","stream":"stderr","time":"2025-07-28T07:27:18.495569648Z"}
{"log":"    while not self.shutdown and self.handle_one_report():\n","stream":"stderr","time":"2025-07-28T07:27:18.495575266Z"}
{"log":"                                ~~~~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495590607Z"}
{"log":"  File \"/opt/healthchecks/hc/api/management/commands/sendreports.py\", line 60, in handle_one_report\n","stream":"stderr","time":"2025-07-28T07:27:18.495597479Z"}
{"log":"    if profile.send_report():\n","stream":"stderr","time":"2025-07-28T07:27:18.495603188Z"}
{"log":"       ~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495608583Z"}
{"log":"  File \"/opt/healthchecks/hc/accounts/models.py\", line 259, in send_report\n","stream":"stderr","time":"2025-07-28T07:27:18.49561394Z"}
{"log":"    emails.report(self.user.email, ctx, headers)\n","stream":"stderr","time":"2025-07-28T07:27:18.495620029Z"}
{"log":"    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495625627Z"}
{"log":"  File \"/opt/healthchecks/hc/lib/emails.py\", line 101, in report\n","stream":"stderr","time":"2025-07-28T07:27:18.495631017Z"}
{"log":"    send(m, block=True)\n","stream":"stderr","time":"2025-07-28T07:27:18.495636554Z"}
{"log":"    ~~~~^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495642Z"}
{"log":"  File \"/opt/healthchecks/hc/lib/emails.py\", line 76, in send\n","stream":"stderr","time":"2025-07-28T07:27:18.495647518Z"}
{"log":"    t.run()\n","stream":"stderr","time":"2025-07-28T07:27:18.495653088Z"}
{"log":"    ~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495658515Z"}
{"log":"  File \"/opt/healthchecks/hc/lib/emails.py\", line 26, in run\n","stream":"stderr","time":"2025-07-28T07:27:18.495663839Z"}
{"log":"    self.message.send()\n","stream":"stderr","time":"2025-07-28T07:27:18.495669531Z"}
{"log":"    ~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495675077Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/mail/message.py\", line 307, in send\n","stream":"stderr","time":"2025-07-28T07:27:18.495680581Z"}
{"log":"    return self.get_connection(fail_silently).send_messages([self])\n","stream":"stderr","time":"2025-07-28T07:27:18.495686625Z"}
{"log":"           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495692427Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/mail/backends/smtp.py\", line 128, in send_messages\n","stream":"stderr","time":"2025-07-28T07:27:18.495700867Z"}
{"log":"    new_conn_created = self.open()\n","stream":"stderr","time":"2025-07-28T07:27:18.495707586Z"}
{"log":"  File \"/usr/local/lib/python3.13/site-packages/django/core/mail/backends/smtp.py\", line 86, in open\n","stream":"stderr","time":"2025-07-28T07:27:18.495713377Z"}
{"log":"    self.connection = self.connection_class(\n","stream":"stderr","time":"2025-07-28T07:27:18.495726802Z"}
{"log":"                      ~~~~~~~~~~~~~~~~~~~~~^\n","stream":"stderr","time":"2025-07-28T07:27:18.495733052Z"}
{"log":"        self.host, self.port, **connection_params\n","stream":"stderr","time":"2025-07-28T07:27:18.49573856Z"}
{"log":"        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.49574408Z"}
{"log":"    )\n","stream":"stderr","time":"2025-07-28T07:27:18.495749481Z"}
{"log":"    ^\n","stream":"stderr","time":"2025-07-28T07:27:18.495754937Z"}
{"log":"  File \"/usr/local/lib/python3.13/smtplib.py\", line 255, in __init__\n","stream":"stderr","time":"2025-07-28T07:27:18.49576032Z"}
{"log":"    (code, msg) = self.connect(host, port)\n","stream":"stderr","time":"2025-07-28T07:27:18.495765841Z"}
{"log":"                  ~~~~~~~~~~~~^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495771346Z"}
{"log":"  File \"/usr/local/lib/python3.13/smtplib.py\", line 341, in connect\n","stream":"stderr","time":"2025-07-28T07:27:18.495776893Z"}
{"log":"    self.sock = self._get_socket(host, port, self.timeout)\n","stream":"stderr","time":"2025-07-28T07:27:18.495782513Z"}
{"log":"                ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495787951Z"}
{"log":"  File \"/usr/local/lib/python3.13/smtplib.py\", line 312, in _get_socket\n","stream":"stderr","time":"2025-07-28T07:27:18.495793406Z"}
{"log":"    return socket.create_connection((host, port), timeout,\n","stream":"stderr","time":"2025-07-28T07:27:18.495799026Z"}
{"log":"           ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495804583Z"}
{"log":"                                    self.source_address)\n","stream":"stderr","time":"2025-07-28T07:27:18.495810089Z"}
{"log":"                                    ^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.49581583Z"}
{"log":"  File \"/usr/local/lib/python3.13/socket.py\", line 864, in create_connection\n","stream":"stderr","time":"2025-07-28T07:27:18.495821327Z"}
{"log":"    raise exceptions[0]\n","stream":"stderr","time":"2025-07-28T07:27:18.495826895Z"}
{"log":"  File \"/usr/local/lib/python3.13/socket.py\", line 849, in create_connection\n","stream":"stderr","time":"2025-07-28T07:27:18.495832468Z"}
{"log":"    sock.connect(sa)\n","stream":"stderr","time":"2025-07-28T07:27:18.495838104Z"}
{"log":"    ~~~~~~~~~~~~^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495843533Z"}
{"log":"ConnectionRefusedError: [Errno 111] Connection refused\n","stream":"stderr","time":"2025-07-28T07:27:18.495848998Z"}
{"log":"daemon \"./manage.py sendreports --loop --skip-checks\" (pid: 21) annihilated\n","stream":"stderr","time":"2025-07-28T07:27:19.457897573Z"}
{"log":"[pid: 19|app: 0|req: 2277/9108] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:27:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 2 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:27:48.536607413Z"}
{"log":"[pid: 16|app: 0|req: 2278/9109] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:28:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 5 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:28:48.747860648Z"}

One hint regarding the very last log entry "[Errno 111] Connection refused".
I had some problems with email account settings in my Proxmox Backup Server - that triggered my own fail2ban instance and blocking my own IP again and again. The same IP that healthcecks is using for sending mails.
Proxbox Backup Server also showed that Error 111.
I have fixed this in Proxmox Backup Server around the end of July and havent't restarted healthchecks ever since (restart of healthechecks on 2025-08-18).
It could be that healthchecks tried to send the weekly report while the IP was banned by fail2ban and could not connect to the mailserver.
Nonetheless the date for next report was updated to 2025-08-04, but stuck there with days advancing.
So maybe weekly reports function in healthchecks is somehow irritated if it isn't able to send a mail once, and does not try it any more in the future unless it is restarted.
However, the weekly report should not stop working if it is not possible to send the mail in one week. It should still try it next week. Even better it should try the weekly report again after 1 or 2 hours if it fails to do so the first time.
There is always the possibility that a mailserver is down for whatever reason.
As you can see in the log above, a report was sent successfully when I had a nightly downtime on my WAN remote backup site on 2025-08-13.
So this function was not interrupted.

Regards,
Heiko

<!-- gh-comment-id:3207230913 --> @heikoh81 commented on GitHub (Aug 20, 2025): Hi, thanks for your reply. I'm using the standard container provided on docker hub: ```shell docker run \ -d \ --name=healthchecks \ -p 0.0.0.0:8001:8000 \ --restart unless-stopped \ -e ALLOWED_HOSTS=192.168.179.20 \ -e DB=mysql \ -e DB_NAME=healthchecks \ -e DB_HOST=192.168.179.22 \ -e DB_PASSWORD=secret \ -e DB_PORT=3306 \ -e DB_USER=root \ -e DEBUG=False \ -e DEFAULT_FROM_EMAIL=rpi@secret.de \ -e PING_BODY_LIMIT=250000 \ -e EMAIL_HOST=secret.de \ -e EMAIL_HOST_PASSWORD=secret \ -e EMAIL_HOST_USER=rpi@secret.de \ -e EMAIL_PORT=587 \ -e EMAIL_USE_TLS=True \ -e SECRET_KEY=secret \ -e SITE_ROOT=http://192.168.179.20:8001 \ healthchecks/healthchecks:v3.10 ``` docker log ```shell 2025-06-23T09:56:20.101062122Z Operations to perform: 2025-06-23T09:56:20.101119891Z Apply all migrations: accounts, admin, api, auth, contenttypes, logs, payments, sessions 2025-06-23T09:56:20.123969655Z Running migrations: 2025-06-23T09:56:20.134705788Z Applying accounts.0049_convert_email_lowercase... OK 2025-06-23T09:56:20.150587703Z Applying api.0113_alter_channel_kind... OK 2025-06-23T09:56:20.229911422Z Applying api.0114_flip_reason... OK 2025-06-23T09:56:20.301485882Z Applying api.0115_flip_api_flip_owner_created... OK 2025-06-23T09:56:20.326649530Z Applying api.0116_alter_check_badge_key... OK 2025-06-23T09:56:20.396136647Z Applying api.0117_fill_badge_key... OK 2025-06-23T09:56:20.559274307Z Applying api.0118_alter_check_badge_key... OK 2025-06-23T09:56:22.245955065Z sendreports is now running 2025-06-23T09:56:22.246921484Z sendalerts is now running 2025-06-30T07:45:35.719236758Z Sent monthly report to mail@secret.de 2025-07-07T08:39:01.077546811Z Sent monthly report to mail@secret.de 2025-07-14T07:33:28.235892414Z Sent monthly report to mail@secret.de 2025-07-21T07:47:48.827350067Z Sent monthly report to mail@secret.de 2025-07-22T12:39:47.989994182Z Terminated, finishing... 2025-07-22T12:39:48.933408291Z Terminated, finishing... 2025-07-22T12:39:49.007450589Z Done. 2025-07-22T12:39:49.718439542Z Done. 2025-07-22T12:40:27.827281232Z sendreports is now running 2025-07-22T12:40:27.864492217Z sendalerts is now running 2025-08-13T01:32:24.681791242Z e2598da9-d901-4507-af39-ac5dd01ff44e goes down 2025-08-13T01:32:24.681828288Z cf3b506c (email) OK in 0.2s 2025-08-14T01:31:00.656494572Z e2598da9-d901-4507-af39-ac5dd01ff44e goes up 2025-08-14T01:31:00.656522879Z cf3b506c (email) OK in 0.0s 2025-08-18T09:32:03.152690157Z Operations to perform: 2025-08-18T09:32:03.152735143Z Apply all migrations: accounts, admin, api, auth, contenttypes, logs, payments, sessions 2025-08-18T09:32:03.184648827Z Running migrations: 2025-08-18T09:32:03.184696108Z No migrations to apply. 2025-08-18T09:32:03.210767766Z Your models in app(s): 'api' have changes that are not yet reflected in a migration, and so won't be applied. 2025-08-18T09:32:03.210817875Z Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them. 2025-08-18T09:32:05.754317502Z sendalerts is now running 2025-08-18T09:32:05.759933382Z sendreports is now running 2025-08-18T09:32:06.538502351Z Sent monthly report to mail@secret.de ``` I found 2 log entries where something with manage.py seems to go wrong. This is for 2025-07-22. Don't know what happend here but probably the container was restarted by myself. ```shell {"log":"[pid: 9|app: 0|req: 14423/57697] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:36:59 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 3 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:36:59.007948971Z"} {"log":"[pid: 11|app: 0|req: 14428/57698] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:37:59 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 2 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:37:59.202373061Z"} {"log":"[pid: 10|app: 0|req: 14423/57699] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:38:59 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 2 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:38:59.390909234Z"} {"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:39:47.96410089Z"} {"log":"[uwsgi-daemons] stopping daemon (pid: 13): ./manage.py sendalerts --skip-checks\n","stream":"stderr","time":"2025-07-22T12:39:47.964132812Z"} {"log":"Terminated, finishing...\n","stream":"stdout","time":"2025-07-22T12:39:47.989994182Z"} {"log":"[uwsgi-daemons] stopping daemon (pid: 14): ./manage.py sendreports --loop --skip-checks\n","stream":"stderr","time":"2025-07-22T12:39:48.933119266Z"} {"log":"Terminated, finishing...\n","stream":"stdout","time":"2025-07-22T12:39:48.933408291Z"} {"log":"Done.\n","stream":"stdout","time":"2025-07-22T12:39:49.007450589Z"} {"log":"Done.\n","stream":"stdout","time":"2025-07-22T12:39:49.718439542Z"} {"log":"worker 1 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933388908Z"} {"log":"worker 2 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933447104Z"} {"log":"worker 3 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933456769Z"} {"log":"worker 4 buried after 2 seconds\n","stream":"stderr","time":"2025-07-22T12:39:49.933462925Z"} {"log":"goodbye to uWSGI.\n","stream":"stderr","time":"2025-07-22T12:39:49.933468483Z"} {"log":"[uWSGI] getting INI configuration from /opt/healthchecks/docker/uwsgi.ini\n","stream":"stderr","time":"2025-07-22T12:40:18.827249399Z"} {"log":"[uwsgi-static] added check for static-collected/\n","stream":"stderr","time":"2025-07-22T12:40:18.830250679Z"} {"log":"*** Starting uWSGI 2.0.29 (64bit) on [Tue Jul 22 12:40:18 2025] ***\n","stream":"stderr","time":"2025-07-22T12:40:18.863629884Z"} {"log":"compiled with version: 12.2.0 on 09 May 2025 08:14:17\n","stream":"stderr","time":"2025-07-22T12:40:18.863686747Z"} {"log":"os: Linux-6.1.0-22-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.94-1 (2024-06-21)\n","stream":"stderr","time":"2025-07-22T12:40:18.863692839Z"} {"log":"nodename: 78cfdaa467ea\n","stream":"stderr","time":"2025-07-22T12:40:18.8636978Z"} {"log":"machine: x86_64\n","stream":"stderr","time":"2025-07-22T12:40:18.863702559Z"} {"log":"clock source: unix\n","stream":"stderr","time":"2025-07-22T12:40:18.863707108Z"} {"log":"pcre jit disabled\n","stream":"stderr","time":"2025-07-22T12:40:18.863711555Z"} {"log":"detected number of CPU cores: 2\n","stream":"stderr","time":"2025-07-22T12:40:18.863715935Z"} {"log":"current working directory: /opt/healthchecks\n","stream":"stderr","time":"2025-07-22T12:40:18.863720596Z"} {"log":"detected binary path: /usr/local/bin/uwsgi\n","stream":"stderr","time":"2025-07-22T12:40:18.863725063Z"} {"log":"chdir() to /opt/healthchecks\n","stream":"stderr","time":"2025-07-22T12:40:18.863729465Z"} {"log":"your memory page size is 4096 bytes\n","stream":"stderr","time":"2025-07-22T12:40:18.86373378Z"} {"log":"detected max file descriptor number: 10000\n","stream":"stderr","time":"2025-07-22T12:40:18.863750991Z"} {"log":"!!! no /etc/mime.types file found !!!\n","stream":"stderr","time":"2025-07-22T12:40:18.863768279Z"} {"log":"lock engine: pthread robust mutexes\n","stream":"stderr","time":"2025-07-22T12:40:18.863773888Z"} {"log":"thunder lock: enabled\n","stream":"stderr","time":"2025-07-22T12:40:18.863888751Z"} {"log":"uwsgi socket 0 bound to TCP address :8000 fd 3\n","stream":"stderr","time":"2025-07-22T12:40:18.864634868Z"} {"log":"Python version: 3.13.0 (main, Dec 3 2024, 02:26:48) [GCC 12.2.0]\n","stream":"stderr","time":"2025-07-22T12:40:18.864651567Z"} {"log":"Python main interpreter initialized at 0x7fcc45135a60\n","stream":"stderr","time":"2025-07-22T12:40:18.936667409Z"} {"log":"python threads support enabled\n","stream":"stderr","time":"2025-07-22T12:40:18.936699119Z"} {"log":"your server socket listen backlog is limited to 100 connections\n","stream":"stderr","time":"2025-07-22T12:40:18.93670617Z"} {"log":"your mercy for graceful operations on workers is 60 seconds\n","stream":"stderr","time":"2025-07-22T12:40:18.936711103Z"} {"log":"setting request body buffering size to 16192 bytes\n","stream":"stderr","time":"2025-07-22T12:40:18.936715622Z"} {"log":"mapped 588920 bytes (575 KB) for 4 cores\n","stream":"stderr","time":"2025-07-22T12:40:18.936719996Z"} {"log":"*** Operational MODE: preforking ***\n","stream":"stderr","time":"2025-07-22T12:40:18.936724342Z"} {"log":"running \"exec:./manage.py migrate\" (pre app)...\n","stream":"stderr","time":"2025-07-22T12:40:18.941694914Z"} {"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2025-07-22T12:40:23.676210681Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 279, in ensure_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.676240633Z"} {"log":" self.connect()\n","stream":"stderr","time":"2025-07-22T12:40:23.676247128Z"} {"log":" ~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.676252117Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.676256809Z"} {"log":" return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.676261641Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 256, in connect\n","stream":"stderr","time":"2025-07-22T12:40:23.676266306Z"} {"log":" self.connection = self.get_new_connection(conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.676271292Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.676276249Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.67628101Z"} {"log":" return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.676285983Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 256, in get_new_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.676290682Z"} {"log":" connection = Database.connect(**conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.676295694Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/MySQLdb/__init__.py\", line 121, in Connect\n","stream":"stderr","time":"2025-07-22T12:40:23.676300607Z"} {"log":" return Connection(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.67630541Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/MySQLdb/connections.py\", line 200, in __init__\n","stream":"stderr","time":"2025-07-22T12:40:23.676310382Z"} {"log":" super().__init__(*args, **kwargs2)\n","stream":"stderr","time":"2025-07-22T12:40:23.67631534Z"} {"log":" ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.676319888Z"} {"log":"MySQLdb.OperationalError: (2013, \"Lost connection to server at 'handshake: reading initial communication packet', system error: 115\")\n","stream":"stderr","time":"2025-07-22T12:40:23.676324364Z"} {"log":"\n","stream":"stderr","time":"2025-07-22T12:40:23.67634005Z"} {"log":"The above exception was the direct cause of the following exception:\n","stream":"stderr","time":"2025-07-22T12:40:23.67634505Z"} {"log":"\n","stream":"stderr","time":"2025-07-22T12:40:23.676349904Z"} {"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2025-07-22T12:40:23.676354412Z"} {"log":" File \"/opt/healthchecks/./manage.py\", line 17, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-22T12:40:23.692410507Z"} {"log":" raise e\n","stream":"stderr","time":"2025-07-22T12:40:23.692436606Z"} {"log":" File \"/opt/healthchecks/./manage.py\", line 13, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-22T12:40:23.692442913Z"} {"log":" execute_from_command_line(sys.argv)\n","stream":"stderr","time":"2025-07-22T12:40:23.692448488Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692453275Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 442, in execute_from_command_line\n","stream":"stderr","time":"2025-07-22T12:40:23.692457965Z"} {"log":" utility.execute()\n","stream":"stderr","time":"2025-07-22T12:40:23.692462963Z"} {"log":" ~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692467473Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 436, in execute\n","stream":"stderr","time":"2025-07-22T12:40:23.692472277Z"} {"log":" self.fetch_command(subcommand).run_from_argv(self.argv)\n","stream":"stderr","time":"2025-07-22T12:40:23.692477117Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692481772Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 416, in run_from_argv\n","stream":"stderr","time":"2025-07-22T12:40:23.692486442Z"} {"log":" self.execute(*args, **cmd_options)\n","stream":"stderr","time":"2025-07-22T12:40:23.692491306Z"} {"log":" ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692495826Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 457, in execute\n","stream":"stderr","time":"2025-07-22T12:40:23.692500331Z"} {"log":" self.check(**check_kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692505144Z"} {"log":" ~~~~~~~~~~^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692509772Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 492, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692514211Z"} {"log":" all_issues = checks.run_checks(\n","stream":"stderr","time":"2025-07-22T12:40:23.692518873Z"} {"log":" app_configs=app_configs,\n","stream":"stderr","time":"2025-07-22T12:40:23.692523427Z"} {"log":" ...\u003c2 lines\u003e...\n","stream":"stderr","time":"2025-07-22T12:40:23.692527911Z"} {"log":" databases=databases,\n","stream":"stderr","time":"2025-07-22T12:40:23.692532967Z"} {"log":" )\n","stream":"stderr","time":"2025-07-22T12:40:23.692537552Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/checks/registry.py\", line 89, in run_checks\n","stream":"stderr","time":"2025-07-22T12:40:23.692541945Z"} {"log":" new_errors = check(app_configs=app_configs, databases=databases)\n","stream":"stderr","time":"2025-07-22T12:40:23.692546998Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/checks/model_checks.py\", line 36, in check_all_models\n","stream":"stderr","time":"2025-07-22T12:40:23.692551786Z"} {"log":" errors.extend(model.check(**kwargs))\n","stream":"stderr","time":"2025-07-22T12:40:23.692556639Z"} {"log":" ~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692561206Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/models/base.py\", line 1719, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692576975Z"} {"log":" *cls._check_fields(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.692582587Z"} {"log":" ~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692587154Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/models/base.py\", line 1914, in _check_fields\n","stream":"stderr","time":"2025-07-22T12:40:23.692591859Z"} {"log":" errors.extend(field.check(**kwargs))\n","stream":"stderr","time":"2025-07-22T12:40:23.692596736Z"} {"log":" ~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.69260149Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 2793, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692606157Z"} {"log":" *super().check(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.692610961Z"} {"log":" ~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692617772Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 2071, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692622658Z"} {"log":" *super().check(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.69262745Z"} {"log":" ~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692632Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 274, in check\n","stream":"stderr","time":"2025-07-22T12:40:23.692636623Z"} {"log":" *self._check_backend_specific_checks(**kwargs),\n","stream":"stderr","time":"2025-07-22T12:40:23.692641342Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692645941Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 489, in _check_backend_specific_checks\n","stream":"stderr","time":"2025-07-22T12:40:23.692650584Z"} {"log":" errors.extend(connections[alias].validation.check_field(self, **kwargs))\n","stream":"stderr","time":"2025-07-22T12:40:23.692655393Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692659974Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/validation.py\", line 25, in check_field\n","stream":"stderr","time":"2025-07-22T12:40:23.692664585Z"} {"log":" field_type = field.db_type(self.connection)\n","stream":"stderr","time":"2025-07-22T12:40:23.692669372Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/models/fields/__init__.py\", line 879, in db_type\n","stream":"stderr","time":"2025-07-22T12:40:23.692673874Z"} {"log":" column_type = connection.data_types[self.get_internal_type()]\n","stream":"stderr","time":"2025-07-22T12:40:23.692678489Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692683039Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692687516Z"} {"log":" res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692692182Z"} {"log":" ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692696808Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 141, in data_types\n","stream":"stderr","time":"2025-07-22T12:40:23.692701352Z"} {"log":" if self.features.has_native_uuid_field:\n","stream":"stderr","time":"2025-07-22T12:40:23.692705968Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692710431Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692714916Z"} {"log":" res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692724839Z"} {"log":" ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692729583Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/features.py\", line 310, in has_native_uuid_field\n","stream":"stderr","time":"2025-07-22T12:40:23.692734227Z"} {"log":" is_mariadb = self.connection.mysql_is_mariadb\n","stream":"stderr","time":"2025-07-22T12:40:23.692739088Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692746251Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692750942Z"} {"log":" res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692756612Z"} {"log":" ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692761446Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 444, in mysql_is_mariadb\n","stream":"stderr","time":"2025-07-22T12:40:23.69276676Z"} {"log":" return \"mariadb\" in self.mysql_server_info.lower()\n","stream":"stderr","time":"2025-07-22T12:40:23.692772055Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692777294Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692781918Z"} {"log":" res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692786675Z"} {"log":" ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692791136Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 430, in mysql_server_info\n","stream":"stderr","time":"2025-07-22T12:40:23.692795687Z"} {"log":" return self.mysql_server_data[\"version\"]\n","stream":"stderr","time":"2025-07-22T12:40:23.692800416Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.69280501Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/functional.py\", line 47, in __get__\n","stream":"stderr","time":"2025-07-22T12:40:23.692809497Z"} {"log":" res = instance.__dict__[self.name] = self.func(instance)\n","stream":"stderr","time":"2025-07-22T12:40:23.692814295Z"} {"log":" ~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692831679Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 404, in mysql_server_data\n","stream":"stderr","time":"2025-07-22T12:40:23.692836948Z"} {"log":" with self.temporary_connection() as cursor:\n","stream":"stderr","time":"2025-07-22T12:40:23.692841648Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692846181Z"} {"log":" File \"/usr/local/lib/python3.13/contextlib.py\", line 141, in __enter__\n","stream":"stderr","time":"2025-07-22T12:40:23.692850683Z"} {"log":" return next(self.gen)\n","stream":"stderr","time":"2025-07-22T12:40:23.692855286Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 695, in temporary_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692859796Z"} {"log":" with self.cursor() as cursor:\n","stream":"stderr","time":"2025-07-22T12:40:23.692864644Z"} {"log":" ~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692869207Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692873806Z"} {"log":" return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692881913Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 320, in cursor\n","stream":"stderr","time":"2025-07-22T12:40:23.692886639Z"} {"log":" return self._cursor()\n","stream":"stderr","time":"2025-07-22T12:40:23.69289138Z"} {"log":" ~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692895835Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 296, in _cursor\n","stream":"stderr","time":"2025-07-22T12:40:23.692900371Z"} {"log":" self.ensure_connection()\n","stream":"stderr","time":"2025-07-22T12:40:23.69290512Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692909756Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692914249Z"} {"log":" return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692918903Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 278, in ensure_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692924061Z"} {"log":" with self.wrap_database_errors:\n","stream":"stderr","time":"2025-07-22T12:40:23.692928837Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692933289Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/utils.py\", line 91, in __exit__\n","stream":"stderr","time":"2025-07-22T12:40:23.692937718Z"} {"log":" raise dj_exc_value.with_traceback(traceback) from exc_value\n","stream":"stderr","time":"2025-07-22T12:40:23.692942375Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 279, in ensure_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692946918Z"} {"log":" self.connect()\n","stream":"stderr","time":"2025-07-22T12:40:23.692951577Z"} {"log":" ~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692956042Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692960542Z"} {"log":" return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692965267Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/base/base.py\", line 256, in connect\n","stream":"stderr","time":"2025-07-22T12:40:23.692969738Z"} {"log":" self.connection = self.get_new_connection(conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.692974495Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.692979105Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/utils/asyncio.py\", line 26, in inner\n","stream":"stderr","time":"2025-07-22T12:40:23.692983711Z"} {"log":" return func(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.692988517Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/db/backends/mysql/base.py\", line 256, in get_new_connection\n","stream":"stderr","time":"2025-07-22T12:40:23.692993099Z"} {"log":" connection = Database.connect(**conn_params)\n","stream":"stderr","time":"2025-07-22T12:40:23.692997907Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/MySQLdb/__init__.py\", line 121, in Connect\n","stream":"stderr","time":"2025-07-22T12:40:23.693002671Z"} {"log":" return Connection(*args, **kwargs)\n","stream":"stderr","time":"2025-07-22T12:40:23.693007478Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/MySQLdb/connections.py\", line 200, in __init__\n","stream":"stderr","time":"2025-07-22T12:40:23.693012182Z"} {"log":" super().__init__(*args, **kwargs2)\n","stream":"stderr","time":"2025-07-22T12:40:23.693016982Z"} {"log":" ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-22T12:40:23.693021638Z"} {"log":"django.db.utils.OperationalError: (2013, \"Lost connection to server at 'handshake: reading initial communication packet', system error: 115\")\n","stream":"stderr","time":"2025-07-22T12:40:23.693030392Z"} {"log":"command \"./manage.py migrate\" exited with non-zero code: 1\n","stream":"stderr","time":"2025-07-22T12:40:24.561928748Z"} {"log":"Tue Jul 22 12:40:24 2025 - FATAL hook failed, destroying instance\n","stream":"stderr","time":"2025-07-22T12:40:24.561987912Z"} {"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:40:24.562005844Z"} {"log":"WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x7fcc45135a60 pid: 1 (default app)\n","stream":"stderr","time":"2025-07-22T12:40:25.887913732Z"} {"log":"*** uWSGI is running in multiple interpreter mode ***\n","stream":"stderr","time":"2025-07-22T12:40:25.888079416Z"} {"log":"spawned uWSGI master process (pid: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.888153129Z"} {"log":"spawned uWSGI worker 1 (pid: 16, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.890350862Z"} {"log":"spawned uWSGI worker 2 (pid: 17, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.892040386Z"} {"log":"spawned uWSGI worker 3 (pid: 18, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.893679674Z"} {"log":"spawned uWSGI worker 4 (pid: 19, cores: 1)\n","stream":"stderr","time":"2025-07-22T12:40:25.89548555Z"} {"log":"[uwsgi-daemons] spawning \"./manage.py sendreports --loop --skip-checks\" (uid: 999 gid: 999)\n","stream":"stderr","time":"2025-07-22T12:40:25.91165214Z"} {"log":"[uwsgi-daemons] spawning \"./manage.py sendalerts --skip-checks\" (uid: 999 gid: 999)\n","stream":"stderr","time":"2025-07-22T12:40:25.943630553Z"} {"log":"[pid: 16|app: 0|req: 1/1] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:40:25 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 645 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:40:26.544030038Z"} {"log":"sendreports is now running\n","stream":"stdout","time":"2025-07-22T12:40:27.827281232Z"} {"log":"sendalerts is now running\n","stream":"stdout","time":"2025-07-22T12:40:27.864492217Z"} {"log":"[pid: 18|app: 0|req: 1/2] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:41:26 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 151 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:41:26.872055008Z"} {"log":"[pid: 17|app: 0|req: 1/3] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:42:27 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 170 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:42:27.236874154Z"} {"log":"[pid: 19|app: 0|req: 1/4] 127.0.0.1 () {26 vars in 332 bytes} [Tue Jul 22 12:43:27 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 156 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-22T12:43:27.552953468Z"} ``` Then on 2025-07-28 something goes wrong again, and after that, there is no more entry found for manage.py until my manual restart of the container when I started posting this issue. ```shell {"log":"[pid: 16|app: 0|req: 2277/9105] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:24:47 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 8 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:24:47.935980854Z"} {"log":"[pid: 18|app: 0|req: 2277/9106] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:25:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 4 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:25:48.167608792Z"} {"log":"[pid: 17|app: 0|req: 2277/9107] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:26:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 3 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:26:48.345447273Z"} {"log":"Traceback (most recent call last):\n","stream":"stderr","time":"2025-07-28T07:27:18.492533367Z"} {"log":" File \"/opt/healthchecks/./manage.py\", line 17, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-28T07:27:18.495433895Z"} {"log":" raise e\n","stream":"stderr","time":"2025-07-28T07:27:18.495465164Z"} {"log":" File \"/opt/healthchecks/./manage.py\", line 13, in \u003cmodule\u003e\n","stream":"stderr","time":"2025-07-28T07:27:18.495472693Z"} {"log":" execute_from_command_line(sys.argv)\n","stream":"stderr","time":"2025-07-28T07:27:18.495479442Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.49548547Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 442, in execute_from_command_line\n","stream":"stderr","time":"2025-07-28T07:27:18.495491388Z"} {"log":" utility.execute()\n","stream":"stderr","time":"2025-07-28T07:27:18.495497393Z"} {"log":" ~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495503075Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/__init__.py\", line 436, in execute\n","stream":"stderr","time":"2025-07-28T07:27:18.49552427Z"} {"log":" self.fetch_command(subcommand).run_from_argv(self.argv)\n","stream":"stderr","time":"2025-07-28T07:27:18.495530732Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495536455Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 416, in run_from_argv\n","stream":"stderr","time":"2025-07-28T07:27:18.495541981Z"} {"log":" self.execute(*args, **cmd_options)\n","stream":"stderr","time":"2025-07-28T07:27:18.495547651Z"} {"log":" ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495553197Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/management/base.py\", line 460, in execute\n","stream":"stderr","time":"2025-07-28T07:27:18.495558586Z"} {"log":" output = self.handle(*args, **options)\n","stream":"stderr","time":"2025-07-28T07:27:18.495564083Z"} {"log":" File \"/opt/healthchecks/hc/api/management/commands/sendreports.py\", line 106, in handle\n","stream":"stderr","time":"2025-07-28T07:27:18.495569648Z"} {"log":" while not self.shutdown and self.handle_one_report():\n","stream":"stderr","time":"2025-07-28T07:27:18.495575266Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495590607Z"} {"log":" File \"/opt/healthchecks/hc/api/management/commands/sendreports.py\", line 60, in handle_one_report\n","stream":"stderr","time":"2025-07-28T07:27:18.495597479Z"} {"log":" if profile.send_report():\n","stream":"stderr","time":"2025-07-28T07:27:18.495603188Z"} {"log":" ~~~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495608583Z"} {"log":" File \"/opt/healthchecks/hc/accounts/models.py\", line 259, in send_report\n","stream":"stderr","time":"2025-07-28T07:27:18.49561394Z"} {"log":" emails.report(self.user.email, ctx, headers)\n","stream":"stderr","time":"2025-07-28T07:27:18.495620029Z"} {"log":" ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495625627Z"} {"log":" File \"/opt/healthchecks/hc/lib/emails.py\", line 101, in report\n","stream":"stderr","time":"2025-07-28T07:27:18.495631017Z"} {"log":" send(m, block=True)\n","stream":"stderr","time":"2025-07-28T07:27:18.495636554Z"} {"log":" ~~~~^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495642Z"} {"log":" File \"/opt/healthchecks/hc/lib/emails.py\", line 76, in send\n","stream":"stderr","time":"2025-07-28T07:27:18.495647518Z"} {"log":" t.run()\n","stream":"stderr","time":"2025-07-28T07:27:18.495653088Z"} {"log":" ~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495658515Z"} {"log":" File \"/opt/healthchecks/hc/lib/emails.py\", line 26, in run\n","stream":"stderr","time":"2025-07-28T07:27:18.495663839Z"} {"log":" self.message.send()\n","stream":"stderr","time":"2025-07-28T07:27:18.495669531Z"} {"log":" ~~~~~~~~~~~~~~~~~^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495675077Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/mail/message.py\", line 307, in send\n","stream":"stderr","time":"2025-07-28T07:27:18.495680581Z"} {"log":" return self.get_connection(fail_silently).send_messages([self])\n","stream":"stderr","time":"2025-07-28T07:27:18.495686625Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495692427Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/mail/backends/smtp.py\", line 128, in send_messages\n","stream":"stderr","time":"2025-07-28T07:27:18.495700867Z"} {"log":" new_conn_created = self.open()\n","stream":"stderr","time":"2025-07-28T07:27:18.495707586Z"} {"log":" File \"/usr/local/lib/python3.13/site-packages/django/core/mail/backends/smtp.py\", line 86, in open\n","stream":"stderr","time":"2025-07-28T07:27:18.495713377Z"} {"log":" self.connection = self.connection_class(\n","stream":"stderr","time":"2025-07-28T07:27:18.495726802Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~^\n","stream":"stderr","time":"2025-07-28T07:27:18.495733052Z"} {"log":" self.host, self.port, **connection_params\n","stream":"stderr","time":"2025-07-28T07:27:18.49573856Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.49574408Z"} {"log":" )\n","stream":"stderr","time":"2025-07-28T07:27:18.495749481Z"} {"log":" ^\n","stream":"stderr","time":"2025-07-28T07:27:18.495754937Z"} {"log":" File \"/usr/local/lib/python3.13/smtplib.py\", line 255, in __init__\n","stream":"stderr","time":"2025-07-28T07:27:18.49576032Z"} {"log":" (code, msg) = self.connect(host, port)\n","stream":"stderr","time":"2025-07-28T07:27:18.495765841Z"} {"log":" ~~~~~~~~~~~~^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495771346Z"} {"log":" File \"/usr/local/lib/python3.13/smtplib.py\", line 341, in connect\n","stream":"stderr","time":"2025-07-28T07:27:18.495776893Z"} {"log":" self.sock = self._get_socket(host, port, self.timeout)\n","stream":"stderr","time":"2025-07-28T07:27:18.495782513Z"} {"log":" ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495787951Z"} {"log":" File \"/usr/local/lib/python3.13/smtplib.py\", line 312, in _get_socket\n","stream":"stderr","time":"2025-07-28T07:27:18.495793406Z"} {"log":" return socket.create_connection((host, port), timeout,\n","stream":"stderr","time":"2025-07-28T07:27:18.495799026Z"} {"log":" ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495804583Z"} {"log":" self.source_address)\n","stream":"stderr","time":"2025-07-28T07:27:18.495810089Z"} {"log":" ^^^^^^^^^^^^^^^^^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.49581583Z"} {"log":" File \"/usr/local/lib/python3.13/socket.py\", line 864, in create_connection\n","stream":"stderr","time":"2025-07-28T07:27:18.495821327Z"} {"log":" raise exceptions[0]\n","stream":"stderr","time":"2025-07-28T07:27:18.495826895Z"} {"log":" File \"/usr/local/lib/python3.13/socket.py\", line 849, in create_connection\n","stream":"stderr","time":"2025-07-28T07:27:18.495832468Z"} {"log":" sock.connect(sa)\n","stream":"stderr","time":"2025-07-28T07:27:18.495838104Z"} {"log":" ~~~~~~~~~~~~^^^^\n","stream":"stderr","time":"2025-07-28T07:27:18.495843533Z"} {"log":"ConnectionRefusedError: [Errno 111] Connection refused\n","stream":"stderr","time":"2025-07-28T07:27:18.495848998Z"} {"log":"daemon \"./manage.py sendreports --loop --skip-checks\" (pid: 21) annihilated\n","stream":"stderr","time":"2025-07-28T07:27:19.457897573Z"} {"log":"[pid: 19|app: 0|req: 2277/9108] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:27:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 2 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:27:48.536607413Z"} {"log":"[pid: 16|app: 0|req: 2278/9109] 127.0.0.1 () {26 vars in 332 bytes} [Mon Jul 28 07:28:48 2025] GET /api/v3/status/ =\u003e generated 2 bytes in 5 msecs (HTTP/1.1 200) 7 headers in 219 bytes (1 switches on core 0)\n","stream":"stderr","time":"2025-07-28T07:28:48.747860648Z"} ``` One hint regarding the very last log entry "[Errno 111] Connection refused". I had some problems with email account settings in my Proxmox Backup Server - that triggered my own fail2ban instance and blocking my own IP again and again. The same IP that healthcecks is using for sending mails. Proxbox Backup Server also showed that Error 111. I have fixed this in Proxmox Backup Server around the end of July and havent't restarted healthchecks ever since (restart of healthechecks on 2025-08-18). It could be that healthchecks tried to send the weekly report while the IP was banned by fail2ban and could not connect to the mailserver. Nonetheless the date for next report was updated to 2025-08-04, but stuck there with days advancing. So maybe weekly reports function in healthchecks is somehow irritated if it isn't able to send a mail once, and does not try it any more in the future unless it is restarted. However, the weekly report should not stop working if it is not possible to send the mail in one week. It should still try it next week. Even better it should try the weekly report again after 1 or 2 hours if it fails to do so the first time. There is always the possibility that a mailserver is down for whatever reason. As you can see in the log above, a report was sent successfully when I had a nightly downtime on my WAN remote backup site on 2025-08-13. So this function was not interrupted. Regards, Heiko
Author
Owner

@cuu508 commented on GitHub (Aug 21, 2025):

As an experiment, I started a healthchecks container like so:

docker run \
  --name=healthchecks \
  -p 8000:8000 \
  --restart unless-stopped \
  -e DB=sqlite \
  -e DB_NAME=/data/hc.sqlite \
  -e DEBUG=False \
  -e DEFAULT_FROM_EMAIL=foo@example.org \
  -e EMAIL_HOST=127.0.0.1 \
  -e EMAIL_HOST_PASSWORD=dummy \
  -e EMAIL_HOST_USER=dummy \
  -e EMAIL_PORT=1234 \
  -e EMAIL_USE_TLS=True \
  -e SECRET_KEY=--- \
  -e SITE_ROOT=http://localhost:8000 \
  -v healthchecks-data:/data \

The email port is set to 1234 but there's nothing listening on this port, so sendreports should crash the first time it attempts to send a report.

I then logged into the admin interface and changed my user's next report date to a date in the past to trigger a report. Sure enough, about a minute later, sendreports crashed:

  File "/usr/local/lib/python3.13/socket.py", line 849, in create_connection
    sock.connect(sa)
    ~~~~~~~~~~~~^^^^
ConnectionRefusedError: [Errno 111] Connection refused
[uwsgi-daemons] respawning "./manage.py sendreports --loop --skip-checks" (uid: 999 gid: 999)
sendreports is now running

In my experiment, after sendreports crashed, uwsgi restarted it right away.

In your case though, uwsgi logged:

daemon "./manage.py sendreports --loop --skip-checks" (pid: 21) annihilated

It did not respawn sendreports and so you stopped receiving weekly reports.

So what's different in these two cases? I looked around uwsgi's source code and it looks like uwsgi prints the "daemon .... annihilated" message and does not attempt to respawn if uwsgi master process is either reloading or shutting down (source).

If we look back at your logs there's indeed a line that would suggest a shutdown in process:

{"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:40:24.562005844Z"}

This line is printed before the main app has finished initializing. So I'm guessing what is happening is:

  • uwsgi starts up
  • during startup, but before the app is ready and serving requests, it receives SIGING/SIGTERM
  • the app finishes loading and starts serving requests
  • uwsgi is now stuck in a "shutting down" state
  • the first time sendreports crashes, uwsgi does not respawn it because it is still shutting down

I managed to reproduce this locally too: I started uwsgi from command line and pressed Ctrl+C almost immediately. This produced the log message:

SIGINT/SIGTERM received...killing workers...

Afterwards I manipulated sendreports to crash and it was indeed not restarted:

daemon "./manage.py sendreports --loop" (pid: 71382) annihilated

I'm not sure what's the correct solution here. Perhaps uwsgi should be patched to handle cases where it receives SIGINT/SIGTERM while the app is still loading. But I don't have the skills to contribute that patch.

<!-- gh-comment-id:3210543959 --> @cuu508 commented on GitHub (Aug 21, 2025): As an experiment, I started a healthchecks container like so: ``` docker run \ --name=healthchecks \ -p 8000:8000 \ --restart unless-stopped \ -e DB=sqlite \ -e DB_NAME=/data/hc.sqlite \ -e DEBUG=False \ -e DEFAULT_FROM_EMAIL=foo@example.org \ -e EMAIL_HOST=127.0.0.1 \ -e EMAIL_HOST_PASSWORD=dummy \ -e EMAIL_HOST_USER=dummy \ -e EMAIL_PORT=1234 \ -e EMAIL_USE_TLS=True \ -e SECRET_KEY=--- \ -e SITE_ROOT=http://localhost:8000 \ -v healthchecks-data:/data \ ``` The email port is set to 1234 but there's nothing listening on this port, so `sendreports` should crash the first time it attempts to send a report. I then logged into the admin interface and changed my user's next report date to a date in the past to trigger a report. Sure enough, about a minute later, sendreports crashed: ``` File "/usr/local/lib/python3.13/socket.py", line 849, in create_connection sock.connect(sa) ~~~~~~~~~~~~^^^^ ConnectionRefusedError: [Errno 111] Connection refused [uwsgi-daemons] respawning "./manage.py sendreports --loop --skip-checks" (uid: 999 gid: 999) sendreports is now running ``` In my experiment, after sendreports crashed, uwsgi restarted it right away. In your case though, uwsgi logged: ``` daemon "./manage.py sendreports --loop --skip-checks" (pid: 21) annihilated ``` It did not respawn `sendreports` and so you stopped receiving weekly reports. So what's different in these two cases? I looked around uwsgi's source code and it looks like uwsgi prints the "daemon .... annihilated" message and does not attempt to respawn **if uwsgi master process is either reloading or shutting down** ([source](https://github.com/unbit/uwsgi/blob/f93193828730c72e1e31d00cb0f36c4af44f5507/core/master.c#L946)). If we look back at your logs there's indeed a line that would suggest a shutdown in process: ``` {"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:40:24.562005844Z"} ``` This line is printed before the main app has finished initializing. So I'm guessing what is happening is: * uwsgi starts up * during startup, but before the app is ready and serving requests, it receives SIGING/SIGTERM * the app finishes loading and starts serving requests * uwsgi is now stuck in a "shutting down" state * the first time `sendreports` crashes, uwsgi does not respawn it because it is still shutting down I managed to reproduce this locally too: I started uwsgi from command line and pressed Ctrl+C almost immediately. This produced the log message: ``` SIGINT/SIGTERM received...killing workers... ``` Afterwards I manipulated `sendreports` to crash and it was indeed not restarted: ``` daemon "./manage.py sendreports --loop" (pid: 71382) annihilated ``` I'm not sure what's the correct solution here. Perhaps uwsgi should be patched to handle cases where it receives SIGINT/SIGTERM while the app is still loading. But I don't have the skills to contribute that patch.
Author
Owner

@heikoh81 commented on GitHub (Aug 21, 2025):

Thanks for checking everything.

I don't know what happened on 2025-07-22, maybe I restarted the VM or even the Proxmox Host.
Maybe I just restarted the healthcheck container.
However, I just use portainer to do that, I don't enter the container.
So I did not kill uwsgi manually.

What I remember for sure is that it is not the first time that weekly reports stopped. It has been going on for several months now.
That's why I upgraded healthcheck from 3.7 own build without heartbeat (https://github.com/healthchecks/healthchecks/issues/1071) to the standard 3.10 container.

I have restarted the container, does that mean uwsgi is in a normal state again, or is it still in "shutting down state"?

<!-- gh-comment-id:3211277613 --> @heikoh81 commented on GitHub (Aug 21, 2025): Thanks for checking everything. I don't know what happened on 2025-07-22, maybe I restarted the VM or even the Proxmox Host. Maybe I just restarted the healthcheck container. However, I just use portainer to do that, I don't enter the container. So I did not kill uwsgi manually. What I remember for sure is that it is not the first time that weekly reports stopped. It has been going on for several months now. That's why I upgraded healthcheck from 3.7 own build without heartbeat (https://github.com/healthchecks/healthchecks/issues/1071) to the standard 3.10 container. I have restarted the container, does that mean uwsgi is in a normal state again, or is it still in "shutting down state"?
Author
Owner

@cuu508 commented on GitHub (Aug 21, 2025):

If you don't see SIGINT/SIGTERM received...killing workers... in logs since the start then it is in normal state.

<!-- gh-comment-id:3211387129 --> @cuu508 commented on GitHub (Aug 21, 2025): If you don't see `SIGINT/SIGTERM received...killing workers...` in logs since the start then it is in normal state.
Author
Owner

@heikoh81 commented on GitHub (Aug 21, 2025):

Checked the log again.
No SIGINT/SIGTERM since 2025-07-22.

I will leave this issue open for two more weeks,
and see if I get a weekly report on the next 2 mondays.

<!-- gh-comment-id:3211468959 --> @heikoh81 commented on GitHub (Aug 21, 2025): Checked the log again. No SIGINT/SIGTERM since 2025-07-22. I will leave this issue open for two more weeks, and see if I get a weekly report on the next 2 mondays.
Author
Owner

@cuu508 commented on GitHub (Sep 25, 2025):

There's another clue in your log output, before this line:

{"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:40:24.562005844Z"}

There is this line:

{"log":"Tue Jul 22 12:40:24 2025 - FATAL hook failed, destroying instance\n","stream":"stderr","time":"2025-07-22T12:40:24.561987912Z"}

So I think the more complete story is:

  • The manage.py migrate hook failed because it could not connect to the database (perhaps the database was starting up simultaneously and was not yet ready?)
  • At this point uwsgi should have terminated, but the HTTP listener, and the sendalerts and sendreports processes still started up
  • Some time later sendreports crashed for unrelated reason, but was not restarted because uwsgi was technically in a "shutting down" state

I filed a bug for uWSGI here: https://github.com/unbit/uwsgi/issues/2741

<!-- gh-comment-id:3333644328 --> @cuu508 commented on GitHub (Sep 25, 2025): There's another clue in your log output, before this line: ``` {"log":"SIGINT/SIGTERM received...killing workers...\n","stream":"stderr","time":"2025-07-22T12:40:24.562005844Z"} ``` There is this line: ``` {"log":"Tue Jul 22 12:40:24 2025 - FATAL hook failed, destroying instance\n","stream":"stderr","time":"2025-07-22T12:40:24.561987912Z"} ``` So I think the more complete story is: * The `manage.py migrate` hook failed because it could not connect to the database (perhaps the database was starting up simultaneously and was not yet ready?) * At this point uwsgi should have terminated, but the HTTP listener, and the `sendalerts` and `sendreports` processes still started up * Some time later `sendreports` crashed for unrelated reason, but was not restarted because uwsgi was technically in a "shutting down" state I filed a bug for uWSGI here: https://github.com/unbit/uwsgi/issues/2741
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/healthchecks#814
No description provided.