1
0
forked from Tank/braga
This commit is contained in:
Татьяна Фарбер 2026-03-08 23:50:49 +04:00
parent d84e55d891
commit dbcedd2348
21 changed files with 1086 additions and 227 deletions

BIN
database/16 Normal file

Binary file not shown.

142
database/array.lua Normal file
View File

@ -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

BIN
database/cellar Normal file

Binary file not shown.

86
database/flatdb.lua Normal file
View File

@ -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
})

BIN
database/room Normal file

Binary file not shown.

54
database/sensors.lua Normal file
View File

@ -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

97
database/tanks.lua Normal file
View File

@ -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

View File

@ -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

21
front/archive.lua Normal file
View File

@ -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))

View File

@ -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

View File

@ -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

30
front/room.lua Normal file
View File

@ -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))

6
getcsv.sh Normal file
View File

@ -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

View File

@ -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"

View File

@ -1,3 +1,6 @@
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;
@ -19,6 +22,33 @@
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)$ {
access_log off;

View File

@ -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
}
}
}
});
}
});

3
tanks.csv Normal file
View File

@ -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
1 sensor_id Название емкости Объем емкости Дата постановки на брожение Объем сока Начальная масса добавленного меда Начальная масса добавленной фруктозы Начальная масса добавленной декстрозы Начальная масса добавленных полисахаров PH Сахаристость Дата снятия с осадка Дата постановки на повторное брожение Дата повторного снятия с осадка Дата купажа Дата добавления фруктозы Масса добавления фруктозы Дата добавления декстрозы Масса добавления декстрозы Дата добавления полисахаров Масса добавления полисахаров Комментарии Архив
2 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
3 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

36
templates/archive.html Normal file
View File

@ -0,0 +1,36 @@
<section class="container">
<div class="columns is-multiline">
<div class="column is-12">
<h1 class="title">{{title}}</h1>
</div>
</div>
<div class="section">
<div class="columns is-multiline">
{% for id,tank in pairs(tanks) do %}
<div class="column is-half">
<h3 class="title is-4"><i class="fa fa-flask fa-fw" aria-hidden="true"></i><span class="tag {{tank.status}} is-large"><a class="full-info has-text-black" data-id="{{id}}">{{tank.name.value}}</a></span><span class="tag is-info has-text-black is-large is-pulled-right">PH: {{tank.ph.value}}</span></h3>
<div class="notification {{tank.notification.typ}}">{{tank.notification.text}}</div>
<div>
<canvas id="daystats{{id}}" data-labels='[{% for key, record in pairs(tank.stat) do %}"{{record.date}}"{% if key ~= #tank.stat then %},{% end end %}]' data-vals='[{% for key, record in pairs(tank.stat) do %}{{record.temp}}{% if key ~= #tank.stat then %},{% end end %}]'></canvas>
</div>
<br/>
<div class="tags">
<span class="tag is-info has-text-black is-large is-pulled-right">{{tank.date_start.value}}</span>
<span class="tag is-success has-text-black is-large is-pulled-right">{{tank.volume.value}} л</span>
<span class="tag is-success has-text-black is-large is-pulled-right">С-р: {{tank.sugar.value}}%</span>
<span class="tag is-light has-text-black is-large is-pulled-right">{{tank.date_end.value}}</span>
</div>
<div id="info{{id}}" class="is-hidden">
<ul class="tank-data">
{% for key,val in pairs(tank) do
if val.text and val.order then %}
<li style="border-bottom: 1px dotted white" data-order="{{val.order}}">{{val.text}} <span class="is-pulled-right"><b>{{val.value}}</b></span></li>
{% end end %}
</ul>
</div>
</div>
{% end %}
</div>
</div>
</section>

31
templates/climate.html Normal file
View File

@ -0,0 +1,31 @@
<section class="container">
<div class="columns is-multiline">
<div class="column is-12">
<h1 class="title">{{title}}</h1>
<p>Период: <span class="has-text-warning is-size-5">{{start}} - {{ends}}</span></p>
<section class="block">
<form method="POST">
<div class="field is-grouped">
<p class="control">
<input class="input" id="dater" type="text" data-start="{{start}}" data-end="{{ends}}" name="datetimes" value="{{start}}|{{ends}}">
</p>
<p class="control">
<button class="button" name="submit" type="submit" class="is-danger">Выбрать</button>
</p>
</div>
</form>
</section>
</div>
</div>
<div class="section">
<div class="columns is-multiline">
<div class="column is-half">
<canvas id="climate1" data-labels='[{% for key, record in pairs(data) do %}"{{record.date}}"{% if key ~= #data then %},{% end end %}]' data-vals='[{% for key, record in pairs(data) do %}{{record.temp}}{% if key ~= #data then %},{% end end %}]'></canvas>
</div>
<div class="column is-half">
<canvas id="climate2" data-labels='[{% for key, record in pairs(data) do %}"{{record.date}}"{% if key ~= #data then %},{% end end %}]' data-vals='[{% for key, record in pairs(data) do %}{{record.warm}}{% if key ~= #data then %},{% end end %}]'></canvas>
</div>
</div>
</div>
</section>

View File

@ -1,6 +1,6 @@
<section class="container">
<div class="columns is-multiline">
<div class="column is-8">
<div class="column is-12">
<h1 class="title">{{title}}</h1>
<p>Период: <span class="has-text-warning is-size-5">{{start}} - {{ends}}</span></p>
<section class="block">
@ -16,91 +16,34 @@
</form>
</section>
</div>
<div class="column is-4">
Подвал: <span class="tag {{cellar.temp_status}} is-large"><i class="fa fa-thermometer-three-quarters fa-fw" aria-hidden="true"></i>{{cellar.temp}}</span>
<span class="tag {{cellar.warm_status}} is-large"><i class="fa fa-tint fa-fw" aria-hidden="true"></i>{{cellar.warm}}</span>
<hr/>
Бродня: <span class="tag {{room.temp_status}} is-large"><i class="fa fa-thermometer-three-quarters fa-fw" aria-hidden="true"></i>{{room.temp}}</span>
<span class="tag {{room.warm_status}} is-large"><i class="fa fa-tint fa-fw" aria-hidden="true"></i>{{room.warm}}</span>
</div>
</div>
<div class="section">
<div class="section">
<div class="columns is-multiline">
{% for id,tank in pairs(tanks) do %}
<div class="column is-half">
<h3 class="title is-4"><i class="fa fa-flask fa-fw" aria-hidden="true"></i><span class="tag {{tank.status}} is-large"><a class="full-info has-text-black" data-id="2">11 - квас на березовом соке</a></span><span class="tag is-info has-text-black is-large is-pulled-right">PH: 3.1</span></h3>
<div class="notification is-danger">Пора добавить фруктозу в объеме 250 грамм</div>
<h3 class="title is-4"><i class="fa fa-flask fa-fw" aria-hidden="true"></i><span class="tag {{tank.status}} is-large"><a class="full-info has-text-black" data-id="{{id}}">{{tank.name.value}}</a></span><span class="tag is-info has-text-black is-large is-pulled-right">PH: {{tank.ph.value}}</span></h3>
<div class="notification {{tank.notification.typ}}">{{tank.notification.text}}</div>
<div>
<canvas id="daystats" data-labels='[{% for key, record in pairs(stat) do %}"{{record.day}}"{% if key ~= #stat then %},{% end end %}]' data-vals='[{% for key, record in pairs(stat) do %}{{record.temp}}{% if key ~= #stat then %},{% end end %}]'></canvas>
<canvas id="daystats{{id}}" data-labels='[{% for key, record in pairs(tank.stat) do %}"{{record.date}}"{% if key ~= #tank.stat then %},{% end end %}]' data-vals='[{% for key, record in pairs(tank.stat) do %}{{record.temp}}{% if key ~= #tank.stat then %},{% end end %}]'></canvas>
</div>
<br/>
<div class="tags">
<span class="tag is-info has-text-black is-large is-pulled-right">02.03.2026</span>
<span class="tag is-success has-text-black is-large is-pulled-right">25 л</span>
<span class="tag is-success has-text-black is-large is-pulled-right">С-р: 12%</span>
<span class="tag is-light has-text-black is-large is-pulled-right">02.03.2026</span>
<span class="tag is-info has-text-black is-large is-pulled-right">{{tank.date_start.value}}</span>
<span class="tag is-success has-text-black is-large is-pulled-right">{{tank.volume.value}} л</span>
<span class="tag is-success has-text-black is-large is-pulled-right">С-р: {{tank.sugar.value}}%</span>
<span class="tag is-light has-text-black is-large is-pulled-right">{{tank.date_end.value}}</span>
</div>
<div id="info2" class="is-hidden">
<ul>
<li>Объем сусла: </li>
<li>Объем сока: </li>
<li>Начальная масса добавленного меда: </li>
<li>Начальная масса добавленной фруктозы: </li>
<li>Начальная масса добавленной декстрозы: </li>
<li>Начальная масса добавленных полисахаров: </li>
<li>Сахаристость: </li>
<li>Дата постановки на брожение: </li>
<li>Дата снятия с осадка: </li>
<li>Дата постановки на повторное брожение: </li>
<li>Дата повторного снятия с осадка: </li>
<li>Дата купажа: </li>
<li>Масса добавления фруктозы: </li>
<li>Дата добавления фруктозы: </li>
<li>Масса добавления декстрозы: </li>
<li>Дата добавления декстрозы: </li>
<li>Масса добавления полисахаров: </li>
<li>Дата добавления полисахаров: </li>
<div id="info{{id}}" class="is-hidden">
<ul class="tank-data">
{% for key,val in pairs(tank) do
if val.text and val.order then %}
<li style="border-bottom: 1px dotted white" data-order="{{val.order}}">{{val.text}} <span class="is-pulled-right"><b>{{val.value}}</b></span></li>
{% end end %}
</ul>
</div>
</div>
<div class="column is-half">
<h3 class="title is-4"><i class="fa fa-flask fa-fw" aria-hidden="true"></i><span class="tag {{tank.status}} is-large"><a class="full-info has-text-black" data-id="2">12 - медовуха крепкая полусладкая</a></span><span class="tag is-info has-text-black is-large is-pulled-right">PH: 3.4</span></h3>
<div class="notification is-success">Брожение протекает нормально</div>
<div>
<canvas id="daystats1" data-labels='[{% for key, record in pairs(stat) do %}"{{record.day}}"{% if key ~= #stat then %},{% end end %}]' data-vals='[{% for key, record in pairs(stat) do %}{{record.temp}}{% if key ~= #stat then %},{% end end %}]'></canvas>
</div>
<br/>
<div class="tags">
<span class="tag is-info has-text-black is-large is-pulled-right">04.03.2026</span>
<span class="tag is-success has-text-black is-large is-pulled-right">28 л</span>
<span class="tag is-success has-text-black is-large is-pulled-right">С-р: 22%</span>
<span class="tag is-light has-text-black is-large is-pulled-right">22.03.2026</span>
</div>
<div id="info2" class="is-hidden">
<ul>
<li>Объем сусла: </li>
<li>Объем сока: </li>
<li>Начальная масса добавленного меда: </li>
<li>Начальная масса добавленной фруктозы: </li>
<li>Начальная масса добавленной декстрозы: </li>
<li>Начальная масса добавленных полисахаров: </li>
<li>Сахаристость: </li>
<li>Дата постановки на брожение: </li>
<li>Дата снятия с осадка: </li>
<li>Дата постановки на повторное брожение: </li>
<li>Дата повторного снятия с осадка: </li>
<li>Дата купажа: </li>
<li>Масса добавления фруктозы: </li>
<li>Дата добавления фруктозы: </li>
<li>Масса добавления декстрозы: </li>
<li>Дата добавления декстрозы: </li>
<li>Масса добавления полисахаров: </li>
<li>Дата добавления полисахаров: </li>
</ul>
{% end %}
</div>
</div>
</div>
</div>
</section>

View File

@ -15,16 +15,6 @@
<!-- JQuery UI -->
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<style>
/* Стили полей */
label {margin-bottom: 0.5rem;}
.field {margin-bottom: 1.5rem;}
.select, .control.is-expanded {width: 100%;}
button.delete {background-color: red !important; color: white !important;}
/* Ползунки */
.slider-range {margin: 1rem 0;}
</style>
</head>
<body>
@ -57,10 +47,24 @@
Мои чаны
</p>
<ul class="menu-list">
<li><a href="/">Бродильные емкости</a></li>
<li><a href="/users">Добавить новую</a></li>
<li><a href="/config">Конфигурация</a></li>
<li><a href="/">Активные чаны</a></li>
<li><a href="/archive">Архивные чаны</a></li>
</ul>
<p class="menu-label">
Бродильня
</p>
<ul class="menu-list">
<li>
<a href="/room"><span class="tag {{room.temp_status}} is-large"><i class="fa fa-thermometer-three-quarters fa-fw" aria-hidden="true"></i>{{room.temp}}</span></a>
<a href="/room"><span class="tag {{room.warm_status}} is-large"><i class="fa fa-tint fa-fw" aria-hidden="true"></i>{{room.warm}}</span></a>
</li>
<p class="menu-label">
Подвал
</p>
<li>
<a href="/cellar"><span class="tag {{cellar.temp_status}} is-large"><i class="fa fa-thermometer-three-quarters fa-fw" aria-hidden="true"></i>{{cellar.temp}}</span></a>
<a href="/cellar"><span class="tag {{cellar.warm_status}} is-large"><i class="fa fa-tint fa-fw" aria-hidden="true"></i>{{cellar.warm}}</span></a>
</li>
</nav>
</aside>
<main class="column main">