From dbcedd23482e99f41495d5eb441674c953e02eaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B0=D1=82=D1=8C=D1=8F=D0=BD=D0=B0=20=D0=A4=D0=B0?= =?UTF-8?q?=D1=80=D0=B1=D0=B5=D1=80?= Date: Sun, 8 Mar 2026 23:50:49 +0400 Subject: [PATCH] front --- database/16 | Bin 0 -> 47 bytes database/array.lua | 142 ++++++++++++ database/cellar | Bin 0 -> 84 bytes database/flatdb.lua | 86 +++++++ database/room | Bin 0 -> 84 bytes database/sensors.lua | 54 +++++ database/tanks.lua | 97 ++++++++ framework/auth.lua | 116 ---------- front/archive.lua | 21 ++ front/{add.lua => cellar.lua} | 10 +- front/index.lua | 17 +- front/room.lua | 30 +++ getcsv.sh | 6 + logs/error.log | 424 ++++++++++++++++++++++++++++++++++ nginx.conf | 34 ++- public/js/bulma.js | 67 ++++++ tanks.csv | 3 + templates/archive.html | 36 +++ templates/climate.html | 31 +++ templates/index.html | 109 +++------ templates/layout.html | 30 +-- 21 files changed, 1086 insertions(+), 227 deletions(-) create mode 100644 database/16 create mode 100644 database/array.lua create mode 100644 database/cellar create mode 100644 database/flatdb.lua create mode 100644 database/room create mode 100644 database/sensors.lua create mode 100644 database/tanks.lua delete mode 100644 framework/auth.lua create mode 100644 front/archive.lua rename front/{add.lua => cellar.lua} (63%) create mode 100644 front/room.lua create mode 100644 getcsv.sh create mode 100644 tanks.csv create mode 100644 templates/archive.html create mode 100644 templates/climate.html diff --git a/database/16 b/database/16 new file mode 100644 index 0000000000000000000000000000000000000000..c04f60f66c959d7bff08211256e0e5d5acfeee37 GIT binary patch literal 47 hcmbQ#v?L|5Bz2XMfsvW6frYMt@sg6%+yVw1!T^=W5CH%H literal 0 HcmV?d00001 diff --git a/database/array.lua b/database/array.lua new file mode 100644 index 0000000..da620a2 --- /dev/null +++ b/database/array.lua @@ -0,0 +1,142 @@ +local _M = {} + +function _M.keys(t) + local keys = {} + for key,_ in pairs(t) do + table.insert(keys, key) + end + return keys +end + +function _M.count(t) + local count = 0 + for key,_ in pairs(t) do + count = count + 1 + end + return count +end + +function _M.first(t) + for key,val in pairs(t) do + return key,val + end +end + +function _M.merge(...) + local arg = {...} + if not arg[1] then return nil end + for i,v in ipairs(arg) do + for key,val in pairs(arg[i]) do + arg[1][key] = val + end + end + return arg[1] +end + +function _M.sort(t) + table.sort(t) + return _M.values(t) +end + +function _M.values(t) + local results = {} + for k,v in pairs(t) do + table.insert(results,v) + end + return results +end + +function _M.sort_by_keys(t) + local keys = {} + local results = {} + for k,v in pairs(t) do + table.insert(keys,k) + end + table.sort(keys) + for k,v in pairs(keys) do + table.insert(results,t[k]) + end + return results +end + +function _M.ordnung(t) + local res = {} + for key,val in pairs(t) do + if val.order then + res[val.order] = {} + res[val.order][key] = val + else table.insert(res,t[key]) end + end + return res +end + +function _M.minkey(t) + local a = {} + for n in pairs(t) do table.insert(a, n) end + table.sort(a) + return a[1] +end + +function _M.in_array(t,val) + for _,v in ipairs(t) do + if v == val then return true end + end + return false +end + +function _M.implode(t,before,after,sep) + local result = '' + local count = _M.count(t) + for key,val in pairs(t) do + result = result..before..val..after + if key < count then result = result..sep end + end + return result +end + +function _M.binary_search(arr, target) + local left = 1 + local right = #arr + while left <= right do + local mid = math.floor((left + right) / 2) + if arr[mid] == target then + return mid + elseif arr[mid] < target then + left = mid + 1 + else + right = mid - 1 + end + end + return nil +end + +function _M.explode(t,delimiter) + local result = { } + local from = 1 + local delim_from, delim_to = string.find(t, '%'..delimiter, from ) + while delim_from do + table.insert( result, string.sub(t, from , delim_from-1 ) ) + from = delim_to + 1 + delim_from, delim_to = string.find(t, '%'..delimiter, from ) + end + table.insert( result, string.sub(t, from ) ) + return result +end + +function _M.clear(t) + local result = {} + for key,data in pairs(t) do + if data ~= nil then table.insert(result,data) end + end + return result +end + +function _M.blank(t,default) + local results = {} + for _,v in ipairs(t) do + results[''..v] = default + end + return results +end + +return _M diff --git a/database/cellar b/database/cellar new file mode 100644 index 0000000000000000000000000000000000000000..03ec03280774f84a0134269cdfe94ab0c4dad899 GIT binary patch literal 84 zcmbQ(x+EpBBz3cqfsvW6fw8WEg@Tc>m9c@9iN%ug#G+h=)gUsyxFoTpw0LD^v2IFY cUV3WL>XOvl0;uRJpeRsLUS?kU5|A(h00_q*4FCWD literal 0 HcmV?d00001 diff --git a/database/flatdb.lua b/database/flatdb.lua new file mode 100644 index 0000000..b21f1e7 --- /dev/null +++ b/database/flatdb.lua @@ -0,0 +1,86 @@ +local mp = require("MessagePack") + +local function isFile(path) + local f = io.open(path, "r") + if f then + f:close() + return true + end + return false +end + +local function isDir(path) + path = string.gsub(path.."/", "//", "/") + local ok, err, code = os.rename(path, path) + if ok or code == 13 then + return true + end + return false +end + +local function load_page(path) + local ret + local f = io.open(path, "rb") + if f then + ret = mp.unpack(f:read("*a")) + f:close() + end + return ret +end + +local function store_page(path, page) + if type(page) == "table" then + local f = io.open(path, "wb") + if f then + f:write(mp.pack(page)) + f:close() + return true + end + end + return false +end + +local pool = {} + +local db_funcs = { + save = function(db, p) + if p then + if type(p) == "string" and type(db[p]) == "table" then + return store_page(pool[db].."/"..p, db[p]) + else + return false + end + end + for p, page in pairs(db) do + if not store_page(pool[db].."/"..p, page) then + return false + end + end + return true + end +} + +local mt = { + __index = function(db, k) + if db_funcs[k] then return db_funcs[k] end + if k and pool[db] and isFile(pool[db].."/"..k) then + db[k] = load_page(pool[db].."/"..k) + end + return rawget(db, k) + end +} + +pool.hack = db_funcs + +return setmetatable(pool, { + __mode = "kv", + __call = function(pool, path) + assert(isDir(path), path.." is not a directory.") + if pool[path] then return pool[path] end + local db = {} + setmetatable(db, mt) + pool[path] = db + pool[db] = path + return db + end +}) diff --git a/database/room b/database/room new file mode 100644 index 0000000000000000000000000000000000000000..03ec03280774f84a0134269cdfe94ab0c4dad899 GIT binary patch literal 84 zcmbQ(x+EpBBz3cqfsvW6fw8WEg@Tc>m9c@9iN%ug#G+h=)gUsyxFoTpw0LD^v2IFY cUV3WL>XOvl0;uRJpeRsLUS?kU5|A(h00_q*4FCWD literal 0 HcmV?d00001 diff --git a/database/sensors.lua b/database/sensors.lua new file mode 100644 index 0000000..ef6f634 --- /dev/null +++ b/database/sensors.lua @@ -0,0 +1,54 @@ +local array = require("database.array") +local flatdb = require('database.flatdb') +local date = require('date') +local db = flatdb(ngx.var.document_root..'/database') + +local _M = {} + +_M.cellar = {} + +_M.room = {} + +if not db.cellar then + db.cellar = {{temp=0, date = os.date('%Y-%m-%d %H:%M:%S'), warm=0, warm_status='is-danger',temp_status='is-warning'}} + db:save() +end + +if not db.room then + db.room = {{temp=0, date = os.date('%Y-%m-%d %H:%M:%S'), warm=0, warm_status='is-danger',temp_status='is-warning'}} + db:save() +end + +function _M.cellar.now() + return db.cellar[#db.cellar] +end + +function _M.cellar.data(start,ends) + if not start then start = date(start) else start = date():addhours(-24) end + if not ends then ends = date(ends) else ends = date() end + local res = {} + for key,val in pairs(db.cellar) do + if date(val.date) >= start and date(val.date) <= ends then + table.insert(res,val) + end + end + return res +end + +function _M.room.now() + return db.room[#db.room] +end + +function _M.room.data(start,ends) + if not start then start = date(start) else start = date():addhours(-24) end + if not ends then ends = date(ends) else ends = date() end + local res = {} + for key,val in pairs(db.room) do + if date(val.date) >= start and date(val.date) <= ends then + table.insert(res,val) + end + end + return res +end + +return _M diff --git a/database/tanks.lua b/database/tanks.lua new file mode 100644 index 0000000..5c45408 --- /dev/null +++ b/database/tanks.lua @@ -0,0 +1,97 @@ +local array = require("database.array") +local flatdb = require('database.flatdb') +local date = require('date') +local db = flatdb(ngx.var.document_root..'/database') + +local _M = {} + +local fields = { + {sensor_id = 'ID сенсора'}, + {name = 'Название емкости'}, + {volume = 'Объем емкости'}, + {date_start = 'Дата постановки на брожение'}, + {raw_volume = 'Объем сока'}, + {honey_weight = 'Начальная масса добавленного меда'}, + {fructose_weight = 'Начальная масса добавленной фруктозы'}, + {dextrose_weight = 'Начальная масса добавленной декстрозы'}, + {polisugar_weight = 'Начальная масса добавленных полисахаров'}, + {ph = 'PH'}, + {sugar = 'Сахаристость'}, + {date_end = 'Дата снятия с осадка'}, + {date_restart = 'Дата постановки на повторное брожение'}, + {date_reend = 'Дата повторного снятия с осадка'}, + {date_blending = 'Дата купажа'}, + {date_fructose_add = 'Дата добавления фруктозы'}, + {add_fructose_weight = 'Масса добавляемой фруктозы'}, + {date_dextrose_add = 'Дата добавления декстрозы'}, + {add_dextrose_weight = 'Масса добавляемой декстрозы'}, + {date_polisugar_add = 'Дата добавления полисахаров'}, + {add_polisugar_weight = 'Масса добавляемых полисахаров'}, + {comment = 'Комментарии'}, + {archive = 'Архивная емкость'} +} + +local count = 0 + +local results = {} + +for line in io.lines(ngx.var.document_root..'/tanks.csv') do + if count>0 then + local data = array.explode(line,',') + results[count] = {notification = {typ = 'is-success', text = 'Брожение протекает нормально'}, status = 'is-primary'} + for n,value in pairs(data) do + local key,text = array.first(fields[n]) + if key:find('date_') and value ~='' and pcall(date(),value) and date(value) < date() then + results[count].notification = {typ = 'is-danger', text = text} + end + results[count][key] = {value = value, text = text, order = n} + end + if not db[results[count].sensor_id.value] then + db[results[count].sensor_id.value] = { + {temp = 0, date = date():fmt('%Y-%d-%m')}, + {temp = 0, date = date():fmt('%Y-%d-%m')} + } + db:save() + end + results[count].stat = db[results[count].sensor_id.value] + if (results[count]['date_blending'].value ~= '' and pcall(date(),results[count]['date_blending'].value) and date(results[count]['date_blending'].value) < date()) or (results[count]['date_end'].value ~= '' and date(results[count]['date_end'].value) < date()) then + results[count].status = 'is-success' + end + end + count = count + 1 +end + +function _M.all() + return results +end + +function _M.active(start,ends) + if not start then start = date(start) else start = date():addhours(-24) end + if not ends then ends = date(ends) else ends = date() end + local res = {} + for key,result in pairs(results) do + if result.archive and result.archive.value ~= '' and tonumber(result.archive.value) ~= 1 then + local stat = {} + for i,val in pairs(result.stat) do + if date(val.date) >= start and date(val.date) <= ends then + table.insert(stat,val) + end + end + result.stat = stat + table.insert(res,result) + end + end + return res +end + +function _M.archive() + local res = {} + for key,result in pairs(results) do + if (result.archive and result.archive.value ~= '' and tonumber(result.archive.value) == 1) or (result['date_blending'].value ~= '' and pcall(date(),result['date_blending'].value) and date(result['date_blending'].value) < date()) then + table.insert(res,result) + end + end + return res +end + +return _M diff --git a/framework/auth.lua b/framework/auth.lua deleted file mode 100644 index 19b6e7b..0000000 --- a/framework/auth.lua +++ /dev/null @@ -1,116 +0,0 @@ -local _M = {} -local resp = require('framework.resp') -local shell = require "resty.shell" -require("resty.session").init({ - remember = true, - audience = "proxy", - secret = "8UQW1fsdag", - storage = "cookie", -}) - -local login -local password - -local admin_login = 'nz8080' -local admin_password = 'WarWind.Ru' - -local error = {code = 400, error = 'Неизвестная ошибка авторизации'} - -local errors = { - NO_HEADER = {code = 400, error = 'Отсутствует заголовок для авторизации'}, - NO_BASIC = {code = 412, error = 'Неподдерживаемый тип авторизации'}, - NO_BASE = {code = 412, error = 'Неподдерживаемый тип строки авторизации'}, - NO_LOGIN = {code = 412, error = 'Не указан логин'}, - NO_PASSWORD = {code = 412, error = 'Не указан пароль'}, - BAD_LOGIN = {code = 403, error = 'Логин не верен'}, - BAD_PASSWORD = {code = 403, error = 'Пароль не верен'}, - BAD_USER = {code = 403, error = 'Пользователь не найден'}, - BAD_SALT = {code = 444, error = 'Неверный размер номера устройства'}, - BAD_SEED = {code = 444, error = 'Контрольная сумма не совпадает'}, -} - -local function seed(salt) - local ok, stdout, stderr, reason, status = - shell.run('/home/zoviet/lock/decode/decode '..salt, '', 3000, 128) - if not ok then - return false - end - return tonumber(stdout) -end - -function get_auth() - local auth = ngx.req.get_headers()['Authorization'] - if auth==nil then - error = errors.NO_HEADER - return false - end - auth = string.match(auth,'Basic (.+)') - if auth==nil then - error = errors.NO_BASIC - return false - end - auth = ngx.decode_base64(auth) - if auth==nil then - error = errors.NO_BASE - return false - end - login,password = string.match(auth,'(.+):(.+)') - if login == nil then - error = errors.NO_LOGIN - return false - end - if password == nil then - error = errors.NO_PASSWORD - return false - end - return true -end - -function _M.resp() - return resp(nil,error) -end - -function _M.error() - return error.error -end - --- Авторизация админа - -function _M.admin() - if not get_auth() then return false end - if admin_login ~= login then - error = errors.BAD_LOGIN - return false - end - if admin_password ~= password then - error = errors.BAD_PASSWORD - return false - end - return true -end - --- Авторизация админ-панели - -function _M.front(login,password) - if admin_login ~= login then - error = errors.BAD_LOGIN - return false - end - if admin_password ~= password then - error = errors.BAD_PASSWORD - return false - end - return true -end - --- Авторизация через сессии - -function _M.session() - local ses = require "resty.session".start() - print(ses:get("login")) - if _M.front(ses:get("login"),ses:get("password")) then return true end - require "resty.session".destroy() - ngx.redirect('/login') -end - -return _M diff --git a/front/archive.lua b/front/archive.lua new file mode 100644 index 0000000..b4322fb --- /dev/null +++ b/front/archive.lua @@ -0,0 +1,21 @@ +local template = require "resty.template" +local handle = require('framework.handle') +local tanks = require('database.tanks') + +local function resp(start,ends) + local view = template.new("archive.html", "layout.html") + view.title = "Мои архивные чаны" + view.cellar = {temp=12, warm=45, warm_status='is-danger',temp_status='is-warning'} + view.room = {temp=18, warm=45,warm_status='is-success',temp_status='is-warning'} + view.tanks = tanks.archive() + view:render() +end + +local request = { + GET = function() + resp() + end +} + +ngx.say(handle(request)) + diff --git a/front/add.lua b/front/cellar.lua similarity index 63% rename from front/add.lua rename to front/cellar.lua index a683404..6d75757 100644 --- a/front/add.lua +++ b/front/cellar.lua @@ -1,9 +1,15 @@ local template = require "resty.template" local handle = require('framework.handle') +local sensors = require('database.sensors') local function resp(start,ends) - local view = template.new("index.html", "layout.html") - view.title = "Бродильные емкости" + local view = template.new("climate.html", "layout.html") + view.start = start + view.ends = ends + view.title = "Микроклимат подвала" + view.data = sensors.cellar.data(start,ends) + view.cellar = sensors.cellar.now() + view.room = sensors.room.now() view:render() end diff --git a/front/index.lua b/front/index.lua index 82b96e1..6b002d5 100644 --- a/front/index.lua +++ b/front/index.lua @@ -1,21 +1,16 @@ local template = require "resty.template" local handle = require('framework.handle') +local tanks = require('database.tanks') +local sensors = require('database.sensors') local function resp(start,ends) local view = template.new("index.html", "layout.html") view.start = start view.ends = ends - view.title = "Мои чаны" - view.cellar = {temp=12, warm=45, warm_status='is-danger',temp_status='is-warning'} - view.room = {temp=18, warm=45,warm_status='is-success',temp_status='is-warning'} - view.stat = { - {temp = 16, day = '2026-03-02'}, - {temp = 17, day = '2026-03-03'}, - {temp = 18, day = '2026-03-04'}, - {temp = 17, day = '2026-03-05'}, - {temp = 15, day = '2026-03-06'} - } - view.tank = {status = 'is-primary'} + view.title = "Мои активные чаны" + view.cellar = sensors.cellar.now() + view.room = sensors.room.now() + view.tanks = tanks.active(start,ends) view:render() end diff --git a/front/room.lua b/front/room.lua new file mode 100644 index 0000000..39199fb --- /dev/null +++ b/front/room.lua @@ -0,0 +1,30 @@ +local template = require "resty.template" +local handle = require('framework.handle') +local sensors = require('database.sensors') + +local function resp(start,ends) + local view = template.new("climate.html", "layout.html") + view.start = start + view.ends = ends + view.title = "Микроклимат бродильни" + view.data = sensors.room.data(start,ends) + view.cellar = sensors.cellar.now() + view.room = sensors.room.now() + view:render() +end + +local request = { + POST = function() + ngx.req.read_body() + local args, err = ngx.req.get_post_args() + resp(string.match(args['datetimes'], "([%d-%s:]+)%s>%s([%d-%s:]+)")) + end, + GET = function() + local ends = os.date('%Y-%m-%d %H:%M:%S',os.time()+14400) + local start = os.date('%Y-%m-%d %H:%M:%S',os.time()-86400) + resp(start,ends) + end +} + +ngx.say(handle(request)) + diff --git a/getcsv.sh b/getcsv.sh new file mode 100644 index 0000000..06488ab --- /dev/null +++ b/getcsv.sh @@ -0,0 +1,6 @@ +curl -LJO \ +-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" \ +-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \ +'https://docs.google.com/spreadsheets/d/e/2PACX-1vQrEP1eukYo2fnNs5zsQgmZTcS1PzIDYL46Lw7un1_v70jP6mgBFqpjOJno9ic-W03PrlxsC3s3YiWA/pub?gid=0&single=true&output=csv' + +mv braga-1.csv tanks.csv diff --git a/logs/error.log b/logs/error.log index 68bfb3c..bddd803 100644 --- a/logs/error.log +++ b/logs/error.log @@ -462,3 +462,427 @@ coroutine 0: 2026/03/08 15:46:02 [error] 8789#0: *34 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" 2026/03/08 15:46:03 [error] 8788#0: *36 open() "/var/www/braga/installHook.js.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /installHook.js.map HTTP/1.1", host: "braga" 2026/03/08 15:52:18 [error] 8788#0: *38 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 20:36:13 [error] 3921#0: *1 lua entry thread aborted: runtime error: /var/www/braga/database/csv.lua:7: bad argument #1 to 'lines' (/var/www/bragatanks.csv: No such file or directory) +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 20:36:13 [error] 3921#0: *7 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 20:36:15 [error] 3921#0: *8 lua entry thread aborted: runtime error: /var/www/braga/database/csv.lua:7: bad argument #1 to 'lines' (/var/www/bragatanks.csv: No such file or directory) +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 20:36:43 [error] 3921#0: *9 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:18:24 [error] 3921#0: *10 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:21:55 [error] 3921#0: *11 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:22:05 [error] 3921#0: *12 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 21:22:20 [error] 3921#0: *14 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:23:00 [error] 3921#0: *14 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:24:26 [error] 3921#0: *14 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:24:58 [error] 3921#0: *14 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:26:29 [error] 3921#0: *14 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:40:19 [error] 3921#0: *15 lua entry thread aborted: runtime error: /usr/local/share/lua/5.1/date.lua:394: invalid date time value +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:45:11 [error] 3921#0: *16 lua entry thread aborted: runtime error: /usr/local/share/lua/5.1/date.lua:394: invalid date time value +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:47:12 [error] 3921#0: *17 lua entry thread aborted: runtime error: [string "context=... or {}..."]:112: attempt to index local 'record' (a number value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:48:11 [error] 3921#0: *18 lua entry thread aborted: runtime error: [string "context=... or {}..."]:112: attempt to index local 'record' (a number value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:48:35 [error] 3922#0: *23 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:48:57 [error] 3921#0: *25 lua entry thread aborted: runtime error: [string "context=... or {}..."]:112: attempt to index local 'record' (a number value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:49:36 [error] 3921#0: *26 lua entry thread aborted: runtime error: [string "context=... or {}..."]:115: attempt to get length of global 'stat' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:49:54 [error] 3921#0: *27 lua entry thread aborted: runtime error: [string "context=... or {}..."]:114: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:51:17 [error] 3921#0: *29 lua entry thread aborted: runtime error: [string "context=... or {}..."]:104: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:51:30 [error] 3921#0: *30 lua entry thread aborted: runtime error: [string "context=... or {}..."]:115: attempt to get length of global 'stat' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:51:31 [error] 3921#0: *31 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:51:47 [error] 3921#0: *32 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 21:51:47 [error] 3921#0: *31 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:51:58 [error] 3921#0: *32 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 21:51:59 [error] 3921#0: *31 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:52:14 [error] 3921#0: *31 lua entry thread aborted: runtime error: [string "context=... or {}..."]:112: attempt to index local 'record' (a number value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:52:14 [error] 3921#0: *33 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:54:19 [error] 3921#0: *34 lua entry thread aborted: runtime error: [string "context=... or {}..."]:114: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:54:19 [error] 3921#0: *35 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:54:20 [error] 3921#0: *35 lua entry thread aborted: runtime error: [string "context=... or {}..."]:114: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:54:20 [error] 3921#0: *36 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:55:26 [error] 3921#0: *36 lua entry thread aborted: runtime error: [string "context=... or {}..."]:115: attempt to get length of global 'stat' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:55:26 [error] 3921#0: *37 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:57:50 [error] 3921#0: *38 lua entry thread aborted: runtime error: error loading module 'database.tanks' from file '/var/www/braga/database/tanks.lua': + /var/www/braga/database/tanks.lua:60: '}' expected (to close '{' at line 58) near '{' +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:57:50 [error] 3921#0: *39 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:58:05 [error] 3921#0: *39 lua entry thread aborted: runtime error: [string "context=... or {}..."]:115: attempt to get length of global 'stat' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:58:05 [error] 3921#0: *40 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:58:45 [error] 3921#0: *40 lua entry thread aborted: runtime error: [string "context=... or {}..."]:121: bad argument #1 to 'pairs' (table expected, got nil) +stack traceback: +coroutine 0: + [C]: in function 'pairs' + [string "context=... or {}..."]:121: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:58:45 [error] 3921#0: *41 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 21:59:56 [error] 3921#0: *41 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 21:59:56 [error] 3921#0: *42 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:00:36 [error] 3921#0: *42 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:00:36 [error] 3921#0: *43 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:00:37 [error] 3921#0: *43 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:00:37 [error] 3921#0: *44 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:00:38 [error] 3921#0: *44 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:00:38 [error] 3921#0: *45 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:00:38 [error] 3921#0: *45 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:00:38 [error] 3921#0: *46 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:00:38 [error] 3921#0: *46 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:00:39 [error] 3921#0: *47 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:00:39 [error] 3921#0: *47 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:00:39 [error] 3921#0: *48 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:01:20 [error] 3921#0: *48 lua entry thread aborted: runtime error: [string "context=... or {}..."]:137: attempt to index field 'value' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:01:20 [error] 3921#0: *49 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:01:38 [error] 3921#0: *50 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:01:39 [error] 3921#0: *49 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:03:08 [error] 3921#0: *50 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:03:09 [error] 3921#0: *49 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:06:13 [error] 3921#0: *53 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:06:14 [error] 3921#0: *52 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:07:24 [error] 3921#0: *53 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:07:25 [error] 3921#0: *52 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:08:55 [error] 3921#0: *53 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:08:56 [error] 3921#0: *52 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:11:48 [error] 3921#0: *55 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:11:50 [error] 3921#0: *54 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:13:03 [error] 3921#0: *54 lua entry thread aborted: runtime error: [string "context=... or {}..."]:91: attempt to index field 'name' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:13:04 [error] 3921#0: *56 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:13:41 [error] 3921#0: *55 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:13:42 [error] 3921#0: *56 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:16:19 [error] 3921#0: *57 lua entry thread aborted: runtime error: [string "context=... or {}..."]:91: attempt to index field 'name' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:311: in function 'render' + /var/www/braga/front/index.lua:13: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:16:19 [error] 3921#0: *58 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:17:09 [error] 3921#0: *60 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:17:30 [error] 3921#0: *58 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:21:32 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:21:34 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:22:11 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:22:13 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:22:57 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:22:59 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:23:34 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:23:36 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:24:03 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:24:04 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:25:05 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:25:05 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:26:29 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:26:30 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:27:07 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:27:09 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:27:24 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:27:25 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:28:13 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:28:14 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:28:43 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:28:45 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:30:04 [error] 3921#0: *63 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:30:05 [error] 3921#0: *62 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:32:51 [error] 3921#0: *65 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:32:51 [error] 3921#0: *66 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:34:14 [error] 3921#0: *65 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:34:15 [error] 3921#0: *66 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:34:42 [error] 3921#0: *65 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:34:42 [error] 3921#0: *66 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:35:13 [error] 3921#0: *65 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:35:14 [error] 3921#0: *66 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:38:40 [error] 3921#0: *67 lua entry thread aborted: runtime error: /var/www/braga/database/array.lua:20: bad argument #1 to 'pairs' (table expected, got nil) +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:38:40 [error] 3921#0: *68 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:38:42 [error] 3921#0: *68 lua entry thread aborted: runtime error: /var/www/braga/database/array.lua:20: bad argument #1 to 'pairs' (table expected, got nil) +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:38:42 [error] 3921#0: *69 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:39:20 [error] 3921#0: *69 lua entry thread aborted: runtime error: /var/www/braga/database/array.lua:20: bad argument #1 to 'pairs' (table expected, got nil) +stack traceback: +coroutine 0: + [C]: in function 'require' + /var/www/braga/front/index.lua:3: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:39:20 [error] 3921#0: *70 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:40:21 [error] 3921#0: *71 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:40:22 [error] 3921#0: *70 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:44:34 [error] 3921#0: *74 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:44:36 [error] 3921#0: *73 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:44:47 [error] 3921#0: *73 lua entry thread aborted: runtime error: /var/www/braga/database/tanks.lua:83: bad argument #1 to 'insert' (table expected, got nil) +stack traceback: +coroutine 0: + [C]: in function 'insert' + /var/www/braga/database/tanks.lua:83: in function 'active' + /var/www/braga/front/index.lua:12: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 22:44:47 [error] 3921#0: *72 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:47:28 [error] 3921#0: *77 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:47:29 [error] 3921#0: *76 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:47:54 [error] 3921#0: *77 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:47:56 [error] 3921#0: *76 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:48:50 [error] 3921#0: *77 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:48:51 [error] 3921#0: *76 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:50:25 [error] 3921#0: *77 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:50:26 [error] 3921#0: *76 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:53:11 [error] 3921#0: *79 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:53:12 [error] 3921#0: *78 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:55:14 [error] 3921#0: *81 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:55:15 [error] 3921#0: *80 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:55:19 [error] 3921#0: *81 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:55:20 [error] 3921#0: *80 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:56:38 [error] 3921#0: *81 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:56:38 [error] 3921#0: *80 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 22:56:53 [error] 3921#0: *81 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 22:56:54 [error] 3921#0: *82 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:06:09 [error] 3921#0: *97 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:06:11 [error] 3921#0: *96 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:16:23 [error] 3921#0: *98 lua entry thread aborted: runtime error: invalid argument(s) +stack traceback: +coroutine 0: + [C]: in function 'addhours' + /var/www/braga/database/tanks.lua:80: in function 'active' + /var/www/braga/front/index.lua:12: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 23:16:24 [error] 3921#0: *99 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:18:09 [error] 3921#0: *99 lua entry thread aborted: runtime error: /usr/local/share/lua/5.1/date.lua:308: duplicate value: 8 +2026-08-03 Mar-03-%s +...........^ +stack traceback: +coroutine 0: + [C]: in function 'error' + /usr/local/share/lua/5.1/date.lua:308: in function 'error_dup' + /usr/local/share/lua/5.1/date.lua:312: in function 'setm' + /usr/local/share/lua/5.1/date.lua:343: in function 'fnil' + /usr/local/share/lua/5.1/date.lua:393: in function 'date_getdobj' + /usr/local/share/lua/5.1/date.lua:698: in function 'date' + /var/www/braga/database/tanks.lua:87: in function 'active' + /var/www/braga/front/index.lua:12: in function 'resp' + /var/www/braga/front/index.lua:25: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/index.lua:29: in main chunk, client: 127.0.0.1, server: braga, request: "GET / HTTP/1.1", host: "braga" +2026/03/08 23:18:09 [error] 3921#0: *100 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:19:39 [error] 3921#0: *101 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:19:40 [error] 3921#0: *100 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:20:33 [error] 3921#0: *101 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:20:34 [error] 3921#0: *100 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/archive" +2026/03/08 23:20:37 [error] 3921#0: *101 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:20:39 [error] 3921#0: *100 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:20:52 [error] 16268#0: *2 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:20:54 [error] 16268#0: *3 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:20:57 [error] 16268#0: *2 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:20:58 [error] 16268#0: *3 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/archive" +2026/03/08 23:21:04 [error] 16268#0: *2 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:21:05 [error] 16268#0: *3 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:30:50 [error] 16268#0: *6 open() "/var/www/braga/public/css/style.css.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /public/css/style.css.map HTTP/1.1", host: "braga" +2026/03/08 23:30:51 [error] 16268#0: *7 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:46:05 [error] 16271#0: *19 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:46:06 [error] 16268#0: *20 open() "/var/www/braga/installHook.js.map" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /installHook.js.map HTTP/1.1", host: "braga" +2026/03/08 23:47:41 [error] 16271#0: *19 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:47:44 [error] 16271#0: *19 lua entry thread aborted: runtime error: [string "context=... or {}..."]:67: attempt to index global 'room' (a nil value) +stack traceback: +coroutine 0: + [string "context=... or {}..."]: in function 'process' + /usr/local/share/lua/5.1/resty/template.lua:652: in function 'render' + /usr/local/share/lua/5.1/resty/template.lua:312: in function 'render' + /var/www/braga/front/room.lua:11: in function 'resp' + /var/www/braga/front/room.lua:23: in function 'transfer' + /var/www/braga/framework/handle.lua:7: in function 'handle' + /var/www/braga/front/room.lua:27: in main chunk, client: 127.0.0.1, server: braga, request: "GET /room HTTP/1.1", host: "braga", referrer: "http://braga/" +2026/03/08 23:47:44 [error] 16268#0: *18 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/room" +2026/03/08 23:49:59 [error] 16268#0: *22 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/room" +2026/03/08 23:50:08 [error] 16268#0: *22 open() "/var/www/braga/favicon.ico" failed (2: No such file or directory), client: 127.0.0.1, server: braga, request: "GET /favicon.ico HTTP/1.1", host: "braga", referrer: "http://braga/cellar" diff --git a/nginx.conf b/nginx.conf index 5485f01..8f5cc0f 100644 --- a/nginx.conf +++ b/nginx.conf @@ -1,4 +1,7 @@ - server { + lua_package_path "/var/www/blog/?.lua;/var/www/braga/?.lua;/var/www/appphotos/?.lua;/var/www/apihh/?.lua;;"; + lua_code_cache off; + + server { listen 80; server_name braga; root /var/www/braga; @@ -17,7 +20,34 @@ proxy_read_timeout 120; proxy_send_timeout 120; content_by_lua_file /var/www/braga/front/index.lua; - } + } + + location /archive { + default_type text/html; + add_header 'Access-Control-Allow-Origin' '*' always; + proxy_connect_timeout 140; + proxy_read_timeout 120; + proxy_send_timeout 120; + content_by_lua_file /var/www/braga/front/archive.lua; + } + + location /room { + default_type text/html; + add_header 'Access-Control-Allow-Origin' '*' always; + proxy_connect_timeout 140; + proxy_read_timeout 120; + proxy_send_timeout 120; + content_by_lua_file /var/www/braga/front/room.lua; + } + + location /cellar { + default_type text/html; + add_header 'Access-Control-Allow-Origin' '*' always; + proxy_connect_timeout 140; + proxy_read_timeout 120; + proxy_send_timeout 120; + content_by_lua_file /var/www/braga/front/cellar.lua; + } location ~* \.(?:css(\.map)?|js(\.map)?|yaml|ico|json|pdf|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ { diff --git a/public/js/bulma.js b/public/js/bulma.js index 4fb4f00..2a7ec76 100644 --- a/public/js/bulma.js +++ b/public/js/bulma.js @@ -72,5 +72,72 @@ $( document ).ready(function() { }); }); + $(".tank-data").each(function() { + // Внутри каждого отдельного списка сортируем его пункты + $(this).find("li").sort(function(a, b) { + // Преобразуем строку в число и сравниваем порядок + return parseInt($(a).attr("data-order"), 10) - parseInt($(b).attr("data-order"), 10); + }).appendTo(this); // Перемещаем отсортированные пункты обратно в этот же список + }); + + $('.full-info').click(function() { + var id = $(this).data('id') + if ($('#info'+id).hasClass('is-hidden')) { + $('#info'+id).removeClass('is-hidden') + } else { + $('#info'+id).addClass('is-hidden') + } + }); + + if($('#climate1').length){ + new Chart($('#climate1'), { + type: 'bar', + data: { + labels: $('#climate1').data('labels'), + datasets: [{ + label: 'Температура воздуха', + data: $('#climate1').data('vals'), + borderWidth: 1, + backgroundColor: [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 205, 86)' + ], + }] + }, + options: { + scales: { + y: { + beginAtZero: true + } + } + } + }); + + new Chart($('#climate2'), { + type: 'bar', + data: { + labels: $('#climate2').data('labels'), + datasets: [{ + label: 'Влажность', + data: $('#climate2').data('vals'), + borderWidth: 1, + backgroundColor: [ + 'rgb(255, 99, 132)', + 'rgb(54, 162, 235)', + 'rgb(255, 205, 86)' + ], + }] + }, + options: { + scales: { + y: { + beginAtZero: true + } + } + } + }); + } + }); diff --git a/tanks.csv b/tanks.csv new file mode 100644 index 0000000..fa6c035 --- /dev/null +++ b/tanks.csv @@ -0,0 +1,3 @@ +sensor_id,Название емкости,Объем емкости,Дата постановки на брожение,Объем сока,Начальная масса добавленного меда,Начальная масса добавленной фруктозы,Начальная масса добавленной декстрозы,Начальная масса добавленных полисахаров,PH,Сахаристость,Дата снятия с осадка,Дата постановки на повторное брожение,Дата повторного снятия с осадка,Дата купажа,Дата добавления фруктозы,Масса добавления фруктозы,Дата добавления декстрозы,Масса добавления декстрозы,Дата добавления полисахаров,Масса добавления полисахаров,Комментарии,Архив +16,Тестовая емкость,38,03-08-2026,20,5,0,0,0,3,12,17-08-2026,17-08-2026,31-08-2026,31-08-2026,08-08-2026,0,08-08-2026,0,08-08-2026,0,тест,0 +16,Отбродившая емкость,38,03-08-2026,20,5,0,0,0,3,12,17-08-2026,17-08-2026,31-08-2026,31-08-2026,08-08-2026,0,08-08-2026,0,08-08-2026,0,тест,1 \ No newline at end of file diff --git a/templates/archive.html b/templates/archive.html new file mode 100644 index 0000000..adc1114 --- /dev/null +++ b/templates/archive.html @@ -0,0 +1,36 @@ +
+
+
+

{{title}}

+
+
+ +
+
+ {% for id,tank in pairs(tanks) do %} +
+

{{tank.name.value}}PH: {{tank.ph.value}}

+
{{tank.notification.text}}
+
+ +
+
+
+ {{tank.date_start.value}} + {{tank.volume.value}} л + С-р: {{tank.sugar.value}}% + {{tank.date_end.value}} +
+ +
+ {% end %} +
+
+
diff --git a/templates/climate.html b/templates/climate.html new file mode 100644 index 0000000..e5f22a8 --- /dev/null +++ b/templates/climate.html @@ -0,0 +1,31 @@ +
+
+
+

{{title}}

+

Период: {{start}} - {{ends}}

+
+
+
+

+ +

+

+ +

+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
diff --git a/templates/index.html b/templates/index.html index 8b56859..b9604da 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,6 +1,6 @@
-
+

{{title}}

Период: {{start}} - {{ends}}

@@ -16,91 +16,34 @@
-
- Подвал: {{cellar.temp}} - {{cellar.warm}} -
- Бродня: {{room.temp}} - {{room.warm}} -
-
-
-
-

11 - квас на березовом сокеPH: 3.1

-
Пора добавить фруктозу в объеме 250 грамм
-
- -
-
-
- 02.03.2026 - 25 л - С-р: 12% - 02.03.2026 -
-
diff --git a/templates/layout.html b/templates/layout.html index 1d0fb5b..144a7ae 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -15,16 +15,6 @@ - @@ -57,10 +47,24 @@ Мои чаны

+ +