Skip to content

sqlite3.OperationalError: table CurrentScan has no column named cur_NAME (LUCIRPC) #1502

@trwblanchard

Description

@trwblanchard

What installation are you running?

Production (netalertx) 📦

Is there an existing issue for this?

The issue occurs in the following browsers. Select at least 2.

  • Firefox
  • Chrome
  • Edge
  • Safari (unsupported) - PRs welcome
  • N/A - This is an issue with the backend

Current Behavior

Scheduled scans run, error appears in stderror:
Traceback (most recent call last):
File "", line 198, in _run_module_as_main
File "", line 88, in _run_code
File "/app/server/main.py", line 260, in
sys.exit(main())
^^^^^^
File "/app/server/main.py", line 135, in main
pm.run_plugin_scripts("schedule")
File "/app/server/plugin.py", line 102, in run_plugin_scripts
execute_plugin(self.db, self.all_plugins, plugin)
File "/app/server/plugin.py", line 711, in execute_plugin
process_plugin_events(db, plugin, sqlParams)
File "/app/server/plugin.py", line 1053, in process_plugin_events
sql.executemany(q, sqlParams)
sqlite3.OperationalError: table CurrentScan has no column named cur_NAME

No further scheduled scans then run automatically until the container is restarted.
Error appears only when LUCIRPC plugin is configured and enabled

Expected Behavior

All scheduled scans run without interruption

Steps To Reproduce

  1. Use Docker Compose to create a new NetAlertX instance with a fresh database.
  2. Configure settings/subnets
  3. Enable & configure LUCIRPC
  4. Note that when LUCIRPC scan is in progress, the error appears in stdout and no further scans run

Relevant app.conf settings

#-----------------AUTOGENERATED FILE-----------------#
#                                                    #
#         Generated:  2026-02-09_11-45-58                 #
#                                                    #
#   Config file for the LAN intruder detection app:  #
#      https://github.com/jokob-sk/NetAlertX         #
#                                                    #
#-----------------AUTOGENERATED FILE-----------------#


# General
#---------------------------
LOADED_PLUGINS=['ARPSCAN','AVAHISCAN','CSVBCKP','DBCLNP','DIGSCAN','INTRNT','MAINT','NEWDEV','NBTSCAN','NSLOOKUP','NTFPRCS','SETPWD','SMTP','SYNC','VNDRPDT','WORKFLOWS','UI','CUSTPROP','LUCIRPC']
LOADED_PLUGINS__metadata="{}"
DISCOVER_PLUGINS=True
DISCOVER_PLUGINS__metadata="{}"
SCAN_SUBNETS=['192.168.0.0/24 --interface=enx00e04c68397e']
SCAN_SUBNETS__metadata="{}"
LOG_LEVEL='trace'
LOG_LEVEL__metadata="{}"
TIMEZONE='Europe/London'
TIMEZONE__metadata="{}"
PLUGINS_KEEP_HIST=250
PLUGINS_KEEP_HIST__metadata="{}"
REPORT_DASHBOARD_URL='https://netalertx.REDACTED.uk'
REPORT_DASHBOARD_URL__metadata="{}"
BACKEND_API_URL='https://netalertx.REDACTED.uk/netalertx-api'
BACKEND_API_URL__metadata="{}"
DAYS_TO_KEEP_EVENTS=90
DAYS_TO_KEEP_EVENTS__metadata="{}"
HRS_TO_KEEP_NEWDEV=0
HRS_TO_KEEP_NEWDEV__metadata="{}"
HRS_TO_KEEP_OFFDEV=0
HRS_TO_KEEP_OFFDEV__metadata="{}"
CLEAR_NEW_FLAG=0
CLEAR_NEW_FLAG__metadata="{}"
REFRESH_FQDN=True
REFRESH_FQDN__metadata="{}"
API_CUSTOM_SQL='SELECT * FROM Devices WHERE devPresentLastScan = 0'
API_CUSTOM_SQL__metadata="{}"
VERSION='v26.2.6'
VERSION__metadata="{}"
NETWORK_DEVICE_TYPES=['AP','Access Point','Gateway','Firewall','Hypervisor','Powerline','Switch','WLAN','PLC','Router','USB LAN Adapter','USB WIFI Adapter','Internet']
NETWORK_DEVICE_TYPES__metadata="{}"
GRAPHQL_PORT=20212
GRAPHQL_PORT__metadata="{}"
API_TOKEN='REDACTED'
API_TOKEN__metadata="{}"

# LUCIRPC
#---------------------------
LUCIRPC_RUN='schedule'
LUCIRPC_RUN__metadata="{\"function\": \"RUN\", \"events\": [\"run\"], \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"select\", \"elementOptions\": [], \"transformers\": []}]}, \"default_value\": \"disabled\", \"options\": [\"disabled\", \"once\", \"schedule\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"When to run\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"When the plugin should run. Good options are <code>schedule</code>\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u041a\\u043e\\u0433\\u0434\\u0430 \\u0434\\u043e\\u043b\\u0436\\u0435\\u043d \\u0437\\u0430\\u043f\\u0443\\u0441\\u0442\\u0438\\u0442\\u044c\\u0441\\u044f \\u043f\\u043b\\u0430\\u0433\\u0438\\u043d. \\u0425\\u043e\\u0440\\u043e\\u0448\\u0438\\u043c\\u0438 \\u0432\\u0430\\u0440\\u0438\\u0430\\u043d\\u0442\\u0430\\u043c\\u0438 \\u044f\\u0432\\u043b\\u044f\\u044e\\u0442\\u0441\\u044f <code>schedule</code>\"}]}"
LUCIRPC_RUN_SCHD='*/5 * * * *'
LUCIRPC_RUN_SCHD__metadata="{\"function\": \"RUN_SCHD\", \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [], \"transformers\": []}]}, \"default_value\": \"*/5 * * * *\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Schedule\"}, {\"language_code\": \"ru_ru\", \"string\": \"Schedule\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Only enabled if you select <code>schedule</code> in the <a href=\\\"#SYNC_RUN\\\"><code>SYNC_RUN</code> setting</a>. Make sure you enter the schedule in the correct cron-like format (e.g. validate at <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). For example entering <code>0 4 * * *</code> will run the scan after 4 am in the <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</code> you set above</a>. Will be run NEXT time the time passes.\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u0414\\u043e\\u0441\\u0442\\u0443\\u043f\\u043d\\u043e \\u0442\\u043e\\u043b\\u044c\\u043a\\u043e \\u0432 \\u0442\\u043e\\u043c \\u0441\\u043b\\u0443\\u0447\\u0430\\u0435, \\u0435\\u0441\\u043b\\u0438 \\u0432\\u044b \\u0432\\u044b\\u0431\\u0440\\u0430\\u043b\\u0438 <code>schedule</code> \\u0432 <a href=\\\"#SYNC_RUN\\\"><code>SYNC_RUN</code> setting</a>. \\u0423\\u0431\\u0435\\u0434\\u0438\\u0442\\u0435\\u0441\\u044c, \\u0447\\u0442\\u043e \\u0432\\u044b \\u0432\\u0432\\u043e\\u0434\\u0438\\u0442\\u0435 \\u0440\\u0430\\u0441\\u043f\\u0438\\u0441\\u0430\\u043d\\u0438\\u0435 \\u0432 \\u043f\\u0440\\u0430\\u0432\\u0438\\u043b\\u044c\\u043d\\u043e\\u043c \\u0444\\u043e\\u0440\\u043c\\u0430\\u0442\\u0435, \\u043f\\u043e\\u0445\\u043e\\u0436\\u0435\\u043c \\u043d\\u0430 cron (\\u043d\\u0430\\u043f\\u0440\\u0438\\u043c\\u0435\\u0440, \\u043f\\u0440\\u043e\\u0432\\u0435\\u0440\\u044c\\u0442\\u0435 \\u043d\\u0430 <a href=\\\"https://crontab.guru/\\\" target=\\\"_blank\\\">crontab.guru</a>). \\u041d\\u0430\\u043f\\u0440\\u0438\\u043c\\u0435\\u0440, \\u0435\\u0441\\u043b\\u0438 \\u0432\\u044b \\u0432\\u0432\\u0435\\u0434\\u0435\\u0442\\u0435 <code>0 4 * * *</code>, \\u0442\\u043e \\u0441\\u043a\\u0430\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0437\\u0430\\u043f\\u0443\\u0441\\u043a\\u0430\\u0442\\u044c\\u0441\\u044f \\u043f\\u043e\\u0441\\u043b\\u0435 4 \\u0447\\u0430\\u0441\\u043e\\u0432 \\u0443\\u0442\\u0440\\u0430 \\u0432 <a onclick=\\\"toggleAllSettings()\\\" href=\\\"#TIMEZONE\\\"><code>TIMEZONE</code> \\u043a\\u043e\\u0442\\u043e\\u0440\\u044b\\u0439 \\u0432\\u044b \\u0443\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u0438\\u043b\\u0438 \\u0432\\u044b\\u0448\\u0435</a>. \\u0421\\u043a\\u0430\\u043d\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u0438\\u0435 \\u0431\\u0443\\u0434\\u0435\\u0442 \\u0437\\u0430\\u043f\\u0443\\u0441\\u043a\\u0430\\u0442\\u044c\\u0441\\u044f \\u0421\\u041b\\u0415\\u0414\\u0423\\u042e\\u0429\\u0418\\u0419 \\u0420\\u0410\\u0417, \\u043a\\u043e\\u0433\\u0434\\u0430 \\u043f\\u0440\\u043e\\u0439\\u0434\\u0435\\u0442 \\u044d\\u0442\\u043e \\u0432\\u0440\\u0435\\u043c\\u044f.\"}]}"
LUCIRPC_CMD='python3 /app/front/plugins/luci_import/script.py'
LUCIRPC_CMD__metadata="{\"function\": \"CMD\", \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"readonly\": \"true\"}], \"transformers\": []}]}, \"default_value\": \"python3 /app/front/plugins/luci_import/script.py\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Command\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Command to run. This can not be changed\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u041a\\u043e\\u043c\\u0430\\u043d\\u0434\\u0430 \\u0434\\u043b\\u044f \\u0437\\u0430\\u043f\\u0443\\u0441\\u043a\\u0430. \\u042d\\u0442\\u043e \\u043d\\u0435\\u0432\\u043e\\u0437\\u043c\\u043e\\u0436\\u043d\\u043e \\u0438\\u0437\\u043c\\u0435\\u043d\\u0438\\u0442\\u044c\"}]}"
LUCIRPC_RUN_TIMEOUT=30
LUCIRPC_RUN_TIMEOUT__metadata="{\"function\": \"RUN_TIMEOUT\", \"type\": {\"dataType\": \"integer\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"type\": \"number\"}], \"transformers\": []}]}, \"default_value\": 30, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Run timeout\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u0412\\u0440\\u0435\\u043c\\u044f \\u043e\\u0436\\u0438\\u0434\\u0430\\u043d\\u0438\\u044f \\u0432\\u044b\\u043f\\u043e\\u043b\\u043d\\u0435\\u043d\\u0438\\u044f\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Maximum time in seconds to wait for the script to finish. If this time is exceeded the script is aborted.\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u041c\\u0430\\u043a\\u0441\\u0438\\u043c\\u0430\\u043b\\u044c\\u043d\\u043e\\u0435 \\u0432\\u0440\\u0435\\u043c\\u044f \\u0432 \\u0441\\u0435\\u043a\\u0443\\u043d\\u0434\\u0430\\u0445, \\u0432 \\u0442\\u0435\\u0447\\u0435\\u043d\\u0438\\u0435 \\u043a\\u043e\\u0442\\u043e\\u0440\\u043e\\u0433\\u043e \\u043d\\u0443\\u0436\\u043d\\u043e \\u0436\\u0434\\u0430\\u0442\\u044c \\u0437\\u0430\\u0432\\u0435\\u0440\\u0448\\u0435\\u043d\\u0438\\u044f \\u0440\\u0430\\u0431\\u043e\\u0442\\u044b \\u0441\\u043a\\u0440\\u0438\\u043f\\u0442\\u0430. \\u0415\\u0441\\u043b\\u0438 \\u044d\\u0442\\u043e \\u0432\\u0440\\u0435\\u043c\\u044f \\u043f\\u0440\\u0435\\u0432\\u044b\\u0448\\u0435\\u043d\\u043e, \\u0441\\u043a\\u0440\\u0438\\u043f\\u0442 \\u043f\\u0440\\u0435\\u0440\\u044b\\u0432\\u0430\\u0435\\u0442\\u0441\\u044f.\"}]}"
LUCIRPC_host='192.168.0.1:4339'
LUCIRPC_host__metadata="{\"function\": \"host\", \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [], \"transformers\": []}]}, \"default_value\": \"192.168.1.1\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Router ip\"}, {\"language_code\": \"ru_ru\", \"string\": \"Ip \\u0430\\u0434\\u0440\\u0435\\u0441 \\u0440\\u043e\\u0443\\u0442\\u0435\\u0440\\u0430\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Router ip(do not include <code>http://</code> or <code>https://</code>).\"}, {\"language_code\": \"ru_ru\", \"string\": \"Ip \\u0430\\u0434\\u0440\\u0435\\u0441 \\u0440\\u043e\\u0443\\u0442\\u0435\\u0440\\u0430(\\u0431\\u0435\\u0437 <code>http://</code> \\u0438 <code>https://</code>).\"}]}"
LUCIRPC_user='root'
LUCIRPC_user__metadata="{\"function\": \"user\", \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [], \"transformers\": []}]}, \"default_value\": \"root\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Router user\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u0418\\u043c\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f \\u0434\\u043b\\u044f \\u043f\\u043e\\u0434\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u044f \\u043a \\u0440\\u043e\\u0443\\u0442\\u0435\\u0440\\u0443\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"User name used to login into your router.\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u0418\\u043c\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f \\u0434\\u043b\\u044f \\u043f\\u043e\\u0434\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u044f \\u043a \\u0440\\u043e\\u0443\\u0442\\u0435\\u0440\\u0443.\"}]}"
LUCIRPC_password='REDACTED'
LUCIRPC_password__metadata="{\"function\": \"password\", \"type\": {\"dataType\": \"string\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"type\": \"password\"}], \"transformers\": []}]}, \"default_value\": \"\", \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Router password\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u041f\\u0430\\u0440\\u043e\\u043b\\u044c \\u0440\\u043e\\u0443\\u0442\\u0435\\u0440\\u0430\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Password used to login into your router.\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u041f\\u0430\\u0440\\u043e\\u043b\\u044c \\u0434\\u043b\\u044f \\u043f\\u043e\\u0434\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u044f \\u043a \\u0440\\u043e\\u0443\\u0442\\u0435\\u0440\\u0443.\"}]}"
LUCIRPC_ssl=True
LUCIRPC_ssl__metadata="{\"function\": \"ssl\", \"type\": {\"dataType\": \"boolean\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"type\": \"checkbox\"}], \"transformers\": []}]}, \"default_value\": false, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Router SSL\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u0420\\u043e\\u0443\\u0442\\u0435\\u0440 SSL.\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"If your router enforces SSL connections.\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u0415\\u0441\\u043b\\u0438 \\u0440\\u043e\\u0443\\u0442\\u0435\\u0440 \\u043f\\u043e\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 SSL \\u043f\\u043e\\u0434\\u043a\\u043b\\u044e\\u0447\\u0435\\u043d\\u0438\\u0435.\"}]}"
LUCIRPC_verify_ssl=False
LUCIRPC_verify_ssl__metadata="{\"function\": \"verify_ssl\", \"type\": {\"dataType\": \"boolean\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"type\": \"checkbox\"}], \"transformers\": []}]}, \"default_value\": true, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Verify SSL\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u041f\\u0440\\u043e\\u0432\\u0435\\u0440\\u043a\\u0430 SSL\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"If SSL/TLS verification for HTTPS resources needs to be turned off (for self-signed certs, etc.)\"}, {\"language_code\": \"ru_ru\", \"string\": \"\\u0415\\u0441\\u043b\\u0438 \\u043d\\u0435\\u043e\\u0431\\u0445\\u043e\\u0434\\u0438\\u043c\\u043e \\u043e\\u0442\\u043a\\u043b\\u044e\\u0447\\u0438\\u0442\\u044c \\u043f\\u0440\\u043e\\u0432\\u0435\\u0440\\u043a\\u0443 SSL/TLS \\u0434\\u043b\\u044f \\u0440\\u0435\\u0441\\u0443\\u0440\\u0441\\u043e\\u0432 HTTPS (\\u0434\\u043b\\u044f \\u0441\\u0430\\u043c\\u043e\\u043f\\u043e\\u0434\\u043f\\u0438\\u0441\\u0430\\u043d\\u043d\\u044b\\u0445 \\u0441\\u0435\\u0440\\u0442\\u0438\\u0444\\u0438\\u043a\\u0430\\u0442\\u043e\\u0432 \\u0438 \\u0442. \\u0434.)\"}]}"
LUCIRPC_only_reachable=False
LUCIRPC_only_reachable__metadata="{\"function\": \"only_reachable\", \"type\": {\"dataType\": \"boolean\", \"elements\": [{\"elementType\": \"input\", \"elementOptions\": [{\"type\": \"checkbox\"}], \"transformers\": []}]}, \"default_value\": true, \"options\": [], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Only reachable\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"Retrieve only devices that are reachable.\"}]}"
LUCIRPC_SET_ALWAYS=['devMac','devLastIP']
LUCIRPC_SET_ALWAYS__metadata="{\"function\": \"SET_ALWAYS\", \"type\": {\"dataType\": \"array\", \"elements\": [{\"elementType\": \"select\", \"elementOptions\": [{\"multiple\": \"true\", \"ordeable\": \"true\"}], \"transformers\": []}]}, \"default_value\": [\"devMac\", \"devLastIP\"], \"options\": [\"devMac\", \"devLastIP\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Set always columns\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"These columns are treated as authoritative and will overwrite existing values, including those set by other plugins, unless the current value was explicitly set by the user (<code>Source = USER</code> or <code>Source = LOCKED</code>).\"}]}"
LUCIRPC_SET_EMPTY=[]
LUCIRPC_SET_EMPTY__metadata="{\"function\": \"SET_EMPTY\", \"type\": {\"dataType\": \"array\", \"elements\": [{\"elementType\": \"select\", \"elementOptions\": [{\"multiple\": \"true\", \"ordeable\": \"true\"}], \"transformers\": []}]}, \"default_value\": [], \"options\": [\"devMac\", \"devLastIP\", \"devSourcePlugin\"], \"localized\": [\"name\", \"description\"], \"name\": [{\"language_code\": \"en_us\", \"string\": \"Set empty columns\"}], \"description\": [{\"language_code\": \"en_us\", \"string\": \"These columns are only overwritten if they are empty (<code>NULL</code> / empty string) or if their Source is set to <code>NEWDEV</code>\"}]}"

docker-compose.yml

services:
  netalertx:
  #use an environmental variable to set host networking mode if needed
    container_name: netalertx                       # The name when you docker contiainer ls
    image: ghcr.io/jokob-sk/netalertx:latest
    network_mode: ${NETALERTX_NETWORK_MODE:-host}   # Use host networking for ARP scanning and other services

    read_only: true                                 # Make the container filesystem read-only
    cap_drop:                                       # Drop all capabilities for enhanced security
      - ALL
    cap_add:                                        # Add only the necessary capabilities
      - NET_ADMIN                                   # Required for ARP scanning
      - NET_RAW                                     # Required for raw socket operations
      - NET_BIND_SERVICE                            # Required to bind to privileged ports (nbtscan)
      - CHOWN                                       # Required for root-entrypoint to chown /data + /tmp before dropping privileges
      - SETUID                                      # Required for root-entrypoint to switch to non-root user
      - SETGID                                      # Required for root-entrypoint to switch to non-root group

    volumes:
     # - type: volume                                # Persistent Docker-managed named volume for config + database
     #   source: netalertx_data
     #   target: /data                               # `/data/config` and `/data/db` live inside this mount
     #   read_only: false

    # Example custom local folder called /home/user/netalertx_data
      - type: bind
        source: ./data
        target: /data
        read_only: false
    # ... or use the alternative format
    # - /home/user/netalertx_data:/data:rw

      - type: bind                                  # Bind mount for timezone consistency
        source: /etc/localtime
        target: /etc/localtime
        read_only: true

      # Mount your DHCP server file into NetAlertX for a plugin to access
      # - path/on/host/to/dhcp.file:/resources/dhcp.file

    # tmpfs mount consolidates writable state for a read-only container and improves performance
    # uid/gid default to the service user (NETALERTX_UID/GID, default 20211)
    # mode=1700 grants rwx------ permissions to the runtime user only
    tmpfs:
      # Comment out to retain logs between container restarts - this has a server performance impact.
      - "/tmp:uid=${NETALERTX_UID:-20211},gid=${NETALERTX_GID:-20211},mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"

      # Retain logs - comment out tmpfs /tmp if you want to retain logs between container restarts
      # Please note if you remove the /tmp mount, you must create and maintain sub-folder mounts.
      # - /path/on/host/log:/tmp/log
      # - "/tmp/api:uid=${NETALERTX_UID:-20211},gid=${NETALERTX_GID:-20211},mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
      # - "/tmp/nginx:uid=${NETALERTX_UID:-20211},gid=${NETALERTX_GID:-20211},mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
      # - "/tmp/run:uid=${NETALERTX_UID:-20211},gid=${NETALERTX_GID:-20211},mode=1700,rw,noexec,nosuid,nodev,async,noatime,nodiratime"
    dns:
      - 192.168.0.1
    environment:
      LISTEN_ADDR: ${LISTEN_ADDR:-0.0.0.0}                   # Listen for connections on all interfaces
      PORT: ${PORT:-20211}                                   # Application port
      GRAPHQL_PORT: ${GRAPHQL_PORT:-20212}                   # GraphQL API port (passed into APP_CONF_OVERRIDE at runtime)
      PUID: ${NETALERTX_UID:-20211} # Runtime UID after priming (Synology/no-copy-up safe)
      PGID: ${NETALERTX_GID:-20211}

  #    NETALERTX_DEBUG: ${NETALERTX_DEBUG:-0}                 # 0=kill all services and restart if any dies. 1 keeps running dead services.
  #    PUID: 20211                             # Runtime PUID override, set to 0 to run as root
  #    PGID: 20211                             # Runtime PGID override

    # Resource limits to prevent resource exhaustion
    mem_limit: 2048m            # Maximum memory usage
    mem_reservation: 1024m      # Soft memory limit
    cpu_shares: 512             # Relative CPU weight for CPU contention scenarios
    pids_limit: 512             # Limit the number of processes/threads to prevent fork bombs
    logging:
      driver: "json-file"       # Use JSON file logging driver
      options:
        max-size: "10m"         # Rotate log files after they reach 10MB
        max-file: "3"           # Keep a maximum of 3 log files

    # Always restart the container unless explicitly stopped
    restart: unless-stopped

#volumes:                        # Persistent volume for configuration and database storage
#  netalertx_data:

Debug or Trace enabled

  • I have read and followed the steps in the wiki link above and provided the required debug logs and the log section covers the time when the issue occurs.

Relevant app.log section

No response

Docker Logs

    
    * Creating Plugins log.

    * Creating System services run log.

    * Creating System services run tmp.

    * Creating DB locked log.

    * Creating Execution queue log.

--> apply conf override.sh 

--> writable config.sh 

--> nginx config.sh 

--> expected user id match.sh 

--> host mode network.sh 

--> excessive capabilities.sh 

--> appliance integrity.sh 

--> ports available.sh 

APP_CONF_OVERRIDE detected (set from GRAPHQL_PORT)

Starting /usr/sbin/php-fpm83 -y "/services/config/php/php-fpm.conf" -F (tee stderr to app.php_errors.log)

Starting supercronic --quiet "/services/config/cron/crontab" >>"/tmp/log/cron.log" 2>&1 &

Starting /usr/sbin/nginx -p "/tmp/run/" -c "/tmp/nginx/active-config/nginx.conf" -g "error_log stderr; error_log /tmp/log/nginx-error.log; daemon off;" &

Starting python3  -m server > /tmp/log/stdout.log 2> >(tee /tmp/log/stderr.log >&2)

Successfully updated IEEE OUI database (112965 entries)

Traceback (most recent call last):

  File "<frozen runpy>", line 198, in _run_module_as_main

  File "<frozen runpy>", line 88, in _run_code

  File "/app/server/__main__.py", line 260, in <module>

    sys.exit(main())

             ^^^^^^

  File "/app/server/__main__.py", line 135, in main

    pm.run_plugin_scripts("schedule")

  File "/app/server/plugin.py", line 102, in run_plugin_scripts

    execute_plugin(self.db, self.all_plugins, plugin)

  File "/app/server/plugin.py", line 711, in execute_plugin

    process_plugin_events(db, plugin, sqlParams)

  File "/app/server/plugin.py", line 1053, in process_plugin_events

    sql.executemany(q, sqlParams)

sqlite3.OperationalError: table CurrentScan has no column named cur_NAME

 _   _      _    ___  _           _  __   __

| \ | |    | |  / _ \| |         | | \ \ / /

|  \| | ___| |_/ /_\ \ | ___ _ __| |_ \ V /

| .   |/ _ \ __|  _  | |/ _ \  __| __|/   \

| |\  |  __/ |_| | | | |  __/ |  | |_/ /^\ \

\_| \_/\___|\__\_| |_/_|\___|_|   \__\/   \/

   Network intruder and presence detector.

   https://netalertx.com

Startup pre-checks

--> data migration.sh 

--> capabilities audit.sh 

--> mounts.py 

 Path                     | R | W | Mount | RAMDisk | Performance | DataLoss 

--------------------------+---+---+-------+---------+-------------+----------

 /data                    | ✅| ✅|   ✅  |    ➖   |      ➖     |    ✅     

 /data/db                 | ✅| ✅|   ✅  |    ➖   |      ➖     |    ✅     

 /data/config             | ✅| ✅|   ✅  |    ➖   |      ➖     |    ✅     

 /tmp/run/tmp             | ✅| ✅|   ✅  |    ✅   |      ✅     |    ✅     

 /tmp/api                 | ✅| ✅|   ✅  |    ✅   |      ✅     |    ✅     

 /tmp/log                 | ✅| ✅|   ✅  |    ✅   |      ✅     |    ✅     

 /tmp/run                 | ✅| ✅|   ✅  |    ✅   |      ✅     |    ✅     

 /tmp/nginx/active-config | ✅| ✅|   ✅  |    ✅   |      ✅     |    ✅     

--> first run config.sh 

--> first run db.sh 

--> mandatory folders.sh 

    * Creating NetAlertX log directory.

    * Creating NetAlertX API cache.

    * Creating System services runtime directory.

    * Creating nginx active configuration directory.

    * Creating Plugins log.

    * Creating System services run log.

    * Creating System services run tmp.

    * Creating DB locked log.

    * Creating Execution queue log.

--> apply conf override.sh 

--> writable config.sh 

--> nginx config.sh 

--> expected user id match.sh 

--> host mode network.sh 

--> excessive capabilities.sh 

--> appliance integrity.sh 

--> ports available.sh 

APP_CONF_OVERRIDE detected (set from GRAPHQL_PORT)

Starting /usr/sbin/php-fpm83 -y "/services/config/php/php-fpm.conf" -F (tee stderr to app.php_errors.log)

Starting supercronic --quiet "/services/config/cron/crontab" >>"/tmp/log/cron.log" 2>&1 &

Starting python3  -m server > /tmp/log/stdout.log 2> >(tee /tmp/log/stderr.log >&2)

Starting /usr/sbin/nginx -p "/tmp/run/" -c "/tmp/nginx/active-config/nginx.conf" -g "error_log stderr; error_log /tmp/log/nginx-error.log; daemon off;" &

Successfully updated IEEE OUI database (112965 entries)

Traceback (most recent call last):

  File "<frozen runpy>", line 198, in _run_module_as_main

  File "<frozen runpy>", line 88, in _run_code

  File "/app/server/__main__.py", line 260, in <module>

    sys.exit(main())

             ^^^^^^

  File "/app/server/__main__.py", line 135, in main

    pm.run_plugin_scripts("schedule")

  File "/app/server/plugin.py", line 102, in run_plugin_scripts

    execute_plugin(self.db, self.all_plugins, plugin)

  File "/app/server/plugin.py", line 711, in execute_plugin

    process_plugin_events(db, plugin, sqlParams)

  File "/app/server/plugin.py", line 1053, in process_plugin_events

    sql.executemany(q, sqlParams)

sqlite3.OperationalError: table CurrentScan has no column named cur_NAME

Metadata

Metadata

Assignees

No one assigned

    Labels

    Waiting for reply⏳Waiting for the original poster to respond, or discussion in progress.bug 🐛Something isn't workingnext release/in dev image 🚀This is coming in the next release or was already released if the issue is Closed.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions