From 6ee12431465598c0529d9174eb82a2c5fb3cee25 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 11 Oct 2025 18:56:04 +0200 Subject: [PATCH 001/242] refactored routing service --- .gitignore | 1 + tracky/geo-services/docker-compose-local.yml | 40 +++ tracky/geo-services/docker-compose.yml | 26 +- tracky/src/firmware.go | 13 +- tracky/src/trackeroo/routes.go | 250 ++++++++++--------- 5 files changed, 206 insertions(+), 124 deletions(-) create mode 100644 tracky/geo-services/docker-compose-local.yml diff --git a/.gitignore b/.gitignore index 4629a8e1..61e90f93 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ trackeroo-backend/grafana trackeroo-backend/mongo/data nominatim-data osrm-data +overpass-data trackeroo-backend/redis mqtt_client tracky/docker-compose.yml diff --git a/tracky/geo-services/docker-compose-local.yml b/tracky/geo-services/docker-compose-local.yml new file mode 100644 index 00000000..4434595c --- /dev/null +++ b/tracky/geo-services/docker-compose-local.yml @@ -0,0 +1,40 @@ +services: + overpass: + image: wiktorn/overpass-api + container_name: overpass-italy + ports: + - "12345:80" + environment: + - OVERPASS_META=yes + - OVERPASS_MODE=init + - OVERPASS_PLANET_URL=http://download.geofabrik.de/europe/italy/centro-latest.osm.bz2-disabled + volumes: + - ./overpass-data:/db + nominatim: + image: mediagis/nominatim:4.4 + container_name: nominatim + ports: + - "8082:8080" + environment: + - PBF_URL=https://download.geofabrik.de/europe/italy/centro-latest.osm.pbf + - REPLICATION_URL=https://download.geofabrik.de/europe/italy/centro-updates + - NOMINATIM_PASSWORD=password + volumes: + - ./nominatim-data:/var/lib/postgresql/14/main + + osrm: + image: osrm/osrm-backend + container_name: osrm + ports: + - "5000:5000" + volumes: + - ./osrm-data:/data + command: > + sh -c " + if [ ! -f /data/centro-latest.osrm ]; then + osrm-extract -p /opt/car.lua /data/centro-latest.osm.pbf && + osrm-partition /data/centro-latest.osrm && + osrm-customize /data/centro-latest.osrm; + fi && + osrm-routed --algorithm mld /data/centro-latest.osrm + " diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index a8972f59..0ead2a3a 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -1,12 +1,24 @@ services: + overpass: + image: wiktorn/overpass-api + container_name: overpass-italy + ports: + - "12345:80" + environment: + - OVERPASS_META=yes + - OVERPASS_MODE=init + - OVERPASS_PLANET_URL=http://download.geofabrik.de/europe/italy-latest.osm.bz2-disabled + volumes: + - ./overpass-data:/db + nominatim: image: mediagis/nominatim:4.4 container_name: nominatim ports: - "8082:8080" environment: - - PBF_URL=https://download.geofabrik.de/europe/italy/centro-latest.osm.pbf - - REPLICATION_URL=https://download.geofabrik.de/europe/italy/centro-updates + - PBF_URL=https://download.geofabrik.de/europe/italy-latest.osm.pbf + - REPLICATION_URL=https://download.geofabrik.de/europe/italy-updates - NOMINATIM_PASSWORD=password volumes: - ./nominatim-data:/var/lib/postgresql/14/main @@ -20,10 +32,10 @@ services: - ./osrm-data:/data command: > sh -c " - if [ ! -f /data/centro-latest.osrm ]; then - osrm-extract -p /opt/car.lua /data/centro-latest.osm.pbf && - osrm-partition /data/centro-latest.osrm && - osrm-customize /data/centro-latest.osrm; + if [ ! -f /data/italy-latest.osrm ]; then + osrm-extract -p /opt/car.lua /data/italy-latest.osm.pbf && + osrm-partition /data/italy-latest.osrm && + osrm-customize /data/italy-latest.osrm; fi && - osrm-routed --algorithm mld /data/centro-latest.osrm + osrm-routed --algorithm mld /data/italy-latest.osrm " diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 60e92b39..921d4d02 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -100,10 +100,13 @@ func Init() { func Terminate() { taskManager.Shutdown(0) } - func Loop() { + rand.Seed(time.Now().UnixNano()) creds, _ := trackeroo.GetCredentials() deviceType := creds.DeviceType + cities := []string{"Pisa", "Lucca", "Firenze", "Livorno", "Pontedera", "Viareggio", "Siena"} + // streetProvider := trackeroo.NewCachedStreetProvider("http://localhost:12345/api/interpreter") + streetProvider := trackeroo.NewCachedStreetProvider("https://overpass-api.de/api/interpreter") routingService := trackeroo.NewRoutingService( os.Getenv("GEOCODING_SERVICE_URL"), os.Getenv("ROUTING_SERVICE_URL"), @@ -126,8 +129,12 @@ func Loop() { consumptionVar := trackeroo.NewStatVar[float64]() for { trackeroo.Info("Getting route from %s", lastEnd) - route := trackeroo.GetRoute(lastEnd) - trackeroo.Info("Route: %+v", route) + route, err := trackeroo.GetRoute(streetProvider, cities, lastEnd) + if err != nil { + trackeroo.Error("Error getting route %v", err) + continue + } + trackeroo.Info("Route: %+v -> %+v", route[0], route[1]) drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, route, 60, 100, isPirate, creds.DeviceType) if err != nil { trackeroo.Error("Error initializing driving simulator %v", err) diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 325d8377..043906d9 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -1,126 +1,148 @@ package trackeroo -import "math/rand" - -var streets = []string{ - // Pisa (56127) - "Piazza dei Cavalieri, Pisa, Italy, 56126", - "Borgo Stretto, Pisa, Italy, 56127", - "Via San Frediano, Pisa, Italy, 56126", - "Lungarno Mediceo, Pisa, Italy, 56127", - "Via San Martino, Pisa, Italy, 56125", - "Via di Gargalone, Pisa, Italy, 56127", - "Via Asmara, Pisa, Italy, 56127", - "Via Putignano, Pisa, Italy, 56127", - "Via Fagiana, Pisa, Italy, 56127", - "Via Santa Bona, Pisa, Italy, 56127", - - // Lucca (55100) - "Via Fillungo, Lucca, Italy, 55100", - "Piazza Napoleone, Lucca, Italy, 55100", - "Via Santa Croce, Lucca, Italy, 55100", - "Via San Paolino, Lucca, Italy, 55100", - "Via Guinigi, Lucca, Italy, 55100", - "Via del Cimitero, Lucca, Italy, 55100", - "Via di Vicopelago, Lucca, Italy, 55100", - "Via dei Bollori, Lucca, Italy, 55100", - "Via delle Fornacette, Lucca, Italy, 55100", - "Via Stefano Tofanelli, Lucca, Italy, 55100", - - // Firenze (50123) - "Via dei Calzaiuoli, Firenze, Italy, 50123", - "Via Tornabuoni, Firenze, Italy, 50123", - "Borgo San Lorenzo, Firenze, Italy, 50123", - "Via della Vigna Nuova, Firenze, Italy, 50123", - "Via Ghibellina, Firenze, Italy, 50122", - "Via del Gelsomino, Firenze, Italy, 50125", - "Via Livorno, Firenze, Italy, 50142", - "Via Gherardo Starnina, Firenze, Italy, 50142", - "Via della Casella, Firenze, Italy, 50142", - "Via Antonio del Pollaiolo, Firenze, Italy, 50142", - - // Livorno (57123) - "Via Grande, Livorno, Italy, 57123", - "Piazza della Repubblica, Livorno, Italy, 57123", - "Via Magenta, Livorno, Italy, 57123", - "Scali delle Cantine, Livorno, Italy, 57123", - "Via Ricasoli, Livorno, Italy, 57123", - "Via di Quercianella, Livorno, Italy, 57128", - "Via del Littorale, Livorno, Italy, 57128", - "Viale di Antignano, Livorno, Italy, 57128", - "Via del Pastore, Livorno, Italy, 57128", - "Via Uberto Mondolfi, Livorno, Italy, 57128", - - // Pontedera (56025) - "Corso Matteotti, Pontedera, Italy, 56025", - "Piazza Curtatone, Pontedera, Italy, 56025", - "Via Roma, Pontedera, Italy, 56025", - "Via Dante Alighieri, Pontedera, Italy, 56025", - "Via Verdi, Pontedera, Italy, 56025", - "Via di Gello, Pontedera, Italy, 56025", - "Via di Lavaiano, Pontedera, Italy, 56025", - "Via dell’Industria, Pontedera, Italy, 56025", - "Via delle Colombaie, Pontedera, Italy, 56025", - "Via della Fornace, Pontedera, Italy, 56025", - - // Poggibonsi (53036) - "Via della Repubblica, Poggibonsi, Italy, 53036", - "Via Trento, Poggibonsi, Italy, 53036", - "Via San Gimignano, Poggibonsi, Italy, 53036", - "Via Borgaccio, Poggibonsi, Italy, 53036", - "Via Sardegna, Poggibonsi, Italy, 53036", - "Via dell’Ospedale, Poggibonsi, Italy, 53036", - "Via Abruzzo, Poggibonsi, Italy, 53036", - "Via Lazio, Poggibonsi, Italy, 53036", - "Via Sicilia, Poggibonsi, Italy, 53036", - "Via Calabria, Poggibonsi, Italy, 53036", - - // Viareggio (55049) - "Viale Giosuè Carducci, Viareggio, Italy, 55049", - "Piazza Mazzini, Viareggio, Italy, 55049", - "Via Cesare Battisti, Viareggio, Italy, 55049", - "Via Santa Maria Goretti, Viareggio, Italy, 55049", - "Via Coppino, Viareggio, Italy, 55049", - "Via delle Cavalle, Viareggio, Italy, 55049", - "Via Marina di Levante, Viareggio, Italy, 55049", - "Via dei Partigiani, Viareggio, Italy, 55049", - "Via Santa Gemma Galgani, Viareggio, Italy, 55049", - "Via della Ferrovia, Viareggio, Italy, 55049", - - // Camaiore (55041) - "Via Vittorio Emanuele, Camaiore, Italy, 55041", - "Via XX Settembre, Camaiore, Italy, 55041", - "Via Roma, Camaiore, Italy, 55041", - "Via del Secco, Camaiore, Italy, 55041", - "Via dei Ghivizzani, Camaiore, Italy, 55041", - "Via Mentana, Camaiore, Italy, 55041", - "Via Montecassino, Camaiore, Italy, 55041", - "Via Alessandro Volta, Camaiore, Italy, 55041", - "Via dei Papaveri, Camaiore, Italy, 55041", - "Via Montemagno, Camaiore, Italy, 55041", - - // Siena (53100) - "Via di Città, Siena, Italy, 53100", - "Banchi di Sopra, Siena, Italy, 53100", - "Via dei Rossi, Siena, Italy, 53100", - "Via Pantaneto, Siena, Italy, 53100", - "Via della Sapienza, Siena, Italy, 53100", - "Strada Grossetana, Siena, Italy, 53100", - "Strada Massetana Romana, Siena, Italy, 53100", - "Via Paolo Mascagni, Siena, Italy, 53100", - "Strada del Ruffolo, Siena, Italy, 53100", - "Via di Fiera Vecchia, Siena, Italy, 53100", +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "math/rand" + "net/http" + "time" +) + +type OverpassElement struct { + Type string `json:"type"` + ID int64 `json:"id"` + Tags map[string]string `json:"tags"` +} + +type OverpassResponse struct { + Elements []OverpassElement `json:"elements"` } -func GetRoute(lastEnd string) []string { +type OverpassClient struct { + BaseURL string + Client *http.Client +} + +func NewOverpassClient(baseURL string) *OverpassClient { + return &OverpassClient{ + BaseURL: baseURL, + Client: &http.Client{ + Timeout: 30 * time.Second, + }, + } +} + +func (c *OverpassClient) GetStreets(city string, limit int) ([]string, error) { + if limit == 0 { + limit = 100 + } + radiusMeters := 2000 // 2km default + + query := fmt.Sprintf(` +[out:json][timeout:25]; +area["ISO3166-1"="IT"][admin_level=2]->.italy; +node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; +( + way(around.citynode:%d)["highway"]["name"]["highway"!~"motorway|trunk|motorway_link|trunk_link"](area.italy); +); +out tags %d; +`, city, radiusMeters, limit) + + resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) + if err != nil { + return nil, fmt.Errorf("failed to query Overpass API: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) + } + + var overpassResp OverpassResponse + if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { + return nil, fmt.Errorf("failed to decode response: %w", err) + } + + var streets []string + for _, element := range overpassResp.Elements { + if name, ok := element.Tags["name"]; ok && name != "" { + postcode := element.Tags["addr:postcode"] + + if postcode != "" { + streets = append(streets, fmt.Sprintf("%s, %s, Italy, %s", name, city, postcode)) + } else { + streets = append(streets, fmt.Sprintf("%s, %s, Italy", name, city)) + } + } + } + + if len(streets) == 0 { + return nil, fmt.Errorf("no streets found for city: %s", city) + } + + return streets, nil +} + +func (c *OverpassClient) GetRandomStreet(city string) (string, error) { + streets, err := c.GetStreets(city, 100) + if err != nil { + return "", err + } + return streets[rand.Intn(len(streets))], nil +} + +type CachedStreetProvider struct { + client *OverpassClient + cache map[string][]string +} + +func NewCachedStreetProvider(baseURL string) *CachedStreetProvider { + return &CachedStreetProvider{ + client: NewOverpassClient(baseURL), + cache: make(map[string][]string), + } +} + +func (p *CachedStreetProvider) GetRandomStreet(city string) (string, error) { + if streets, ok := p.cache[city]; ok && len(streets) > 0 { + return streets[rand.Intn(len(streets))], nil + } + + streets, err := p.client.GetStreets(city, 100) + if err != nil { + return "", err + } + + p.cache[city] = streets + + return streets[rand.Intn(len(streets))], nil +} + +// GetRoute generates a route with random streets +// If using cached provider, pass cities to select from +func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd string) ([]string, error) { var route []string + if lastEnd != "" { route = append(route, lastEnd) } else { - randStreet := streets[rand.Intn(len(streets))] + city := cities[rand.Intn(len(cities))] + randStreet, err := provider.GetRandomStreet(city) + if err != nil { + return nil, err + } route = append(route, randStreet) } - randStreet := streets[rand.Intn(len(streets))] + + city := cities[rand.Intn(len(cities))] + randStreet, err := provider.GetRandomStreet(city) + if err != nil { + return nil, err + } route = append(route, randStreet) - return route + + return route, nil } From ee20f1a709fa8557fe530feb3b858c344bf47c6e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 11 Oct 2025 19:12:25 +0200 Subject: [PATCH 002/242] whole italy --- tracky/make_compose.py | 2 + tracky/src/firmware.go | 9 ++- tracky/src/trackeroo/regions.go | 110 ++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 tracky/src/trackeroo/regions.go diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 3af0fa77..b471b52d 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -77,6 +77,8 @@ def create_compose(credentials: List[Dict]): environment={ "GEOCODING_SERVICE_URL": "http://localhost:8082", "ROUTING_SERVICE_URL": "http://localhost:5000", + "OVERPASS_URL": "http://localhost:12345/api/interpreter", + "REGIONAL": "true" if random.randint(1, 100) < 10 else "false", "PUBLISH_PERIOD": "500", "PIRATE": "true" if random.randint(1, 100) < 10 else "false" }, diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 921d4d02..7e922cbb 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -104,9 +104,8 @@ func Loop() { rand.Seed(time.Now().UnixNano()) creds, _ := trackeroo.GetCredentials() deviceType := creds.DeviceType - cities := []string{"Pisa", "Lucca", "Firenze", "Livorno", "Pontedera", "Viareggio", "Siena"} // streetProvider := trackeroo.NewCachedStreetProvider("http://localhost:12345/api/interpreter") - streetProvider := trackeroo.NewCachedStreetProvider("https://overpass-api.de/api/interpreter") + streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL")) routingService := trackeroo.NewRoutingService( os.Getenv("GEOCODING_SERVICE_URL"), os.Getenv("ROUTING_SERVICE_URL"), @@ -120,6 +119,12 @@ func Loop() { } lastPublish := time.Now() isPirate := os.Getenv("PIRATE") == "true" || os.Getenv("PIRATE") == "1" + var cities []string + if os.Getenv("REGIONAL") == "true" { + cities = trackeroo.GetRandomRegion() + } else { + cities = trackeroo.GetAllCities() + } trackeroo.Info("Is pirate: %t", isPirate) lastStatus := "" lastEnd := "" diff --git a/tracky/src/trackeroo/regions.go b/tracky/src/trackeroo/regions.go new file mode 100644 index 00000000..9e9b093b --- /dev/null +++ b/tracky/src/trackeroo/regions.go @@ -0,0 +1,110 @@ +package trackeroo + +import ( + "math/rand" + "time" +) + +var regions = map[string][]string{ + "Abruzzo": { + "L'Aquila", "Teramo", "Pescara", "Chieti", "Sulmona", "Avezzano", + "Lanciano", "Giulianova", "Roseto degli Abruzzi", "Vasto", + }, + "Basilicata": { + "Potenza", "Matera", "Melfi", "Policoro", "Pisticci", + "Venosa", "Bernalda", "Rionero in Vulture", "Maratea", "Lavello", + }, + "Calabria": { + "Catanzaro", "Cosenza", "Reggio Calabria", "Crotone", "Vibo Valentia", + "Lamezia Terme", "Corigliano-Rossano", "Gioia Tauro", "Siderno", "Paola", + }, + "Campania": { + "Napoli", "Salerno", "Avellino", "Benevento", "Caserta", + "Pompei", "Torre del Greco", "Pozzuoli", "Giugliano", "Nocera Inferiore", + }, + "Emilia-Romagna": { + "Bologna", "Modena", "Parma", "Reggio Emilia", "Ferrara", + "Rimini", "Ravenna", "Forlì", "Cesena", "Piacenza", + }, + "Friuli-Venezia Giulia": { + "Trieste", "Udine", "Pordenone", "Gorizia", "Monfalcone", + "Cervignano del Friuli", "Codroipo", "Latisana", "Cividale del Friuli", "San Daniele del Friuli", + }, + "Lazio": { + "Roma", "Latina", "Frosinone", "Viterbo", "Rieti", + "Civitavecchia", "Tivoli", "Guidonia Montecelio", "Anzio", "Fiumicino", + }, + "Liguria": { + "Genova", "Savona", "La Spezia", "Imperia", "Sanremo", + "Rapallo", "Chiavari", "Alassio", "Ventimiglia", "Levanto", + }, + "Lombardia": { + "Milano", "Bergamo", "Brescia", "Como", "Monza", + "Pavia", "Mantova", "Varese", "Cremona", "Lecco", + }, + "Marche": { + "Ancona", "Macerata", "Pesaro", "Urbino", "Ascoli Piceno", + "Fermo", "Civitanova Marche", "Senigallia", "Jesi", "Fabriano", + }, + "Molise": { + "Campobasso", "Isernia", "Termoli", "Venafro", "Agnone", + "Bojano", "Larino", "Trivento", "Guglionesi", "Montenero di Bisaccia", + }, + "Piemonte": { + "Torino", "Alessandria", "Asti", "Biella", "Cuneo", + "Novara", "Vercelli", "Verbania", "Ivrea", "Moncalieri", + }, + "Puglia": { + "Bari", "Lecce", "Taranto", "Foggia", "Brindisi", + "Andria", "Barletta", "Trani", "Manfredonia", "Gallipoli", + }, + "Sardegna": { + "Cagliari", "Sassari", "Nuoro", "Oristano", "Olbia", + "Alghero", "Carbonia", "Iglesias", "Tempio Pausania", "Quartú Sant'Elena", + }, + "Sicilia": { + "Palermo", "Catania", "Messina", "Siracusa", "Trapani", + "Ragusa", "Enna", "Caltanissetta", "Agrigento", "Marsala", + }, + "Toscana": { + "Firenze", "Pisa", "Siena", "Arezzo", "Lucca", + "Livorno", "Massa", "Prato", "Grosseto", "Viareggio", + }, + "Trentino-Alto Adige": { + "Trento", "Bolzano", "Merano", "Rovereto", "Bressanone", + "Brunico", "Vipiteno", "Pergine Valsugana", "Arco", "Laives", + }, + "Umbria": { + "Perugia", "Terni", "Foligno", "Spoleto", "Assisi", + "Città di Castello", "Gubbio", "Orvieto", "Todi", "Bastia Umbra", + }, + "Valle d'Aosta": { + "Aosta", "Courmayeur", "Saint-Vincent", "Châtillon", "Pont-Saint-Martin", + "Sarre", "Gressoney-Saint-Jean", "Cogne", "La Thuile", "Pré-Saint-Didier", + }, + "Veneto": { + "Venezia", "Verona", "Vicenza", "Padova", "Treviso", + "Rovigo", "Belluno", "Mestre", "Chioggia", "Bassano del Grappa", + }, +} + +func GetRandomRegion() []string { + rand.Seed(time.Now().UnixNano()) + + // Extract keys + keys := make([]string, 0, len(regions)) + for k := range regions { + keys = append(keys, k) + } + + // Pick random key + return regions[keys[rand.Intn(len(keys))]] +} + +func GetAllCities() []string { + var cities []string + for _, region := range regions { + cities = append(cities, region...) + } + return cities +} From 5c02085e21aaa60c27bfdf93ec4f87f8e5cbe80b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 11 Oct 2025 19:18:36 +0200 Subject: [PATCH 003/242] changed regional probability --- tracky/make_compose.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index b471b52d..936be3cb 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -78,7 +78,7 @@ def create_compose(credentials: List[Dict]): "GEOCODING_SERVICE_URL": "http://localhost:8082", "ROUTING_SERVICE_URL": "http://localhost:5000", "OVERPASS_URL": "http://localhost:12345/api/interpreter", - "REGIONAL": "true" if random.randint(1, 100) < 10 else "false", + "REGIONAL": "true" if random.randint(1, 100) > 10 else "false", "PUBLISH_PERIOD": "500", "PIRATE": "true" if random.randint(1, 100) < 10 else "false" }, From 9876fe711cd38190f9934e8eefe5fa510ce58683 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 11 Oct 2025 19:48:19 +0200 Subject: [PATCH 004/242] refining routes query --- tracky/src/trackeroo/routes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 043906d9..b35c7c2c 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -45,7 +45,7 @@ func (c *OverpassClient) GetStreets(city string, limit int) ([]string, error) { area["ISO3166-1"="IT"][admin_level=2]->.italy; node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; ( - way(around.citynode:%d)["highway"]["name"]["highway"!~"motorway|trunk|motorway_link|trunk_link"](area.italy); + way(around.citynode:%d)["highway"]["name"]["wikipedia"]["highway"!~"motorway|trunk|motorway_link|trunk_link|pedestrian|footway|cycleway|path|steps|bridleway"](area.italy); ); out tags %d; `, city, radiusMeters, limit) From 8179ce743e505b548ddc4f26c8ae72f785651a23 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 11 Oct 2025 19:51:10 +0200 Subject: [PATCH 005/242] refining routes query --- tracky/src/trackeroo/routes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index b35c7c2c..89ed7fa7 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -45,7 +45,7 @@ func (c *OverpassClient) GetStreets(city string, limit int) ([]string, error) { area["ISO3166-1"="IT"][admin_level=2]->.italy; node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; ( - way(around.citynode:%d)["highway"]["name"]["wikipedia"]["highway"!~"motorway|trunk|motorway_link|trunk_link|pedestrian|footway|cycleway|path|steps|bridleway"](area.italy); + way(around.citynode:%d)["highway"~"primary|secondary|tertiary|residential|unclassified"]["name"]["highway"!~"motorway|trunk|motorway_link|trunk_link"](area.italy); ); out tags %d; `, city, radiusMeters, limit) From 07664c54c6bb94298ce423803d704b553b626a9b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 09:27:09 +0200 Subject: [PATCH 006/242] testing without nominatim --- tracky/src/firmware.go | 2 +- tracky/src/trackeroo/driving.go | 2 +- tracky/src/trackeroo/routes.go | 65 +++++++++++++++++---------------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 7e922cbb..e23829c5 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -127,7 +127,7 @@ func Loop() { } trackeroo.Info("Is pirate: %t", isPirate) lastStatus := "" - lastEnd := "" + lastEnd := trackeroo.Location{} normalRun := true deltaDistance := 0.0 speedVar := trackeroo.NewStatVar[float64]() diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 30c977f0..0fb1d5fb 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -221,7 +221,7 @@ type DrivingSimulator struct { Distance float64 } -func NewDrivingSimulator(routingService *RoutingService, waypoints []string, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { +func NewDrivingSimulator(routingService *RoutingService, waypoints []Location, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { route := make([]RouteSegment, 0) for i := 0; i < len(waypoints)-1; i++ { start, err := routingService.Geocode(waypoints[i]) diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 89ed7fa7..38d6e986 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -11,9 +11,10 @@ import ( ) type OverpassElement struct { - Type string `json:"type"` - ID int64 `json:"id"` - Tags map[string]string `json:"tags"` + Type string `json:"type"` + ID int64 `json:"id"` + Tags map[string]string `json:"tags"` + Geometry []Coordinate `json:"geometry"` } type OverpassResponse struct { @@ -25,6 +26,18 @@ type OverpassClient struct { Client *http.Client } +type Location struct { + Coordinate Coordinate + StreetName string +} + +func streetToLocation(street OverpassElement) Location { + return Location{ + Coordinate: street.Geometry[rand.Intn(len(street.Geometry))], + StreetName: street.Tags["name"], + } +} + func NewOverpassClient(baseURL string) *OverpassClient { return &OverpassClient{ BaseURL: baseURL, @@ -34,7 +47,7 @@ func NewOverpassClient(baseURL string) *OverpassClient { } } -func (c *OverpassClient) GetStreets(city string, limit int) ([]string, error) { +func (c *OverpassClient) GetStreets(city string, limit int) ([]OverpassElement, error) { if limit == 0 { limit = 100 } @@ -47,7 +60,7 @@ node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; ( way(around.citynode:%d)["highway"~"primary|secondary|tertiary|residential|unclassified"]["name"]["highway"!~"motorway|trunk|motorway_link|trunk_link"](area.italy); ); -out tags %d; +out tags geom %d; `, city, radiusMeters, limit) resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) @@ -66,67 +79,55 @@ out tags %d; return nil, fmt.Errorf("failed to decode response: %w", err) } - var streets []string - for _, element := range overpassResp.Elements { - if name, ok := element.Tags["name"]; ok && name != "" { - postcode := element.Tags["addr:postcode"] - - if postcode != "" { - streets = append(streets, fmt.Sprintf("%s, %s, Italy, %s", name, city, postcode)) - } else { - streets = append(streets, fmt.Sprintf("%s, %s, Italy", name, city)) - } - } - } - - if len(streets) == 0 { + if len(overpassResp.Elements) == 0 { return nil, fmt.Errorf("no streets found for city: %s", city) } - return streets, nil + return overpassResp.Elements, nil } -func (c *OverpassClient) GetRandomStreet(city string) (string, error) { +func (c *OverpassClient) GetRandomStreet(city string) (Location, error) { streets, err := c.GetStreets(city, 100) if err != nil { - return "", err + return Location{}, err } - return streets[rand.Intn(len(streets))], nil + randStreet := streets[rand.Intn(len(streets))] + return streetToLocation(randStreet), nil } type CachedStreetProvider struct { client *OverpassClient - cache map[string][]string + cache map[string][]OverpassElement } func NewCachedStreetProvider(baseURL string) *CachedStreetProvider { return &CachedStreetProvider{ client: NewOverpassClient(baseURL), - cache: make(map[string][]string), + cache: make(map[string][]OverpassElement), } } -func (p *CachedStreetProvider) GetRandomStreet(city string) (string, error) { +func (p *CachedStreetProvider) GetRandomStreet(city string) (Location, error) { if streets, ok := p.cache[city]; ok && len(streets) > 0 { - return streets[rand.Intn(len(streets))], nil + return streetToLocation(streets[rand.Intn(len(streets))]), nil } streets, err := p.client.GetStreets(city, 100) if err != nil { - return "", err + return Location{}, err } p.cache[city] = streets - return streets[rand.Intn(len(streets))], nil + return streetToLocation(streets[rand.Intn(len(streets))]), nil } // GetRoute generates a route with random streets // If using cached provider, pass cities to select from -func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd string) ([]string, error) { - var route []string +func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Location) ([]Location, error) { + var route []Location - if lastEnd != "" { + if lastEnd.StreetName != "" { route = append(route, lastEnd) } else { city := cities[rand.Intn(len(cities))] From 51a2cc569fc16a7f141aea0ea6a007a9a1b50429 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 09:36:48 +0200 Subject: [PATCH 007/242] testing without nominatim --- tracky/src/trackeroo/driving.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 0fb1d5fb..bf1c9968 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -138,7 +138,7 @@ func (rs *RoutingService) Geocode(address string) (*Coordinate, error) { } // GetRoute gets routing directions from point A to B using OSRM -func (rs *RoutingService) GetRoute(from, to *Coordinate) ([]RouteSegment, error) { +func (rs *RoutingService) GetRoute(from, to Coordinate) ([]RouteSegment, error) { requestURL := fmt.Sprintf( "%s/route/v1/driving/%f,%f;%f,%f?geometries=geojson&overview=full&steps=true", rs.OSRMURL, from.Lng, from.Lat, to.Lng, to.Lat) @@ -224,14 +224,8 @@ type DrivingSimulator struct { func NewDrivingSimulator(routingService *RoutingService, waypoints []Location, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { route := make([]RouteSegment, 0) for i := 0; i < len(waypoints)-1; i++ { - start, err := routingService.Geocode(waypoints[i]) - if err != nil { - return nil, fmt.Errorf("Error geocoding address %s: %v", waypoints[i], err) - } - end, err := routingService.Geocode(waypoints[i+1]) - if err != nil { - return nil, fmt.Errorf("Error geocoding address %s: %v", waypoints[i], err) - } + start := waypoints[i].Coordinate + end := waypoints[i+1].Coordinate r, err := routingService.GetRoute(start, end) if err != nil { return nil, err From af4ef2438c82fe582ac8afc64ef0d59931e3841a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 09:56:45 +0200 Subject: [PATCH 008/242] testing without nominatim --- tracky/src/firmware.go | 3 +- tracky/src/trackeroo/driving.go | 56 ++------------------------------- tracky/src/trackeroo/routes.go | 10 +++--- 3 files changed, 10 insertions(+), 59 deletions(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index e23829c5..463d328d 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -107,7 +107,6 @@ func Loop() { // streetProvider := trackeroo.NewCachedStreetProvider("http://localhost:12345/api/interpreter") streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL")) routingService := trackeroo.NewRoutingService( - os.Getenv("GEOCODING_SERVICE_URL"), os.Getenv("ROUTING_SERVICE_URL"), ) pubPeriod := time.Millisecond * 2000 @@ -133,7 +132,7 @@ func Loop() { speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - trackeroo.Info("Getting route from %s", lastEnd) + trackeroo.Info("Getting route from %v", lastEnd) route, err := trackeroo.GetRoute(streetProvider, cities, lastEnd) if err != nil { trackeroo.Error("Error getting route %v", err) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index bf1c9968..f2d48172 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -7,7 +7,6 @@ import ( "math" "math/rand" "net/http" - "net/url" "time" ) @@ -37,12 +36,6 @@ type RouteSegment struct { ShouldStop bool } -type NominatimResponse []struct { - Lat string `json:"lat"` - Lon string `json:"lon"` - DisplayName string `json:"display_name"` -} - type OSRMResponse struct { Code string `json:"code"` Routes []struct { @@ -87,54 +80,11 @@ type RoutingService struct { httpClient *http.Client } -func NewRoutingService(nominatimURL, osrmURL string) *RoutingService { +func NewRoutingService(osrmURL string) *RoutingService { return &RoutingService{ - NominatimURL: nominatimURL, - OSRMURL: osrmURL, - httpClient: &http.Client{Timeout: 30 * time.Second}, - } -} - -func (rs *RoutingService) Geocode(address string) (*Coordinate, error) { - encodedAddress := url.QueryEscape(address) - requestURL := fmt.Sprintf("%s/search?q=%s&format=json&limit=1", rs.NominatimURL, encodedAddress) - - resp, err := rs.httpClient.Get(requestURL) - if err != nil { - return nil, fmt.Errorf("failed to geocode address: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("nominatim API returned status %d", resp.StatusCode) + OSRMURL: osrmURL, + httpClient: &http.Client{Timeout: 30 * time.Second}, } - - body, err := io.ReadAll(resp.Body) - if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) - } - - var nominatimResp NominatimResponse - if err := json.Unmarshal(body, &nominatimResp); err != nil { - return nil, fmt.Errorf("failed to parse nominatim response: %w", err) - } - - if len(nominatimResp) == 0 { - return nil, fmt.Errorf("no results found for address: %s", address) - } - - // Parse coordinates - lat, err := parseFloat(nominatimResp[0].Lat) - if err != nil { - return nil, fmt.Errorf("invalid latitude: %w", err) - } - - lng, err := parseFloat(nominatimResp[0].Lon) - if err != nil { - return nil, fmt.Errorf("invalid longitude: %w", err) - } - - return &Coordinate{Lat: lat, Lng: lng}, nil } // GetRoute gets routing directions from point A to B using OSRM diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 38d6e986..62c009f8 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -29,12 +29,14 @@ type OverpassClient struct { type Location struct { Coordinate Coordinate StreetName string + City string } -func streetToLocation(street OverpassElement) Location { +func streetToLocation(city string, street OverpassElement) Location { return Location{ Coordinate: street.Geometry[rand.Intn(len(street.Geometry))], StreetName: street.Tags["name"], + City: city, } } @@ -92,7 +94,7 @@ func (c *OverpassClient) GetRandomStreet(city string) (Location, error) { return Location{}, err } randStreet := streets[rand.Intn(len(streets))] - return streetToLocation(randStreet), nil + return streetToLocation(city, randStreet), nil } type CachedStreetProvider struct { @@ -109,7 +111,7 @@ func NewCachedStreetProvider(baseURL string) *CachedStreetProvider { func (p *CachedStreetProvider) GetRandomStreet(city string) (Location, error) { if streets, ok := p.cache[city]; ok && len(streets) > 0 { - return streetToLocation(streets[rand.Intn(len(streets))]), nil + return streetToLocation(city, streets[rand.Intn(len(streets))]), nil } streets, err := p.client.GetStreets(city, 100) @@ -119,7 +121,7 @@ func (p *CachedStreetProvider) GetRandomStreet(city string) (Location, error) { p.cache[city] = streets - return streetToLocation(streets[rand.Intn(len(streets))]), nil + return streetToLocation(city, streets[rand.Intn(len(streets))]), nil } // GetRoute generates a route with random streets From 568536785517d1b8041b84dddb61d9f40d09d45a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 10:02:26 +0200 Subject: [PATCH 009/242] testing without nominatim --- tracky/src/firmware.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 463d328d..45c6a3d7 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -132,7 +132,7 @@ func Loop() { speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - trackeroo.Info("Getting route from %v", lastEnd) + trackeroo.Info("Getting route from %+v in %s - REGIONAL: %t - URBAN: %t", lastEnd, cities, os.Getenv("REGIONAL") == "true", os.Getenv("URBAN") == "true") route, err := trackeroo.GetRoute(streetProvider, cities, lastEnd) if err != nil { trackeroo.Error("Error getting route %v", err) From 4a950055f479941ba0bd0f81d117c213c1f96df1 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 10:06:51 +0200 Subject: [PATCH 010/242] testing without nominatim --- tracky/src/firmware.go | 2 +- tracky/src/trackeroo/routes.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 45c6a3d7..3a70b737 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -132,7 +132,7 @@ func Loop() { speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - trackeroo.Info("Getting route from %+v in %s - REGIONAL: %t - URBAN: %t", lastEnd, cities, os.Getenv("REGIONAL") == "true", os.Getenv("URBAN") == "true") + trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, os.Getenv("REGIONAL") == "true", os.Getenv("URBAN") == "true") route, err := trackeroo.GetRoute(streetProvider, cities, lastEnd) if err != nil { trackeroo.Error("Error getting route %v", err) diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 62c009f8..3725b7bf 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -110,6 +110,7 @@ func NewCachedStreetProvider(baseURL string) *CachedStreetProvider { } func (p *CachedStreetProvider) GetRandomStreet(city string) (Location, error) { + Info("Getting random street from %s", city) if streets, ok := p.cache[city]; ok && len(streets) > 0 { return streetToLocation(city, streets[rand.Intn(len(streets))]), nil } From 78cab456e6c834841b57a563e8c452aa8abe0fa8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 10:14:39 +0200 Subject: [PATCH 011/242] testing without nominatim --- tracky/src/firmware.go | 10 ++++++++-- tracky/src/trackeroo/routes.go | 9 +++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 3a70b737..f8efaeae 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -133,9 +133,15 @@ func Loop() { consumptionVar := trackeroo.NewStatVar[float64]() for { trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, os.Getenv("REGIONAL") == "true", os.Getenv("URBAN") == "true") - route, err := trackeroo.GetRoute(streetProvider, cities, lastEnd) + route, err, cityErr := trackeroo.GetRoute(streetProvider, cities, lastEnd) if err != nil { - trackeroo.Error("Error getting route %v", err) + trackeroo.Error("Error getting route in %s %v", cityErr, err) + trackeroo.Warning("Removing %s", cityErr) + for i, city := range cities { + if city == cityErr { + cities = append(cities[:i], cities[i+1:]...) + } + } continue } trackeroo.Info("Route: %+v -> %+v", route[0], route[1]) diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 3725b7bf..fd843d89 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -112,6 +112,7 @@ func NewCachedStreetProvider(baseURL string) *CachedStreetProvider { func (p *CachedStreetProvider) GetRandomStreet(city string) (Location, error) { Info("Getting random street from %s", city) if streets, ok := p.cache[city]; ok && len(streets) > 0 { + Info("Cache hit for %s", city) return streetToLocation(city, streets[rand.Intn(len(streets))]), nil } @@ -127,7 +128,7 @@ func (p *CachedStreetProvider) GetRandomStreet(city string) (Location, error) { // GetRoute generates a route with random streets // If using cached provider, pass cities to select from -func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Location) ([]Location, error) { +func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Location) ([]Location, error, string) { var route []Location if lastEnd.StreetName != "" { @@ -136,7 +137,7 @@ func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Location) city := cities[rand.Intn(len(cities))] randStreet, err := provider.GetRandomStreet(city) if err != nil { - return nil, err + return nil, err, city } route = append(route, randStreet) } @@ -144,9 +145,9 @@ func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Location) city := cities[rand.Intn(len(cities))] randStreet, err := provider.GetRandomStreet(city) if err != nil { - return nil, err + return nil, err, city } route = append(route, randStreet) - return route, nil + return route, nil, "" } From b217f17b22af90d5fb7930baa6ac40da3aa5b5ed Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 11:04:57 +0200 Subject: [PATCH 012/242] refining street gathering logic --- tracky/src/firmware.go | 41 +++++++-- tracky/src/trackeroo/driving.go | 2 +- tracky/src/trackeroo/overpass.go | 152 +++++++++++++++++++++++++++++++ tracky/src/trackeroo/regions.go | 110 ---------------------- tracky/src/trackeroo/routes.go | 103 +++------------------ 5 files changed, 199 insertions(+), 209 deletions(-) create mode 100644 tracky/src/trackeroo/overpass.go delete mode 100644 tracky/src/trackeroo/regions.go diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index f8efaeae..7a4bb6d9 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -105,7 +105,8 @@ func Loop() { creds, _ := trackeroo.GetCredentials() deviceType := creds.DeviceType // streetProvider := trackeroo.NewCachedStreetProvider("http://localhost:12345/api/interpreter") - streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL")) + overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) + streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL"), overpassClient) routingService := trackeroo.NewRoutingService( os.Getenv("ROUTING_SERVICE_URL"), ) @@ -118,21 +119,49 @@ func Loop() { } lastPublish := time.Now() isPirate := os.Getenv("PIRATE") == "true" || os.Getenv("PIRATE") == "1" + isRegional := os.Getenv("REGIONAL") == "true" + isUrban := os.Getenv("URBAN") == "true" + if isUrban { + isRegional = true + } var cities []string - if os.Getenv("REGIONAL") == "true" { - cities = trackeroo.GetRandomRegion() + if isRegional { + regions, err := overpassClient.GetRegions() + if err != nil || len(regions) == 0 { + trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) + regions = []string{"Toscana"} + } + cities, err = overpassClient.GetCities(regions[rand.Intn(len(regions))]) + if err != nil || len(cities) == 0 { + trackeroo.Error("Error getting cities, falling back to default cities: %v", err) + cities = []string{"Firenze", "Pisa", "Siena", "Lucca", "Vinci", "Prato", "Montecatini", "Arezzo", "Grosseto", "Massa"} + } + + if isUrban { + city := cities[rand.Intn(len(cities))] + cities = []string{city} + } } else { - cities = trackeroo.GetAllCities() + regions, err := overpassClient.GetRegions() + if err != nil || len(regions) == 0 { + trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) + regions = []string{"Toscana"} + } + cities = make([]string, 0) + for _, region := range regions { + c, _ := overpassClient.GetCities(region) + cities = append(cities, c...) + } } trackeroo.Info("Is pirate: %t", isPirate) lastStatus := "" - lastEnd := trackeroo.Location{} + lastEnd := trackeroo.Street{} normalRun := true deltaDistance := 0.0 speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, os.Getenv("REGIONAL") == "true", os.Getenv("URBAN") == "true") + trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, isRegional, isUrban) route, err, cityErr := trackeroo.GetRoute(streetProvider, cities, lastEnd) if err != nil { trackeroo.Error("Error getting route in %s %v", cityErr, err) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index f2d48172..1fadf6d7 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -171,7 +171,7 @@ type DrivingSimulator struct { Distance float64 } -func NewDrivingSimulator(routingService *RoutingService, waypoints []Location, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { +func NewDrivingSimulator(routingService *RoutingService, waypoints []Street, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { route := make([]RouteSegment, 0) for i := 0; i < len(waypoints)-1; i++ { start := waypoints[i].Coordinate diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go new file mode 100644 index 00000000..14330c82 --- /dev/null +++ b/tracky/src/trackeroo/overpass.go @@ -0,0 +1,152 @@ +package trackeroo + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "math/rand" + "net/http" + "time" +) + +type OverpassElement struct { + Type string `json:"type"` + ID int64 `json:"id"` + Tags map[string]string `json:"tags"` + Geometry []Coordinate `json:"geometry"` +} + +type OverpassResponse struct { + Elements []OverpassElement `json:"elements"` +} + +type OverpassClient struct { + BaseURL string + Client *http.Client +} + +func NewOverpassClient(baseURL string) *OverpassClient { + return &OverpassClient{ + BaseURL: baseURL, + Client: &http.Client{ + Timeout: 30 * time.Second, + }, + } +} + +func (c *OverpassClient) GetStreets(city string, limit int, radiusMeters int) ([]OverpassElement, error) { + if limit == 0 { + limit = 100 + } + + query := fmt.Sprintf(` +[out:json][timeout:25]; +area["ISO3166-1"="IT"][admin_level=2]->.italy; +node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; +( + way(around.citynode:%d)["highway"~"primary|secondary|tertiary|residential|unclassified"]["name"]["highway"!~"motorway|trunk|motorway_link|trunk_link"](area.italy); +); +out tags geom %d; +`, city, radiusMeters, limit) + + resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) + if err != nil { + return nil, fmt.Errorf("failed to query Overpass API: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) + } + + var overpassResp OverpassResponse + if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { + return nil, fmt.Errorf("failed to decode response: %w", err) + } + + if len(overpassResp.Elements) == 0 { + return nil, fmt.Errorf("no streets found for city: %s", city) + } + + return overpassResp.Elements, nil +} + +func (c *OverpassClient) GetRandomStreet(city string) (Street, error) { + streets, err := c.GetStreets(city, 100) + if err != nil { + return Street{}, err + } + randStreet := streets[rand.Intn(len(streets))] + return stringToStreet(city, randStreet), nil +} + +func (c *OverpassClient) GetRegions() ([]string, error) { + + query := `[out:json][timeout:25]; +area["ISO3166-1"="IT"][admin_level=2]->.italy; +relation["boundary"="administrative"]["admin_level"=4](area.italy); +out tags;` + + resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) + if err != nil { + return nil, fmt.Errorf("failed to query Overpass API: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) + } + + var overpassResp OverpassResponse + if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { + return nil, fmt.Errorf("failed to decode response: %w", err) + } + + if len(overpassResp.Elements) == 0 { + return nil, fmt.Errorf("no regions found") + } + regions := make([]string, 0) + for _, element := range overpassResp.Elements { + if element.Type == "relation" { + regions = append(regions, element.Tags["name"]) + } + } + return regions, nil +} + +func (c *OverpassClient) GetCities(region string) ([]string, error) { + query := fmt.Sprintf(`'[out:json][timeout:25]; +relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; +.reg map_to_area->.region; +node["place"~"city|town"](area.region); +out tags;'`, region) + resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) + if err != nil { + return nil, fmt.Errorf("failed to query Overpass API: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) + } + + var overpassResp OverpassResponse + if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { + return nil, fmt.Errorf("failed to decode response: %w", err) + } + + if len(overpassResp.Elements) == 0 { + return nil, fmt.Errorf("no cities found") + } + cities := make([]string, 0) + for _, element := range overpassResp.Elements { + if element.Type == "node" { + cities = append(cities, element.Tags["name"]) + } + } + return cities, nil +} diff --git a/tracky/src/trackeroo/regions.go b/tracky/src/trackeroo/regions.go deleted file mode 100644 index 9e9b093b..00000000 --- a/tracky/src/trackeroo/regions.go +++ /dev/null @@ -1,110 +0,0 @@ -package trackeroo - -import ( - "math/rand" - "time" -) - -var regions = map[string][]string{ - "Abruzzo": { - "L'Aquila", "Teramo", "Pescara", "Chieti", "Sulmona", "Avezzano", - "Lanciano", "Giulianova", "Roseto degli Abruzzi", "Vasto", - }, - "Basilicata": { - "Potenza", "Matera", "Melfi", "Policoro", "Pisticci", - "Venosa", "Bernalda", "Rionero in Vulture", "Maratea", "Lavello", - }, - "Calabria": { - "Catanzaro", "Cosenza", "Reggio Calabria", "Crotone", "Vibo Valentia", - "Lamezia Terme", "Corigliano-Rossano", "Gioia Tauro", "Siderno", "Paola", - }, - "Campania": { - "Napoli", "Salerno", "Avellino", "Benevento", "Caserta", - "Pompei", "Torre del Greco", "Pozzuoli", "Giugliano", "Nocera Inferiore", - }, - "Emilia-Romagna": { - "Bologna", "Modena", "Parma", "Reggio Emilia", "Ferrara", - "Rimini", "Ravenna", "Forlì", "Cesena", "Piacenza", - }, - "Friuli-Venezia Giulia": { - "Trieste", "Udine", "Pordenone", "Gorizia", "Monfalcone", - "Cervignano del Friuli", "Codroipo", "Latisana", "Cividale del Friuli", "San Daniele del Friuli", - }, - "Lazio": { - "Roma", "Latina", "Frosinone", "Viterbo", "Rieti", - "Civitavecchia", "Tivoli", "Guidonia Montecelio", "Anzio", "Fiumicino", - }, - "Liguria": { - "Genova", "Savona", "La Spezia", "Imperia", "Sanremo", - "Rapallo", "Chiavari", "Alassio", "Ventimiglia", "Levanto", - }, - "Lombardia": { - "Milano", "Bergamo", "Brescia", "Como", "Monza", - "Pavia", "Mantova", "Varese", "Cremona", "Lecco", - }, - "Marche": { - "Ancona", "Macerata", "Pesaro", "Urbino", "Ascoli Piceno", - "Fermo", "Civitanova Marche", "Senigallia", "Jesi", "Fabriano", - }, - "Molise": { - "Campobasso", "Isernia", "Termoli", "Venafro", "Agnone", - "Bojano", "Larino", "Trivento", "Guglionesi", "Montenero di Bisaccia", - }, - "Piemonte": { - "Torino", "Alessandria", "Asti", "Biella", "Cuneo", - "Novara", "Vercelli", "Verbania", "Ivrea", "Moncalieri", - }, - "Puglia": { - "Bari", "Lecce", "Taranto", "Foggia", "Brindisi", - "Andria", "Barletta", "Trani", "Manfredonia", "Gallipoli", - }, - "Sardegna": { - "Cagliari", "Sassari", "Nuoro", "Oristano", "Olbia", - "Alghero", "Carbonia", "Iglesias", "Tempio Pausania", "Quartú Sant'Elena", - }, - "Sicilia": { - "Palermo", "Catania", "Messina", "Siracusa", "Trapani", - "Ragusa", "Enna", "Caltanissetta", "Agrigento", "Marsala", - }, - "Toscana": { - "Firenze", "Pisa", "Siena", "Arezzo", "Lucca", - "Livorno", "Massa", "Prato", "Grosseto", "Viareggio", - }, - "Trentino-Alto Adige": { - "Trento", "Bolzano", "Merano", "Rovereto", "Bressanone", - "Brunico", "Vipiteno", "Pergine Valsugana", "Arco", "Laives", - }, - "Umbria": { - "Perugia", "Terni", "Foligno", "Spoleto", "Assisi", - "Città di Castello", "Gubbio", "Orvieto", "Todi", "Bastia Umbra", - }, - "Valle d'Aosta": { - "Aosta", "Courmayeur", "Saint-Vincent", "Châtillon", "Pont-Saint-Martin", - "Sarre", "Gressoney-Saint-Jean", "Cogne", "La Thuile", "Pré-Saint-Didier", - }, - "Veneto": { - "Venezia", "Verona", "Vicenza", "Padova", "Treviso", - "Rovigo", "Belluno", "Mestre", "Chioggia", "Bassano del Grappa", - }, -} - -func GetRandomRegion() []string { - rand.Seed(time.Now().UnixNano()) - - // Extract keys - keys := make([]string, 0, len(regions)) - for k := range regions { - keys = append(keys, k) - } - - // Pick random key - return regions[keys[rand.Intn(len(keys))]] -} - -func GetAllCities() []string { - var cities []string - for _, region := range regions { - cities = append(cities, region...) - } - return cities -} diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index fd843d89..fbf6c5fe 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -1,135 +1,54 @@ package trackeroo import ( - "bytes" - "encoding/json" - "fmt" - "io" "math/rand" - "net/http" - "time" ) -type OverpassElement struct { - Type string `json:"type"` - ID int64 `json:"id"` - Tags map[string]string `json:"tags"` - Geometry []Coordinate `json:"geometry"` -} - -type OverpassResponse struct { - Elements []OverpassElement `json:"elements"` -} - -type OverpassClient struct { - BaseURL string - Client *http.Client -} - -type Location struct { +type Street struct { Coordinate Coordinate StreetName string City string } -func streetToLocation(city string, street OverpassElement) Location { - return Location{ +func stringToStreet(city string, street OverpassElement) Street { + return Street{ Coordinate: street.Geometry[rand.Intn(len(street.Geometry))], StreetName: street.Tags["name"], City: city, } } -func NewOverpassClient(baseURL string) *OverpassClient { - return &OverpassClient{ - BaseURL: baseURL, - Client: &http.Client{ - Timeout: 30 * time.Second, - }, - } -} - -func (c *OverpassClient) GetStreets(city string, limit int) ([]OverpassElement, error) { - if limit == 0 { - limit = 100 - } - radiusMeters := 2000 // 2km default - - query := fmt.Sprintf(` -[out:json][timeout:25]; -area["ISO3166-1"="IT"][admin_level=2]->.italy; -node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; -( - way(around.citynode:%d)["highway"~"primary|secondary|tertiary|residential|unclassified"]["name"]["highway"!~"motorway|trunk|motorway_link|trunk_link"](area.italy); -); -out tags geom %d; -`, city, radiusMeters, limit) - - resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) - if err != nil { - return nil, fmt.Errorf("failed to query Overpass API: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) - } - - var overpassResp OverpassResponse - if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { - return nil, fmt.Errorf("failed to decode response: %w", err) - } - - if len(overpassResp.Elements) == 0 { - return nil, fmt.Errorf("no streets found for city: %s", city) - } - - return overpassResp.Elements, nil -} - -func (c *OverpassClient) GetRandomStreet(city string) (Location, error) { - streets, err := c.GetStreets(city, 100) - if err != nil { - return Location{}, err - } - randStreet := streets[rand.Intn(len(streets))] - return streetToLocation(city, randStreet), nil -} - type CachedStreetProvider struct { client *OverpassClient cache map[string][]OverpassElement } -func NewCachedStreetProvider(baseURL string) *CachedStreetProvider { +func NewCachedStreetProvider(baseURL string, overpassClient *OverpassClient) *CachedStreetProvider { return &CachedStreetProvider{ - client: NewOverpassClient(baseURL), + client: overpassClient, cache: make(map[string][]OverpassElement), } } -func (p *CachedStreetProvider) GetRandomStreet(city string) (Location, error) { +func (p *CachedStreetProvider) GetRandomStreet(city string) (Street, error) { Info("Getting random street from %s", city) if streets, ok := p.cache[city]; ok && len(streets) > 0 { Info("Cache hit for %s", city) - return streetToLocation(city, streets[rand.Intn(len(streets))]), nil + return stringToStreet(city, streets[rand.Intn(len(streets))]), nil } streets, err := p.client.GetStreets(city, 100) if err != nil { - return Location{}, err + return Street{}, err } p.cache[city] = streets - return streetToLocation(city, streets[rand.Intn(len(streets))]), nil + return stringToStreet(city, streets[rand.Intn(len(streets))]), nil } -// GetRoute generates a route with random streets -// If using cached provider, pass cities to select from -func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Location) ([]Location, error, string) { - var route []Location +func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street) ([]Street, error, string) { + var route []Street if lastEnd.StreetName != "" { route = append(route, lastEnd) From 078441036583d74f8689f4ce3f74f79695476f66 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 13:29:28 +0200 Subject: [PATCH 013/242] refining street gathering logic --- tracky/make_compose.py | 7 ++-- tracky/src/Dockerfile | 2 +- tracky/src/firmware.go | 42 ++++++++++++++++------ tracky/src/trackeroo/routes.go | 65 +++++++++++++++++++++++++++++----- 4 files changed, 94 insertions(+), 22 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 936be3cb..1a78c207 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -69,6 +69,8 @@ def create_compose(credentials: List[Dict]): for i, cred in enumerate(credentials): # print(f"Processing device {cred}") # continue + regional = "true" if random.randint(1, 100) > 10 else "false" + urban = "true" if random.randint(1, 100) > 50 and regional == "true" else "false" compose.services[cred["id"]] = ServiceConfig( build={ "context": "src", @@ -78,13 +80,14 @@ def create_compose(credentials: List[Dict]): "GEOCODING_SERVICE_URL": "http://localhost:8082", "ROUTING_SERVICE_URL": "http://localhost:5000", "OVERPASS_URL": "http://localhost:12345/api/interpreter", - "REGIONAL": "true" if random.randint(1, 100) > 10 else "false", + "REGIONAL": regional, + "URBAN": urban, "PUBLISH_PERIOD": "500", "PIRATE": "true" if random.randint(1, 100) < 10 else "false" }, # depends_on=["nominatim", "osrm"], network_mode="host", - volumes=[f"./{cred["id"]}:/app/credentials"], + volumes=[f"./{cred["id"]}:/app/credentials", f"./data/{cred["id"]}:/data"], restart="no", ) # if compose.services[cred["id"]].environment["PIRATE"] == "true": diff --git a/tracky/src/Dockerfile b/tracky/src/Dockerfile index 8aea8981..f8c31e28 100644 --- a/tracky/src/Dockerfile +++ b/tracky/src/Dockerfile @@ -12,7 +12,7 @@ RUN go build -o tracky tracky.go firmware.go FROM alpine:latest WORKDIR /app - +RUN mkdir -p /data COPY --from=builder /app/tracky . ENTRYPOINT ["./tracky"] diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 7a4bb6d9..42e76e7a 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -100,11 +100,12 @@ func Init() { func Terminate() { taskManager.Shutdown(0) } + func Loop() { rand.Seed(time.Now().UnixNano()) creds, _ := trackeroo.GetCredentials() + lastRouteFile := "/data/last_route.json" deviceType := creds.DeviceType - // streetProvider := trackeroo.NewCachedStreetProvider("http://localhost:12345/api/interpreter") overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL"), overpassClient) routingService := trackeroo.NewRoutingService( @@ -161,19 +162,39 @@ func Loop() { speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, isRegional, isUrban) - route, err, cityErr := trackeroo.GetRoute(streetProvider, cities, lastEnd) - if err != nil { - trackeroo.Error("Error getting route in %s %v", cityErr, err) - trackeroo.Warning("Removing %s", cityErr) - for i, city := range cities { - if city == cityErr { - cities = append(cities[:i], cities[i+1:]...) + var route []trackeroo.Street + var err error + if trackeroo.ExistsPrevRoute(lastRouteFile) { + route, err = trackeroo.LoadRoute(lastRouteFile) + if err != nil { + trackeroo.Error("Error loading route %v, discarding file", err) + trackeroo.DeleteRoute(lastRouteFile) + continue + } + lastEnd = route[1] + } else { + trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, isRegional, isUrban) + var cityErr string + route, err, cityErr = trackeroo.GetRoute(streetProvider, cities, lastEnd, isUrban) + if err != nil { + trackeroo.Error("Error getting route from %s %v", cityErr, err) + trackeroo.Warning("Removing %s", cityErr) + for i, city := range cities { + if city == cityErr { + cities = append(cities[:i], cities[i+1:]...) + } } + continue } - continue } trackeroo.Info("Route: %+v -> %+v", route[0], route[1]) + err = trackeroo.SaveRoute(route, lastRouteFile) + if err != nil { + trackeroo.Error("Error saving route %v", err) + } else { + trackeroo.Info("Route saved to %s", lastRouteFile) + } + drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, route, 60, 100, isPirate, creds.DeviceType) if err != nil { trackeroo.Error("Error initializing driving simulator %v", err) @@ -237,6 +258,7 @@ func Loop() { trackeroo.Millisleep(100) } /* Routing terminated, waiting before next route */ + trackeroo.DeleteRoute(lastRouteFile) time.Sleep(time.Second * 120) if !normalRun { /* Wait some more */ diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index fbf6c5fe..e620b561 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -1,13 +1,16 @@ package trackeroo import ( + "encoding/json" + "fmt" "math/rand" + "os" ) type Street struct { - Coordinate Coordinate - StreetName string - City string + Coordinate Coordinate `json:"coordinate"` + StreetName string `json:"street_name"` + City string `json:"city"` } func stringToStreet(city string, street OverpassElement) Street { @@ -30,14 +33,17 @@ func NewCachedStreetProvider(baseURL string, overpassClient *OverpassClient) *Ca } } -func (p *CachedStreetProvider) GetRandomStreet(city string) (Street, error) { +func (p *CachedStreetProvider) GetRandomStreet(city string, isUrban bool) (Street, error) { Info("Getting random street from %s", city) if streets, ok := p.cache[city]; ok && len(streets) > 0 { Info("Cache hit for %s", city) return stringToStreet(city, streets[rand.Intn(len(streets))]), nil } - - streets, err := p.client.GetStreets(city, 100) + radiusMeters := 2000 + if isUrban { + radiusMeters = 10000 + } + streets, err := p.client.GetStreets(city, 100, radiusMeters) if err != nil { return Street{}, err } @@ -47,14 +53,14 @@ func (p *CachedStreetProvider) GetRandomStreet(city string) (Street, error) { return stringToStreet(city, streets[rand.Intn(len(streets))]), nil } -func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street) ([]Street, error, string) { +func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street, isUrban bool) ([]Street, error, string) { var route []Street if lastEnd.StreetName != "" { route = append(route, lastEnd) } else { city := cities[rand.Intn(len(cities))] - randStreet, err := provider.GetRandomStreet(city) + randStreet, err := provider.GetRandomStreet(city, isUrban) if err != nil { return nil, err, city } @@ -62,7 +68,7 @@ func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street) ( } city := cities[rand.Intn(len(cities))] - randStreet, err := provider.GetRandomStreet(city) + randStreet, err := provider.GetRandomStreet(city, isUrban) if err != nil { return nil, err, city } @@ -70,3 +76,44 @@ func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street) ( return route, nil, "" } + +func ExistsPrevRoute(filename string) bool { + _, err := os.Stat(filename) + return !os.IsNotExist(err) +} + +func SaveRoute(route []Street, filename string) error { + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + + jsonData, err := json.Marshal(route) + if err != nil { + return err + } + fmt.Fprintf(file, "%s\n", jsonData) + + return nil +} + +func LoadRoute(filename string) ([]Street, error) { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + var route []Street + err = json.NewDecoder(file).Decode(&route) + if err != nil { + return nil, err + } + + return route, nil +} + +func DeleteRoute(filename string) error { + return os.Remove(filename) +} From dcbdca2632ec01b6783ea204a6f7a93b32b5bc78 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 13:31:32 +0200 Subject: [PATCH 014/242] refining street gathering logic --- tracky/src/trackeroo/overpass.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 14330c82..7cf0899e 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -73,8 +73,8 @@ out tags geom %d; return overpassResp.Elements, nil } -func (c *OverpassClient) GetRandomStreet(city string) (Street, error) { - streets, err := c.GetStreets(city, 100) +func (c *OverpassClient) GetRandomStreet(city string, radiusMeters int) (Street, error) { + streets, err := c.GetStreets(city, 100, radiusMeters) if err != nil { return Street{}, err } From ffe600a438c95e0a28a56ce6c5e4af43b8ce47ab Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 13:39:27 +0200 Subject: [PATCH 015/242] refining street gathering logic --- tracky/src/trackeroo/overpass.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 7cf0899e..39fe108e 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -41,7 +41,7 @@ func (c *OverpassClient) GetStreets(city string, limit int, radiusMeters int) ([ } query := fmt.Sprintf(` -[out:json][timeout:25]; +[out:json][timeout:60]; area["ISO3166-1"="IT"][admin_level=2]->.italy; node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; ( @@ -84,7 +84,7 @@ func (c *OverpassClient) GetRandomStreet(city string, radiusMeters int) (Street, func (c *OverpassClient) GetRegions() ([]string, error) { - query := `[out:json][timeout:25]; + query := `[out:json][timeout:60]; area["ISO3166-1"="IT"][admin_level=2]->.italy; relation["boundary"="administrative"]["admin_level"=4](area.italy); out tags;` @@ -118,7 +118,7 @@ out tags;` } func (c *OverpassClient) GetCities(region string) ([]string, error) { - query := fmt.Sprintf(`'[out:json][timeout:25]; + query := fmt.Sprintf(`'[out:json][timeout:60]; relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; .reg map_to_area->.region; node["place"~"city|town"](area.region); From 0e1a1b751e9323ecb7adbcfdf07eaed4a5937d1c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 13:45:40 +0200 Subject: [PATCH 016/242] refining street gathering logic --- tracky/src/trackeroo/overpass.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 39fe108e..4892f09e 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -1,12 +1,13 @@ package trackeroo import ( - "bytes" "encoding/json" "fmt" "io" "math/rand" "net/http" + "net/url" + "strings" "time" ) @@ -49,8 +50,10 @@ node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; ); out tags geom %d; `, city, radiusMeters, limit) + form := url.Values{} + form.Set("data", query) - resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) + resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", strings.NewReader(form.Encode())) if err != nil { return nil, fmt.Errorf("failed to query Overpass API: %w", err) } @@ -89,7 +92,10 @@ area["ISO3166-1"="IT"][admin_level=2]->.italy; relation["boundary"="administrative"]["admin_level"=4](area.italy); out tags;` - resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) + form := url.Values{} + form.Set("data", query) + + resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", strings.NewReader(form.Encode())) if err != nil { return nil, fmt.Errorf("failed to query Overpass API: %w", err) } @@ -123,7 +129,11 @@ relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; .reg map_to_area->.region; node["place"~"city|town"](area.region); out tags;'`, region) - resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", bytes.NewBufferString(query)) + + form := url.Values{} + form.Set("data", query) + + resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", strings.NewReader(form.Encode())) if err != nil { return nil, fmt.Errorf("failed to query Overpass API: %w", err) } From e13eabc20cf172152c48d3e7dcda16417aab4bbe Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 13:55:02 +0200 Subject: [PATCH 017/242] refining street gathering logic --- tracky/src/trackeroo/overpass.go | 99 +++++++++++++++++--------------- 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 4892f09e..8343df4b 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -36,6 +36,52 @@ func NewOverpassClient(baseURL string) *OverpassClient { } } +func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { + const maxRetries = 5 + + form := url.Values{} + form.Set("data", query) + + var lastErr error + var overpassResp OverpassResponse + + for attempt := 1; attempt <= maxRetries; attempt++ { + resp, err := c.Client.Post( + c.BaseURL, + "application/x-www-form-urlencoded", + strings.NewReader(form.Encode()), + ) + if err != nil { + lastErr = fmt.Errorf("failed to query Overpass API: %w", err) + time.Sleep(time.Duration(attempt) * time.Second) + continue + } + + bodyBytes, _ := io.ReadAll(resp.Body) + resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + lastErr = fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(bodyBytes)) + + if resp.StatusCode == http.StatusTooManyRequests || resp.StatusCode >= 500 { + time.Sleep(time.Duration(attempt) * time.Second) + continue + } + break + } + + if err := json.Unmarshal(bodyBytes, &overpassResp); err != nil { + lastErr = fmt.Errorf("failed to decode response: %w", err) + time.Sleep(time.Duration(attempt) * time.Second) + continue + } + + return overpassResp, nil + } + + return OverpassResponse{}, lastErr +} + func (c *OverpassClient) GetStreets(city string, limit int, radiusMeters int) ([]OverpassElement, error) { if limit == 0 { limit = 100 @@ -50,23 +96,10 @@ node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; ); out tags geom %d; `, city, radiusMeters, limit) - form := url.Values{} - form.Set("data", query) - resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", strings.NewReader(form.Encode())) + overpassResp, err := c.runQuery(query) if err != nil { - return nil, fmt.Errorf("failed to query Overpass API: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) - } - - var overpassResp OverpassResponse - if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { - return nil, fmt.Errorf("failed to decode response: %w", err) + return nil, err } if len(overpassResp.Elements) == 0 { @@ -92,23 +125,9 @@ area["ISO3166-1"="IT"][admin_level=2]->.italy; relation["boundary"="administrative"]["admin_level"=4](area.italy); out tags;` - form := url.Values{} - form.Set("data", query) - - resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", strings.NewReader(form.Encode())) + overpassResp, err := c.runQuery(query) if err != nil { - return nil, fmt.Errorf("failed to query Overpass API: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) - } - - var overpassResp OverpassResponse - if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { - return nil, fmt.Errorf("failed to decode response: %w", err) + return nil, err } if len(overpassResp.Elements) == 0 { @@ -130,23 +149,9 @@ relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; node["place"~"city|town"](area.region); out tags;'`, region) - form := url.Values{} - form.Set("data", query) - - resp, err := c.Client.Post(c.BaseURL, "application/x-www-form-urlencoded", strings.NewReader(form.Encode())) + overpassResp, err := c.runQuery(query) if err != nil { - return nil, fmt.Errorf("failed to query Overpass API: %w", err) - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - return nil, fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(body)) - } - - var overpassResp OverpassResponse - if err := json.NewDecoder(resp.Body).Decode(&overpassResp); err != nil { - return nil, fmt.Errorf("failed to decode response: %w", err) + return nil, err } if len(overpassResp.Elements) == 0 { From 500bd6740dc7fcf832a3538e21633219948bedfd Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 13:59:24 +0200 Subject: [PATCH 018/242] refining street gathering logic --- tracky/src/trackeroo/overpass.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 8343df4b..0c9f45c5 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -6,7 +6,6 @@ import ( "io" "math/rand" "net/http" - "net/url" "strings" "time" ) @@ -39,9 +38,6 @@ func NewOverpassClient(baseURL string) *OverpassClient { func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { const maxRetries = 5 - form := url.Values{} - form.Set("data", query) - var lastErr error var overpassResp OverpassResponse @@ -49,7 +45,7 @@ func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { resp, err := c.Client.Post( c.BaseURL, "application/x-www-form-urlencoded", - strings.NewReader(form.Encode()), + strings.NewReader(query), ) if err != nil { lastErr = fmt.Errorf("failed to query Overpass API: %w", err) From 1e9d1b9de63df547daa6188dae4757a2dc276943 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:01:58 +0200 Subject: [PATCH 019/242] refining street gathering logic --- tracky/src/trackeroo/overpass.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 0c9f45c5..8343df4b 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -6,6 +6,7 @@ import ( "io" "math/rand" "net/http" + "net/url" "strings" "time" ) @@ -38,6 +39,9 @@ func NewOverpassClient(baseURL string) *OverpassClient { func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { const maxRetries = 5 + form := url.Values{} + form.Set("data", query) + var lastErr error var overpassResp OverpassResponse @@ -45,7 +49,7 @@ func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { resp, err := c.Client.Post( c.BaseURL, "application/x-www-form-urlencoded", - strings.NewReader(query), + strings.NewReader(form.Encode()), ) if err != nil { lastErr = fmt.Errorf("failed to query Overpass API: %w", err) From edd909946fb97e5576ad061430c4896ee32bdaca Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:02:46 +0200 Subject: [PATCH 020/242] fixing overpass --- tracky/src/trackeroo/overpass.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 8343df4b..c623b3ef 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -37,6 +37,7 @@ func NewOverpassClient(baseURL string) *OverpassClient { } func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { + Info("Running Overpass query: %s", query) const maxRetries = 5 form := url.Values{} From 96599216f8c1b9fb4826388a765cb73c8af86b10 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:03:22 +0200 Subject: [PATCH 021/242] fixing overpass --- tracky/src/trackeroo/overpass.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index c623b3ef..c67ff25c 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -37,8 +37,8 @@ func NewOverpassClient(baseURL string) *OverpassClient { } func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { - Info("Running Overpass query: %s", query) const maxRetries = 5 + Info("Running Overpass query: %s", query) form := url.Values{} form.Set("data", query) From 1e17beec5b8c90d8218f17d56f223c2a2f437b48 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:06:08 +0200 Subject: [PATCH 022/242] fixing overpass --- tracky/src/trackeroo/overpass.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index c67ff25c..d661658f 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -144,11 +144,11 @@ out tags;` } func (c *OverpassClient) GetCities(region string) ([]string, error) { - query := fmt.Sprintf(`'[out:json][timeout:60]; + query := fmt.Sprintf(`[out:json][timeout:60]; relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; .reg map_to_area->.region; node["place"~"city|town"](area.region); -out tags;'`, region) +out tags;`, region) overpassResp, err := c.runQuery(query) if err != nil { From 7bbd28aecf53ca155749661b4c86623f9f6c949b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:08:56 +0200 Subject: [PATCH 023/242] fixing overpass --- tracky/src/trackeroo/overpass.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index d661658f..762be235 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -1,6 +1,7 @@ package trackeroo import ( + "bytes" "encoding/json" "fmt" "io" @@ -71,6 +72,13 @@ func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { break } + contentType := resp.Header.Get("Content-Type") + if strings.Contains(contentType, "text/html") || bytes.HasPrefix(bodyBytes, []byte(" Date: Mon, 13 Oct 2025 14:12:57 +0200 Subject: [PATCH 024/242] fixing overpass --- tracky/geo-services/docker-compose-local.yml | 1 + tracky/geo-services/docker-compose.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/tracky/geo-services/docker-compose-local.yml b/tracky/geo-services/docker-compose-local.yml index 4434595c..468f433c 100644 --- a/tracky/geo-services/docker-compose-local.yml +++ b/tracky/geo-services/docker-compose-local.yml @@ -1,6 +1,7 @@ services: overpass: image: wiktorn/overpass-api + command: --allow-duplicate-queries container_name: overpass-italy ports: - "12345:80" diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index 0ead2a3a..66cc01c7 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -1,6 +1,7 @@ services: overpass: image: wiktorn/overpass-api + command: --allow-duplicate-queries container_name: overpass-italy ports: - "12345:80" From b05f7b0e3a9f1469429c1fd492039c75a7da2eaf Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:18:28 +0200 Subject: [PATCH 025/242] fixing overpass --- tracky/geo-services/docker-compose-local.yml | 4 +++- tracky/geo-services/docker-compose.yml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tracky/geo-services/docker-compose-local.yml b/tracky/geo-services/docker-compose-local.yml index 468f433c..66cd7377 100644 --- a/tracky/geo-services/docker-compose-local.yml +++ b/tracky/geo-services/docker-compose-local.yml @@ -1,7 +1,6 @@ services: overpass: image: wiktorn/overpass-api - command: --allow-duplicate-queries container_name: overpass-italy ports: - "12345:80" @@ -9,6 +8,9 @@ services: - OVERPASS_META=yes - OVERPASS_MODE=init - OVERPASS_PLANET_URL=http://download.geofabrik.de/europe/italy/centro-latest.osm.bz2-disabled + - OVERPASS_RATE_LIMIT=0 + - OVERPASS_RATE_SPACE=1073741824 + - OVERPASS_ALLOW_DUPLICATE_QUERIES=yes volumes: - ./overpass-data:/db nominatim: diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index 66cc01c7..c03fffb7 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -1,7 +1,6 @@ services: overpass: image: wiktorn/overpass-api - command: --allow-duplicate-queries container_name: overpass-italy ports: - "12345:80" @@ -9,6 +8,9 @@ services: - OVERPASS_META=yes - OVERPASS_MODE=init - OVERPASS_PLANET_URL=http://download.geofabrik.de/europe/italy-latest.osm.bz2-disabled + - OVERPASS_RATE_LIMIT=0 + - OVERPASS_RATE_SPACE=1073741824 + - OVERPASS_ALLOW_DUPLICATE_QUERIES=yes volumes: - ./overpass-data:/db From 368f4ddf5c31715cb17e5040340bf8b446563be2 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:21:08 +0200 Subject: [PATCH 026/242] fixing overpass --- tracky/src/firmware.go | 1 + tracky/src/trackeroo/overpass.go | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 42e76e7a..c6209df8 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -172,6 +172,7 @@ func Loop() { continue } lastEnd = route[1] + trackeroo.Info("Route loaded successfully") } else { trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, isRegional, isUrban) var cityErr string diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 762be235..f359eebc 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -39,7 +39,6 @@ func NewOverpassClient(baseURL string) *OverpassClient { func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { const maxRetries = 5 - Info("Running Overpass query: %s", query) form := url.Values{} form.Set("data", query) From 77f959531ea9c81ba4e74891ac93094496b28033 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:27:39 +0200 Subject: [PATCH 027/242] fixing overpass --- tracky/geo-services/docker-compose.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index c03fffb7..a17fb2bf 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -4,6 +4,9 @@ services: container_name: overpass-italy ports: - "12345:80" + deploy: + mode: replicated + replicas: 3 environment: - OVERPASS_META=yes - OVERPASS_MODE=init From 198dd2eb2ca4f599b3fc7b34315e755bd2af2ec1 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:28:18 +0200 Subject: [PATCH 028/242] fixing overpass --- tracky/src/trackeroo/overpass.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index f359eebc..22380840 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -32,13 +32,13 @@ func NewOverpassClient(baseURL string) *OverpassClient { return &OverpassClient{ BaseURL: baseURL, Client: &http.Client{ - Timeout: 30 * time.Second, + Timeout: 60 * time.Second, }, } } func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { - const maxRetries = 5 + const maxRetries = 10 form := url.Values{} form.Set("data", query) From a57abaed02773d210ee7f2c65ffb3a8982b25dc8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:28:45 +0200 Subject: [PATCH 029/242] fixing overpass --- tracky/geo-services/docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index a17fb2bf..dffe8163 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -1,7 +1,6 @@ services: overpass: image: wiktorn/overpass-api - container_name: overpass-italy ports: - "12345:80" deploy: From d6f9fce98bc718e664e9dff516ab0bbe74e9b8f3 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:29:44 +0200 Subject: [PATCH 030/242] fixing overpass --- tracky/geo-services/docker-compose.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index dffe8163..f89d4ba2 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -16,18 +16,6 @@ services: volumes: - ./overpass-data:/db - nominatim: - image: mediagis/nominatim:4.4 - container_name: nominatim - ports: - - "8082:8080" - environment: - - PBF_URL=https://download.geofabrik.de/europe/italy-latest.osm.pbf - - REPLICATION_URL=https://download.geofabrik.de/europe/italy-updates - - NOMINATIM_PASSWORD=password - volumes: - - ./nominatim-data:/var/lib/postgresql/14/main - osrm: image: osrm/osrm-backend container_name: osrm From 8d87dbf512761f6c2e2b26326cbb1e457879518e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:54:56 +0200 Subject: [PATCH 031/242] fixing overpass --- tracky/geo-services/docker-compose.yml | 12 ++++-- tracky/geo-services/nginx/nginx.conf | 54 ++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 tracky/geo-services/nginx/nginx.conf diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index f89d4ba2..3a6e18da 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -1,20 +1,26 @@ services: overpass: image: wiktorn/overpass-api - ports: - - "12345:80" deploy: mode: replicated replicas: 3 environment: - OVERPASS_META=yes - - OVERPASS_MODE=init + - OVERPASS_MODE=clone - OVERPASS_PLANET_URL=http://download.geofabrik.de/europe/italy-latest.osm.bz2-disabled - OVERPASS_RATE_LIMIT=0 - OVERPASS_RATE_SPACE=1073741824 - OVERPASS_ALLOW_DUPLICATE_QUERIES=yes volumes: - ./overpass-data:/db + nginx: + image: nginx:alpine + ports: + - "12345:80" + volumes: + - ./nginx:/etc/nginx:ro + depends_on: + - overpass osrm: image: osrm/osrm-backend diff --git a/tracky/geo-services/nginx/nginx.conf b/tracky/geo-services/nginx/nginx.conf new file mode 100644 index 00000000..9f48f348 --- /dev/null +++ b/tracky/geo-services/nginx/nginx.conf @@ -0,0 +1,54 @@ +events { + worker_connections 1024; +} + +http { + upstream overpass_backend { + least_conn; # Use least connections algorithm for better distribution + + # Docker Swarm uses DNS round-robin for service discovery + # The service name resolves to all replica IPs + server overpass:80 max_fails=3 fail_timeout=30s; + + keepalive 32; # Keep connections alive for better performance + } + + server { + listen 80; + server_name _; + + # Increase timeouts for long-running Overpass queries + proxy_connect_timeout 300s; + proxy_send_timeout 300s; + proxy_read_timeout 300s; + send_timeout 300s; + + # Increase buffer sizes for large responses + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; + + location / { + proxy_pass http://overpass_backend; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # HTTP/1.1 for keepalive + proxy_http_version 1.1; + proxy_set_header Connection ""; + } + + # Health check endpoint (optional) + location /nginx-health { + access_log off; + return 200 "healthy\n"; + add_header Content-Type text/plain; + } + } + + # Logging + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log warn; +} From bac504d6e6d563ea51e6dfe05e9b7f31cc2f5d67 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 14:59:30 +0200 Subject: [PATCH 032/242] fixing overpass --- tracky/geo-services/nginx/nginx.conf | 70 ++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 9 deletions(-) diff --git a/tracky/geo-services/nginx/nginx.conf b/tracky/geo-services/nginx/nginx.conf index 9f48f348..02503b26 100644 --- a/tracky/geo-services/nginx/nginx.conf +++ b/tracky/geo-services/nginx/nginx.conf @@ -3,20 +3,28 @@ events { } http { - upstream overpass_backend { - least_conn; # Use least connections algorithm for better distribution + # Define cache path and settings + proxy_cache_path /var/cache/nginx/overpass + levels=1:2 + keys_zone=overpass_cache:100m + max_size=10g + inactive=7d + use_temp_path=off; - # Docker Swarm uses DNS round-robin for service discovery - # The service name resolves to all replica IPs + upstream overpass_backend { + least_conn; server overpass:80 max_fails=3 fail_timeout=30s; - - keepalive 32; # Keep connections alive for better performance + keepalive 32; } server { listen 80; server_name _; + # Enable request body caching + client_body_buffer_size 1M; + client_max_body_size 10M; + # Increase timeouts for long-running Overpass queries proxy_connect_timeout 300s; proxy_send_timeout 300s; @@ -38,17 +46,61 @@ http { # HTTP/1.1 for keepalive proxy_http_version 1.1; proxy_set_header Connection ""; + + # Cache configuration + proxy_cache overpass_cache; + + # CRITICAL: Cache key must include request body for POST requests + proxy_cache_key "$request_method$request_uri$request_body"; + + # Cache GET and POST requests + proxy_cache_methods GET HEAD POST; + + proxy_cache_valid 200 1h; # Cache successful responses for 1 hour + proxy_cache_valid 404 10m; # Cache 404s for 10 minutes + proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; + proxy_cache_background_update on; + proxy_cache_lock on; # Prevent cache stampede + + # Add cache status header for debugging + add_header X-Cache-Status $upstream_cache_status; + + # Ignore cache control from backend + proxy_ignore_headers Cache-Control Expires; + } + + # Cache purge endpoint (optional - restrict access in production) + location ~ /cache-purge/(.*) { + allow 127.0.0.1; + allow 172.0.0.0/8; # Docker networks + deny all; + + proxy_cache_purge overpass_cache "POST$1$request_body"; } - # Health check endpoint (optional) + # Health check endpoint location /nginx-health { access_log off; return 200 "healthy\n"; add_header Content-Type text/plain; } + + # Cache stats endpoint (optional) + location /cache-stats { + allow 127.0.0.0/8; + allow 172.0.0.0/8; + deny all; + + stub_status; + } } - # Logging - access_log /var/log/nginx/access.log; + # Logging with cache status + log_format cache_log '$remote_addr - $remote_user [$time_local] ' + '"$request" $status $body_bytes_sent ' + '"$http_referer" "$http_user_agent" ' + 'Cache: $upstream_cache_status'; + + access_log /var/log/nginx/access.log cache_log; error_log /var/log/nginx/error.log warn; } From 1807c77c24dae4421690df0ac2c5d23c518b0f71 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 15:01:31 +0200 Subject: [PATCH 033/242] fixing overpass --- tracky/geo-services/docker-compose.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index 3a6e18da..3f2649d8 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -1,18 +1,16 @@ services: overpass: image: wiktorn/overpass-api - deploy: - mode: replicated - replicas: 3 environment: - OVERPASS_META=yes - - OVERPASS_MODE=clone + - OVERPASS_MODE=init - OVERPASS_PLANET_URL=http://download.geofabrik.de/europe/italy-latest.osm.bz2-disabled - OVERPASS_RATE_LIMIT=0 - OVERPASS_RATE_SPACE=1073741824 - OVERPASS_ALLOW_DUPLICATE_QUERIES=yes volumes: - ./overpass-data:/db + nginx: image: nginx:alpine ports: From e653883564d2dced0860d889c66950ffc02fc834 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 15:04:58 +0200 Subject: [PATCH 034/242] fixing overpass --- tracky/geo-services/nginx/nginx.conf | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tracky/geo-services/nginx/nginx.conf b/tracky/geo-services/nginx/nginx.conf index 02503b26..68b78d93 100644 --- a/tracky/geo-services/nginx/nginx.conf +++ b/tracky/geo-services/nginx/nginx.conf @@ -69,15 +69,6 @@ http { proxy_ignore_headers Cache-Control Expires; } - # Cache purge endpoint (optional - restrict access in production) - location ~ /cache-purge/(.*) { - allow 127.0.0.1; - allow 172.0.0.0/8; # Docker networks - deny all; - - proxy_cache_purge overpass_cache "POST$1$request_body"; - } - # Health check endpoint location /nginx-health { access_log off; From c35ebd7c694b1ca7460f2a8d1239e3939f9e69b2 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 15:12:49 +0200 Subject: [PATCH 035/242] fixing overpass --- tracky/src/firmware.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index c6209df8..6e078a7a 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -132,9 +132,10 @@ func Loop() { trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) regions = []string{"Toscana"} } - cities, err = overpassClient.GetCities(regions[rand.Intn(len(regions))]) + region := regions[rand.Intn(len(regions))] + cities, err = overpassClient.GetCities(region) if err != nil || len(cities) == 0 { - trackeroo.Error("Error getting cities, falling back to default cities: %v", err) + trackeroo.Error("Error getting cities for %s, falling back to default cities: %v", region, err) cities = []string{"Firenze", "Pisa", "Siena", "Lucca", "Vinci", "Prato", "Montecatini", "Arezzo", "Grosseto", "Massa"} } From 70cdf74824d1c7a0c9cdaef5afa0508a04ab630f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 15:32:26 +0200 Subject: [PATCH 036/242] fixing overpass --- tracky/src/firmware.go | 3 +++ tracky/src/trackeroo/overpass.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 6e078a7a..f066d805 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -131,12 +131,14 @@ func Loop() { if err != nil || len(regions) == 0 { trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) regions = []string{"Toscana"} + trackeroo.DeleteRoute(lastRouteFile) } region := regions[rand.Intn(len(regions))] cities, err = overpassClient.GetCities(region) if err != nil || len(cities) == 0 { trackeroo.Error("Error getting cities for %s, falling back to default cities: %v", region, err) cities = []string{"Firenze", "Pisa", "Siena", "Lucca", "Vinci", "Prato", "Montecatini", "Arezzo", "Grosseto", "Massa"} + trackeroo.DeleteRoute(lastRouteFile) } if isUrban { @@ -148,6 +150,7 @@ func Loop() { if err != nil || len(regions) == 0 { trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) regions = []string{"Toscana"} + trackeroo.DeleteRoute(lastRouteFile) } cities = make([]string, 0) for _, region := range regions { diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 22380840..675dd5cf 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -130,7 +130,7 @@ func (c *OverpassClient) GetRegions() ([]string, error) { query := `[out:json][timeout:60]; area["ISO3166-1"="IT"][admin_level=2]->.italy; -relation["boundary"="administrative"]["admin_level"=4](area.italy); +relation["boundary"="administrative"]["admin_level"=4]["ISO3166-2"~"^IT-"](area.italy); out tags;` overpassResp, err := c.runQuery(query) From c9bc41358d670242d2e4bdf424c1bb383e6b1e27 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 15:48:17 +0200 Subject: [PATCH 037/242] added devices --- utils/gen_mongo_dev/main.go | 117 +++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 50 deletions(-) diff --git a/utils/gen_mongo_dev/main.go b/utils/gen_mongo_dev/main.go index 9813d73d..1e33ba84 100644 --- a/utils/gen_mongo_dev/main.go +++ b/utils/gen_mongo_dev/main.go @@ -17,41 +17,68 @@ const ( OTHER = "other" ) -// Container-style names for randomization -var containerNames = []string{ - "amazing_turing", "boring_wozniak", "clever_newton", "dreamy_tesla", - "eager_darwin", "friendly_curie", "gracious_hawking", "happy_einstein", - "intelligent_jobs", "jolly_gates", "kind_torvalds", "loving_lovelace", - "mystifying_feynman", "naughty_dijkstra", "optimistic_babbage", "peaceful_pascal", - "quirky_shannon", "relaxed_turing", "serene_hopper", "trusting_knuth", - "upbeat_ritchie", "vibrant_thompson", "wonderful_wirth", "xenodochial_carmack", - "youthful_stallman", "zealous_berners", "admiring_bohr", "adoring_morse", - "affectionate_bell", "agitated_planck", "amazing_galileo", "angry_maxwell", - "boring_heisenberg", "brave_schrodinger", "busy_pauli", "charming_dirac", - "clever_fermi", "compassionate_oppenheimer", "competent_rutherford", "condescending_volta", - "confident_faraday", "cool_ohm", "cranky_ampere", "crazy_coulomb", - "curious_feynman", "dazzling_maxwell", "determined_kelvin", "distracted_planck", - "dreamy_euler", "eager_gauss", "ecstatic_riemann", "elastic_fourier", - "elegant_lagrange", "elated_laplace", "eloquent_leibniz", "enchanting_poincare", - "energetic_hilbert", "epic_cantor", "exciting_godel", "exotic_turing", - "fabulous_ramanujan", "faithful_hardy", "fancy_erdos", "fascinated_noether", - "fearless_galois", "fervent_abel", "flamboyant_jacobi", "focused_cauchy", - "friendly_weierstrass", "frosty_dedekind", "funny_peano", "furious_russell", - "gallant_whitehead", "gentle_church", "gifted_kleene", "goofy_markov", - "graceful_chebyshev", "great_kolmogorov", "grieving_wiener", "groovy_shannon", - "happy_nyquist", "hardcore_bell", "heartwarming_bose", "heuristic_fermi", - "hopeful_bardeen", "hungry_cooper", "hyper_shockley", "inspiring_bardeen", - "interesting_watson", "inventive_crick", "iron_franklin", "jaunty_pauling", - "jovial_mendeleev", "keen_bohr", "laughing_rutherford", "lucid_heisenberg", - "magical_dirac", "magnificent_feynman", "merry_schwinger", "modest_dyson", - "motivated_penrose", "nervous_hawking", "noble_weinberg", "nostalgic_salam", - "objective_glashow", "optimized_higgs", "original_yang", "outstanding_lee", - "patient_wu", "pedantic_pauli", "phenomenal_born", "pious_planck", - "playful_compton", "polite_millikan", "practical_michelson", "proud_morley", - "puzzled_fizeau", "quizzical_doppler", "romantic_hertz", "sad_marconi", - "serene_tesla", "sharp_edison", "silly_westinghouse", "sleepy_siemens", - "stoic_ohm", "strange_ampere", "suspicious_volta", "sweet_galvani", - "tender_faraday", "thirsty_henry", "thoughtful_weber", "thrilled_gauss", +var adjectives = []string{ + "admiring", "adoring", "affectionate", "agitated", "amazing", + "angry", "awesome", "beautiful", "blissful", "bold", + "boring", "brave", "busy", "calm", "charming", + "clever", "cool", "compassionate", "competent", "condescending", + "confident", "cranky", "crazy", "curious", "dazzling", + "determined", "distracted", "dreamy", "eager", "ecstatic", + "elastic", "elated", "elegant", "eloquent", "enchanting", + "energetic", "epic", "exciting", "exotic", "fabulous", + "faithful", "fancy", "fascinated", "fearless", "fervent", + "flamboyant", "focused", "friendly", "frosty", "funny", + "furious", "gallant", "gentle", "gifted", "goofy", + "graceful", "gracious", "great", "grieving", "groovy", + "happy", "hardcore", "heartwarming", "heuristic", "hopeful", + "hungry", "hyper", "inspiring", "intelligent", "interesting", + "inventive", "iron", "jaunty", "jolly", "jovial", + "keen", "kind", "laughing", "loving", "lucid", + "magical", "magnificent", "merry", "modest", "motivated", + "mystifying", "naughty", "nervous", "noble", "nostalgic", + "objective", "optimistic", "optimized", "original", "outstanding", + "patient", "peaceful", "pedantic", "phenomenal", "pious", + "playful", "polite", "practical", "proud", "puzzled", + "quirky", "quizzical", "relaxed", "romantic", "sad", + "serene", "sharp", "silly", "sleepy", "stoic", + "strange", "suspicious", "sweet", "tender", "thirsty", + "thoughtful", "thrilled", "trusting", "upbeat", "vibrant", + "wonderful", "xenodochial", "youthful", "zealous", +} + +var names = []string{ + "abel", "ampere", "babbage", "bardeen", "bell", + "berners", "bohr", "born", "bose", "cantor", + "carmack", "cauchy", "chebyshev", "church", "compton", + "cooper", "coulomb", "crick", "curie", "darwin", + "dedekind", "dijkstra", "dirac", "doppler", "dyson", + "edison", "einstein", "erdos", "euler", "faraday", + "fermi", "feynman", "fizeau", "fourier", "franklin", + "galileo", "galois", "galvani", "gates", "gauss", + "glashow", "godel", "hardy", "hawking", "heisenberg", + "henry", "hertz", "higgs", "hilbert", "hopper", + "jacobi", "jobs", "kelvin", "kleene", "knuth", + "kolmogorov", "lagrange", "laplace", "lee", "leibniz", + "lovelace", "marconi", "markov", "maxwell", "mendeleev", + "michelson", "millikan", "morley", "morse", "newton", + "noether", "nyquist", "ohm", "oppenheimer", "pascal", + "pauli", "pauling", "peano", "penrose", "planck", + "poincare", "ramanujan", "riemann", "ritchie", "russell", + "rutherford", "salam", "schrodinger", "schwinger", "shannon", + "shockley", "siemens", "stallman", "tesla", "thompson", + "torvalds", "turing", "volta", "watson", "weber", + "weinberg", "weierstrass", "westinghouse", "whitehead", "wiener", + "wirth", "wozniak", "wu", "yang", +} + +func generateRandomName() string { + // Seed the random number generator (do this once in your main function, not every time) + rand.Seed(time.Now().UnixNano()) + + adjective := adjectives[rand.Intn(len(adjectives))] + name := names[rand.Intn(len(names))] + + return fmt.Sprintf("%s_%s", adjective, name) } var deviceTypes = []string{VALUABLES, FOOD, PRIVATE_TRANSPORT, PUBLIC_TRANSPORT, OTHER} @@ -91,7 +118,7 @@ func generateJSObject() (string, error) { return "", err } - name := containerNames[mrand.Intn(len(containerNames))] + name := generateRandomName() deviceType := deviceTypes[mrand.Intn(len(deviceTypes))] id := generateRandomID() connected := mrand.Intn(2) == 1 // Random boolean @@ -120,7 +147,7 @@ func generateJSObjectList(count int) error { // Ensure unique name for { - name = containerNames[mrand.Intn(len(containerNames))] + name = generateRandomName() if !usedNames[name] { usedNames[name] = true break @@ -142,18 +169,16 @@ func generateJSObjectList(count int) error { } deviceType := deviceTypes[mrand.Intn(len(deviceTypes))] - connected := mrand.Intn(2) == 1 // Random boolean - lastMessage := generateRandomTime() createdAt := generateRandomTime() jsObject := fmt.Sprintf(`{ _id: "%s", name: "%s", - status: { connected: %t, last_message: "%s" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "%s", private_key: "%s", created_at: ISODate("%s"), -}`, id, name, connected, lastMessage, deviceType, privateKey, createdAt) +}`, id, name, deviceType, privateKey, createdAt) fmt.Print(jsObject) if i < count-1 { @@ -169,15 +194,7 @@ func generateJSObjectList(count int) error { func main() { rand.Seed(time.Now().UnixNano()) - // Generate 5 objects by default (max 50 due to name uniqueness) - count := 100 - - if count > len(containerNames) { - fmt.Printf("Warning: Requested %d objects but only %d unique names available. Using %d objects.\n", - count, len(containerNames), len(containerNames)) - count = len(containerNames) - } - + count := 200 fmt.Printf("// Generated %d JS objects with no duplicates:\n", count) err := generateJSObjectList(count) if err != nil { From 07a01ec7d8e93c82e2406f9d8f1f9e2f90bf882b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 15:48:43 +0200 Subject: [PATCH 038/242] added devices --- mongo/init.js | 1828 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 1717 insertions(+), 111 deletions(-) diff --git a/mongo/init.js b/mongo/init.js index c084bb01..f1291528 100644 --- a/mongo/init.js +++ b/mongo/init.js @@ -3,54 +3,60 @@ db.users.insertMany([ { username: "leonardo", role: "admin", - password_hash: "$2b$12$PHQyHC3QX7hSaSNk3otnJe90Htsf5nIqNeqSMKCWrmCHwbDvEUrwm", + password_hash: + "$2b$12$PHQyHC3QX7hSaSNk3otnJe90Htsf5nIqNeqSMKCWrmCHwbDvEUrwm", last_login: new Date(), session_token: "", issued_at: new Date(), - expires_at: new Date(Date.now() + 24*60*60*1000) // 24 hours from now + expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), // 24 hours from now }, { username: "simone", role: "admin", - password_hash: "$2b$12$CCBM/Xy54gPzHkJyMWovm.fTmUUqjg73GWb1cBDTKPaMU4JsfSXd6", + password_hash: + "$2b$12$CCBM/Xy54gPzHkJyMWovm.fTmUUqjg73GWb1cBDTKPaMU4JsfSXd6", last_login: new Date(), session_token: "", issued_at: new Date(), - expires_at: new Date(Date.now() + 24*60*60*1000) + expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), }, { username: "admin", role: "admin", - password_hash: "$2b$12$3CaXyt.SvoUeQiR5TAFdReV4AjnAlNe46/oL6SBd75souC5SvKLAu", + password_hash: + "$2b$12$3CaXyt.SvoUeQiR5TAFdReV4AjnAlNe46/oL6SBd75souC5SvKLAu", last_login: new Date(), session_token: "", issued_at: new Date(), - expires_at: new Date(Date.now() + 24*60*60*1000) + expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), }, { username: "apps", role: "admin", - password_hash: "$2b$12$ZhKtxqqkFfrcEXiKjgvM0.BqM9sVXTEZAQCP5/qhRxMBZn2cWWbJ6", + password_hash: + "$2b$12$ZhKtxqqkFfrcEXiKjgvM0.BqM9sVXTEZAQCP5/qhRxMBZn2cWWbJ6", last_login: new Date(), session_token: "", issued_at: new Date(), - expires_at: new Date(Date.now() + 24*60*60*1000) + expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), }, { username: "trackeroo", role: "admin", - password_hash: "$2b$12$NAfj6rvgE20aWfxfK9Y0j.aVUaA1k3eJak2a0.u11nO0/9ijsFX4W", // trackeroo + password_hash: + "$2b$12$NAfj6rvgE20aWfxfK9Y0j.aVUaA1k3eJak2a0.u11nO0/9ijsFX4W", // trackeroo last_login: new Date(), session_token: "", issued_at: new Date(), - expires_at: new Date(Date.now() + 24*60*60*1000) - } + expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), + }, ]); + db.devices.insertMany([ { _id: "trk-18608d12c8414acfcb9165b1", name: "wonderful_wirth", - status: { connected: true, last_message: "2025-08-02T16:40:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "m9mFoEWSL+GwWtoyPZsF2q4HpwLddf7JfsxmedN8h+Y=", created_at: ISODate("2025-08-18T03:36:46Z"), @@ -58,7 +64,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c843cfc86452c8bc", name: "xenodochial_carmack", - status: { connected: false, last_message: "2025-08-18T20:34:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "QNiUX1DdBq9hNGToa8ynDbXZRF9aDbO4LWvm7QspLo8=", created_at: ISODate("2025-08-08T07:04:46Z"), @@ -66,7 +72,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8443834a667d6c2", name: "merry_schwinger", - status: { connected: false, last_message: "2025-08-10T14:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "mS+C+G6Ut4mrbmz6v3EA5Fm7OvtcwrcRzvLOoIyIRDw=", created_at: ISODate("2025-08-08T17:05:46Z"), @@ -74,7 +80,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8445101b3d3a3b8", name: "thirsty_henry", - status: { connected: false, last_message: "2025-08-22T18:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "4kKuUQSMJE9RckmbCFReQy5gtbRpY3sCgDjcTnxBxwI=", created_at: ISODate("2025-08-04T05:03:46Z"), @@ -82,7 +88,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8446943ffbf2df9", name: "admiring_bohr", - status: { connected: true, last_message: "2025-08-06T01:33:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "5mp9W9wUVd50eqGqC/JpW/0/pG6wBrAsivSPg0bcC2M=", created_at: ISODate("2025-08-25T16:35:46Z"), @@ -90,7 +96,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84480bd0ad4656f", name: "keen_bohr", - status: { connected: true, last_message: "2025-08-16T05:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "/3tiwn6woUzwRGe/TUqOZQNGvYWHYSHj4d/Fpq9eTS8=", created_at: ISODate("2025-08-01T14:09:46Z"), @@ -98,7 +104,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8449838a8eb28eb", name: "clever_fermi", - status: { connected: true, last_message: "2025-08-08T23:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "pveqq6guV0EAQANRpMOQq5Yd8iSaZSH6QUMynO0ke6g=", created_at: ISODate("2025-08-05T16:46:46Z"), @@ -106,7 +112,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844b01d0d668fce", name: "brave_schrodinger", - status: { connected: false, last_message: "2025-08-04T16:28:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "+NrhtHayxZYPZnqA+C1C6uth3bORje/ka5uxXZ3E2zQ=", created_at: ISODate("2025-08-04T20:21:46Z"), @@ -114,7 +120,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844cb262515236b", name: "youthful_stallman", - status: { connected: false, last_message: "2025-08-22T21:24:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "dkvOCYpkWXr3WZs62jH9LfjOAbhm0TapSNQvcIzijLA=", created_at: ISODate("2025-08-04T10:00:46Z"), @@ -122,7 +128,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844e58e640b9ea1", name: "friendly_curie", - status: { connected: true, last_message: "2025-08-21T03:51:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "1l0SNynykdBFZVNfGlkTYiniGlmk5KVgyW3bp8HI6xg=", created_at: ISODate("2025-08-05T23:57:46Z"), @@ -130,7 +136,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844fccd26144714", name: "charming_dirac", - status: { connected: false, last_message: "2025-07-31T23:08:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "/Vi9D/RMiWilNw0jHA/fv4DbGwAEbqRAgQJulPl4DTQ=", created_at: ISODate("2025-08-08T18:10:46Z"), @@ -138,7 +144,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8451452004ec96d", name: "iron_franklin", - status: { connected: true, last_message: "2025-08-02T12:47:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "V0exZwne86ptOGifjuWX7QmGjpN1W62szV6+WxX9m5s=", created_at: ISODate("2025-08-07T12:55:46Z"), @@ -146,7 +152,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8456a397013ce6b", name: "gentle_church", - status: { connected: false, last_message: "2025-08-11T23:09:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "KH+3BS3QnEec8vME0ToemUn3mK9i0bwCg1ZlvgnRfkU=", created_at: ISODate("2025-08-15T20:23:46Z"), @@ -154,7 +160,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84581a0b80ca1c5", name: "practical_michelson", - status: { connected: false, last_message: "2025-08-11T11:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "ab3Wu7Glx9xhfSFUNRKzi1CZPfPeiCI7ujc/iJmYWpI=", created_at: ISODate("2025-08-04T21:37:46Z"), @@ -162,7 +168,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845ad105b9a60db", name: "phenomenal_born", - status: { connected: false, last_message: "2025-08-23T09:48:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "h3dT1JuyA/MhH1/o/n/IiPRFEyyEvXlMl3ZNtrCHZwY=", created_at: ISODate("2025-08-06T01:48:46Z"), @@ -170,7 +176,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845c8050d2973c1", name: "agitated_planck", - status: { connected: false, last_message: "2025-08-20T06:43:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "l/TRQN08IpMfwVHCWHpcNQ/SBuRWLeNcuJZDf28697c=", created_at: ISODate("2025-08-12T01:20:46Z"), @@ -178,7 +184,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845df659619c7e6", name: "determined_kelvin", - status: { connected: true, last_message: "2025-08-16T14:01:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "MlxmbBIfcGNpReS6GUgLDmTRrDDQQ6rlLxj4Eggrfjo=", created_at: ISODate("2025-08-10T07:50:46Z"), @@ -186,7 +192,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845f5d103e908ad", name: "thoughtful_weber", - status: { connected: false, last_message: "2025-08-18T05:54:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "WGmlcdPBvesFWds8BZ4UR4k7ze/25P1GpWhXaSmgNDQ=", created_at: ISODate("2025-08-04T22:08:46Z"), @@ -194,7 +200,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8460bf33167dbdc", name: "hyper_shockley", - status: { connected: false, last_message: "2025-08-17T20:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "BzHUYgawXJvf458ZW6fLaKxbTEoOXBI1pgI4Z5ebMuM=", created_at: ISODate("2025-08-17T07:01:46Z"), @@ -202,7 +208,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8462309d5e746cc", name: "pious_planck", - status: { connected: true, last_message: "2025-08-12T19:59:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "DMAF8lJbDW/hdBvKttHueeokLXgQ9nlcTQBDMfypO4w=", created_at: ISODate("2025-08-15T02:45:46Z"), @@ -210,7 +216,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84640a54b9bd528", name: "heuristic_fermi", - status: { connected: true, last_message: "2025-08-02T15:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "+crZGHsZ6r5ZN0UMsB0JFK/hveE6E267uzcAGdkQAZQ=", created_at: ISODate("2025-08-09T02:32:46Z"), @@ -218,7 +224,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846577d4ec97cfb", name: "sharp_edison", - status: { connected: true, last_message: "2025-08-14T03:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "eW16LWeR4CcKm0mRqkBnv9lU6WYKXyzS8csOmoTwt+c=", created_at: ISODate("2025-08-21T01:54:46Z"), @@ -226,7 +232,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8466e529b599dc4", name: "romantic_hertz", - status: { connected: true, last_message: "2025-08-30T03:20:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "kbRJ702ADyEPki+ko7MbOZ7AGvhKPSql5A7fK6MGFGI=", created_at: ISODate("2025-08-17T20:13:46Z"), @@ -234,7 +240,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84685251cdaf35c", name: "gallant_whitehead", - status: { connected: true, last_message: "2025-08-05T15:55:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "ZeGHStsNcbp56gDEk+nasq/BaaLklfzXfuG8BcX+lrs=", created_at: ISODate("2025-08-28T00:41:46Z"), @@ -242,7 +248,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8469c00840cc49b", name: "laughing_rutherford", - status: { connected: false, last_message: "2025-08-13T10:56:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "n0LNbNhaIaW42aBkqCwDM0cJSwcwL8McL8im5CP91v4=", created_at: ISODate("2025-08-29T17:24:46Z"), @@ -250,7 +256,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846b3600123a417", name: "sad_marconi", - status: { connected: true, last_message: "2025-08-05T23:52:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "g2D4mb6ezOrfK/ft41lACByyeU4IQVF6RWlB/0P7zhc=", created_at: ISODate("2025-08-15T07:38:46Z"), @@ -258,7 +264,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846ca7bab489e30", name: "clever_newton", - status: { connected: true, last_message: "2025-08-18T06:39:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "hGz/4/osEsLT/5Q53TTlID+wA54Xb2p8Cxpj05jZsik=", created_at: ISODate("2025-08-18T00:25:46Z"), @@ -266,7 +272,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846e0a3e38974e5", name: "dazzling_maxwell", - status: { connected: false, last_message: "2025-08-10T04:46:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "KSG9WiZ6pWINfm9FH9vS/GSo3t1TmLf+eE5eGhU+Hik=", created_at: ISODate("2025-08-05T06:51:46Z"), @@ -274,7 +280,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c847064ce1bdf7ee", name: "elegant_lagrange", - status: { connected: true, last_message: "2025-08-28T18:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "tlrnwpslaBwOChP+dAFPQ2sfItsoKERU+MR33NHk9yQ=", created_at: ISODate("2025-08-19T09:04:46Z"), @@ -282,7 +288,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8472b9f0905b3ad", name: "ecstatic_riemann", - status: { connected: true, last_message: "2025-08-05T19:27:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "5v94oQP8pNQZrOZrYNTTl5c67qyrPDUJE4eZTfuBjVU=", created_at: ISODate("2025-08-08T11:59:46Z"), @@ -290,7 +296,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84742df27b88f6b", name: "cranky_ampere", - status: { connected: false, last_message: "2025-08-19T19:18:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "cS34G/an+Z+MM1M5P5dh48B+y4kjyy0eI/8cw4ClkT4=", created_at: ISODate("2025-08-08T18:36:46Z"), @@ -298,7 +304,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84759c8a9ef04f8", name: "energetic_hilbert", - status: { connected: true, last_message: "2025-08-25T05:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "EInJWD1jh2t06pz3D5WZjspYvxzqs57NRKAxVhe9uIk=", created_at: ISODate("2025-08-28T01:57:46Z"), @@ -306,7 +312,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84770f5153b97ef", name: "amazing_turing", - status: { connected: false, last_message: "2025-08-10T10:51:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "X9Lx6+KllLFtNDyvj/466CrOQmF6UewS+3xs9j18ILA=", created_at: ISODate("2025-08-03T11:49:46Z"), @@ -314,7 +320,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84786f21e4edc5e", name: "happy_einstein", - status: { connected: true, last_message: "2025-08-21T12:01:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "wzTOvpERsSN6QO4jgUD3XuRtcdqQLItdjSxSgrKmcoo=", created_at: ISODate("2025-08-17T21:31:46Z"), @@ -322,7 +328,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8479d828433ff9a", name: "funny_peano", - status: { connected: true, last_message: "2025-08-11T05:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "cqseF4l1F5lAgCe7bD6EP+rEE+L1wFhc+10MQV48UJo=", created_at: ISODate("2025-08-24T04:47:46Z"), @@ -330,7 +336,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c847b3e74258eb03", name: "vibrant_thompson", - status: { connected: false, last_message: "2025-08-15T07:02:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "O0XXGhe7rp/EsEYyXNAGIKjJk5T+FXCAdebGqh/dluo=", created_at: ISODate("2025-08-16T09:54:46Z"), @@ -338,7 +344,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8480b18fe88b4af", name: "patient_wu", - status: { connected: false, last_message: "2025-08-21T22:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "bHzGkyOqJLG9GAnkC25B2OLoXhQhIUu3bPVIE9sBlzU=", created_at: ISODate("2025-08-24T18:56:46Z"), @@ -346,7 +352,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84823aa3e06b7da", name: "epic_cantor", - status: { connected: true, last_message: "2025-08-07T10:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "G7MRIMBP24R0xdEXZRIV3me9dDDFRdxtTXuLXe28494=", created_at: ISODate("2025-08-02T10:17:46Z"), @@ -354,7 +360,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8483aeb4dce2724", name: "hopeful_bardeen", - status: { connected: true, last_message: "2025-08-30T06:16:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "Xd5a7XzvWCVjDtduORbuAH1sykFtGHcvAhK/4BadcaI=", created_at: ISODate("2025-08-06T23:01:46Z"), @@ -362,7 +368,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8486259917b5535", name: "frosty_dedekind", - status: { connected: false, last_message: "2025-08-07T10:35:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "I0ahyNHzwY2ax1RTIwkdAW1+4eErU6s1WISzCED2ImI=", created_at: ISODate("2025-08-05T02:16:46Z"), @@ -370,7 +376,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8487a58b5c5651d", name: "heartwarming_bose", - status: { connected: true, last_message: "2025-08-15T11:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "LsgbCoMQG+opSUt9JrsiDIL4Z1k5VU+WnTGajUsfRMU=", created_at: ISODate("2025-08-04T01:01:46Z"), @@ -378,7 +384,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848919ae0a5ac8f", name: "kind_torvalds", - status: { connected: false, last_message: "2025-08-02T19:55:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "ij0mk0VXVo7nsb0cqpGJX0V5oChhDa830+CJ72ZW8xk=", created_at: ISODate("2025-08-20T23:21:46Z"), @@ -386,7 +392,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848b620cb14aa25", name: "fascinated_noether", - status: { connected: false, last_message: "2025-08-20T21:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "XJVLbd6UO12QkuIGo3EbZGXjG4xPKSvliiOLRLnMZmI=", created_at: ISODate("2025-08-09T07:11:46Z"), @@ -394,7 +400,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848d48480a5d5b6", name: "puzzled_fizeau", - status: { connected: true, last_message: "2025-08-22T09:43:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "ceSr36+tty8/YgIQuT7V66kMAXhi+K2JPN7EqEF7r3Y=", created_at: ISODate("2025-08-02T11:41:46Z"), @@ -402,7 +408,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848eb34f8760e19", name: "competent_rutherford", - status: { connected: true, last_message: "2025-08-04T03:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "e8kkc8+QotgP718tO8zL2+ukDwUiNfSmRl3UQFKnEwc=", created_at: ISODate("2025-08-02T23:24:46Z"), @@ -410,7 +416,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8490334a6303366", name: "pedantic_pauli", - status: { connected: true, last_message: "2025-08-30T09:45:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "kXVOIOGZGLfPzYCPK55aVbR15kbwTZr9ezA6zSxHEig=", created_at: ISODate("2025-08-05T01:38:46Z"), @@ -418,7 +424,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8491a91b1f888a9", name: "magical_dirac", - status: { connected: false, last_message: "2025-08-08T15:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "C9biy8JKSu1nQCKQxGTjuxkjHr4W46086h3KwjVBr/I=", created_at: ISODate("2025-08-05T22:46:46Z"), @@ -426,7 +432,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84931d6fa2d6232", name: "serene_tesla", - status: { connected: false, last_message: "2025-08-03T19:17:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "xPGoSwT+dTYd6ZX1++0+CJC8iEwVscx3VoDDI+LXWw8=", created_at: ISODate("2025-08-05T07:06:46Z"), @@ -434,7 +440,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8494897112ba78e", name: "peaceful_pascal", - status: { connected: true, last_message: "2025-08-05T08:37:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "WAVVSnHd8206VRwJOtgHDuUGDf0orqqYBIqodJA9L1I=", created_at: ISODate("2025-08-15T05:44:46Z"), @@ -442,7 +448,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8495fd71857ce3f", name: "stoic_ohm", - status: { connected: false, last_message: "2025-08-22T12:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "vzDwSMp/L6oyVEyYj3RKTY9UKyBj3V7LvhCD6cqe/nI=", created_at: ISODate("2025-08-22T20:43:46Z"), @@ -450,7 +456,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84976fefd57d1ff", name: "fearless_galois", - status: { connected: false, last_message: "2025-08-10T16:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "PoHtJ2l8pTjJPJctSMrIII20agqTIk4LpVoiIdNLzgo=", created_at: ISODate("2025-08-03T14:47:46Z"), @@ -458,7 +464,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8498d777941e066", name: "distracted_planck", - status: { connected: true, last_message: "2025-08-24T07:49:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "W8F6g6HmjQAP3lwJjRqAfdQOIOsSq1vzEVbHMS8ZUAo=", created_at: ISODate("2025-08-21T20:41:46Z"), @@ -466,7 +472,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849a50c845c25a9", name: "optimistic_babbage", - status: { connected: true, last_message: "2025-08-12T09:06:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "zpX14uHmth5/ZzzNaL68qeoHLJRZjT3huaYns0LmnWU=", created_at: ISODate("2025-08-06T17:19:46Z"), @@ -474,7 +480,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849bd6d485879c1", name: "tender_faraday", - status: { connected: true, last_message: "2025-08-10T12:57:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "O8XxluA24EC4bsgPrBHWCwS8q8GmBK7mv0byordbYc8=", created_at: ISODate("2025-08-13T13:09:46Z"), @@ -482,7 +488,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849d409351613c2", name: "jaunty_pauling", - status: { connected: true, last_message: "2025-08-27T07:44:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "OLbAlVzxkhzr2wlaO/WV8fCB/m4jJQ5AIfrJ0tUgF0A=", created_at: ISODate("2025-08-20T22:21:46Z"), @@ -490,7 +496,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a2e54a6ffdd76", name: "suspicious_volta", - status: { connected: true, last_message: "2025-08-03T18:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "S30Z2mlkvsUR6yH8nULY8RqPhmUcxEHEcEVuP7ePmSM=", created_at: ISODate("2025-08-10T10:53:46Z"), @@ -498,7 +504,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a5f766256c9e2", name: "serene_hopper", - status: { connected: true, last_message: "2025-08-13T10:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "DTOj/Y2DiO0Ju5vwxOUgBtwXB5579pz30EEMYun7z00=", created_at: ISODate("2025-08-18T16:45:46Z"), @@ -506,7 +512,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a892c3aad3955", name: "eager_gauss", - status: { connected: false, last_message: "2025-08-06T19:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "Dl4fLpzCBXqNHjtrgm+5jrj+tSXPZRxttltQPvr/JcY=", created_at: ISODate("2025-08-29T10:30:46Z"), @@ -514,7 +520,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84aa049b09a2169", name: "eager_darwin", - status: { connected: true, last_message: "2025-08-10T19:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "EC7AoSY05EyPbRVEl/eGTSfESGXZZ4OWF5FsPcaKdTU=", created_at: ISODate("2025-08-24T18:39:46Z"), @@ -522,7 +528,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ab6d05b8082ad", name: "hardcore_bell", - status: { connected: true, last_message: "2025-08-25T03:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "Ar3WbxWHU8l2uyOZPnqJffGQ9vJpXAovM/ZoNRYd9RA=", created_at: ISODate("2025-08-20T22:33:46Z"), @@ -530,7 +536,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84acd0d1c7fc74a", name: "enchanting_poincare", - status: { connected: false, last_message: "2025-08-12T07:20:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "0HbmI0I5esubDm4b6XvzgLgHJtXVxGTeIt4EiHJAKc0=", created_at: ISODate("2025-08-08T23:41:46Z"), @@ -538,7 +544,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ae3dffff2e52d", name: "proud_morley", - status: { connected: true, last_message: "2025-08-17T10:23:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "NYrTqrlsGqPo9r6nKF2+bVd+QshvHb00Z676LpK3R00=", created_at: ISODate("2025-08-30T11:59:46Z"), @@ -546,7 +552,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84afa2c10aa6c55", name: "inspiring_bardeen", - status: { connected: false, last_message: "2025-08-15T18:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "6dU2H5RdD5VaZyXi5ZWaj5rkydlEV5f2PS1l9+fvL+c=", created_at: ISODate("2025-08-07T16:21:46Z"), @@ -554,7 +560,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b11c367999861", name: "objective_glashow", - status: { connected: true, last_message: "2025-08-26T14:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "uW2kufM6EeR+tpJHDYRmd/5CPGLMn84jMBsu6mhWtRU=", created_at: ISODate("2025-08-19T03:27:46Z"), @@ -562,7 +568,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b2feca3792861", name: "modest_dyson", - status: { connected: false, last_message: "2025-08-25T10:25:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "5XYG/w/clJolar2hAO3n4D9+fJdckv7i0ZO0S2m2KRo=", created_at: ISODate("2025-08-02T00:09:46Z"), @@ -570,7 +576,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b469627a640d9", name: "boring_heisenberg", - status: { connected: false, last_message: "2025-08-25T03:19:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "EHPvNh8KnmQNbD8Kef2UZh+07Y6DiHKpNwTuuIcyemo=", created_at: ISODate("2025-08-10T16:52:46Z"), @@ -578,7 +584,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b5cae4cff3133", name: "strange_ampere", - status: { connected: true, last_message: "2025-08-28T04:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "fUqc7PB2fR3likQIUigerur96bUzz7dQZE/lMUiMJHY=", created_at: ISODate("2025-08-08T07:02:46Z"), @@ -586,7 +592,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b74702fe3e85c", name: "faithful_hardy", - status: { connected: false, last_message: "2025-08-27T20:37:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "etflzQEpsxaJqAlO2o/G45T+s80cWWaSV0KPobuWWFE=", created_at: ISODate("2025-08-02T15:50:46Z"), @@ -594,7 +600,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b8b83746dbc8b", name: "eloquent_leibniz", - status: { connected: true, last_message: "2025-08-14T14:03:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "nwdfO4d3o5nmJsO/i8xQrgcjsa2KNSQQ9PQzgMNbEc8=", created_at: ISODate("2025-08-13T23:17:46Z"), @@ -602,7 +608,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ba2911c4a675e", name: "cool_ohm", - status: { connected: false, last_message: "2025-08-12T06:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "7TXa0utsnnJXx7tHWYt5KC8nwv1xThn8iy12KI2zOvE=", created_at: ISODate("2025-08-12T01:49:46Z"), @@ -610,7 +616,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84bde9e8b791f18", name: "fervent_abel", - status: { connected: true, last_message: "2025-08-03T23:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "1doRBvIJsrXQIG1Ui9albOMUHxMjtrjU6VvNLZTZQak=", created_at: ISODate("2025-08-29T22:05:46Z"), @@ -618,7 +624,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84bf63dcc1fb3e7", name: "groovy_shannon", - status: { connected: true, last_message: "2025-08-10T16:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "4NnTHCSG64xQf807OjIJlzc+MdgrOv9/a83gDgRzUwQ=", created_at: ISODate("2025-08-16T23:38:46Z"), @@ -626,7 +632,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c23101fa0a8b6", name: "grieving_wiener", - status: { connected: true, last_message: "2025-08-14T09:38:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "BpChhURWcEyErTfXhnx6J9gg4L+Qy4FyWzdeL6e27u4=", created_at: ISODate("2025-08-14T21:20:46Z"), @@ -634,7 +640,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c3ae0fd8aad7e", name: "optimized_higgs", - status: { connected: false, last_message: "2025-08-21T14:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "csXqVuqw2AXm2A46aCt97ytsUzs5pA6t5Jnit25JFkI=", created_at: ISODate("2025-08-15T19:27:46Z"), @@ -642,7 +648,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c5151bb792931", name: "boring_wozniak", - status: { connected: true, last_message: "2025-08-08T02:27:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "X3CHEXehWzXvRfQAJ6GGCoeEbVPcdX95JCzT3uEBYSs=", created_at: ISODate("2025-08-02T10:22:46Z"), @@ -650,7 +656,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c678173241105", name: "curious_feynman", - status: { connected: false, last_message: "2025-08-21T18:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "XxN0HpCbfzUE2AMRPcteDPSRLT5YgnAy4ILOxwIzm/g=", created_at: ISODate("2025-08-26T19:07:46Z"), @@ -658,7 +664,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c7e6385d059d6", name: "noble_weinberg", - status: { connected: true, last_message: "2025-08-07T01:06:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "SZzpdjeGSaaWEBBa8apWtQJdwscbjyJ4jC/nXgnxJu4=", created_at: ISODate("2025-08-21T16:34:46Z"), @@ -666,7 +672,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c9470140d32f6", name: "upbeat_ritchie", - status: { connected: false, last_message: "2025-08-10T09:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "65mhzIpZvOx51yE6nPxQgjgy3rwlv13lMSM5X7vEFeQ=", created_at: ISODate("2025-08-01T12:55:46Z"), @@ -674,7 +680,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84caba1375500b4", name: "quizzical_doppler", - status: { connected: true, last_message: "2025-08-11T14:42:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "t/9N9FYcN12suJ/nZl5q6jC7OAWv0h2Pow6vJBSr4dA=", created_at: ISODate("2025-08-29T00:09:46Z"), @@ -682,7 +688,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cc3de436f7bde", name: "silly_westinghouse", - status: { connected: true, last_message: "2025-08-28T04:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "Ba4MVIb1YQL6dm2eYRiJOX0CljrdeuFtAI2HZ3nBtsE=", created_at: ISODate("2025-08-02T07:07:46Z"), @@ -690,7 +696,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cdbbc4c9327d2", name: "dreamy_tesla", - status: { connected: true, last_message: "2025-08-12T22:50:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "/kDru3xkiT7oAfKFD4Mp6nVl5IIFEMXponchC0ojKlo=", created_at: ISODate("2025-08-01T00:21:46Z"), @@ -698,7 +704,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cf3df4741680f", name: "jovial_mendeleev", - status: { connected: true, last_message: "2025-08-06T08:10:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "voqhD27X8L+VW4e/Op93AyazBBx/a7mqhTbAsvn6tnc=", created_at: ISODate("2025-08-26T23:38:46Z"), @@ -706,7 +712,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d0b5fc332f041", name: "great_kolmogorov", - status: { connected: false, last_message: "2025-08-14T09:59:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "TH/tO2mmlgP3dnH6h+ickwu8IaEajnm+DpvDLcAZDC8=", created_at: ISODate("2025-08-29T11:27:46Z"), @@ -714,7 +720,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d2247a477b6ff", name: "interesting_watson", - status: { connected: true, last_message: "2025-08-20T09:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "ZBNn287pTaxPwGShBOOICVcZDmQbcdr2vtmLYbelgoU=", created_at: ISODate("2025-08-19T19:46:46Z"), @@ -722,7 +728,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d385e1d5c7bbc", name: "zealous_berners", - status: { connected: true, last_message: "2025-08-04T11:23:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "5Wx/7819jHalM4yOsTrhtswnTS8ItR5/n0BEaYFotQM=", created_at: ISODate("2025-08-18T18:58:46Z"), @@ -730,7 +736,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d62f4adb3c923", name: "condescending_volta", - status: { connected: true, last_message: "2025-08-15T00:32:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "CKwOOv0LRsGpDURy9iXE9tnUFdjtI6ZqtAFoJkal360=", created_at: ISODate("2025-08-26T02:07:46Z"), @@ -738,7 +744,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d9ce75be19956", name: "adoring_morse", - status: { connected: false, last_message: "2025-08-28T04:09:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "iL0T7kaXpwPrO6Z0mA7Kk2Gs+tHEBl6fNSbFV3rSgVM=", created_at: ISODate("2025-08-04T14:20:46Z"), @@ -746,7 +752,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84db5aa45ada38e", name: "elastic_fourier", - status: { connected: true, last_message: "2025-08-22T06:00:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "8loHVYewF31YJGSlkcOrMZpfc5eQ2DFhuvpne8M68Xc=", created_at: ISODate("2025-08-09T06:44:46Z"), @@ -754,7 +760,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84dccaa3ac843bd", name: "thrilled_gauss", - status: { connected: false, last_message: "2025-08-14T07:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "jhESuO3AwXCtX0TcH5E9l91DDRUUx3SIErqpjt+SpUk=", created_at: ISODate("2025-08-25T19:51:46Z"), @@ -762,7 +768,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84de3a8df5efbcc", name: "goofy_markov", - status: { connected: false, last_message: "2025-08-20T02:12:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "1bmj0Qvq4D9EsyHZJpITpEqEBBrOcD9KsiUhDX4X7R4=", created_at: ISODate("2025-08-27T19:33:46Z"), @@ -770,7 +776,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84dfa6590d8fbda", name: "relaxed_turing", - status: { connected: true, last_message: "2025-08-29T02:47:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "bMvQyF6Lu/h5zYPEn4TBAOAxjVj67QTXl3ifZYf3S7s=", created_at: ISODate("2025-08-09T23:16:46Z"), @@ -778,7 +784,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e12b161fb52f1", name: "exciting_godel", - status: { connected: true, last_message: "2025-08-19T23:11:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "L+ZecOMBWt0L7Ix8sPW8MZpDskk30MZydLOV1av++fk=", created_at: ISODate("2025-08-30T12:59:46Z"), @@ -786,7 +792,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e2a4a52da79d9", name: "sweet_galvani", - status: { connected: false, last_message: "2025-08-29T21:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "dDVOk5b+i7+npM3o7icJocZSNFaed64RKX6HuxK5TTk=", created_at: ISODate("2025-08-22T08:08:46Z"), @@ -794,7 +800,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e473a6d897698", name: "fabulous_ramanujan", - status: { connected: false, last_message: "2025-08-18T06:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "n/7uqrA1Xh7uzYaX4BouodyLFlU/HWXMF3Gjd5gRN6g=", created_at: ISODate("2025-08-19T16:05:46Z"), @@ -802,7 +808,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e67b817e2a8fd", name: "trusting_knuth", - status: { connected: true, last_message: "2025-08-28T09:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "frrz+vzXLVQV4HHhZf7MFMPo4iGIJQWsgSPIkHKJ8OE=", created_at: ISODate("2025-08-01T15:20:46Z"), @@ -810,7 +816,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e7f725b9dd529", name: "quirky_shannon", - status: { connected: false, last_message: "2025-08-16T17:49:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "443NJMtr5p+i0QIA8th2B9QTsh3aKhI1p51G0uwN1iQ=", created_at: ISODate("2025-08-09T21:36:46Z"), @@ -818,7 +824,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e95effa9dc925", name: "nervous_hawking", - status: { connected: true, last_message: "2025-08-15T23:40:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "XTAux5J/tThXxN+5AoXR61Pxm0nfvJ92SOpCVo9HVpk=", created_at: ISODate("2025-08-18T09:24:46Z"), @@ -826,7 +832,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84eaef489342f7e", name: "exotic_turing", - status: { connected: true, last_message: "2025-08-03T15:10:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "rrNb0cdFEBeDwGfwZXv8U1VqHz4QfxT6Re+o+HR8vGA=", created_at: ISODate("2025-08-16T03:12:46Z"), @@ -834,7 +840,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ec5eea3a8dae1", name: "gifted_kleene", - status: { connected: true, last_message: "2025-08-12T00:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "EaBPc3d6Edkfi3YYxsqc+sAMILGwn2RbsIkB4zmnSU0=", created_at: ISODate("2025-08-24T06:35:46Z"), @@ -842,9 +848,1609 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ee5a2e49c6f83", name: "lucid_heisenberg", - status: { connected: true, last_message: "2025-08-08T11:32:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, + { + _id: "trk-186e11012a5561d480d2e2eb", + name: "fervent_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "kqtwRUbhMyVd17VSGcNacCgknCqXG/nbTZ0TpdkHuG0=", + created_at: ISODate("2025-10-02T06:02:41Z"), + }, + { + _id: "trk-186e11012a596d43fd69108e", + name: "mystifying_riemann", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "kgpHr5wgALwkGS3rZ++yHMFJVyQyM7PtocptH7xWA8s=", + created_at: ISODate("2025-10-07T20:48:41Z"), + }, + { + _id: "trk-186e11012a598ad93ff98c88", + name: "fabulous_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "qPL22InLNt+qxCMYNI9IbWqUnFX6XMlldzxiwEeIGew=", + created_at: ISODate("2025-10-02T22:25:41Z"), + }, + { + _id: "trk-186e11012a59b19903d892f0", + name: "sweet_ramanujan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "cFe3cCf75MF+sDHwumwNz/8AarbzIZ8gCjI4K2kzYOY=", + created_at: ISODate("2025-10-11T14:40:41Z"), + }, + { + _id: "trk-186e11012a59cb26e0075b2a", + name: "distracted_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "O5pJz4gxI9odDLTT1yPIZBm6Twnr4C8IGkDt7zoKxho=", + created_at: ISODate("2025-10-08T20:34:41Z"), + }, + { + _id: "trk-186e11012a59e3d14be606df", + name: "proud_weber", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "T4T4gHgXrdMXUd7J1lyDO+f62DcmrAbUUA9qOxc7Uvw=", + created_at: ISODate("2025-09-22T03:41:41Z"), + }, + { + _id: "trk-186e11012a59fa7cd3c6dce1", + name: "hyper_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "AY7Rf9qa1Ly/e6kF10FKT570Bg/qlFAKP7bsMUgb9rg=", + created_at: ISODate("2025-10-13T11:43:41Z"), + }, + { + _id: "trk-186e11012a5a13d3a9db4772", + name: "groovy_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wv7hUUOS/l5gPcyEyWtqIWfL1B9l+6TOUDaXR1VpqCc=", + created_at: ISODate("2025-09-23T22:15:41Z"), + }, + { + _id: "trk-186e11012a5a2d27c9191da5", + name: "great_cooper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "w3E6srVzISB3/6RwJLThuqXCIuB/mwVUnb1+jjq0tGc=", + created_at: ISODate("2025-09-17T05:12:41Z"), + }, + { + _id: "trk-186e11012a5a4494864fe415", + name: "goofy_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "RD0xX5dLEAtLQqoFSwNI6sXRFt8uXbvBF/kqUb8fWKs=", + created_at: ISODate("2025-10-01T18:21:41Z"), + }, + { + _id: "trk-186e11012a5a5a58df5eaad8", + name: "cranky_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "olYsIof8//f0fRwqpmsB/oSBGhxAgUd6SDALBkLkEfA=", + created_at: ISODate("2025-09-27T16:56:41Z"), + }, + { + _id: "trk-186e11012a5a6f0b11c08ea9", + name: "optimized_hertz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "/im+6GYjhW6G/az/9KVzuhYzypbLSgxm2feoKBAUVWo=", + created_at: ISODate("2025-10-03T17:42:41Z"), + }, + { + _id: "trk-186e11012a5a8326235064aa", + name: "funny_ampere", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ps9v0p2pfDjjNlIkqZijXseLsZ7I34N1l6w8ss9Gbjo=", + created_at: ISODate("2025-09-20T16:23:41Z"), + }, + { + _id: "trk-186e11012a5a98929c44b902", + name: "phenomenal_schwinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "iqgX85qTfX4Xy5rDlMuuw6y+EmGy1qcdLBz+VGr3PtY=", + created_at: ISODate("2025-09-18T23:10:41Z"), + }, + { + _id: "trk-186e11012a5ace77b59f96f0", + name: "inspiring_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "OKkXfWT+lPo+CFBU71O10ahMByiZEteZpBD+ti6q7oI=", + created_at: ISODate("2025-09-28T16:35:41Z"), + }, + { + _id: "trk-186e11012a5ae586a58fdddf", + name: "motivated_ampere", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "RVbNIWA0ApYY6MJeib+ONiu8s0hKj8rmlOh/bpnk9os=", + created_at: ISODate("2025-09-27T01:17:41Z"), + }, + { + _id: "trk-186e11012a5afb592361434c", + name: "nervous_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZTduEIFal2ZpIn5lUXO3sYyGgbYKUIwDL6QsiOd5OPw=", + created_at: ISODate("2025-09-26T09:06:41Z"), + }, + { + _id: "trk-186e11012a5b0fbc6d8d33d3", + name: "thirsty_galvani", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "iLa6/opdNyQaQQBu7hidLlvX6pe1vcomQsgxeP4XfzM=", + created_at: ISODate("2025-09-27T22:01:41Z"), + }, + { + _id: "trk-186e11012a5b23c2f89bddba", + name: "quirky_dedekind", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "soINuZ+4XhQ1HuxX/6WwunLQ2X7on/e0uotjk99sSNU=", + created_at: ISODate("2025-09-29T05:28:41Z"), + }, + { + _id: "trk-186e11012a5b38c33d43a45e", + name: "pious_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "XXLyX9ffOpj1eI2RIUSjry6b/Rzis15TzinrvmoKoKk=", + created_at: ISODate("2025-10-02T06:37:41Z"), + }, + { + _id: "trk-186e11012a5b4cd44a3a45cf", + name: "sweet_watson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "jFq96uYH10c+0GshcwZjgkaUHrwOlMjxxUg+xF4LmWg=", + created_at: ISODate("2025-10-02T13:16:41Z"), + }, + { + _id: "trk-186e11012a5b6332148cd018", + name: "admiring_turing", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "XcBe4uqZBIDo/I2SjAImJfBrsNk5N5atDrnrBEYlcqE=", + created_at: ISODate("2025-09-20T10:04:41Z"), + }, + { + _id: "trk-186e11012a5b787f126d15f1", + name: "practical_hardy", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "TuHP/ofEOd/2slfenIJ2+66Pg5zgH9Dx8zrmUMpiwYQ=", + created_at: ISODate("2025-09-22T21:16:41Z"), + }, + { + _id: "trk-186e11012a5b99983857d7f5", + name: "compassionate_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "04IdX2PAwIbnedM7AXRjXOVS8zMataBOSLI7TLW+sJU=", + created_at: ISODate("2025-10-09T21:19:41Z"), + }, + { + _id: "trk-186e11012a5bae42c3d6ccfc", + name: "enchanting_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "jWiaC8MyTsXV7n9K8UswTxuDiTJVEIndjeVBj4wu4WE=", + created_at: ISODate("2025-09-29T10:41:41Z"), + }, + { + _id: "trk-186e11012a5bc46607105b2a", + name: "elated_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "6JHQq/8pK9dyk6FjNo1CJbE8fsysTpVn2qmKtzys390=", + created_at: ISODate("2025-10-09T17:09:41Z"), + }, + { + _id: "trk-186e11012a5bd9cfb0f5b31d", + name: "jolly_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "+hoDuiVnwHeNSQ5DzwzkgiMxGMKmOE2ni/mX6UfTXhY=", + created_at: ISODate("2025-10-06T04:04:41Z"), + }, + { + _id: "trk-186e11012a5bed6777eda1c8", + name: "elated_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "B6a9x6vz+tkuC+S2OQzxuJCv/MAGViKAPMjokDzYZhU=", + created_at: ISODate("2025-10-09T01:10:41Z"), + }, + { + _id: "trk-186e11012a5c1ccccb9b0a4e", + name: "gifted_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "mjsPzOv/5a+iF09A8svypYFonKHJCZuQWTOjzWLyhbc=", + created_at: ISODate("2025-10-03T05:26:41Z"), + }, + { + _id: "trk-186e11012a5c4401a63b0f3c", + name: "confident_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "lS2fQ0b5IPEvW0EClWkOxPbRrWl45bp1EZe0psee2pc=", + created_at: ISODate("2025-09-17T06:55:41Z"), + }, + { + _id: "trk-186e11012a5c59dd750d2c06", + name: "fascinated_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "h5di5PLrxdJirC1m7RDe61/DqOgoSfJ6XiELleXZKjE=", + created_at: ISODate("2025-09-21T10:00:41Z"), + }, + { + _id: "trk-186e11012a5c6ee1af951199", + name: "keen_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "iUvf42OIcqd1e5Nbemgjy/vLfAwaZERGyd2TAgbX61c=", + created_at: ISODate("2025-09-19T06:23:41Z"), + }, + { + _id: "trk-186e11012a5c830dd37874fe", + name: "goofy_curie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "MsqIwOOiR1bYD/zWIOo0HGFH4rJ/nQXKMUPHxZeA86w=", + created_at: ISODate("2025-09-18T06:06:41Z"), + }, + { + _id: "trk-186e11012a5c98b36f264650", + name: "hyper_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "4Pjt6Nz5Cggifiww9tnVOs+TA/Z4ETuw5FLqlsQ87bs=", + created_at: ISODate("2025-10-03T02:10:41Z"), + }, + { + _id: "trk-186e11012a5cad311c595ad1", + name: "determined_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "YfSXzGiI3cbp/vM2b6ke/UUkxwUhKkywqAyvmFGXPp8=", + created_at: ISODate("2025-09-15T15:21:41Z"), + }, + { + _id: "trk-186e11012a5cc574d6d81de8", + name: "sleepy_pascal", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "RpSxQsx5LqFUFbbolTRrnA2C/LsiAwMoS/NbIorA0Rc=", + created_at: ISODate("2025-10-13T02:34:41Z"), + }, + { + _id: "trk-186e11012a5cd92693beffd9", + name: "tender_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "SiyPQhaSZFCUe0EwhzwEHn0ZGF+auw09D5WdkXv5JUY=", + created_at: ISODate("2025-09-13T16:36:41Z"), + }, + { + _id: "trk-186e11012a5ced9d9a7f3282", + name: "thrilled_fourier", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "z5hY1D4uamwjhBUigsuQIVYStk8LkS7IHGffvP1g+Ig=", + created_at: ISODate("2025-10-08T08:28:41Z"), + }, + { + _id: "trk-186e11012a5d018136d48bad", + name: "enchanting_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "pr3lrF2O5U3f0Yf1DbFhdmz7g1YZ9ORKszdAOQ4n1Ek=", + created_at: ISODate("2025-09-23T02:49:41Z"), + }, + { + _id: "trk-186e11012a5d1517f5b46305", + name: "lucid_gauss", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "FOZHubOJabF1/4rPcKbm2R/RqIACyC3tS+Pw3L9QCzI=", + created_at: ISODate("2025-09-25T15:54:41Z"), + }, + { + _id: "trk-186e11012a5d2988550c5169", + name: "admiring_torvalds", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "GkO3pzWOMm260vTOzGd/uvB6+Qh4gMrYQlObQBrJQ1k=", + created_at: ISODate("2025-09-27T13:02:41Z"), + }, + { + _id: "trk-186e11012a5d3cf2b2ca7686", + name: "polite_heisenberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wxoIImrWfV0Ni4PHBqwv4AX4HL7g+AOyRII7dYyWrZk=", + created_at: ISODate("2025-09-28T10:14:41Z"), + }, + { + _id: "trk-186e11012a5d598c29d80cbd", + name: "pious_pascal", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "pgtlmBy0mJuE+ekgqsI0DfDv/QS36Yr3Ma87avO+KOw=", + created_at: ISODate("2025-09-24T19:23:41Z"), + }, + { + _id: "trk-186e11012a5d7a7b4bf73935", + name: "quizzical_ramanujan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "ncLNvzOa6UENXO7wLqTs+rCICEF7vJDmSZiX4ir+8Ow=", + created_at: ISODate("2025-09-14T23:15:41Z"), + }, + { + _id: "trk-186e11012a5d8ece5f7bdd8e", + name: "youthful_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "OJc1uL9AIAsjFi4Dptjh3CpPrmTUF8B6DkjskEMsjTg=", + created_at: ISODate("2025-09-16T03:07:41Z"), + }, + { + _id: "trk-186e11012a5da3cbc19a0fb8", + name: "admiring_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ISYhC21HlX9IcsYUexG5NV0yDjNTmn9lfUQvKSe+JlQ=", + created_at: ISODate("2025-10-11T17:33:41Z"), + }, + { + _id: "trk-186e11012a5db8028171234f", + name: "compassionate_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "gSyfyQDT6eZsiT8tI2wzDGv5Q6g/UYxW0QWaKjLlu/0=", + created_at: ISODate("2025-09-29T02:33:41Z"), + }, + { + _id: "trk-186e11012a5dcc1a6befda29", + name: "jovial_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "eClDfBHCPZ9Kg/fLpky6AzS9O0HOz8Os6PjlnrKsSwg=", + created_at: ISODate("2025-10-01T18:59:41Z"), + }, + { + _id: "trk-186e11012a5ddfa3062f0ff4", + name: "playful_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "P/K62OGL3lwTqYsRXK+OnlMehWZorMlphuQ3roNexo8=", + created_at: ISODate("2025-09-28T09:33:41Z"), + }, + { + _id: "trk-186e11012a5df4297b52a885", + name: "original_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "UxLu9YkY6L0rP3ctdmm9Lzaye9LMCSYPNSKLWyYssMc=", + created_at: ISODate("2025-09-30T20:32:41Z"), + }, + { + _id: "trk-186e11012a5e25d0d813f27a", + name: "dreamy_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "9o3ngbgcWUGQlPEkSflgrOWTiyXLhJ0QYh49t7IqozA=", + created_at: ISODate("2025-09-26T17:36:41Z"), + }, + { + _id: "trk-186e11012a5e3b84ff471fbc", + name: "merry_salam", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "gKiNSB7OCpbcZoHozoLUAYMjMmPDNBMzc979JU+nXp8=", + created_at: ISODate("2025-09-22T13:28:41Z"), + }, + { + _id: "trk-186e11012a5e4fe06bc4b394", + name: "gifted_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "s6lWpBP1VLeSvOzO3oRe8ypkEqOtkwNaLV0UOQNCG14=", + created_at: ISODate("2025-09-20T06:28:41Z"), + }, + { + _id: "trk-186e11012a5e63602bb29a90", + name: "gifted_hopper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "Vjb7DaSJfMV3nITbX00INyTkeOVeVksoA8davwEU7kw=", + created_at: ISODate("2025-09-15T03:44:41Z"), + }, + { + _id: "trk-186e11012a5e779fee7fdd35", + name: "flamboyant_hertz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "z4QNKZrnZ4T6HCRNScL4WkSTUxhjRGTIk28IZupKHno=", + created_at: ISODate("2025-10-07T04:55:41Z"), + }, + { + _id: "trk-186e11012a5e8da24c25c62b", + name: "charming_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "G37P8VjO95i4gKG8yTRCQ1UZRoh/JaaRpRNf7A2gVBw=", + created_at: ISODate("2025-09-23T16:34:41Z"), + }, + { + _id: "trk-186e11012a5ebbf1e05fc63e", + name: "fabulous_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "lsFvUa0rjoRlqjqCUXUUjSI0dE/s9DCcwx59f9pqokU=", + created_at: ISODate("2025-09-25T08:39:41Z"), + }, + { + _id: "trk-186e11012a5ee64eba1cad79", + name: "pious_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "QiSWe4sEtEfa1SfVBNVSkoTmBjvWjAsVjk6cU8qMSsQ=", + created_at: ISODate("2025-09-16T04:17:41Z"), + }, + { + _id: "trk-186e11012a5efba40cd780d6", + name: "merry_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "sgHilxpLlIiMOnig/XHEMha97TYevSbZGlW43f1yiJA=", + created_at: ISODate("2025-09-23T05:15:41Z"), + }, + { + _id: "trk-186e11012a5f455a1b0ae79f", + name: "sad_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "tkwiKvo7W+azl1ZgLtmP6KiHbTrctOLCbqJoBVY3+Pg=", + created_at: ISODate("2025-09-27T09:48:41Z"), + }, + { + _id: "trk-186e11012a5f5a92a359b79a", + name: "hopeful_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "UZNlMvRRozvA3/by9ehRSuaORegK0JDh8hYtWSv5D5E=", + created_at: ISODate("2025-09-25T06:00:41Z"), + }, + { + _id: "trk-186e11012a5f70141806a956", + name: "heartwarming_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "Wyl507rgkRX41yNgrQfTTwagqZJiWVCchcSPf80Vr4Y=", + created_at: ISODate("2025-10-08T18:23:41Z"), + }, + { + _id: "trk-186e11012a5f83c95653663c", + name: "thrilled_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "SJUN1nvUtlSD63P6M1pNKWYGuqRnClFwySGI67lEtV8=", + created_at: ISODate("2025-10-11T19:04:41Z"), + }, + { + _id: "trk-186e11012a5fbf4095b28646", + name: "crazy_ampere", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "b7sAMnrwZm2e2JOu7cVFnmMKCIsxRmmX0CLCRvpnteI=", + created_at: ISODate("2025-09-17T06:38:41Z"), + }, + { + _id: "trk-186e11012a5fd5659402dfeb", + name: "beautiful_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "C4HJyzN27U5jNQShQqk7fnHJ0konB+TtJFIj7xs43mA=", + created_at: ISODate("2025-10-01T08:32:41Z"), + }, + { + _id: "trk-186e11012a5fe94d9f033641", + name: "busy_salam", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "GbomR1IEdZvcIsX+Dy851wwBAKv8bUNkysnlhbt9C30=", + created_at: ISODate("2025-09-19T19:45:41Z"), + }, + { + _id: "trk-186e11012a5ffd352413b530", + name: "sweet_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "aE4zj1h+9vRvYSUqtNKT2kK7tyN9T2LSjgoMGkzR0hc=", + created_at: ISODate("2025-09-18T03:51:41Z"), + }, + { + _id: "trk-186e11012a6011b32b9939db", + name: "cranky_siemens", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "WkrTgRmQtbMyiFIRM7JfBCOwGzECjGGi1UiA6dBubJg=", + created_at: ISODate("2025-09-23T16:26:41Z"), + }, + { + _id: "trk-186e11012a6025cbee1dc98f", + name: "blissful_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "FAfD4UVHwonn9QY8HE3J6YRhnTqwMC/biyPPVTMhIJM=", + created_at: ISODate("2025-09-19T03:15:41Z"), + }, + { + _id: "trk-186e11012a60395b38d1954d", + name: "wonderful_bose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "0ZVm9mi4yq2YZmKogeRDlOGXu7gEnQ7cG82XHajyw7E=", + created_at: ISODate("2025-09-22T20:47:41Z"), + }, + { + _id: "trk-186e11012a604e0f101a26f5", + name: "keen_salam", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "G7IWRP6d+zX+f4t06gbwgZb/rX1w+AYdQh6jWKykaio=", + created_at: ISODate("2025-09-22T09:00:41Z"), + }, + { + _id: "trk-186e11012a606e6ca1634990", + name: "dreamy_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Mh4A9NA3GlJStCAaNbYu63n8pvkDhpHLq2HeYximta8=", + created_at: ISODate("2025-09-21T00:51:41Z"), + }, + { + _id: "trk-186e11012a6084b2c8b9789b", + name: "brave_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "YqbWAlf5lqPZZO61QKdUNMQ5PL85q3AKbgGuMNJLsrE=", + created_at: ISODate("2025-10-10T05:45:41Z"), + }, + { + _id: "trk-186e11012a609969074409b4", + name: "interesting_shockley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "X4IIHw+lyQjKqgcB69gAUJ3knVD+o8Ag0SzaDBXLfYM=", + created_at: ISODate("2025-09-25T09:28:41Z"), + }, + { + _id: "trk-186e11012a60b6113f2cd70a", + name: "practical_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "H/obZQPI2CjXl3/+iQvKS91VGPr/54k+HvB/wBjqewA=", + created_at: ISODate("2025-10-12T01:59:41Z"), + }, + { + _id: "trk-186e11012a60c9972502d08e", + name: "flamboyant_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "dCVwn4KsGiF15UDSiICW8XAf3hlt02zRQBFzst2Upa0=", + created_at: ISODate("2025-10-06T16:44:41Z"), + }, + { + _id: "trk-186e11012a60de635b74de91", + name: "fabulous_fizeau", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "0Diry3mQtd7f6U71EzhhOralUkl5TuXtECAcEs1UvJY=", + created_at: ISODate("2025-09-25T08:13:41Z"), + }, + { + _id: "trk-186e11012a60f293acfce4bd", + name: "amazing_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "c0uOtAw/jol27F5ACAuPp0ZilplgXsyg0NanHhrvZqY=", + created_at: ISODate("2025-09-25T04:13:41Z"), + }, + { + _id: "trk-186e11012a6106547d1f2ae9", + name: "angry_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ol7nIFhU3b3bcy9yDLnczvFj2nljpwMpSMg7bDzlSuQ=", + created_at: ISODate("2025-10-02T23:11:41Z"), + }, + { + _id: "trk-186e11012a611ae837d02d84", + name: "eloquent_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "FpyhfLIqw3aNKpj92kh9fqtz7V8os4gcBnUkon4NhMc=", + created_at: ISODate("2025-10-05T13:47:41Z"), + }, + { + _id: "trk-186e11012a612e3424e7f252", + name: "eloquent_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "dbFscVYmKeQXtbevJl2NaSCC05aecEO0ERqmCzy/vh8=", + created_at: ISODate("2025-10-12T14:51:41Z"), + }, + { + _id: "trk-186e11012a614244a9f7ad63", + name: "eager_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "MCfkq7yy3jSxqVD7foTf2AyApWXuEsSvxRtK1viEqg4=", + created_at: ISODate("2025-10-05T22:56:41Z"), + }, + { + _id: "trk-186e11012a6156ad70dbb8a5", + name: "upbeat_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "yFKv3ZRd0K0RIU/U4cRQRJ3NgTIDUDqyes4nBvc1tw0=", + created_at: ISODate("2025-09-25T09:30:41Z"), + }, + { + _id: "trk-186e11012a616ad6c72ceb10", + name: "energetic_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "AKo95ylXOqXlEeFx50EAe0LmXlLpv9AQ4Tj8eSs23rw=", + created_at: ISODate("2025-09-24T10:40:41Z"), + }, + { + _id: "trk-186e11012a617e4c3b7c0314", + name: "thirsty_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "pIhsQZ0pLeBgUlN83JnyiyRaUDe3Hd8MO6+PE82K2r8=", + created_at: ISODate("2025-10-03T02:28:41Z"), + }, + { + _id: "trk-186e11012a61a0c003e59de7", + name: "jaunty_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "X0J4Sjvyr4wvcx8ycuehCIJo3Lzhll9Ra7SuN3av/7k=", + created_at: ISODate("2025-09-15T01:27:41Z"), + }, + { + _id: "trk-186e11012a61e53f8f9d9afa", + name: "frosty_curie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "+e56TLqJbgbLjvCzKEUYWMKoxEj8bxR/rIl/uo52lGA=", + created_at: ISODate("2025-10-03T14:14:41Z"), + }, + { + _id: "trk-186e11012a61f975f08a6968", + name: "confident_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "DwsZb+mxVf2zfcO3BppyRDKum6jrOwEd0L5QZbQ1Dqo=", + created_at: ISODate("2025-10-11T04:13:41Z"), + }, + { + _id: "trk-186e11012a620da465a07444", + name: "xenodochial_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "WvrUfkbDS9F4ls35iTZLBPr7HYCCpHrAyQlIEZBxy9k=", + created_at: ISODate("2025-09-29T03:14:41Z"), + }, + { + _id: "trk-186e11012a6221372c49d336", + name: "amazing_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "mQYmIvXJbzbkuNOqJOnZuu8Kx1901BNeU1YgeB2NYIg=", + created_at: ISODate("2025-10-09T15:00:41Z"), + }, + { + _id: "trk-186e11012a623cc2f71b8aa6", + name: "puzzled_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Dv+emuCZKoZRsiOrnQrUEq4NO58l3Yb11/09cjVMyyc=", + created_at: ISODate("2025-09-17T07:44:41Z"), + }, + { + _id: "trk-186e11012a625185a495eaae", + name: "flamboyant_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XaVo9DLAYQrrs+LtTXtrAZBwCvkOms3Ldgx+os3gXWA=", + created_at: ISODate("2025-09-18T12:19:41Z"), + }, + { + _id: "trk-186e11012a62658c881b9e94", + name: "exotic_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gbXGqzXlvoAraIZsIhJPe+6ew8YKDINoXZxmzPOUYZs=", + created_at: ISODate("2025-09-14T04:53:41Z"), + }, + { + _id: "trk-186e11012a62792845ddb105", + name: "peaceful_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "JAoVdd3tl8pt112u3AXdNipRltkELT5rNyrvlCQsicI=", + created_at: ISODate("2025-09-16T11:24:41Z"), + }, + { + _id: "trk-186e11012a628e1ded818cc0", + name: "admiring_heisenberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "cHAo2YLBFJ+x4aK2ViC3Nnma2qA0AUN1+C2D8q92z3g=", + created_at: ISODate("2025-10-03T01:37:41Z"), + }, + { + _id: "trk-186e11012a62a3fabe73f15b", + name: "epic_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "nSFmaA3II6KyzdSHU3CivmRf3TZuTYdEi0RfYuvfq1s=", + created_at: ISODate("2025-09-28T03:48:41Z"), + }, + { + _id: "trk-186e11012a62b8eaf103143f", + name: "confident_dirac", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "zMHUy3/proqnKMPc6kjAUN2+owr6XhcrVewX89ANba4=", + created_at: ISODate("2025-10-06T09:43:41Z"), + }, + { + _id: "trk-186e11012a62cddcae8cc82e", + name: "motivated_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "JL3tUaHh8FhQzicHyWHNupHhd/LuNg7p47nHFrexJcA=", + created_at: ISODate("2025-09-24T01:39:41Z"), + }, + { + _id: "trk-186e11012a63006def7f8e13", + name: "trusting_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "DxqgjFVwM58ge+W/YkpZksJAVRpBwFPbWbGEt1+godU=", + created_at: ISODate("2025-10-08T11:28:41Z"), + }, + { + _id: "trk-186e11012a63168e19f956bd", + name: "noble_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "ofkivhvxVIHgzyJ5zqaNEbAWx1vT8QzmmGTkJw5bHEc=", + created_at: ISODate("2025-09-21T20:25:41Z"), + }, + { + _id: "trk-186e11012a632bd8e3481c80", + name: "dreamy_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "Q7TmQiaiMbQjm7VkPzDqRm/eFG8Z+jJyEXXxLfLj00M=", + created_at: ISODate("2025-10-13T13:37:41Z"), + }, + { + _id: "trk-186e11012a6341ed35364f6a", + name: "sweet_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "4FEfi7kRIfruyoU2PWlM5UDOheYCpaQYlYSUnFXrLYY=", + created_at: ISODate("2025-09-22T13:38:41Z"), + }, + { + _id: "trk-186e11012a63557184afd5cb", + name: "thoughtful_cooper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "2skB4VoUcPGktZsj+Lkkvi2SlOCVZDATFrne1YbjTqM=", + created_at: ISODate("2025-09-22T14:20:41Z"), + }, + { + _id: "trk-186e11012a636ae2fc55400f", + name: "fascinated_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "4RWNO5fsnmSZY85qtodAGJTFHotYLFKGM225nl8G29A=", + created_at: ISODate("2025-09-29T10:34:41Z"), + }, + { + _id: "trk-186e11012a637f163120a02f", + name: "phenomenal_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "aupdkGLLAlN+EzxwvJ/ls2CtM2oJW0bmpxAE0Wryug8=", + created_at: ISODate("2025-10-03T21:14:41Z"), + }, + { + _id: "trk-186e11012a63957dad4f6e84", + name: "noble_poincare", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "+S5s9+Eb0b19Xh0JwrM4TXl9HCMJxhvurdQZaEFfQMQ=", + created_at: ISODate("2025-10-13T13:52:41Z"), + }, + { + _id: "trk-186e11012a63a9b488c66966", + name: "naughty_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "luZOlyueEBLvwHm/GGRaLO89GmcucBCuhb4FrOnnt2s=", + created_at: ISODate("2025-09-21T06:33:41Z"), + }, + { + _id: "trk-186e11012a63bdb21339d43d", + name: "polite_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "I62eYTPe2zoU7qyJXJl2Ho1XDj6779SQu+VZzXytdJU=", + created_at: ISODate("2025-09-21T08:37:41Z"), + }, + { + _id: "trk-186e11012a63d3872a73d928", + name: "fearless_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "9jLZgoYP4hmYmWGAEp8zYOv298Wdl5fZdorRjwP8g4w=", + created_at: ISODate("2025-09-30T20:00:41Z"), + }, + { + _id: "trk-186e11012a63fc2dae48253e", + name: "agitated_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "OOSseKFuzABIgwN77wUsojp9BfDEmYJx2OVtIXlohPc=", + created_at: ISODate("2025-09-19T00:41:41Z"), + }, + { + _id: "trk-186e11012a6419cd9adf15d4", + name: "merry_ohm", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "OP+bTdgDMNI2Jj2OUlx6WNvoXEHwQS4SOgGs+jE9HQM=", + created_at: ISODate("2025-09-22T21:45:41Z"), + }, + { + _id: "trk-186e11012a6445e9542ceb3d", + name: "enchanting_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "q/HPagRlkUhkpHpenzzpWVYfZIkgkUGlLygjURoNw/A=", + created_at: ISODate("2025-09-23T19:43:41Z"), + }, + { + _id: "trk-186e11012a64e64acb34fde0", + name: "goofy_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "64ZojcN40nrftTyUp9n/iZWlj4OEpy1AKBC2jCdvR3I=", + created_at: ISODate("2025-09-21T18:52:41Z"), + }, + { + _id: "trk-186e11012a6562f1d5a6bf8e", + name: "faithful_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "NEkkzMX74+vm7O2T57Nj4J7qh+nn8L6q1T3ccAtzCgY=", + created_at: ISODate("2025-10-12T10:39:41Z"), + }, + { + _id: "trk-186e11012a657978bd955932", + name: "fascinated_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Xc3SVOXn4ldKwBxQ7PvyNR2EVweLC3107RrfVnlyqxQ=", + created_at: ISODate("2025-10-05T03:12:41Z"), + }, + { + _id: "trk-186e11012a658deb1cbc74be", + name: "noble_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "UClXMnEWLA1Yo7UnDrmpZHsEfmJ36NJ2mq0gRi/kzcg=", + created_at: ISODate("2025-09-19T02:03:41Z"), + }, + { + _id: "trk-186e11012a65a28d6b20ec16", + name: "admiring_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "xP5B7YbXUDqo03XkmCMoN4HKd11IB2X0v3/PJ9D0j5A=", + created_at: ISODate("2025-10-06T14:03:41Z"), + }, + { + _id: "trk-186e11012a65b65ab4a75d16", + name: "suspicious_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "VuYBRBujCPeJuOxpOx08blAYxKbYvY8Y1ZJA3rM4A1M=", + created_at: ISODate("2025-10-07T01:33:41Z"), + }, + { + _id: "trk-186e11012a65ca7f8e2ff72d", + name: "hungry_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "0uH9j+4TMAyIhwWaPvAlFWJna4VeO5y3msirk5a1AHQ=", + created_at: ISODate("2025-10-13T05:12:41Z"), + }, + { + _id: "trk-186e11012a65de072aa6fc79", + name: "hyper_millikan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "M2V/W+wLV6FLLuRhufazGYXP/W+BPlVlQzd0RctuWu4=", + created_at: ISODate("2025-09-23T13:03:41Z"), + }, + { + _id: "trk-186e11012a65f1bb5c146ab8", + name: "affectionate_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "dlukp0jdH/mAVx81Jggq/tTmh4WTocws+XItVGgNZsk=", + created_at: ISODate("2025-10-12T02:49:41Z"), + }, + { + _id: "trk-186e11012a6605f6bfc85d5a", + name: "bold_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "mBbpCjOBP7WYxjfrV1Q4Y2btmPCTN9/CMn69w6n0n74=", + created_at: ISODate("2025-10-01T22:47:41Z"), + }, + { + _id: "trk-186e11012a661a9459a61af6", + name: "sad_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "qO3bw/C4KZHq37XZC80hm2R9YjTIMpeX1+N2zqNrjes=", + created_at: ISODate("2025-09-19T18:22:41Z"), + }, + { + _id: "trk-186e11012a662e2caaacfc79", + name: "bold_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "doi0T3NH0KKQFn1B+VeNHvs2cWkhsePu3RcDx8SsXWw=", + created_at: ISODate("2025-10-08T02:06:41Z"), + }, + { + _id: "trk-186e11012a6642fad9ad433b", + name: "noble_millikan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "WfHngSuEcKKpJYPm3OZzpyy9wdlPoIeY37f3LZyC3U0=", + created_at: ISODate("2025-09-21T08:03:41Z"), + }, + { + _id: "trk-186e11012a6656542d3d3df5", + name: "brave_darwin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "PZMa4LTYOCnbubNuPpBy20SdPCWPKLUbwYQrMRMmSQ4=", + created_at: ISODate("2025-10-12T19:49:41Z"), + }, + { + _id: "trk-186e11012a667f0f999e1788", + name: "objective_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "DSAkYqCzbuUC/IKdYB57958uVdw6xJeh+Udq81Ca7wc=", + created_at: ISODate("2025-09-15T11:31:41Z"), + }, + { + _id: "trk-186e11012a669f7c7a33a3d8", + name: "gifted_edison", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "6X4dOBZb3FIU49NpN3/rIHZAIOAIuByFDG9ZIzzJWig=", + created_at: ISODate("2025-10-06T07:54:41Z"), + }, + { + _id: "trk-186e11012a66c666bee85163", + name: "magnificent_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "217RGR3iUaLIAunipv/M9vUDOSFXoeU+EBV9JVMaoTw=", + created_at: ISODate("2025-10-07T12:07:41Z"), + }, + { + _id: "trk-186e11012a66dad625d30e99", + name: "cool_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "YdQcELI6H7m1non4OGLuEY3q/k0897BelN6ipTyY+Zs=", + created_at: ISODate("2025-10-07T03:51:41Z"), + }, + { + _id: "trk-186e11012a66ef33204f6ab2", + name: "cranky_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ZoW+dJ5hauh/GgX9X8LHQeyYsQiC9JA4MHcilzB7nHY=", + created_at: ISODate("2025-09-23T08:00:41Z"), + }, + { + _id: "trk-186e11012a670a7c965ce39e", + name: "hopeful_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "QEbUtqBt9DKtIKXPCtBColR21KG+/IaGvCX2b5fIX4Q=", + created_at: ISODate("2025-09-29T06:52:41Z"), + }, + { + _id: "trk-186e11012a6724c551a0e03d", + name: "elastic_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "7wQz6sa46OhYPTVHd3hi/J+9IQkzyP75RHHzcb6jVhg=", + created_at: ISODate("2025-09-27T17:24:41Z"), + }, + { + _id: "trk-186e11012a673a41f95f6110", + name: "fascinated_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "tY0ax0s6/Me3StBIBA6WtZeYEqY4xhu92+cztJQT2Gk=", + created_at: ISODate("2025-09-19T20:13:41Z"), + }, + { + _id: "trk-186e11012a674d8c49e9f91c", + name: "sharp_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "cu0LhNwYjNhjhtE/iz8dEChXyK7xLD2K/+ARgWLPKi4=", + created_at: ISODate("2025-10-12T05:29:41Z"), + }, + { + _id: "trk-186e11012a6760c305264774", + name: "groovy_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "00gF07p5Idgk9MC1ZBX8G2vgFCGTWn9JNn0vB1mcy38=", + created_at: ISODate("2025-09-22T21:48:41Z"), + }, + { + _id: "trk-186e11012a677ead8f9d2983", + name: "intelligent_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hlU+G1cSuNlV6AQaPR8otssCa3z2x8ajOe2a7/G0gGM=", + created_at: ISODate("2025-09-16T14:08:41Z"), + }, + { + _id: "trk-186e11012a6792a56e8f9da9", + name: "proud_higgs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "0j2xg1Dz4wSx9JmrPCzXxBafstNKIJGn3rbP+zI3gyA=", + created_at: ISODate("2025-09-25T05:40:41Z"), + }, + { + _id: "trk-186e11012a67a641ea4feb26", + name: "amazing_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "SWM2yiSrJeEREx3ug5kSKizRaawH+wO25UoxZPoBwmY=", + created_at: ISODate("2025-09-26T09:28:41Z"), + }, + { + _id: "trk-186e11012a67bac8eedf29e7", + name: "pedantic_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "NLVwZmEa2OL6Z4pqkx0vnA7dXL/fXjuVPIEHUDmq5uI=", + created_at: ISODate("2025-09-15T06:26:41Z"), + }, + { + _id: "trk-186e11012a67cdedf1345929", + name: "hyper_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ZyuDt9mXILdg0RunC1pVVUp2AIqk8VNTDFQMRUwgkHg=", + created_at: ISODate("2025-09-28T04:45:41Z"), + }, + { + _id: "trk-186e11012a67eb89cd8566db", + name: "graceful_marconi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "SqeCBkngmr/ehE77ixnv7qHCYZzveMhTu9CwVbQJYNQ=", + created_at: ISODate("2025-10-11T13:27:41Z"), + }, + { + _id: "trk-186e11012a6800ec7f035d74", + name: "magnificent_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "gtaxlYl/+suWErJ7afCt8ATYhAuLSjlx2yvrhC5z0lQ=", + created_at: ISODate("2025-09-24T06:16:41Z"), + }, + { + _id: "trk-186e11012a681436cb176368", + name: "inventive_knuth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "SRpylP5ew5T5/gTc79UHHuN1pwQ6lvfOD8Wphlgprio=", + created_at: ISODate("2025-10-09T12:50:41Z"), + }, + { + _id: "trk-186e11012a6827f1305b747a", + name: "heartwarming_edison", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ZydjOjg0DNTrLegVuZNo3Sn8M1islQZvaT6Zcz8QpLw=", + created_at: ISODate("2025-10-08T10:07:41Z"), + }, + { + _id: "trk-186e11012a683c40c8614731", + name: "thirsty_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "SxZYpfmJKzIPrm87SNVnJ00GpHuOWrcIcw9OJAavBDI=", + created_at: ISODate("2025-09-18T23:04:41Z"), + }, + { + _id: "trk-186e11012a68503e7753741f", + name: "noble_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "g40bfbGnOLmkUhx1i+gx+Y6yzYadiO5yN+cJTufO+JQ=", + created_at: ISODate("2025-10-11T23:20:41Z"), + }, + { + _id: "trk-186e11012a687194b5861e81", + name: "mystifying_kelvin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "PptUjRBMZNacloj83BxlkSDjB2Z6gFk9CSA8gkhldDg=", + created_at: ISODate("2025-10-06T12:02:41Z"), + }, + { + _id: "trk-186e11012a68860d931d5095", + name: "nervous_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "lLAwgfhWZbjkr9VcYPZb0YsZtakY7oGbJcqQK4Uunm0=", + created_at: ISODate("2025-10-07T07:21:41Z"), + }, + { + _id: "trk-186e11012a68997c808f8465", + name: "sleepy_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "voc+y+JNdqp6lX48qNmcu59Lsq6a+uVXJCxct2xRNxk=", + created_at: ISODate("2025-10-01T04:23:41Z"), + }, + { + _id: "trk-186e11012a68ad23b4a73c5a", + name: "jaunty_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "occWle60rL4/Q1k5ZC1YZNFidtrXN1qPpOOQoHJI+0M=", + created_at: ISODate("2025-09-24T13:06:41Z"), + }, + { + _id: "trk-186e11012a68c1d3f71ded27", + name: "lucid_galileo", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "DZ1ZHv14wz04AcnlFCgHXUqY0wn2Smxd+AUD67eHDT8=", + created_at: ISODate("2025-09-22T20:28:41Z"), + }, + { + _id: "trk-186e11012a68d5dc0fbcdc78", + name: "angry_turing", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "yijSK7kAlrVHEkiArf2WHufse4mGsMgyn2zKQmtaFX8=", + created_at: ISODate("2025-09-18T10:02:41Z"), + }, + { + _id: "trk-186e11012a68f3408129aa93", + name: "fervent_torvalds", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "4hYuvxP0lN5zV1E8SYsJdO0CSXHb2LhCUVjfAOcV1uk=", + created_at: ISODate("2025-09-21T10:54:41Z"), + }, + { + _id: "trk-186e11012a69083580f37301", + name: "nostalgic_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "DSP/IOrE5ULpd3X+i8y+++pq+EHjO2CtR/KN+93Cfu4=", + created_at: ISODate("2025-09-15T07:02:41Z"), + }, + { + _id: "trk-186e11012a6923b5915a988a", + name: "motivated_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "eH71/s+dQvQ1xJJL6bLsr4YLpgvhMWpZNkl4XTuhzdY=", + created_at: ISODate("2025-09-27T11:34:41Z"), + }, + { + _id: "trk-186e11012a693761f330d104", + name: "proud_faraday", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "8KlDOWge0E5h6k+nVbYB0aYctn/NPc2Yp8qsgHvYFC4=", + created_at: ISODate("2025-09-21T19:56:41Z"), + }, + { + _id: "trk-186e11012a694ba40a1e8528", + name: "intelligent_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "egi3qn6qf20/lF+9wA1XlNr9R7UdH1w2tnW/BP1DOD8=", + created_at: ISODate("2025-10-08T00:26:41Z"), + }, + { + _id: "trk-186e11012a695fa93dc370cd", + name: "patient_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "C/SrLZcsde5zi+3jVX/1CXO0fyHfFL/LagnN71XM7vM=", + created_at: ISODate("2025-09-29T23:38:41Z"), + }, + { + _id: "trk-186e11012a6973a81a95f137", + name: "eloquent_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "j1t3bLVhGQXReRYX36ydg+8L3dmadL9oOMc9xaEDdqc=", + created_at: ISODate("2025-09-15T11:22:41Z"), + }, + { + _id: "trk-186e11012a6989075fb19370", + name: "eager_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "QP9cWjfrVAUTlexCgC2EQUZfb+jmVMRFlbcQsU0ULD0=", + created_at: ISODate("2025-09-27T00:58:41Z"), + }, + { + _id: "trk-186e11012a699c62e5346db9", + name: "ecstatic_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "dQcTJ19qSW/+XDlTdwlTzogBMQU7qKeGRScV1SV7xgU=", + created_at: ISODate("2025-09-13T20:05:41Z"), + }, + { + _id: "trk-186e11012a69afb578bfa279", + name: "naughty_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "2MHbKiaRPN0ir35fiIReoNXE4WSK5xtPhgGEQR9N/XU=", + created_at: ISODate("2025-09-26T18:35:41Z"), + }, + { + _id: "trk-186e11012a69c43a870114f4", + name: "objective_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Nj+3MmYrI0qejPktZkaTnW0cj2fxQVtwQr7n6xiiDms=", + created_at: ISODate("2025-09-24T16:11:41Z"), + }, + { + _id: "trk-186e11012a69d76c1d58cb5a", + name: "phenomenal_church", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "1TYnKVXTOmyZcd2ZATl7vQKmaZctz8BaE2eQUqiombA=", + created_at: ISODate("2025-10-11T20:40:41Z"), + }, + { + _id: "trk-186e11012a69eb366151d454", + name: "eloquent_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "bogfw5axRNHuqhcZokzzEiOoMQcNfFDJQ+L2lIK8ayY=", + created_at: ISODate("2025-10-03T08:59:41Z"), + }, + { + _id: "trk-186e11012a69ff9ce3bb7579", + name: "hardcore_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "dVgfqWA9h+R0tl3KTyeSGyZ+lWCVptMkmzJp6ECtVXo=", + created_at: ISODate("2025-09-23T17:16:41Z"), + }, + { + _id: "trk-186e11012a6a12cf3be6398b", + name: "calm_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "U0pVdwvHtqXH2Mx3kdqFLImQnbwURMVG/jWXPqW+Ugw=", + created_at: ISODate("2025-10-02T11:22:41Z"), + }, + { + _id: "trk-186e11012a6a26d34c04e401", + name: "faithful_watson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "FCXiT34AwIloVsGogUfNa5Y20a0W7pC/lB24FCpXZNk=", + created_at: ISODate("2025-09-16T13:27:41Z"), + }, + { + _id: "trk-186e11012a6a4fc90c6da34c", + name: "practical_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "OCJwY7fmiHWPQ8a93DY349D0YQV+N3Mkd2TMNT5PDt0=", + created_at: ISODate("2025-09-27T22:12:41Z"), + }, + { + _id: "trk-186e11012a6a6ddd9371f4e1", + name: "jolly_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "zh3fLp0siFfTJx6a5KZaHGOgXQqXDQJNfJ2PNj58HJc=", + created_at: ISODate("2025-10-09T13:14:41Z"), + }, + { + _id: "trk-186e11012a6a8e1d7645a2cc", + name: "iron_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "juSPU5T2XW/KKo/kgn3uf6XkkQ9kDR495szH8DZKP6I=", + created_at: ISODate("2025-09-16T21:33:41Z"), + }, + { + _id: "trk-186e11012a6aa3491ef34d6b", + name: "hungry_wu", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "aHj3TaU2sHN/CZGs7paLUWfnd2PJDk0KZfEtjYSnV6M=", + created_at: ISODate("2025-09-20T15:19:41Z"), + }, + { + _id: "trk-186e11012a6ab6ce0dbd137a", + name: "iron_ramanujan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XUB14u2ASGNYRp4x6GjSXL6P3iDzsEDJp5EYOrlNs7s=", + created_at: ISODate("2025-10-06T05:56:41Z"), + }, + { + _id: "trk-186e11012a6ad190d5f26f5e", + name: "boring_bardeen", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "iohPqYUWmNIM4chluUswul7SDQFnWsHWVbbzYX6Re6o=", + created_at: ISODate("2025-09-28T13:31:41Z"), + }, + { + _id: "trk-186e11012a6ae7df80bb26ac", + name: "laughing_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "K2XZ26AlCgHNAspK3zvk++/3xKDrWgtSSnF8+AOx0Qs=", + created_at: ISODate("2025-09-21T01:21:41Z"), + }, + { + _id: "trk-186e11012a6afd012573444f", + name: "cool_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "9gj00S3hIZZYYv5J0zDa7Ns4y0YsR3Gj6dIygOsKNFA=", + created_at: ISODate("2025-10-09T22:17:41Z"), + }, + { + _id: "trk-186e11012a6b11e2eea6ad28", + name: "amazing_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "BfxlKuJBjUKOLQwuwmIf+FJVmW3lFXLIy+FNl3r16ZI=", + created_at: ISODate("2025-10-02T07:37:41Z"), + }, + { + _id: "trk-186e11012a6b2618fb757329", + name: "gifted_galois", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "OuR5j02z+qXlcppxPdmPXhv7Kp4RuOWTfhKDM6UHVBM=", + created_at: ISODate("2025-09-27T12:50:41Z"), + }, + { + _id: "trk-186e11012a6b394bebadc1e6", + name: "magnificent_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "2As5cpb4ZprXazamVQTYm9zZhy+Q0zX2Lj9SkIkhInY=", + created_at: ISODate("2025-10-02T20:26:41Z"), + }, + { + _id: "trk-186e11012a6b4c6979266ad6", + name: "competent_wiener", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "W9PKV8At5L3ylkfdQpuqpPF3JJOGQ049qgX4g7nd5ts=", + created_at: ISODate("2025-10-04T18:36:41Z"), + }, + { + _id: "trk-186e11012a6b6160671c0d6c", + name: "adoring_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "InblIn+VqVZmJ+a/q2JxFnVpRzgK3qb+alNsE5yf7u4=", + created_at: ISODate("2025-10-01T02:17:41Z"), + }, + { + _id: "trk-186e11012a6b7596da904a86", + name: "zealous_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "QgJmhzs1pPm4C2QjlnqXUDwMuZppTBi2snmjbaWoEvA=", + created_at: ISODate("2025-10-01T11:39:41Z"), + }, + { + _id: "trk-186e11012a6b91e714711be0", + name: "condescending_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Bn+Dx6FWWuu8kT+8R0Radz1cBsk7JoS1fH4eMpOwrZA=", + created_at: ISODate("2025-09-16T22:07:41Z"), + }, + { + _id: "trk-186e11012a6ba6d028cde8bb", + name: "groovy_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "TePeppWG5GrNuh3beskSMFSTcdJBeF9ynGBxfYtb4XI=", + created_at: ISODate("2025-09-22T10:31:41Z"), + }, + { + _id: "trk-186e11012a6bbb009d699414", + name: "distracted_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "TRbTIZ8UCGBO5/2qXuF2yEQJkz+qJHlzNXM/J7nQGDI=", + created_at: ISODate("2025-09-22T12:40:41Z"), + }, + { + _id: "trk-186e11012a6bce3eb8cdd023", + name: "boring_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "jlXx2lFs5DdjRy0krxykZbO2Fr94IGE0Ern3n5z3R7A=", + created_at: ISODate("2025-09-24T04:43:41Z"), + }, + { + _id: "trk-186e11012a6be2728b0de5f1", + name: "quizzical_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "dlFY1T4NYuyQuEeedZ1IdEsnqnUldf+AFCUVJfgopdI=", + created_at: ISODate("2025-10-04T19:56:41Z"), + }, + { + _id: "trk-186e11012a6bf5e949a6578d", + name: "thrilled_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "3AtFcMkrZ4wqFIQkgpE0svSJ6ZWeEv0U/IpAOdLH31s=", + created_at: ISODate("2025-09-16T13:41:41Z"), + }, + { + _id: "trk-186e11012a6c261e6e410b97", + name: "gifted_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "mCocNj0D/NXQlQShXi2dcvGDBy7QIpPGg+nakvQ3bEs=", + created_at: ISODate("2025-10-12T19:47:41Z"), + }, + { + _id: "trk-186e11012a6c3c6824d60f91", + name: "affectionate_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "TXZDLtPpK6Mau3d2WVLxrKH0EuD8BCZ1KCt/NaHU/Es=", + created_at: ISODate("2025-10-03T01:26:41Z"), + }, + { + _id: "trk-186e11012a6c5038373ca424", + name: "elegant_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "8EDKjQSUKiXXv3BUbQ7Ng91j4f/GSr7+QAIqaqKKMII=", + created_at: ISODate("2025-09-26T23:21:41Z"), + }, + { + _id: "trk-186e11012a6c63905c65aa55", + name: "gentle_darwin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "Ynce/psEdLCbWCWGioAf0HMx1MoJogKuY2J/IINSvrI=", + created_at: ISODate("2025-09-29T19:02:41Z"), + }, + { + _id: "trk-186e11012a6c78882c93ea30", + name: "curious_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Wi4UYso0KKCSWpEsWXWhwtehcDXOdFaRFWJccD35X34=", + created_at: ISODate("2025-09-22T01:47:41Z"), + }, + { + _id: "trk-186e11012a6c8d0b88d582b1", + name: "groovy_poincare", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "C9UUSbi10tePQNX8CV9S878FAZepKSHW20mstzqcEl4=", + created_at: ISODate("2025-10-06T10:26:41Z"), + }, + { + _id: "trk-186e11012a6ca08e30bd58f3", + name: "eloquent_oppenheimer", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "ckphAdHxUOhQalPf/Alkhrlpn7LdWuIxEU8OM166IPw=", + created_at: ISODate("2025-09-21T06:30:41Z"), + }, + { + _id: "trk-186e11012a6cb4ea3bd9ddc8", + name: "inventive_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "Nk5bQv/tQLsoZ9sLhMxT7x8ACDjvKCA1HM2kNLDq2gA=", + created_at: ISODate("2025-09-27T12:10:41Z"), + }, + { + _id: "trk-186e11012a6cd94db91adead", + name: "kind_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "oSIz2hlKwllgzLLWEqJiHAvZniIPqIzT7LrB5OpceHY=", + created_at: ISODate("2025-10-04T13:01:41Z"), + }, + { + _id: "trk-186e11012a6cedcd79e9453b", + name: "modest_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "qFydjWVyh4o6yZpaPJ+IyZDayBFD5kMSwUuz5AyDFzc=", + created_at: ISODate("2025-10-09T12:27:41Z"), + }, + { + _id: "trk-186e11012a6d027b8a123406", + name: "magnificent_faraday", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "LPcO0cx0s2Uka6nphi9sMBXu3xkSslMYIGQYsXUrv2g=", + created_at: ISODate("2025-09-28T02:23:41Z"), + }, ]); From c6ac4e6e3643262dea7103464f0f798d0585a544 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 15:56:01 +0200 Subject: [PATCH 039/242] added devices --- services/playbooks/roles/mongo/files/init.js | 1801 +++++++++++++++++- 1 file changed, 1701 insertions(+), 100 deletions(-) diff --git a/services/playbooks/roles/mongo/files/init.js b/services/playbooks/roles/mongo/files/init.js index cc60bb57..f1291528 100644 --- a/services/playbooks/roles/mongo/files/init.js +++ b/services/playbooks/roles/mongo/files/init.js @@ -51,11 +51,12 @@ db.users.insertMany([ expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), }, ]); + db.devices.insertMany([ { _id: "trk-18608d12c8414acfcb9165b1", name: "wonderful_wirth", - status: { connected: true, last_message: "2025-08-02T16:40:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "m9mFoEWSL+GwWtoyPZsF2q4HpwLddf7JfsxmedN8h+Y=", created_at: ISODate("2025-08-18T03:36:46Z"), @@ -63,7 +64,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c843cfc86452c8bc", name: "xenodochial_carmack", - status: { connected: false, last_message: "2025-08-18T20:34:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "QNiUX1DdBq9hNGToa8ynDbXZRF9aDbO4LWvm7QspLo8=", created_at: ISODate("2025-08-08T07:04:46Z"), @@ -71,7 +72,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8443834a667d6c2", name: "merry_schwinger", - status: { connected: false, last_message: "2025-08-10T14:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "mS+C+G6Ut4mrbmz6v3EA5Fm7OvtcwrcRzvLOoIyIRDw=", created_at: ISODate("2025-08-08T17:05:46Z"), @@ -79,7 +80,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8445101b3d3a3b8", name: "thirsty_henry", - status: { connected: false, last_message: "2025-08-22T18:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "4kKuUQSMJE9RckmbCFReQy5gtbRpY3sCgDjcTnxBxwI=", created_at: ISODate("2025-08-04T05:03:46Z"), @@ -87,7 +88,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8446943ffbf2df9", name: "admiring_bohr", - status: { connected: true, last_message: "2025-08-06T01:33:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "5mp9W9wUVd50eqGqC/JpW/0/pG6wBrAsivSPg0bcC2M=", created_at: ISODate("2025-08-25T16:35:46Z"), @@ -95,7 +96,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84480bd0ad4656f", name: "keen_bohr", - status: { connected: true, last_message: "2025-08-16T05:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "/3tiwn6woUzwRGe/TUqOZQNGvYWHYSHj4d/Fpq9eTS8=", created_at: ISODate("2025-08-01T14:09:46Z"), @@ -103,7 +104,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8449838a8eb28eb", name: "clever_fermi", - status: { connected: true, last_message: "2025-08-08T23:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "pveqq6guV0EAQANRpMOQq5Yd8iSaZSH6QUMynO0ke6g=", created_at: ISODate("2025-08-05T16:46:46Z"), @@ -111,7 +112,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844b01d0d668fce", name: "brave_schrodinger", - status: { connected: false, last_message: "2025-08-04T16:28:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "+NrhtHayxZYPZnqA+C1C6uth3bORje/ka5uxXZ3E2zQ=", created_at: ISODate("2025-08-04T20:21:46Z"), @@ -119,7 +120,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844cb262515236b", name: "youthful_stallman", - status: { connected: false, last_message: "2025-08-22T21:24:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "dkvOCYpkWXr3WZs62jH9LfjOAbhm0TapSNQvcIzijLA=", created_at: ISODate("2025-08-04T10:00:46Z"), @@ -127,7 +128,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844e58e640b9ea1", name: "friendly_curie", - status: { connected: true, last_message: "2025-08-21T03:51:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "1l0SNynykdBFZVNfGlkTYiniGlmk5KVgyW3bp8HI6xg=", created_at: ISODate("2025-08-05T23:57:46Z"), @@ -135,7 +136,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844fccd26144714", name: "charming_dirac", - status: { connected: false, last_message: "2025-07-31T23:08:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "/Vi9D/RMiWilNw0jHA/fv4DbGwAEbqRAgQJulPl4DTQ=", created_at: ISODate("2025-08-08T18:10:46Z"), @@ -143,7 +144,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8451452004ec96d", name: "iron_franklin", - status: { connected: true, last_message: "2025-08-02T12:47:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "V0exZwne86ptOGifjuWX7QmGjpN1W62szV6+WxX9m5s=", created_at: ISODate("2025-08-07T12:55:46Z"), @@ -151,7 +152,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8456a397013ce6b", name: "gentle_church", - status: { connected: false, last_message: "2025-08-11T23:09:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "KH+3BS3QnEec8vME0ToemUn3mK9i0bwCg1ZlvgnRfkU=", created_at: ISODate("2025-08-15T20:23:46Z"), @@ -159,7 +160,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84581a0b80ca1c5", name: "practical_michelson", - status: { connected: false, last_message: "2025-08-11T11:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "ab3Wu7Glx9xhfSFUNRKzi1CZPfPeiCI7ujc/iJmYWpI=", created_at: ISODate("2025-08-04T21:37:46Z"), @@ -167,7 +168,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845ad105b9a60db", name: "phenomenal_born", - status: { connected: false, last_message: "2025-08-23T09:48:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "h3dT1JuyA/MhH1/o/n/IiPRFEyyEvXlMl3ZNtrCHZwY=", created_at: ISODate("2025-08-06T01:48:46Z"), @@ -175,7 +176,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845c8050d2973c1", name: "agitated_planck", - status: { connected: false, last_message: "2025-08-20T06:43:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "l/TRQN08IpMfwVHCWHpcNQ/SBuRWLeNcuJZDf28697c=", created_at: ISODate("2025-08-12T01:20:46Z"), @@ -183,7 +184,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845df659619c7e6", name: "determined_kelvin", - status: { connected: true, last_message: "2025-08-16T14:01:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "MlxmbBIfcGNpReS6GUgLDmTRrDDQQ6rlLxj4Eggrfjo=", created_at: ISODate("2025-08-10T07:50:46Z"), @@ -191,7 +192,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845f5d103e908ad", name: "thoughtful_weber", - status: { connected: false, last_message: "2025-08-18T05:54:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "WGmlcdPBvesFWds8BZ4UR4k7ze/25P1GpWhXaSmgNDQ=", created_at: ISODate("2025-08-04T22:08:46Z"), @@ -199,7 +200,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8460bf33167dbdc", name: "hyper_shockley", - status: { connected: false, last_message: "2025-08-17T20:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "BzHUYgawXJvf458ZW6fLaKxbTEoOXBI1pgI4Z5ebMuM=", created_at: ISODate("2025-08-17T07:01:46Z"), @@ -207,7 +208,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8462309d5e746cc", name: "pious_planck", - status: { connected: true, last_message: "2025-08-12T19:59:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "DMAF8lJbDW/hdBvKttHueeokLXgQ9nlcTQBDMfypO4w=", created_at: ISODate("2025-08-15T02:45:46Z"), @@ -215,7 +216,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84640a54b9bd528", name: "heuristic_fermi", - status: { connected: true, last_message: "2025-08-02T15:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "+crZGHsZ6r5ZN0UMsB0JFK/hveE6E267uzcAGdkQAZQ=", created_at: ISODate("2025-08-09T02:32:46Z"), @@ -223,7 +224,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846577d4ec97cfb", name: "sharp_edison", - status: { connected: true, last_message: "2025-08-14T03:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "eW16LWeR4CcKm0mRqkBnv9lU6WYKXyzS8csOmoTwt+c=", created_at: ISODate("2025-08-21T01:54:46Z"), @@ -231,7 +232,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8466e529b599dc4", name: "romantic_hertz", - status: { connected: true, last_message: "2025-08-30T03:20:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "kbRJ702ADyEPki+ko7MbOZ7AGvhKPSql5A7fK6MGFGI=", created_at: ISODate("2025-08-17T20:13:46Z"), @@ -239,7 +240,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84685251cdaf35c", name: "gallant_whitehead", - status: { connected: true, last_message: "2025-08-05T15:55:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "ZeGHStsNcbp56gDEk+nasq/BaaLklfzXfuG8BcX+lrs=", created_at: ISODate("2025-08-28T00:41:46Z"), @@ -247,7 +248,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8469c00840cc49b", name: "laughing_rutherford", - status: { connected: false, last_message: "2025-08-13T10:56:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "n0LNbNhaIaW42aBkqCwDM0cJSwcwL8McL8im5CP91v4=", created_at: ISODate("2025-08-29T17:24:46Z"), @@ -255,7 +256,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846b3600123a417", name: "sad_marconi", - status: { connected: true, last_message: "2025-08-05T23:52:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "g2D4mb6ezOrfK/ft41lACByyeU4IQVF6RWlB/0P7zhc=", created_at: ISODate("2025-08-15T07:38:46Z"), @@ -263,7 +264,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846ca7bab489e30", name: "clever_newton", - status: { connected: true, last_message: "2025-08-18T06:39:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "hGz/4/osEsLT/5Q53TTlID+wA54Xb2p8Cxpj05jZsik=", created_at: ISODate("2025-08-18T00:25:46Z"), @@ -271,7 +272,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846e0a3e38974e5", name: "dazzling_maxwell", - status: { connected: false, last_message: "2025-08-10T04:46:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "KSG9WiZ6pWINfm9FH9vS/GSo3t1TmLf+eE5eGhU+Hik=", created_at: ISODate("2025-08-05T06:51:46Z"), @@ -279,7 +280,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c847064ce1bdf7ee", name: "elegant_lagrange", - status: { connected: true, last_message: "2025-08-28T18:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "tlrnwpslaBwOChP+dAFPQ2sfItsoKERU+MR33NHk9yQ=", created_at: ISODate("2025-08-19T09:04:46Z"), @@ -287,7 +288,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8472b9f0905b3ad", name: "ecstatic_riemann", - status: { connected: true, last_message: "2025-08-05T19:27:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "5v94oQP8pNQZrOZrYNTTl5c67qyrPDUJE4eZTfuBjVU=", created_at: ISODate("2025-08-08T11:59:46Z"), @@ -295,7 +296,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84742df27b88f6b", name: "cranky_ampere", - status: { connected: false, last_message: "2025-08-19T19:18:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "cS34G/an+Z+MM1M5P5dh48B+y4kjyy0eI/8cw4ClkT4=", created_at: ISODate("2025-08-08T18:36:46Z"), @@ -303,7 +304,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84759c8a9ef04f8", name: "energetic_hilbert", - status: { connected: true, last_message: "2025-08-25T05:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "EInJWD1jh2t06pz3D5WZjspYvxzqs57NRKAxVhe9uIk=", created_at: ISODate("2025-08-28T01:57:46Z"), @@ -311,7 +312,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84770f5153b97ef", name: "amazing_turing", - status: { connected: false, last_message: "2025-08-10T10:51:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "X9Lx6+KllLFtNDyvj/466CrOQmF6UewS+3xs9j18ILA=", created_at: ISODate("2025-08-03T11:49:46Z"), @@ -319,7 +320,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84786f21e4edc5e", name: "happy_einstein", - status: { connected: true, last_message: "2025-08-21T12:01:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "wzTOvpERsSN6QO4jgUD3XuRtcdqQLItdjSxSgrKmcoo=", created_at: ISODate("2025-08-17T21:31:46Z"), @@ -327,7 +328,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8479d828433ff9a", name: "funny_peano", - status: { connected: true, last_message: "2025-08-11T05:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "cqseF4l1F5lAgCe7bD6EP+rEE+L1wFhc+10MQV48UJo=", created_at: ISODate("2025-08-24T04:47:46Z"), @@ -335,7 +336,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c847b3e74258eb03", name: "vibrant_thompson", - status: { connected: false, last_message: "2025-08-15T07:02:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "O0XXGhe7rp/EsEYyXNAGIKjJk5T+FXCAdebGqh/dluo=", created_at: ISODate("2025-08-16T09:54:46Z"), @@ -343,7 +344,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8480b18fe88b4af", name: "patient_wu", - status: { connected: false, last_message: "2025-08-21T22:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "bHzGkyOqJLG9GAnkC25B2OLoXhQhIUu3bPVIE9sBlzU=", created_at: ISODate("2025-08-24T18:56:46Z"), @@ -351,7 +352,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84823aa3e06b7da", name: "epic_cantor", - status: { connected: true, last_message: "2025-08-07T10:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "G7MRIMBP24R0xdEXZRIV3me9dDDFRdxtTXuLXe28494=", created_at: ISODate("2025-08-02T10:17:46Z"), @@ -359,7 +360,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8483aeb4dce2724", name: "hopeful_bardeen", - status: { connected: true, last_message: "2025-08-30T06:16:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "Xd5a7XzvWCVjDtduORbuAH1sykFtGHcvAhK/4BadcaI=", created_at: ISODate("2025-08-06T23:01:46Z"), @@ -367,7 +368,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8486259917b5535", name: "frosty_dedekind", - status: { connected: false, last_message: "2025-08-07T10:35:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "I0ahyNHzwY2ax1RTIwkdAW1+4eErU6s1WISzCED2ImI=", created_at: ISODate("2025-08-05T02:16:46Z"), @@ -375,7 +376,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8487a58b5c5651d", name: "heartwarming_bose", - status: { connected: true, last_message: "2025-08-15T11:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "LsgbCoMQG+opSUt9JrsiDIL4Z1k5VU+WnTGajUsfRMU=", created_at: ISODate("2025-08-04T01:01:46Z"), @@ -383,7 +384,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848919ae0a5ac8f", name: "kind_torvalds", - status: { connected: false, last_message: "2025-08-02T19:55:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "ij0mk0VXVo7nsb0cqpGJX0V5oChhDa830+CJ72ZW8xk=", created_at: ISODate("2025-08-20T23:21:46Z"), @@ -391,7 +392,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848b620cb14aa25", name: "fascinated_noether", - status: { connected: false, last_message: "2025-08-20T21:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "XJVLbd6UO12QkuIGo3EbZGXjG4xPKSvliiOLRLnMZmI=", created_at: ISODate("2025-08-09T07:11:46Z"), @@ -399,7 +400,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848d48480a5d5b6", name: "puzzled_fizeau", - status: { connected: true, last_message: "2025-08-22T09:43:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "ceSr36+tty8/YgIQuT7V66kMAXhi+K2JPN7EqEF7r3Y=", created_at: ISODate("2025-08-02T11:41:46Z"), @@ -407,7 +408,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848eb34f8760e19", name: "competent_rutherford", - status: { connected: true, last_message: "2025-08-04T03:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "e8kkc8+QotgP718tO8zL2+ukDwUiNfSmRl3UQFKnEwc=", created_at: ISODate("2025-08-02T23:24:46Z"), @@ -415,7 +416,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8490334a6303366", name: "pedantic_pauli", - status: { connected: true, last_message: "2025-08-30T09:45:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "kXVOIOGZGLfPzYCPK55aVbR15kbwTZr9ezA6zSxHEig=", created_at: ISODate("2025-08-05T01:38:46Z"), @@ -423,7 +424,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8491a91b1f888a9", name: "magical_dirac", - status: { connected: false, last_message: "2025-08-08T15:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "C9biy8JKSu1nQCKQxGTjuxkjHr4W46086h3KwjVBr/I=", created_at: ISODate("2025-08-05T22:46:46Z"), @@ -431,7 +432,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84931d6fa2d6232", name: "serene_tesla", - status: { connected: false, last_message: "2025-08-03T19:17:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "xPGoSwT+dTYd6ZX1++0+CJC8iEwVscx3VoDDI+LXWw8=", created_at: ISODate("2025-08-05T07:06:46Z"), @@ -439,7 +440,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8494897112ba78e", name: "peaceful_pascal", - status: { connected: true, last_message: "2025-08-05T08:37:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "WAVVSnHd8206VRwJOtgHDuUGDf0orqqYBIqodJA9L1I=", created_at: ISODate("2025-08-15T05:44:46Z"), @@ -447,7 +448,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8495fd71857ce3f", name: "stoic_ohm", - status: { connected: false, last_message: "2025-08-22T12:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "vzDwSMp/L6oyVEyYj3RKTY9UKyBj3V7LvhCD6cqe/nI=", created_at: ISODate("2025-08-22T20:43:46Z"), @@ -455,7 +456,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84976fefd57d1ff", name: "fearless_galois", - status: { connected: false, last_message: "2025-08-10T16:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "PoHtJ2l8pTjJPJctSMrIII20agqTIk4LpVoiIdNLzgo=", created_at: ISODate("2025-08-03T14:47:46Z"), @@ -463,7 +464,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8498d777941e066", name: "distracted_planck", - status: { connected: true, last_message: "2025-08-24T07:49:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "W8F6g6HmjQAP3lwJjRqAfdQOIOsSq1vzEVbHMS8ZUAo=", created_at: ISODate("2025-08-21T20:41:46Z"), @@ -471,7 +472,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849a50c845c25a9", name: "optimistic_babbage", - status: { connected: true, last_message: "2025-08-12T09:06:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "zpX14uHmth5/ZzzNaL68qeoHLJRZjT3huaYns0LmnWU=", created_at: ISODate("2025-08-06T17:19:46Z"), @@ -479,7 +480,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849bd6d485879c1", name: "tender_faraday", - status: { connected: true, last_message: "2025-08-10T12:57:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "O8XxluA24EC4bsgPrBHWCwS8q8GmBK7mv0byordbYc8=", created_at: ISODate("2025-08-13T13:09:46Z"), @@ -487,7 +488,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849d409351613c2", name: "jaunty_pauling", - status: { connected: true, last_message: "2025-08-27T07:44:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "OLbAlVzxkhzr2wlaO/WV8fCB/m4jJQ5AIfrJ0tUgF0A=", created_at: ISODate("2025-08-20T22:21:46Z"), @@ -495,7 +496,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a2e54a6ffdd76", name: "suspicious_volta", - status: { connected: true, last_message: "2025-08-03T18:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "S30Z2mlkvsUR6yH8nULY8RqPhmUcxEHEcEVuP7ePmSM=", created_at: ISODate("2025-08-10T10:53:46Z"), @@ -503,7 +504,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a5f766256c9e2", name: "serene_hopper", - status: { connected: true, last_message: "2025-08-13T10:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "DTOj/Y2DiO0Ju5vwxOUgBtwXB5579pz30EEMYun7z00=", created_at: ISODate("2025-08-18T16:45:46Z"), @@ -511,7 +512,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a892c3aad3955", name: "eager_gauss", - status: { connected: false, last_message: "2025-08-06T19:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "Dl4fLpzCBXqNHjtrgm+5jrj+tSXPZRxttltQPvr/JcY=", created_at: ISODate("2025-08-29T10:30:46Z"), @@ -519,7 +520,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84aa049b09a2169", name: "eager_darwin", - status: { connected: true, last_message: "2025-08-10T19:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "EC7AoSY05EyPbRVEl/eGTSfESGXZZ4OWF5FsPcaKdTU=", created_at: ISODate("2025-08-24T18:39:46Z"), @@ -527,7 +528,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ab6d05b8082ad", name: "hardcore_bell", - status: { connected: true, last_message: "2025-08-25T03:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "Ar3WbxWHU8l2uyOZPnqJffGQ9vJpXAovM/ZoNRYd9RA=", created_at: ISODate("2025-08-20T22:33:46Z"), @@ -535,7 +536,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84acd0d1c7fc74a", name: "enchanting_poincare", - status: { connected: false, last_message: "2025-08-12T07:20:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "0HbmI0I5esubDm4b6XvzgLgHJtXVxGTeIt4EiHJAKc0=", created_at: ISODate("2025-08-08T23:41:46Z"), @@ -543,7 +544,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ae3dffff2e52d", name: "proud_morley", - status: { connected: true, last_message: "2025-08-17T10:23:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "NYrTqrlsGqPo9r6nKF2+bVd+QshvHb00Z676LpK3R00=", created_at: ISODate("2025-08-30T11:59:46Z"), @@ -551,7 +552,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84afa2c10aa6c55", name: "inspiring_bardeen", - status: { connected: false, last_message: "2025-08-15T18:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "6dU2H5RdD5VaZyXi5ZWaj5rkydlEV5f2PS1l9+fvL+c=", created_at: ISODate("2025-08-07T16:21:46Z"), @@ -559,7 +560,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b11c367999861", name: "objective_glashow", - status: { connected: true, last_message: "2025-08-26T14:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "uW2kufM6EeR+tpJHDYRmd/5CPGLMn84jMBsu6mhWtRU=", created_at: ISODate("2025-08-19T03:27:46Z"), @@ -567,7 +568,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b2feca3792861", name: "modest_dyson", - status: { connected: false, last_message: "2025-08-25T10:25:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "5XYG/w/clJolar2hAO3n4D9+fJdckv7i0ZO0S2m2KRo=", created_at: ISODate("2025-08-02T00:09:46Z"), @@ -575,7 +576,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b469627a640d9", name: "boring_heisenberg", - status: { connected: false, last_message: "2025-08-25T03:19:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "EHPvNh8KnmQNbD8Kef2UZh+07Y6DiHKpNwTuuIcyemo=", created_at: ISODate("2025-08-10T16:52:46Z"), @@ -583,7 +584,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b5cae4cff3133", name: "strange_ampere", - status: { connected: true, last_message: "2025-08-28T04:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "fUqc7PB2fR3likQIUigerur96bUzz7dQZE/lMUiMJHY=", created_at: ISODate("2025-08-08T07:02:46Z"), @@ -591,7 +592,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b74702fe3e85c", name: "faithful_hardy", - status: { connected: false, last_message: "2025-08-27T20:37:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "etflzQEpsxaJqAlO2o/G45T+s80cWWaSV0KPobuWWFE=", created_at: ISODate("2025-08-02T15:50:46Z"), @@ -599,7 +600,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b8b83746dbc8b", name: "eloquent_leibniz", - status: { connected: true, last_message: "2025-08-14T14:03:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "nwdfO4d3o5nmJsO/i8xQrgcjsa2KNSQQ9PQzgMNbEc8=", created_at: ISODate("2025-08-13T23:17:46Z"), @@ -607,7 +608,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ba2911c4a675e", name: "cool_ohm", - status: { connected: false, last_message: "2025-08-12T06:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "7TXa0utsnnJXx7tHWYt5KC8nwv1xThn8iy12KI2zOvE=", created_at: ISODate("2025-08-12T01:49:46Z"), @@ -615,7 +616,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84bde9e8b791f18", name: "fervent_abel", - status: { connected: true, last_message: "2025-08-03T23:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "1doRBvIJsrXQIG1Ui9albOMUHxMjtrjU6VvNLZTZQak=", created_at: ISODate("2025-08-29T22:05:46Z"), @@ -623,7 +624,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84bf63dcc1fb3e7", name: "groovy_shannon", - status: { connected: true, last_message: "2025-08-10T16:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "4NnTHCSG64xQf807OjIJlzc+MdgrOv9/a83gDgRzUwQ=", created_at: ISODate("2025-08-16T23:38:46Z"), @@ -631,7 +632,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c23101fa0a8b6", name: "grieving_wiener", - status: { connected: true, last_message: "2025-08-14T09:38:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "BpChhURWcEyErTfXhnx6J9gg4L+Qy4FyWzdeL6e27u4=", created_at: ISODate("2025-08-14T21:20:46Z"), @@ -639,7 +640,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c3ae0fd8aad7e", name: "optimized_higgs", - status: { connected: false, last_message: "2025-08-21T14:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "csXqVuqw2AXm2A46aCt97ytsUzs5pA6t5Jnit25JFkI=", created_at: ISODate("2025-08-15T19:27:46Z"), @@ -647,7 +648,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c5151bb792931", name: "boring_wozniak", - status: { connected: true, last_message: "2025-08-08T02:27:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "X3CHEXehWzXvRfQAJ6GGCoeEbVPcdX95JCzT3uEBYSs=", created_at: ISODate("2025-08-02T10:22:46Z"), @@ -655,7 +656,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c678173241105", name: "curious_feynman", - status: { connected: false, last_message: "2025-08-21T18:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "XxN0HpCbfzUE2AMRPcteDPSRLT5YgnAy4ILOxwIzm/g=", created_at: ISODate("2025-08-26T19:07:46Z"), @@ -663,7 +664,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c7e6385d059d6", name: "noble_weinberg", - status: { connected: true, last_message: "2025-08-07T01:06:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "SZzpdjeGSaaWEBBa8apWtQJdwscbjyJ4jC/nXgnxJu4=", created_at: ISODate("2025-08-21T16:34:46Z"), @@ -671,7 +672,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c9470140d32f6", name: "upbeat_ritchie", - status: { connected: false, last_message: "2025-08-10T09:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "65mhzIpZvOx51yE6nPxQgjgy3rwlv13lMSM5X7vEFeQ=", created_at: ISODate("2025-08-01T12:55:46Z"), @@ -679,7 +680,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84caba1375500b4", name: "quizzical_doppler", - status: { connected: true, last_message: "2025-08-11T14:42:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "t/9N9FYcN12suJ/nZl5q6jC7OAWv0h2Pow6vJBSr4dA=", created_at: ISODate("2025-08-29T00:09:46Z"), @@ -687,7 +688,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cc3de436f7bde", name: "silly_westinghouse", - status: { connected: true, last_message: "2025-08-28T04:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "Ba4MVIb1YQL6dm2eYRiJOX0CljrdeuFtAI2HZ3nBtsE=", created_at: ISODate("2025-08-02T07:07:46Z"), @@ -695,7 +696,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cdbbc4c9327d2", name: "dreamy_tesla", - status: { connected: true, last_message: "2025-08-12T22:50:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "/kDru3xkiT7oAfKFD4Mp6nVl5IIFEMXponchC0ojKlo=", created_at: ISODate("2025-08-01T00:21:46Z"), @@ -703,7 +704,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cf3df4741680f", name: "jovial_mendeleev", - status: { connected: true, last_message: "2025-08-06T08:10:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "voqhD27X8L+VW4e/Op93AyazBBx/a7mqhTbAsvn6tnc=", created_at: ISODate("2025-08-26T23:38:46Z"), @@ -711,7 +712,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d0b5fc332f041", name: "great_kolmogorov", - status: { connected: false, last_message: "2025-08-14T09:59:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "TH/tO2mmlgP3dnH6h+ickwu8IaEajnm+DpvDLcAZDC8=", created_at: ISODate("2025-08-29T11:27:46Z"), @@ -719,7 +720,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d2247a477b6ff", name: "interesting_watson", - status: { connected: true, last_message: "2025-08-20T09:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "ZBNn287pTaxPwGShBOOICVcZDmQbcdr2vtmLYbelgoU=", created_at: ISODate("2025-08-19T19:46:46Z"), @@ -727,7 +728,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d385e1d5c7bbc", name: "zealous_berners", - status: { connected: true, last_message: "2025-08-04T11:23:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "5Wx/7819jHalM4yOsTrhtswnTS8ItR5/n0BEaYFotQM=", created_at: ISODate("2025-08-18T18:58:46Z"), @@ -735,7 +736,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d62f4adb3c923", name: "condescending_volta", - status: { connected: true, last_message: "2025-08-15T00:32:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "CKwOOv0LRsGpDURy9iXE9tnUFdjtI6ZqtAFoJkal360=", created_at: ISODate("2025-08-26T02:07:46Z"), @@ -743,7 +744,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d9ce75be19956", name: "adoring_morse", - status: { connected: false, last_message: "2025-08-28T04:09:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "iL0T7kaXpwPrO6Z0mA7Kk2Gs+tHEBl6fNSbFV3rSgVM=", created_at: ISODate("2025-08-04T14:20:46Z"), @@ -751,7 +752,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84db5aa45ada38e", name: "elastic_fourier", - status: { connected: true, last_message: "2025-08-22T06:00:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "8loHVYewF31YJGSlkcOrMZpfc5eQ2DFhuvpne8M68Xc=", created_at: ISODate("2025-08-09T06:44:46Z"), @@ -759,7 +760,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84dccaa3ac843bd", name: "thrilled_gauss", - status: { connected: false, last_message: "2025-08-14T07:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "jhESuO3AwXCtX0TcH5E9l91DDRUUx3SIErqpjt+SpUk=", created_at: ISODate("2025-08-25T19:51:46Z"), @@ -767,7 +768,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84de3a8df5efbcc", name: "goofy_markov", - status: { connected: false, last_message: "2025-08-20T02:12:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "1bmj0Qvq4D9EsyHZJpITpEqEBBrOcD9KsiUhDX4X7R4=", created_at: ISODate("2025-08-27T19:33:46Z"), @@ -775,7 +776,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84dfa6590d8fbda", name: "relaxed_turing", - status: { connected: true, last_message: "2025-08-29T02:47:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "bMvQyF6Lu/h5zYPEn4TBAOAxjVj67QTXl3ifZYf3S7s=", created_at: ISODate("2025-08-09T23:16:46Z"), @@ -783,7 +784,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e12b161fb52f1", name: "exciting_godel", - status: { connected: true, last_message: "2025-08-19T23:11:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "L+ZecOMBWt0L7Ix8sPW8MZpDskk30MZydLOV1av++fk=", created_at: ISODate("2025-08-30T12:59:46Z"), @@ -791,7 +792,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e2a4a52da79d9", name: "sweet_galvani", - status: { connected: false, last_message: "2025-08-29T21:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "dDVOk5b+i7+npM3o7icJocZSNFaed64RKX6HuxK5TTk=", created_at: ISODate("2025-08-22T08:08:46Z"), @@ -799,7 +800,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e473a6d897698", name: "fabulous_ramanujan", - status: { connected: false, last_message: "2025-08-18T06:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "n/7uqrA1Xh7uzYaX4BouodyLFlU/HWXMF3Gjd5gRN6g=", created_at: ISODate("2025-08-19T16:05:46Z"), @@ -807,7 +808,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e67b817e2a8fd", name: "trusting_knuth", - status: { connected: true, last_message: "2025-08-28T09:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "frrz+vzXLVQV4HHhZf7MFMPo4iGIJQWsgSPIkHKJ8OE=", created_at: ISODate("2025-08-01T15:20:46Z"), @@ -815,7 +816,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e7f725b9dd529", name: "quirky_shannon", - status: { connected: false, last_message: "2025-08-16T17:49:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "443NJMtr5p+i0QIA8th2B9QTsh3aKhI1p51G0uwN1iQ=", created_at: ISODate("2025-08-09T21:36:46Z"), @@ -823,7 +824,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e95effa9dc925", name: "nervous_hawking", - status: { connected: true, last_message: "2025-08-15T23:40:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "XTAux5J/tThXxN+5AoXR61Pxm0nfvJ92SOpCVo9HVpk=", created_at: ISODate("2025-08-18T09:24:46Z"), @@ -831,7 +832,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84eaef489342f7e", name: "exotic_turing", - status: { connected: true, last_message: "2025-08-03T15:10:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "rrNb0cdFEBeDwGfwZXv8U1VqHz4QfxT6Re+o+HR8vGA=", created_at: ISODate("2025-08-16T03:12:46Z"), @@ -839,7 +840,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ec5eea3a8dae1", name: "gifted_kleene", - status: { connected: true, last_message: "2025-08-12T00:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "EaBPc3d6Edkfi3YYxsqc+sAMILGwn2RbsIkB4zmnSU0=", created_at: ISODate("2025-08-24T06:35:46Z"), @@ -847,9 +848,1609 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ee5a2e49c6f83", name: "lucid_heisenberg", - status: { connected: true, last_message: "2025-08-08T11:32:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, + { + _id: "trk-186e11012a5561d480d2e2eb", + name: "fervent_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "kqtwRUbhMyVd17VSGcNacCgknCqXG/nbTZ0TpdkHuG0=", + created_at: ISODate("2025-10-02T06:02:41Z"), + }, + { + _id: "trk-186e11012a596d43fd69108e", + name: "mystifying_riemann", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "kgpHr5wgALwkGS3rZ++yHMFJVyQyM7PtocptH7xWA8s=", + created_at: ISODate("2025-10-07T20:48:41Z"), + }, + { + _id: "trk-186e11012a598ad93ff98c88", + name: "fabulous_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "qPL22InLNt+qxCMYNI9IbWqUnFX6XMlldzxiwEeIGew=", + created_at: ISODate("2025-10-02T22:25:41Z"), + }, + { + _id: "trk-186e11012a59b19903d892f0", + name: "sweet_ramanujan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "cFe3cCf75MF+sDHwumwNz/8AarbzIZ8gCjI4K2kzYOY=", + created_at: ISODate("2025-10-11T14:40:41Z"), + }, + { + _id: "trk-186e11012a59cb26e0075b2a", + name: "distracted_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "O5pJz4gxI9odDLTT1yPIZBm6Twnr4C8IGkDt7zoKxho=", + created_at: ISODate("2025-10-08T20:34:41Z"), + }, + { + _id: "trk-186e11012a59e3d14be606df", + name: "proud_weber", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "T4T4gHgXrdMXUd7J1lyDO+f62DcmrAbUUA9qOxc7Uvw=", + created_at: ISODate("2025-09-22T03:41:41Z"), + }, + { + _id: "trk-186e11012a59fa7cd3c6dce1", + name: "hyper_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "AY7Rf9qa1Ly/e6kF10FKT570Bg/qlFAKP7bsMUgb9rg=", + created_at: ISODate("2025-10-13T11:43:41Z"), + }, + { + _id: "trk-186e11012a5a13d3a9db4772", + name: "groovy_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wv7hUUOS/l5gPcyEyWtqIWfL1B9l+6TOUDaXR1VpqCc=", + created_at: ISODate("2025-09-23T22:15:41Z"), + }, + { + _id: "trk-186e11012a5a2d27c9191da5", + name: "great_cooper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "w3E6srVzISB3/6RwJLThuqXCIuB/mwVUnb1+jjq0tGc=", + created_at: ISODate("2025-09-17T05:12:41Z"), + }, + { + _id: "trk-186e11012a5a4494864fe415", + name: "goofy_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "RD0xX5dLEAtLQqoFSwNI6sXRFt8uXbvBF/kqUb8fWKs=", + created_at: ISODate("2025-10-01T18:21:41Z"), + }, + { + _id: "trk-186e11012a5a5a58df5eaad8", + name: "cranky_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "olYsIof8//f0fRwqpmsB/oSBGhxAgUd6SDALBkLkEfA=", + created_at: ISODate("2025-09-27T16:56:41Z"), + }, + { + _id: "trk-186e11012a5a6f0b11c08ea9", + name: "optimized_hertz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "/im+6GYjhW6G/az/9KVzuhYzypbLSgxm2feoKBAUVWo=", + created_at: ISODate("2025-10-03T17:42:41Z"), + }, + { + _id: "trk-186e11012a5a8326235064aa", + name: "funny_ampere", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ps9v0p2pfDjjNlIkqZijXseLsZ7I34N1l6w8ss9Gbjo=", + created_at: ISODate("2025-09-20T16:23:41Z"), + }, + { + _id: "trk-186e11012a5a98929c44b902", + name: "phenomenal_schwinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "iqgX85qTfX4Xy5rDlMuuw6y+EmGy1qcdLBz+VGr3PtY=", + created_at: ISODate("2025-09-18T23:10:41Z"), + }, + { + _id: "trk-186e11012a5ace77b59f96f0", + name: "inspiring_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "OKkXfWT+lPo+CFBU71O10ahMByiZEteZpBD+ti6q7oI=", + created_at: ISODate("2025-09-28T16:35:41Z"), + }, + { + _id: "trk-186e11012a5ae586a58fdddf", + name: "motivated_ampere", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "RVbNIWA0ApYY6MJeib+ONiu8s0hKj8rmlOh/bpnk9os=", + created_at: ISODate("2025-09-27T01:17:41Z"), + }, + { + _id: "trk-186e11012a5afb592361434c", + name: "nervous_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZTduEIFal2ZpIn5lUXO3sYyGgbYKUIwDL6QsiOd5OPw=", + created_at: ISODate("2025-09-26T09:06:41Z"), + }, + { + _id: "trk-186e11012a5b0fbc6d8d33d3", + name: "thirsty_galvani", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "iLa6/opdNyQaQQBu7hidLlvX6pe1vcomQsgxeP4XfzM=", + created_at: ISODate("2025-09-27T22:01:41Z"), + }, + { + _id: "trk-186e11012a5b23c2f89bddba", + name: "quirky_dedekind", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "soINuZ+4XhQ1HuxX/6WwunLQ2X7on/e0uotjk99sSNU=", + created_at: ISODate("2025-09-29T05:28:41Z"), + }, + { + _id: "trk-186e11012a5b38c33d43a45e", + name: "pious_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "XXLyX9ffOpj1eI2RIUSjry6b/Rzis15TzinrvmoKoKk=", + created_at: ISODate("2025-10-02T06:37:41Z"), + }, + { + _id: "trk-186e11012a5b4cd44a3a45cf", + name: "sweet_watson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "jFq96uYH10c+0GshcwZjgkaUHrwOlMjxxUg+xF4LmWg=", + created_at: ISODate("2025-10-02T13:16:41Z"), + }, + { + _id: "trk-186e11012a5b6332148cd018", + name: "admiring_turing", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "XcBe4uqZBIDo/I2SjAImJfBrsNk5N5atDrnrBEYlcqE=", + created_at: ISODate("2025-09-20T10:04:41Z"), + }, + { + _id: "trk-186e11012a5b787f126d15f1", + name: "practical_hardy", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "TuHP/ofEOd/2slfenIJ2+66Pg5zgH9Dx8zrmUMpiwYQ=", + created_at: ISODate("2025-09-22T21:16:41Z"), + }, + { + _id: "trk-186e11012a5b99983857d7f5", + name: "compassionate_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "04IdX2PAwIbnedM7AXRjXOVS8zMataBOSLI7TLW+sJU=", + created_at: ISODate("2025-10-09T21:19:41Z"), + }, + { + _id: "trk-186e11012a5bae42c3d6ccfc", + name: "enchanting_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "jWiaC8MyTsXV7n9K8UswTxuDiTJVEIndjeVBj4wu4WE=", + created_at: ISODate("2025-09-29T10:41:41Z"), + }, + { + _id: "trk-186e11012a5bc46607105b2a", + name: "elated_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "6JHQq/8pK9dyk6FjNo1CJbE8fsysTpVn2qmKtzys390=", + created_at: ISODate("2025-10-09T17:09:41Z"), + }, + { + _id: "trk-186e11012a5bd9cfb0f5b31d", + name: "jolly_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "+hoDuiVnwHeNSQ5DzwzkgiMxGMKmOE2ni/mX6UfTXhY=", + created_at: ISODate("2025-10-06T04:04:41Z"), + }, + { + _id: "trk-186e11012a5bed6777eda1c8", + name: "elated_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "B6a9x6vz+tkuC+S2OQzxuJCv/MAGViKAPMjokDzYZhU=", + created_at: ISODate("2025-10-09T01:10:41Z"), + }, + { + _id: "trk-186e11012a5c1ccccb9b0a4e", + name: "gifted_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "mjsPzOv/5a+iF09A8svypYFonKHJCZuQWTOjzWLyhbc=", + created_at: ISODate("2025-10-03T05:26:41Z"), + }, + { + _id: "trk-186e11012a5c4401a63b0f3c", + name: "confident_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "lS2fQ0b5IPEvW0EClWkOxPbRrWl45bp1EZe0psee2pc=", + created_at: ISODate("2025-09-17T06:55:41Z"), + }, + { + _id: "trk-186e11012a5c59dd750d2c06", + name: "fascinated_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "h5di5PLrxdJirC1m7RDe61/DqOgoSfJ6XiELleXZKjE=", + created_at: ISODate("2025-09-21T10:00:41Z"), + }, + { + _id: "trk-186e11012a5c6ee1af951199", + name: "keen_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "iUvf42OIcqd1e5Nbemgjy/vLfAwaZERGyd2TAgbX61c=", + created_at: ISODate("2025-09-19T06:23:41Z"), + }, + { + _id: "trk-186e11012a5c830dd37874fe", + name: "goofy_curie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "MsqIwOOiR1bYD/zWIOo0HGFH4rJ/nQXKMUPHxZeA86w=", + created_at: ISODate("2025-09-18T06:06:41Z"), + }, + { + _id: "trk-186e11012a5c98b36f264650", + name: "hyper_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "4Pjt6Nz5Cggifiww9tnVOs+TA/Z4ETuw5FLqlsQ87bs=", + created_at: ISODate("2025-10-03T02:10:41Z"), + }, + { + _id: "trk-186e11012a5cad311c595ad1", + name: "determined_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "YfSXzGiI3cbp/vM2b6ke/UUkxwUhKkywqAyvmFGXPp8=", + created_at: ISODate("2025-09-15T15:21:41Z"), + }, + { + _id: "trk-186e11012a5cc574d6d81de8", + name: "sleepy_pascal", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "RpSxQsx5LqFUFbbolTRrnA2C/LsiAwMoS/NbIorA0Rc=", + created_at: ISODate("2025-10-13T02:34:41Z"), + }, + { + _id: "trk-186e11012a5cd92693beffd9", + name: "tender_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "SiyPQhaSZFCUe0EwhzwEHn0ZGF+auw09D5WdkXv5JUY=", + created_at: ISODate("2025-09-13T16:36:41Z"), + }, + { + _id: "trk-186e11012a5ced9d9a7f3282", + name: "thrilled_fourier", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "z5hY1D4uamwjhBUigsuQIVYStk8LkS7IHGffvP1g+Ig=", + created_at: ISODate("2025-10-08T08:28:41Z"), + }, + { + _id: "trk-186e11012a5d018136d48bad", + name: "enchanting_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "pr3lrF2O5U3f0Yf1DbFhdmz7g1YZ9ORKszdAOQ4n1Ek=", + created_at: ISODate("2025-09-23T02:49:41Z"), + }, + { + _id: "trk-186e11012a5d1517f5b46305", + name: "lucid_gauss", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "FOZHubOJabF1/4rPcKbm2R/RqIACyC3tS+Pw3L9QCzI=", + created_at: ISODate("2025-09-25T15:54:41Z"), + }, + { + _id: "trk-186e11012a5d2988550c5169", + name: "admiring_torvalds", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "GkO3pzWOMm260vTOzGd/uvB6+Qh4gMrYQlObQBrJQ1k=", + created_at: ISODate("2025-09-27T13:02:41Z"), + }, + { + _id: "trk-186e11012a5d3cf2b2ca7686", + name: "polite_heisenberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wxoIImrWfV0Ni4PHBqwv4AX4HL7g+AOyRII7dYyWrZk=", + created_at: ISODate("2025-09-28T10:14:41Z"), + }, + { + _id: "trk-186e11012a5d598c29d80cbd", + name: "pious_pascal", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "pgtlmBy0mJuE+ekgqsI0DfDv/QS36Yr3Ma87avO+KOw=", + created_at: ISODate("2025-09-24T19:23:41Z"), + }, + { + _id: "trk-186e11012a5d7a7b4bf73935", + name: "quizzical_ramanujan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "ncLNvzOa6UENXO7wLqTs+rCICEF7vJDmSZiX4ir+8Ow=", + created_at: ISODate("2025-09-14T23:15:41Z"), + }, + { + _id: "trk-186e11012a5d8ece5f7bdd8e", + name: "youthful_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "OJc1uL9AIAsjFi4Dptjh3CpPrmTUF8B6DkjskEMsjTg=", + created_at: ISODate("2025-09-16T03:07:41Z"), + }, + { + _id: "trk-186e11012a5da3cbc19a0fb8", + name: "admiring_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ISYhC21HlX9IcsYUexG5NV0yDjNTmn9lfUQvKSe+JlQ=", + created_at: ISODate("2025-10-11T17:33:41Z"), + }, + { + _id: "trk-186e11012a5db8028171234f", + name: "compassionate_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "gSyfyQDT6eZsiT8tI2wzDGv5Q6g/UYxW0QWaKjLlu/0=", + created_at: ISODate("2025-09-29T02:33:41Z"), + }, + { + _id: "trk-186e11012a5dcc1a6befda29", + name: "jovial_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "eClDfBHCPZ9Kg/fLpky6AzS9O0HOz8Os6PjlnrKsSwg=", + created_at: ISODate("2025-10-01T18:59:41Z"), + }, + { + _id: "trk-186e11012a5ddfa3062f0ff4", + name: "playful_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "P/K62OGL3lwTqYsRXK+OnlMehWZorMlphuQ3roNexo8=", + created_at: ISODate("2025-09-28T09:33:41Z"), + }, + { + _id: "trk-186e11012a5df4297b52a885", + name: "original_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "UxLu9YkY6L0rP3ctdmm9Lzaye9LMCSYPNSKLWyYssMc=", + created_at: ISODate("2025-09-30T20:32:41Z"), + }, + { + _id: "trk-186e11012a5e25d0d813f27a", + name: "dreamy_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "9o3ngbgcWUGQlPEkSflgrOWTiyXLhJ0QYh49t7IqozA=", + created_at: ISODate("2025-09-26T17:36:41Z"), + }, + { + _id: "trk-186e11012a5e3b84ff471fbc", + name: "merry_salam", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "gKiNSB7OCpbcZoHozoLUAYMjMmPDNBMzc979JU+nXp8=", + created_at: ISODate("2025-09-22T13:28:41Z"), + }, + { + _id: "trk-186e11012a5e4fe06bc4b394", + name: "gifted_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "s6lWpBP1VLeSvOzO3oRe8ypkEqOtkwNaLV0UOQNCG14=", + created_at: ISODate("2025-09-20T06:28:41Z"), + }, + { + _id: "trk-186e11012a5e63602bb29a90", + name: "gifted_hopper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "Vjb7DaSJfMV3nITbX00INyTkeOVeVksoA8davwEU7kw=", + created_at: ISODate("2025-09-15T03:44:41Z"), + }, + { + _id: "trk-186e11012a5e779fee7fdd35", + name: "flamboyant_hertz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "z4QNKZrnZ4T6HCRNScL4WkSTUxhjRGTIk28IZupKHno=", + created_at: ISODate("2025-10-07T04:55:41Z"), + }, + { + _id: "trk-186e11012a5e8da24c25c62b", + name: "charming_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "G37P8VjO95i4gKG8yTRCQ1UZRoh/JaaRpRNf7A2gVBw=", + created_at: ISODate("2025-09-23T16:34:41Z"), + }, + { + _id: "trk-186e11012a5ebbf1e05fc63e", + name: "fabulous_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "lsFvUa0rjoRlqjqCUXUUjSI0dE/s9DCcwx59f9pqokU=", + created_at: ISODate("2025-09-25T08:39:41Z"), + }, + { + _id: "trk-186e11012a5ee64eba1cad79", + name: "pious_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "QiSWe4sEtEfa1SfVBNVSkoTmBjvWjAsVjk6cU8qMSsQ=", + created_at: ISODate("2025-09-16T04:17:41Z"), + }, + { + _id: "trk-186e11012a5efba40cd780d6", + name: "merry_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "sgHilxpLlIiMOnig/XHEMha97TYevSbZGlW43f1yiJA=", + created_at: ISODate("2025-09-23T05:15:41Z"), + }, + { + _id: "trk-186e11012a5f455a1b0ae79f", + name: "sad_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "tkwiKvo7W+azl1ZgLtmP6KiHbTrctOLCbqJoBVY3+Pg=", + created_at: ISODate("2025-09-27T09:48:41Z"), + }, + { + _id: "trk-186e11012a5f5a92a359b79a", + name: "hopeful_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "UZNlMvRRozvA3/by9ehRSuaORegK0JDh8hYtWSv5D5E=", + created_at: ISODate("2025-09-25T06:00:41Z"), + }, + { + _id: "trk-186e11012a5f70141806a956", + name: "heartwarming_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "Wyl507rgkRX41yNgrQfTTwagqZJiWVCchcSPf80Vr4Y=", + created_at: ISODate("2025-10-08T18:23:41Z"), + }, + { + _id: "trk-186e11012a5f83c95653663c", + name: "thrilled_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "SJUN1nvUtlSD63P6M1pNKWYGuqRnClFwySGI67lEtV8=", + created_at: ISODate("2025-10-11T19:04:41Z"), + }, + { + _id: "trk-186e11012a5fbf4095b28646", + name: "crazy_ampere", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "b7sAMnrwZm2e2JOu7cVFnmMKCIsxRmmX0CLCRvpnteI=", + created_at: ISODate("2025-09-17T06:38:41Z"), + }, + { + _id: "trk-186e11012a5fd5659402dfeb", + name: "beautiful_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "C4HJyzN27U5jNQShQqk7fnHJ0konB+TtJFIj7xs43mA=", + created_at: ISODate("2025-10-01T08:32:41Z"), + }, + { + _id: "trk-186e11012a5fe94d9f033641", + name: "busy_salam", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "GbomR1IEdZvcIsX+Dy851wwBAKv8bUNkysnlhbt9C30=", + created_at: ISODate("2025-09-19T19:45:41Z"), + }, + { + _id: "trk-186e11012a5ffd352413b530", + name: "sweet_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "aE4zj1h+9vRvYSUqtNKT2kK7tyN9T2LSjgoMGkzR0hc=", + created_at: ISODate("2025-09-18T03:51:41Z"), + }, + { + _id: "trk-186e11012a6011b32b9939db", + name: "cranky_siemens", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "WkrTgRmQtbMyiFIRM7JfBCOwGzECjGGi1UiA6dBubJg=", + created_at: ISODate("2025-09-23T16:26:41Z"), + }, + { + _id: "trk-186e11012a6025cbee1dc98f", + name: "blissful_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "FAfD4UVHwonn9QY8HE3J6YRhnTqwMC/biyPPVTMhIJM=", + created_at: ISODate("2025-09-19T03:15:41Z"), + }, + { + _id: "trk-186e11012a60395b38d1954d", + name: "wonderful_bose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "0ZVm9mi4yq2YZmKogeRDlOGXu7gEnQ7cG82XHajyw7E=", + created_at: ISODate("2025-09-22T20:47:41Z"), + }, + { + _id: "trk-186e11012a604e0f101a26f5", + name: "keen_salam", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "G7IWRP6d+zX+f4t06gbwgZb/rX1w+AYdQh6jWKykaio=", + created_at: ISODate("2025-09-22T09:00:41Z"), + }, + { + _id: "trk-186e11012a606e6ca1634990", + name: "dreamy_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Mh4A9NA3GlJStCAaNbYu63n8pvkDhpHLq2HeYximta8=", + created_at: ISODate("2025-09-21T00:51:41Z"), + }, + { + _id: "trk-186e11012a6084b2c8b9789b", + name: "brave_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "YqbWAlf5lqPZZO61QKdUNMQ5PL85q3AKbgGuMNJLsrE=", + created_at: ISODate("2025-10-10T05:45:41Z"), + }, + { + _id: "trk-186e11012a609969074409b4", + name: "interesting_shockley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "X4IIHw+lyQjKqgcB69gAUJ3knVD+o8Ag0SzaDBXLfYM=", + created_at: ISODate("2025-09-25T09:28:41Z"), + }, + { + _id: "trk-186e11012a60b6113f2cd70a", + name: "practical_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "H/obZQPI2CjXl3/+iQvKS91VGPr/54k+HvB/wBjqewA=", + created_at: ISODate("2025-10-12T01:59:41Z"), + }, + { + _id: "trk-186e11012a60c9972502d08e", + name: "flamboyant_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "dCVwn4KsGiF15UDSiICW8XAf3hlt02zRQBFzst2Upa0=", + created_at: ISODate("2025-10-06T16:44:41Z"), + }, + { + _id: "trk-186e11012a60de635b74de91", + name: "fabulous_fizeau", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "0Diry3mQtd7f6U71EzhhOralUkl5TuXtECAcEs1UvJY=", + created_at: ISODate("2025-09-25T08:13:41Z"), + }, + { + _id: "trk-186e11012a60f293acfce4bd", + name: "amazing_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "c0uOtAw/jol27F5ACAuPp0ZilplgXsyg0NanHhrvZqY=", + created_at: ISODate("2025-09-25T04:13:41Z"), + }, + { + _id: "trk-186e11012a6106547d1f2ae9", + name: "angry_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ol7nIFhU3b3bcy9yDLnczvFj2nljpwMpSMg7bDzlSuQ=", + created_at: ISODate("2025-10-02T23:11:41Z"), + }, + { + _id: "trk-186e11012a611ae837d02d84", + name: "eloquent_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "FpyhfLIqw3aNKpj92kh9fqtz7V8os4gcBnUkon4NhMc=", + created_at: ISODate("2025-10-05T13:47:41Z"), + }, + { + _id: "trk-186e11012a612e3424e7f252", + name: "eloquent_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "dbFscVYmKeQXtbevJl2NaSCC05aecEO0ERqmCzy/vh8=", + created_at: ISODate("2025-10-12T14:51:41Z"), + }, + { + _id: "trk-186e11012a614244a9f7ad63", + name: "eager_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "MCfkq7yy3jSxqVD7foTf2AyApWXuEsSvxRtK1viEqg4=", + created_at: ISODate("2025-10-05T22:56:41Z"), + }, + { + _id: "trk-186e11012a6156ad70dbb8a5", + name: "upbeat_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "yFKv3ZRd0K0RIU/U4cRQRJ3NgTIDUDqyes4nBvc1tw0=", + created_at: ISODate("2025-09-25T09:30:41Z"), + }, + { + _id: "trk-186e11012a616ad6c72ceb10", + name: "energetic_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "AKo95ylXOqXlEeFx50EAe0LmXlLpv9AQ4Tj8eSs23rw=", + created_at: ISODate("2025-09-24T10:40:41Z"), + }, + { + _id: "trk-186e11012a617e4c3b7c0314", + name: "thirsty_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "pIhsQZ0pLeBgUlN83JnyiyRaUDe3Hd8MO6+PE82K2r8=", + created_at: ISODate("2025-10-03T02:28:41Z"), + }, + { + _id: "trk-186e11012a61a0c003e59de7", + name: "jaunty_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "X0J4Sjvyr4wvcx8ycuehCIJo3Lzhll9Ra7SuN3av/7k=", + created_at: ISODate("2025-09-15T01:27:41Z"), + }, + { + _id: "trk-186e11012a61e53f8f9d9afa", + name: "frosty_curie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "+e56TLqJbgbLjvCzKEUYWMKoxEj8bxR/rIl/uo52lGA=", + created_at: ISODate("2025-10-03T14:14:41Z"), + }, + { + _id: "trk-186e11012a61f975f08a6968", + name: "confident_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "DwsZb+mxVf2zfcO3BppyRDKum6jrOwEd0L5QZbQ1Dqo=", + created_at: ISODate("2025-10-11T04:13:41Z"), + }, + { + _id: "trk-186e11012a620da465a07444", + name: "xenodochial_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "WvrUfkbDS9F4ls35iTZLBPr7HYCCpHrAyQlIEZBxy9k=", + created_at: ISODate("2025-09-29T03:14:41Z"), + }, + { + _id: "trk-186e11012a6221372c49d336", + name: "amazing_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "mQYmIvXJbzbkuNOqJOnZuu8Kx1901BNeU1YgeB2NYIg=", + created_at: ISODate("2025-10-09T15:00:41Z"), + }, + { + _id: "trk-186e11012a623cc2f71b8aa6", + name: "puzzled_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Dv+emuCZKoZRsiOrnQrUEq4NO58l3Yb11/09cjVMyyc=", + created_at: ISODate("2025-09-17T07:44:41Z"), + }, + { + _id: "trk-186e11012a625185a495eaae", + name: "flamboyant_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XaVo9DLAYQrrs+LtTXtrAZBwCvkOms3Ldgx+os3gXWA=", + created_at: ISODate("2025-09-18T12:19:41Z"), + }, + { + _id: "trk-186e11012a62658c881b9e94", + name: "exotic_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gbXGqzXlvoAraIZsIhJPe+6ew8YKDINoXZxmzPOUYZs=", + created_at: ISODate("2025-09-14T04:53:41Z"), + }, + { + _id: "trk-186e11012a62792845ddb105", + name: "peaceful_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "JAoVdd3tl8pt112u3AXdNipRltkELT5rNyrvlCQsicI=", + created_at: ISODate("2025-09-16T11:24:41Z"), + }, + { + _id: "trk-186e11012a628e1ded818cc0", + name: "admiring_heisenberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "cHAo2YLBFJ+x4aK2ViC3Nnma2qA0AUN1+C2D8q92z3g=", + created_at: ISODate("2025-10-03T01:37:41Z"), + }, + { + _id: "trk-186e11012a62a3fabe73f15b", + name: "epic_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "nSFmaA3II6KyzdSHU3CivmRf3TZuTYdEi0RfYuvfq1s=", + created_at: ISODate("2025-09-28T03:48:41Z"), + }, + { + _id: "trk-186e11012a62b8eaf103143f", + name: "confident_dirac", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "zMHUy3/proqnKMPc6kjAUN2+owr6XhcrVewX89ANba4=", + created_at: ISODate("2025-10-06T09:43:41Z"), + }, + { + _id: "trk-186e11012a62cddcae8cc82e", + name: "motivated_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "JL3tUaHh8FhQzicHyWHNupHhd/LuNg7p47nHFrexJcA=", + created_at: ISODate("2025-09-24T01:39:41Z"), + }, + { + _id: "trk-186e11012a63006def7f8e13", + name: "trusting_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "DxqgjFVwM58ge+W/YkpZksJAVRpBwFPbWbGEt1+godU=", + created_at: ISODate("2025-10-08T11:28:41Z"), + }, + { + _id: "trk-186e11012a63168e19f956bd", + name: "noble_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "ofkivhvxVIHgzyJ5zqaNEbAWx1vT8QzmmGTkJw5bHEc=", + created_at: ISODate("2025-09-21T20:25:41Z"), + }, + { + _id: "trk-186e11012a632bd8e3481c80", + name: "dreamy_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "Q7TmQiaiMbQjm7VkPzDqRm/eFG8Z+jJyEXXxLfLj00M=", + created_at: ISODate("2025-10-13T13:37:41Z"), + }, + { + _id: "trk-186e11012a6341ed35364f6a", + name: "sweet_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "4FEfi7kRIfruyoU2PWlM5UDOheYCpaQYlYSUnFXrLYY=", + created_at: ISODate("2025-09-22T13:38:41Z"), + }, + { + _id: "trk-186e11012a63557184afd5cb", + name: "thoughtful_cooper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "2skB4VoUcPGktZsj+Lkkvi2SlOCVZDATFrne1YbjTqM=", + created_at: ISODate("2025-09-22T14:20:41Z"), + }, + { + _id: "trk-186e11012a636ae2fc55400f", + name: "fascinated_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "4RWNO5fsnmSZY85qtodAGJTFHotYLFKGM225nl8G29A=", + created_at: ISODate("2025-09-29T10:34:41Z"), + }, + { + _id: "trk-186e11012a637f163120a02f", + name: "phenomenal_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "aupdkGLLAlN+EzxwvJ/ls2CtM2oJW0bmpxAE0Wryug8=", + created_at: ISODate("2025-10-03T21:14:41Z"), + }, + { + _id: "trk-186e11012a63957dad4f6e84", + name: "noble_poincare", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "+S5s9+Eb0b19Xh0JwrM4TXl9HCMJxhvurdQZaEFfQMQ=", + created_at: ISODate("2025-10-13T13:52:41Z"), + }, + { + _id: "trk-186e11012a63a9b488c66966", + name: "naughty_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "luZOlyueEBLvwHm/GGRaLO89GmcucBCuhb4FrOnnt2s=", + created_at: ISODate("2025-09-21T06:33:41Z"), + }, + { + _id: "trk-186e11012a63bdb21339d43d", + name: "polite_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "I62eYTPe2zoU7qyJXJl2Ho1XDj6779SQu+VZzXytdJU=", + created_at: ISODate("2025-09-21T08:37:41Z"), + }, + { + _id: "trk-186e11012a63d3872a73d928", + name: "fearless_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "9jLZgoYP4hmYmWGAEp8zYOv298Wdl5fZdorRjwP8g4w=", + created_at: ISODate("2025-09-30T20:00:41Z"), + }, + { + _id: "trk-186e11012a63fc2dae48253e", + name: "agitated_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "OOSseKFuzABIgwN77wUsojp9BfDEmYJx2OVtIXlohPc=", + created_at: ISODate("2025-09-19T00:41:41Z"), + }, + { + _id: "trk-186e11012a6419cd9adf15d4", + name: "merry_ohm", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "OP+bTdgDMNI2Jj2OUlx6WNvoXEHwQS4SOgGs+jE9HQM=", + created_at: ISODate("2025-09-22T21:45:41Z"), + }, + { + _id: "trk-186e11012a6445e9542ceb3d", + name: "enchanting_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "q/HPagRlkUhkpHpenzzpWVYfZIkgkUGlLygjURoNw/A=", + created_at: ISODate("2025-09-23T19:43:41Z"), + }, + { + _id: "trk-186e11012a64e64acb34fde0", + name: "goofy_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "64ZojcN40nrftTyUp9n/iZWlj4OEpy1AKBC2jCdvR3I=", + created_at: ISODate("2025-09-21T18:52:41Z"), + }, + { + _id: "trk-186e11012a6562f1d5a6bf8e", + name: "faithful_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "NEkkzMX74+vm7O2T57Nj4J7qh+nn8L6q1T3ccAtzCgY=", + created_at: ISODate("2025-10-12T10:39:41Z"), + }, + { + _id: "trk-186e11012a657978bd955932", + name: "fascinated_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Xc3SVOXn4ldKwBxQ7PvyNR2EVweLC3107RrfVnlyqxQ=", + created_at: ISODate("2025-10-05T03:12:41Z"), + }, + { + _id: "trk-186e11012a658deb1cbc74be", + name: "noble_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "UClXMnEWLA1Yo7UnDrmpZHsEfmJ36NJ2mq0gRi/kzcg=", + created_at: ISODate("2025-09-19T02:03:41Z"), + }, + { + _id: "trk-186e11012a65a28d6b20ec16", + name: "admiring_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "xP5B7YbXUDqo03XkmCMoN4HKd11IB2X0v3/PJ9D0j5A=", + created_at: ISODate("2025-10-06T14:03:41Z"), + }, + { + _id: "trk-186e11012a65b65ab4a75d16", + name: "suspicious_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "VuYBRBujCPeJuOxpOx08blAYxKbYvY8Y1ZJA3rM4A1M=", + created_at: ISODate("2025-10-07T01:33:41Z"), + }, + { + _id: "trk-186e11012a65ca7f8e2ff72d", + name: "hungry_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "0uH9j+4TMAyIhwWaPvAlFWJna4VeO5y3msirk5a1AHQ=", + created_at: ISODate("2025-10-13T05:12:41Z"), + }, + { + _id: "trk-186e11012a65de072aa6fc79", + name: "hyper_millikan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "M2V/W+wLV6FLLuRhufazGYXP/W+BPlVlQzd0RctuWu4=", + created_at: ISODate("2025-09-23T13:03:41Z"), + }, + { + _id: "trk-186e11012a65f1bb5c146ab8", + name: "affectionate_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "dlukp0jdH/mAVx81Jggq/tTmh4WTocws+XItVGgNZsk=", + created_at: ISODate("2025-10-12T02:49:41Z"), + }, + { + _id: "trk-186e11012a6605f6bfc85d5a", + name: "bold_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "mBbpCjOBP7WYxjfrV1Q4Y2btmPCTN9/CMn69w6n0n74=", + created_at: ISODate("2025-10-01T22:47:41Z"), + }, + { + _id: "trk-186e11012a661a9459a61af6", + name: "sad_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "qO3bw/C4KZHq37XZC80hm2R9YjTIMpeX1+N2zqNrjes=", + created_at: ISODate("2025-09-19T18:22:41Z"), + }, + { + _id: "trk-186e11012a662e2caaacfc79", + name: "bold_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "doi0T3NH0KKQFn1B+VeNHvs2cWkhsePu3RcDx8SsXWw=", + created_at: ISODate("2025-10-08T02:06:41Z"), + }, + { + _id: "trk-186e11012a6642fad9ad433b", + name: "noble_millikan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "WfHngSuEcKKpJYPm3OZzpyy9wdlPoIeY37f3LZyC3U0=", + created_at: ISODate("2025-09-21T08:03:41Z"), + }, + { + _id: "trk-186e11012a6656542d3d3df5", + name: "brave_darwin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "PZMa4LTYOCnbubNuPpBy20SdPCWPKLUbwYQrMRMmSQ4=", + created_at: ISODate("2025-10-12T19:49:41Z"), + }, + { + _id: "trk-186e11012a667f0f999e1788", + name: "objective_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "DSAkYqCzbuUC/IKdYB57958uVdw6xJeh+Udq81Ca7wc=", + created_at: ISODate("2025-09-15T11:31:41Z"), + }, + { + _id: "trk-186e11012a669f7c7a33a3d8", + name: "gifted_edison", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "6X4dOBZb3FIU49NpN3/rIHZAIOAIuByFDG9ZIzzJWig=", + created_at: ISODate("2025-10-06T07:54:41Z"), + }, + { + _id: "trk-186e11012a66c666bee85163", + name: "magnificent_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "217RGR3iUaLIAunipv/M9vUDOSFXoeU+EBV9JVMaoTw=", + created_at: ISODate("2025-10-07T12:07:41Z"), + }, + { + _id: "trk-186e11012a66dad625d30e99", + name: "cool_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "YdQcELI6H7m1non4OGLuEY3q/k0897BelN6ipTyY+Zs=", + created_at: ISODate("2025-10-07T03:51:41Z"), + }, + { + _id: "trk-186e11012a66ef33204f6ab2", + name: "cranky_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ZoW+dJ5hauh/GgX9X8LHQeyYsQiC9JA4MHcilzB7nHY=", + created_at: ISODate("2025-09-23T08:00:41Z"), + }, + { + _id: "trk-186e11012a670a7c965ce39e", + name: "hopeful_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "QEbUtqBt9DKtIKXPCtBColR21KG+/IaGvCX2b5fIX4Q=", + created_at: ISODate("2025-09-29T06:52:41Z"), + }, + { + _id: "trk-186e11012a6724c551a0e03d", + name: "elastic_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "7wQz6sa46OhYPTVHd3hi/J+9IQkzyP75RHHzcb6jVhg=", + created_at: ISODate("2025-09-27T17:24:41Z"), + }, + { + _id: "trk-186e11012a673a41f95f6110", + name: "fascinated_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "tY0ax0s6/Me3StBIBA6WtZeYEqY4xhu92+cztJQT2Gk=", + created_at: ISODate("2025-09-19T20:13:41Z"), + }, + { + _id: "trk-186e11012a674d8c49e9f91c", + name: "sharp_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "cu0LhNwYjNhjhtE/iz8dEChXyK7xLD2K/+ARgWLPKi4=", + created_at: ISODate("2025-10-12T05:29:41Z"), + }, + { + _id: "trk-186e11012a6760c305264774", + name: "groovy_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "00gF07p5Idgk9MC1ZBX8G2vgFCGTWn9JNn0vB1mcy38=", + created_at: ISODate("2025-09-22T21:48:41Z"), + }, + { + _id: "trk-186e11012a677ead8f9d2983", + name: "intelligent_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hlU+G1cSuNlV6AQaPR8otssCa3z2x8ajOe2a7/G0gGM=", + created_at: ISODate("2025-09-16T14:08:41Z"), + }, + { + _id: "trk-186e11012a6792a56e8f9da9", + name: "proud_higgs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "0j2xg1Dz4wSx9JmrPCzXxBafstNKIJGn3rbP+zI3gyA=", + created_at: ISODate("2025-09-25T05:40:41Z"), + }, + { + _id: "trk-186e11012a67a641ea4feb26", + name: "amazing_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "SWM2yiSrJeEREx3ug5kSKizRaawH+wO25UoxZPoBwmY=", + created_at: ISODate("2025-09-26T09:28:41Z"), + }, + { + _id: "trk-186e11012a67bac8eedf29e7", + name: "pedantic_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "NLVwZmEa2OL6Z4pqkx0vnA7dXL/fXjuVPIEHUDmq5uI=", + created_at: ISODate("2025-09-15T06:26:41Z"), + }, + { + _id: "trk-186e11012a67cdedf1345929", + name: "hyper_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ZyuDt9mXILdg0RunC1pVVUp2AIqk8VNTDFQMRUwgkHg=", + created_at: ISODate("2025-09-28T04:45:41Z"), + }, + { + _id: "trk-186e11012a67eb89cd8566db", + name: "graceful_marconi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "SqeCBkngmr/ehE77ixnv7qHCYZzveMhTu9CwVbQJYNQ=", + created_at: ISODate("2025-10-11T13:27:41Z"), + }, + { + _id: "trk-186e11012a6800ec7f035d74", + name: "magnificent_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "gtaxlYl/+suWErJ7afCt8ATYhAuLSjlx2yvrhC5z0lQ=", + created_at: ISODate("2025-09-24T06:16:41Z"), + }, + { + _id: "trk-186e11012a681436cb176368", + name: "inventive_knuth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "SRpylP5ew5T5/gTc79UHHuN1pwQ6lvfOD8Wphlgprio=", + created_at: ISODate("2025-10-09T12:50:41Z"), + }, + { + _id: "trk-186e11012a6827f1305b747a", + name: "heartwarming_edison", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ZydjOjg0DNTrLegVuZNo3Sn8M1islQZvaT6Zcz8QpLw=", + created_at: ISODate("2025-10-08T10:07:41Z"), + }, + { + _id: "trk-186e11012a683c40c8614731", + name: "thirsty_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "SxZYpfmJKzIPrm87SNVnJ00GpHuOWrcIcw9OJAavBDI=", + created_at: ISODate("2025-09-18T23:04:41Z"), + }, + { + _id: "trk-186e11012a68503e7753741f", + name: "noble_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "g40bfbGnOLmkUhx1i+gx+Y6yzYadiO5yN+cJTufO+JQ=", + created_at: ISODate("2025-10-11T23:20:41Z"), + }, + { + _id: "trk-186e11012a687194b5861e81", + name: "mystifying_kelvin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "PptUjRBMZNacloj83BxlkSDjB2Z6gFk9CSA8gkhldDg=", + created_at: ISODate("2025-10-06T12:02:41Z"), + }, + { + _id: "trk-186e11012a68860d931d5095", + name: "nervous_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "lLAwgfhWZbjkr9VcYPZb0YsZtakY7oGbJcqQK4Uunm0=", + created_at: ISODate("2025-10-07T07:21:41Z"), + }, + { + _id: "trk-186e11012a68997c808f8465", + name: "sleepy_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "voc+y+JNdqp6lX48qNmcu59Lsq6a+uVXJCxct2xRNxk=", + created_at: ISODate("2025-10-01T04:23:41Z"), + }, + { + _id: "trk-186e11012a68ad23b4a73c5a", + name: "jaunty_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "occWle60rL4/Q1k5ZC1YZNFidtrXN1qPpOOQoHJI+0M=", + created_at: ISODate("2025-09-24T13:06:41Z"), + }, + { + _id: "trk-186e11012a68c1d3f71ded27", + name: "lucid_galileo", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "DZ1ZHv14wz04AcnlFCgHXUqY0wn2Smxd+AUD67eHDT8=", + created_at: ISODate("2025-09-22T20:28:41Z"), + }, + { + _id: "trk-186e11012a68d5dc0fbcdc78", + name: "angry_turing", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "yijSK7kAlrVHEkiArf2WHufse4mGsMgyn2zKQmtaFX8=", + created_at: ISODate("2025-09-18T10:02:41Z"), + }, + { + _id: "trk-186e11012a68f3408129aa93", + name: "fervent_torvalds", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "4hYuvxP0lN5zV1E8SYsJdO0CSXHb2LhCUVjfAOcV1uk=", + created_at: ISODate("2025-09-21T10:54:41Z"), + }, + { + _id: "trk-186e11012a69083580f37301", + name: "nostalgic_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "DSP/IOrE5ULpd3X+i8y+++pq+EHjO2CtR/KN+93Cfu4=", + created_at: ISODate("2025-09-15T07:02:41Z"), + }, + { + _id: "trk-186e11012a6923b5915a988a", + name: "motivated_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "eH71/s+dQvQ1xJJL6bLsr4YLpgvhMWpZNkl4XTuhzdY=", + created_at: ISODate("2025-09-27T11:34:41Z"), + }, + { + _id: "trk-186e11012a693761f330d104", + name: "proud_faraday", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "8KlDOWge0E5h6k+nVbYB0aYctn/NPc2Yp8qsgHvYFC4=", + created_at: ISODate("2025-09-21T19:56:41Z"), + }, + { + _id: "trk-186e11012a694ba40a1e8528", + name: "intelligent_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "egi3qn6qf20/lF+9wA1XlNr9R7UdH1w2tnW/BP1DOD8=", + created_at: ISODate("2025-10-08T00:26:41Z"), + }, + { + _id: "trk-186e11012a695fa93dc370cd", + name: "patient_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "C/SrLZcsde5zi+3jVX/1CXO0fyHfFL/LagnN71XM7vM=", + created_at: ISODate("2025-09-29T23:38:41Z"), + }, + { + _id: "trk-186e11012a6973a81a95f137", + name: "eloquent_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "j1t3bLVhGQXReRYX36ydg+8L3dmadL9oOMc9xaEDdqc=", + created_at: ISODate("2025-09-15T11:22:41Z"), + }, + { + _id: "trk-186e11012a6989075fb19370", + name: "eager_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "QP9cWjfrVAUTlexCgC2EQUZfb+jmVMRFlbcQsU0ULD0=", + created_at: ISODate("2025-09-27T00:58:41Z"), + }, + { + _id: "trk-186e11012a699c62e5346db9", + name: "ecstatic_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "dQcTJ19qSW/+XDlTdwlTzogBMQU7qKeGRScV1SV7xgU=", + created_at: ISODate("2025-09-13T20:05:41Z"), + }, + { + _id: "trk-186e11012a69afb578bfa279", + name: "naughty_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "2MHbKiaRPN0ir35fiIReoNXE4WSK5xtPhgGEQR9N/XU=", + created_at: ISODate("2025-09-26T18:35:41Z"), + }, + { + _id: "trk-186e11012a69c43a870114f4", + name: "objective_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Nj+3MmYrI0qejPktZkaTnW0cj2fxQVtwQr7n6xiiDms=", + created_at: ISODate("2025-09-24T16:11:41Z"), + }, + { + _id: "trk-186e11012a69d76c1d58cb5a", + name: "phenomenal_church", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "1TYnKVXTOmyZcd2ZATl7vQKmaZctz8BaE2eQUqiombA=", + created_at: ISODate("2025-10-11T20:40:41Z"), + }, + { + _id: "trk-186e11012a69eb366151d454", + name: "eloquent_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "bogfw5axRNHuqhcZokzzEiOoMQcNfFDJQ+L2lIK8ayY=", + created_at: ISODate("2025-10-03T08:59:41Z"), + }, + { + _id: "trk-186e11012a69ff9ce3bb7579", + name: "hardcore_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "dVgfqWA9h+R0tl3KTyeSGyZ+lWCVptMkmzJp6ECtVXo=", + created_at: ISODate("2025-09-23T17:16:41Z"), + }, + { + _id: "trk-186e11012a6a12cf3be6398b", + name: "calm_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "U0pVdwvHtqXH2Mx3kdqFLImQnbwURMVG/jWXPqW+Ugw=", + created_at: ISODate("2025-10-02T11:22:41Z"), + }, + { + _id: "trk-186e11012a6a26d34c04e401", + name: "faithful_watson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "FCXiT34AwIloVsGogUfNa5Y20a0W7pC/lB24FCpXZNk=", + created_at: ISODate("2025-09-16T13:27:41Z"), + }, + { + _id: "trk-186e11012a6a4fc90c6da34c", + name: "practical_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "OCJwY7fmiHWPQ8a93DY349D0YQV+N3Mkd2TMNT5PDt0=", + created_at: ISODate("2025-09-27T22:12:41Z"), + }, + { + _id: "trk-186e11012a6a6ddd9371f4e1", + name: "jolly_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "zh3fLp0siFfTJx6a5KZaHGOgXQqXDQJNfJ2PNj58HJc=", + created_at: ISODate("2025-10-09T13:14:41Z"), + }, + { + _id: "trk-186e11012a6a8e1d7645a2cc", + name: "iron_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "juSPU5T2XW/KKo/kgn3uf6XkkQ9kDR495szH8DZKP6I=", + created_at: ISODate("2025-09-16T21:33:41Z"), + }, + { + _id: "trk-186e11012a6aa3491ef34d6b", + name: "hungry_wu", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "aHj3TaU2sHN/CZGs7paLUWfnd2PJDk0KZfEtjYSnV6M=", + created_at: ISODate("2025-09-20T15:19:41Z"), + }, + { + _id: "trk-186e11012a6ab6ce0dbd137a", + name: "iron_ramanujan", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XUB14u2ASGNYRp4x6GjSXL6P3iDzsEDJp5EYOrlNs7s=", + created_at: ISODate("2025-10-06T05:56:41Z"), + }, + { + _id: "trk-186e11012a6ad190d5f26f5e", + name: "boring_bardeen", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "iohPqYUWmNIM4chluUswul7SDQFnWsHWVbbzYX6Re6o=", + created_at: ISODate("2025-09-28T13:31:41Z"), + }, + { + _id: "trk-186e11012a6ae7df80bb26ac", + name: "laughing_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "K2XZ26AlCgHNAspK3zvk++/3xKDrWgtSSnF8+AOx0Qs=", + created_at: ISODate("2025-09-21T01:21:41Z"), + }, + { + _id: "trk-186e11012a6afd012573444f", + name: "cool_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "9gj00S3hIZZYYv5J0zDa7Ns4y0YsR3Gj6dIygOsKNFA=", + created_at: ISODate("2025-10-09T22:17:41Z"), + }, + { + _id: "trk-186e11012a6b11e2eea6ad28", + name: "amazing_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "BfxlKuJBjUKOLQwuwmIf+FJVmW3lFXLIy+FNl3r16ZI=", + created_at: ISODate("2025-10-02T07:37:41Z"), + }, + { + _id: "trk-186e11012a6b2618fb757329", + name: "gifted_galois", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "OuR5j02z+qXlcppxPdmPXhv7Kp4RuOWTfhKDM6UHVBM=", + created_at: ISODate("2025-09-27T12:50:41Z"), + }, + { + _id: "trk-186e11012a6b394bebadc1e6", + name: "magnificent_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "2As5cpb4ZprXazamVQTYm9zZhy+Q0zX2Lj9SkIkhInY=", + created_at: ISODate("2025-10-02T20:26:41Z"), + }, + { + _id: "trk-186e11012a6b4c6979266ad6", + name: "competent_wiener", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "W9PKV8At5L3ylkfdQpuqpPF3JJOGQ049qgX4g7nd5ts=", + created_at: ISODate("2025-10-04T18:36:41Z"), + }, + { + _id: "trk-186e11012a6b6160671c0d6c", + name: "adoring_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "InblIn+VqVZmJ+a/q2JxFnVpRzgK3qb+alNsE5yf7u4=", + created_at: ISODate("2025-10-01T02:17:41Z"), + }, + { + _id: "trk-186e11012a6b7596da904a86", + name: "zealous_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "QgJmhzs1pPm4C2QjlnqXUDwMuZppTBi2snmjbaWoEvA=", + created_at: ISODate("2025-10-01T11:39:41Z"), + }, + { + _id: "trk-186e11012a6b91e714711be0", + name: "condescending_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Bn+Dx6FWWuu8kT+8R0Radz1cBsk7JoS1fH4eMpOwrZA=", + created_at: ISODate("2025-09-16T22:07:41Z"), + }, + { + _id: "trk-186e11012a6ba6d028cde8bb", + name: "groovy_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "TePeppWG5GrNuh3beskSMFSTcdJBeF9ynGBxfYtb4XI=", + created_at: ISODate("2025-09-22T10:31:41Z"), + }, + { + _id: "trk-186e11012a6bbb009d699414", + name: "distracted_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "TRbTIZ8UCGBO5/2qXuF2yEQJkz+qJHlzNXM/J7nQGDI=", + created_at: ISODate("2025-09-22T12:40:41Z"), + }, + { + _id: "trk-186e11012a6bce3eb8cdd023", + name: "boring_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "jlXx2lFs5DdjRy0krxykZbO2Fr94IGE0Ern3n5z3R7A=", + created_at: ISODate("2025-09-24T04:43:41Z"), + }, + { + _id: "trk-186e11012a6be2728b0de5f1", + name: "quizzical_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "dlFY1T4NYuyQuEeedZ1IdEsnqnUldf+AFCUVJfgopdI=", + created_at: ISODate("2025-10-04T19:56:41Z"), + }, + { + _id: "trk-186e11012a6bf5e949a6578d", + name: "thrilled_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "3AtFcMkrZ4wqFIQkgpE0svSJ6ZWeEv0U/IpAOdLH31s=", + created_at: ISODate("2025-09-16T13:41:41Z"), + }, + { + _id: "trk-186e11012a6c261e6e410b97", + name: "gifted_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "mCocNj0D/NXQlQShXi2dcvGDBy7QIpPGg+nakvQ3bEs=", + created_at: ISODate("2025-10-12T19:47:41Z"), + }, + { + _id: "trk-186e11012a6c3c6824d60f91", + name: "affectionate_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "TXZDLtPpK6Mau3d2WVLxrKH0EuD8BCZ1KCt/NaHU/Es=", + created_at: ISODate("2025-10-03T01:26:41Z"), + }, + { + _id: "trk-186e11012a6c5038373ca424", + name: "elegant_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "8EDKjQSUKiXXv3BUbQ7Ng91j4f/GSr7+QAIqaqKKMII=", + created_at: ISODate("2025-09-26T23:21:41Z"), + }, + { + _id: "trk-186e11012a6c63905c65aa55", + name: "gentle_darwin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "Ynce/psEdLCbWCWGioAf0HMx1MoJogKuY2J/IINSvrI=", + created_at: ISODate("2025-09-29T19:02:41Z"), + }, + { + _id: "trk-186e11012a6c78882c93ea30", + name: "curious_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Wi4UYso0KKCSWpEsWXWhwtehcDXOdFaRFWJccD35X34=", + created_at: ISODate("2025-09-22T01:47:41Z"), + }, + { + _id: "trk-186e11012a6c8d0b88d582b1", + name: "groovy_poincare", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "C9UUSbi10tePQNX8CV9S878FAZepKSHW20mstzqcEl4=", + created_at: ISODate("2025-10-06T10:26:41Z"), + }, + { + _id: "trk-186e11012a6ca08e30bd58f3", + name: "eloquent_oppenheimer", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "ckphAdHxUOhQalPf/Alkhrlpn7LdWuIxEU8OM166IPw=", + created_at: ISODate("2025-09-21T06:30:41Z"), + }, + { + _id: "trk-186e11012a6cb4ea3bd9ddc8", + name: "inventive_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "Nk5bQv/tQLsoZ9sLhMxT7x8ACDjvKCA1HM2kNLDq2gA=", + created_at: ISODate("2025-09-27T12:10:41Z"), + }, + { + _id: "trk-186e11012a6cd94db91adead", + name: "kind_einstein", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "oSIz2hlKwllgzLLWEqJiHAvZniIPqIzT7LrB5OpceHY=", + created_at: ISODate("2025-10-04T13:01:41Z"), + }, + { + _id: "trk-186e11012a6cedcd79e9453b", + name: "modest_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "qFydjWVyh4o6yZpaPJ+IyZDayBFD5kMSwUuz5AyDFzc=", + created_at: ISODate("2025-10-09T12:27:41Z"), + }, + { + _id: "trk-186e11012a6d027b8a123406", + name: "magnificent_faraday", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "LPcO0cx0s2Uka6nphi9sMBXu3xkSslMYIGQYsXUrv2g=", + created_at: ISODate("2025-09-28T02:23:41Z"), + }, ]); From 29776646bde582c215b1e0e1a20291c18da9d618 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 16:06:24 +0200 Subject: [PATCH 040/242] 200 devs --- mongo/init.js | 1648 +++++------------- services/playbooks/roles/mongo/files/init.js | 1648 +++++------------- utils/gen_mongo_dev/main.go | 2 +- 3 files changed, 849 insertions(+), 2449 deletions(-) diff --git a/mongo/init.js b/mongo/init.js index f1291528..f8abe2d4 100644 --- a/mongo/init.js +++ b/mongo/init.js @@ -51,7 +51,6 @@ db.users.insertMany([ expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), }, ]); - db.devices.insertMany([ { _id: "trk-18608d12c8414acfcb9165b1", @@ -853,1604 +852,805 @@ db.devices.insertMany([ private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, + { - _id: "trk-186e11012a5561d480d2e2eb", - name: "fervent_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "kqtwRUbhMyVd17VSGcNacCgknCqXG/nbTZ0TpdkHuG0=", - created_at: ISODate("2025-10-02T06:02:41Z"), - }, - { - _id: "trk-186e11012a596d43fd69108e", - name: "mystifying_riemann", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "kgpHr5wgALwkGS3rZ++yHMFJVyQyM7PtocptH7xWA8s=", - created_at: ISODate("2025-10-07T20:48:41Z"), - }, - { - _id: "trk-186e11012a598ad93ff98c88", - name: "fabulous_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "qPL22InLNt+qxCMYNI9IbWqUnFX6XMlldzxiwEeIGew=", - created_at: ISODate("2025-10-02T22:25:41Z"), - }, - { - _id: "trk-186e11012a59b19903d892f0", - name: "sweet_ramanujan", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "cFe3cCf75MF+sDHwumwNz/8AarbzIZ8gCjI4K2kzYOY=", - created_at: ISODate("2025-10-11T14:40:41Z"), - }, - { - _id: "trk-186e11012a59cb26e0075b2a", - name: "distracted_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "O5pJz4gxI9odDLTT1yPIZBm6Twnr4C8IGkDt7zoKxho=", - created_at: ISODate("2025-10-08T20:34:41Z"), - }, - { - _id: "trk-186e11012a59e3d14be606df", - name: "proud_weber", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "T4T4gHgXrdMXUd7J1lyDO+f62DcmrAbUUA9qOxc7Uvw=", - created_at: ISODate("2025-09-22T03:41:41Z"), - }, - { - _id: "trk-186e11012a59fa7cd3c6dce1", - name: "hyper_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "AY7Rf9qa1Ly/e6kF10FKT570Bg/qlFAKP7bsMUgb9rg=", - created_at: ISODate("2025-10-13T11:43:41Z"), - }, - { - _id: "trk-186e11012a5a13d3a9db4772", - name: "groovy_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "wv7hUUOS/l5gPcyEyWtqIWfL1B9l+6TOUDaXR1VpqCc=", - created_at: ISODate("2025-09-23T22:15:41Z"), - }, - { - _id: "trk-186e11012a5a2d27c9191da5", - name: "great_cooper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "w3E6srVzISB3/6RwJLThuqXCIuB/mwVUnb1+jjq0tGc=", - created_at: ISODate("2025-09-17T05:12:41Z"), - }, - { - _id: "trk-186e11012a5a4494864fe415", - name: "goofy_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "RD0xX5dLEAtLQqoFSwNI6sXRFt8uXbvBF/kqUb8fWKs=", - created_at: ISODate("2025-10-01T18:21:41Z"), - }, - { - _id: "trk-186e11012a5a5a58df5eaad8", - name: "cranky_tesla", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "olYsIof8//f0fRwqpmsB/oSBGhxAgUd6SDALBkLkEfA=", - created_at: ISODate("2025-09-27T16:56:41Z"), - }, - { - _id: "trk-186e11012a5a6f0b11c08ea9", - name: "optimized_hertz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "/im+6GYjhW6G/az/9KVzuhYzypbLSgxm2feoKBAUVWo=", - created_at: ISODate("2025-10-03T17:42:41Z"), - }, - { - _id: "trk-186e11012a5a8326235064aa", - name: "funny_ampere", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ps9v0p2pfDjjNlIkqZijXseLsZ7I34N1l6w8ss9Gbjo=", - created_at: ISODate("2025-09-20T16:23:41Z"), - }, - { - _id: "trk-186e11012a5a98929c44b902", - name: "phenomenal_schwinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iqgX85qTfX4Xy5rDlMuuw6y+EmGy1qcdLBz+VGr3PtY=", - created_at: ISODate("2025-09-18T23:10:41Z"), - }, - { - _id: "trk-186e11012a5ace77b59f96f0", - name: "inspiring_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "OKkXfWT+lPo+CFBU71O10ahMByiZEteZpBD+ti6q7oI=", - created_at: ISODate("2025-09-28T16:35:41Z"), - }, - { - _id: "trk-186e11012a5ae586a58fdddf", - name: "motivated_ampere", + _id: "trk-186e120746e18c690d2440c6", + name: "busy_torvalds", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "RVbNIWA0ApYY6MJeib+ONiu8s0hKj8rmlOh/bpnk9os=", - created_at: ISODate("2025-09-27T01:17:41Z"), + private_key: "zlaKfT1zfiGUFjuxVy2BuM9SqDVikurwVXUEmjbeuX0=", + created_at: ISODate("2025-09-26T01:56:26Z"), }, { - _id: "trk-186e11012a5afb592361434c", - name: "nervous_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "ZTduEIFal2ZpIn5lUXO3sYyGgbYKUIwDL6QsiOd5OPw=", - created_at: ISODate("2025-09-26T09:06:41Z"), - }, - { - _id: "trk-186e11012a5b0fbc6d8d33d3", - name: "thirsty_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iLa6/opdNyQaQQBu7hidLlvX6pe1vcomQsgxeP4XfzM=", - created_at: ISODate("2025-09-27T22:01:41Z"), - }, - { - _id: "trk-186e11012a5b23c2f89bddba", - name: "quirky_dedekind", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "soINuZ+4XhQ1HuxX/6WwunLQ2X7on/e0uotjk99sSNU=", - created_at: ISODate("2025-09-29T05:28:41Z"), - }, - { - _id: "trk-186e11012a5b38c33d43a45e", - name: "pious_stallman", + _id: "trk-186e120746e5100364a0d88c", + name: "kind_galvani", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "XXLyX9ffOpj1eI2RIUSjry6b/Rzis15TzinrvmoKoKk=", - created_at: ISODate("2025-10-02T06:37:41Z"), + private_key: "HaEBIVX8wM6DzAJe5H/efqhCLc+y/4Z0tk3qgN5G/KE=", + created_at: ISODate("2025-10-04T02:03:26Z"), }, { - _id: "trk-186e11012a5b4cd44a3a45cf", - name: "sweet_watson", + _id: "trk-186e120746e53a7f8b9db50a", + name: "vibrant_abel", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "jFq96uYH10c+0GshcwZjgkaUHrwOlMjxxUg+xF4LmWg=", - created_at: ISODate("2025-10-02T13:16:41Z"), - }, - { - _id: "trk-186e11012a5b6332148cd018", - name: "admiring_turing", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "XcBe4uqZBIDo/I2SjAImJfBrsNk5N5atDrnrBEYlcqE=", - created_at: ISODate("2025-09-20T10:04:41Z"), + private_key: "U9zhxIXPRmXASGaAW2rJ/MHIDQAhlc8/kO4bS/9V8wU=", + created_at: ISODate("2025-09-17T17:58:26Z"), }, { - _id: "trk-186e11012a5b787f126d15f1", - name: "practical_hardy", + _id: "trk-186e120746e5561da2248999", + name: "beautiful_lee", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "TuHP/ofEOd/2slfenIJ2+66Pg5zgH9Dx8zrmUMpiwYQ=", - created_at: ISODate("2025-09-22T21:16:41Z"), + private_key: "PSGrRaqjl2pJybbEnj17F31N/AncTgx7n1A+32GGzgU=", + created_at: ISODate("2025-10-10T15:37:26Z"), }, { - _id: "trk-186e11012a5b99983857d7f5", - name: "compassionate_morley", + _id: "trk-186e120746e571646ff6b00c", + name: "agitated_penrose", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "04IdX2PAwIbnedM7AXRjXOVS8zMataBOSLI7TLW+sJU=", - created_at: ISODate("2025-10-09T21:19:41Z"), + private_key: "/jxYt11fVWtx9+OLZcmO0664Lshxu+L9+Er2/DB5j8I=", + created_at: ISODate("2025-09-15T22:14:26Z"), }, { - _id: "trk-186e11012a5bae42c3d6ccfc", - name: "enchanting_lagrange", + _id: "trk-186e120746e592b6ef437676", + name: "serene_knuth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "jWiaC8MyTsXV7n9K8UswTxuDiTJVEIndjeVBj4wu4WE=", - created_at: ISODate("2025-09-29T10:41:41Z"), + private_key: "TBkHjWmYDA0m2prmSZqqk7wKO3FMAjNfNcwLbamTl14=", + created_at: ISODate("2025-09-18T02:02:26Z"), }, { - _id: "trk-186e11012a5bc46607105b2a", - name: "elated_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "6JHQq/8pK9dyk6FjNo1CJbE8fsysTpVn2qmKtzys390=", - created_at: ISODate("2025-10-09T17:09:41Z"), - }, - { - _id: "trk-186e11012a5bd9cfb0f5b31d", - name: "jolly_fermi", + _id: "trk-186e120746e5b57fe57e549f", + name: "boring_crick", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "+hoDuiVnwHeNSQ5DzwzkgiMxGMKmOE2ni/mX6UfTXhY=", - created_at: ISODate("2025-10-06T04:04:41Z"), + private_key: "r5PJU83UZ0IsuJuMgFEZJy41dymcmoOCTVTGNe+fYp4=", + created_at: ISODate("2025-09-16T16:44:26Z"), }, { - _id: "trk-186e11012a5bed6777eda1c8", - name: "elated_stallman", + _id: "trk-186e120746e5d2cfd3ad47f8", + name: "proud_curie", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "B6a9x6vz+tkuC+S2OQzxuJCv/MAGViKAPMjokDzYZhU=", - created_at: ISODate("2025-10-09T01:10:41Z"), + private_key: "rwrEdWc3CovyYsAYXvhIojm2vM7RQf7R4waNRm7rZDQ=", + created_at: ISODate("2025-09-18T01:04:26Z"), }, { - _id: "trk-186e11012a5c1ccccb9b0a4e", - name: "gifted_noether", + _id: "trk-186e120746e5f3b0e0bd40a6", + name: "epic_hopper", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "mjsPzOv/5a+iF09A8svypYFonKHJCZuQWTOjzWLyhbc=", - created_at: ISODate("2025-10-03T05:26:41Z"), + device_type: "food", + private_key: "NH0AzwhXWUdFM8m6r6FVT+2C2f9KsD++CHWAqRsrCIg=", + created_at: ISODate("2025-09-25T17:10:26Z"), }, { - _id: "trk-186e11012a5c4401a63b0f3c", - name: "confident_thompson", + _id: "trk-186e120746e61249f492cc92", + name: "fervent_ritchie", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "lS2fQ0b5IPEvW0EClWkOxPbRrWl45bp1EZe0psee2pc=", - created_at: ISODate("2025-09-17T06:55:41Z"), + private_key: "IpaYNNClPfrs776+wldgliZ/UenF/fN5qlY6R+R99kA=", + created_at: ISODate("2025-09-26T00:33:26Z"), }, { - _id: "trk-186e11012a5c59dd750d2c06", - name: "fascinated_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "h5di5PLrxdJirC1m7RDe61/DqOgoSfJ6XiELleXZKjE=", - created_at: ISODate("2025-09-21T10:00:41Z"), - }, - { - _id: "trk-186e11012a5c6ee1af951199", - name: "keen_jobs", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iUvf42OIcqd1e5Nbemgjy/vLfAwaZERGyd2TAgbX61c=", - created_at: ISODate("2025-09-19T06:23:41Z"), - }, - { - _id: "trk-186e11012a5c830dd37874fe", - name: "goofy_curie", + _id: "trk-186e120746e62e8b1e50c009", + name: "optimistic_noether", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "MsqIwOOiR1bYD/zWIOo0HGFH4rJ/nQXKMUPHxZeA86w=", - created_at: ISODate("2025-09-18T06:06:41Z"), - }, - { - _id: "trk-186e11012a5c98b36f264650", - name: "hyper_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "4Pjt6Nz5Cggifiww9tnVOs+TA/Z4ETuw5FLqlsQ87bs=", - created_at: ISODate("2025-10-03T02:10:41Z"), - }, - { - _id: "trk-186e11012a5cad311c595ad1", - name: "determined_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "YfSXzGiI3cbp/vM2b6ke/UUkxwUhKkywqAyvmFGXPp8=", - created_at: ISODate("2025-09-15T15:21:41Z"), + private_key: "dPgcLmsJh0nU5IyAjyhyCfHij0NkswJC7aLqhGnKdE4=", + created_at: ISODate("2025-10-01T22:39:26Z"), }, { - _id: "trk-186e11012a5cc574d6d81de8", - name: "sleepy_pascal", + _id: "trk-186e120746e6498c6e55e12f", + name: "keen_ohm", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "RpSxQsx5LqFUFbbolTRrnA2C/LsiAwMoS/NbIorA0Rc=", - created_at: ISODate("2025-10-13T02:34:41Z"), - }, - { - _id: "trk-186e11012a5cd92693beffd9", - name: "tender_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "SiyPQhaSZFCUe0EwhzwEHn0ZGF+auw09D5WdkXv5JUY=", - created_at: ISODate("2025-09-13T16:36:41Z"), - }, - { - _id: "trk-186e11012a5ced9d9a7f3282", - name: "thrilled_fourier", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "z5hY1D4uamwjhBUigsuQIVYStk8LkS7IHGffvP1g+Ig=", - created_at: ISODate("2025-10-08T08:28:41Z"), + private_key: "6sBH2HqlO06ZS6qpAZ75i/0LOb5FEWXK+bbBfyTDZrU=", + created_at: ISODate("2025-09-23T09:49:26Z"), }, { - _id: "trk-186e11012a5d018136d48bad", - name: "enchanting_euler", + _id: "trk-186e120746e6a53392e5a1d6", + name: "dreamy_morse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "pr3lrF2O5U3f0Yf1DbFhdmz7g1YZ9ORKszdAOQ4n1Ek=", - created_at: ISODate("2025-09-23T02:49:41Z"), + private_key: "AdaUNQ0ddcyYZlMHzoFPFDiM+lQS9akdrF086C5uvnU=", + created_at: ISODate("2025-09-19T01:06:26Z"), }, { - _id: "trk-186e11012a5d1517f5b46305", - name: "lucid_gauss", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "FOZHubOJabF1/4rPcKbm2R/RqIACyC3tS+Pw3L9QCzI=", - created_at: ISODate("2025-09-25T15:54:41Z"), - }, - { - _id: "trk-186e11012a5d2988550c5169", - name: "admiring_torvalds", + _id: "trk-186e120746e6c07ef43e3d13", + name: "outstanding_stallman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "GkO3pzWOMm260vTOzGd/uvB6+Qh4gMrYQlObQBrJQ1k=", - created_at: ISODate("2025-09-27T13:02:41Z"), + private_key: "yVvpMOeozwtyH1gS4y8hrDO9hftYbwpzjZeVPwwYwZs=", + created_at: ISODate("2025-09-21T03:27:26Z"), }, { - _id: "trk-186e11012a5d3cf2b2ca7686", - name: "polite_heisenberg", + _id: "trk-186e120746e70513852edb0f", + name: "faithful_knuth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "wxoIImrWfV0Ni4PHBqwv4AX4HL7g+AOyRII7dYyWrZk=", - created_at: ISODate("2025-09-28T10:14:41Z"), + private_key: "8GbhtHVXcN9Yyi41F2wh/aR5Wdarq9uvYZLMoOyD8NM=", + created_at: ISODate("2025-10-09T08:08:26Z"), }, { - _id: "trk-186e11012a5d598c29d80cbd", - name: "pious_pascal", + _id: "trk-186e120746e7235b73eb8923", + name: "modest_gauss", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "pgtlmBy0mJuE+ekgqsI0DfDv/QS36Yr3Ma87avO+KOw=", - created_at: ISODate("2025-09-24T19:23:41Z"), + private_key: "NmFP6t/trYYOSAQLQgdDJhheahC7kO3kDwuwEFLqeCE=", + created_at: ISODate("2025-10-10T04:12:26Z"), }, { - _id: "trk-186e11012a5d7a7b4bf73935", - name: "quizzical_ramanujan", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "ncLNvzOa6UENXO7wLqTs+rCICEF7vJDmSZiX4ir+8Ow=", - created_at: ISODate("2025-09-14T23:15:41Z"), - }, - { - _id: "trk-186e11012a5d8ece5f7bdd8e", - name: "youthful_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "OJc1uL9AIAsjFi4Dptjh3CpPrmTUF8B6DkjskEMsjTg=", - created_at: ISODate("2025-09-16T03:07:41Z"), - }, - { - _id: "trk-186e11012a5da3cbc19a0fb8", - name: "admiring_weinberg", + _id: "trk-186e120746e74151fb9b3cf6", + name: "clever_volta", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "ISYhC21HlX9IcsYUexG5NV0yDjNTmn9lfUQvKSe+JlQ=", - created_at: ISODate("2025-10-11T17:33:41Z"), - }, - { - _id: "trk-186e11012a5db8028171234f", - name: "compassionate_fermi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "gSyfyQDT6eZsiT8tI2wzDGv5Q6g/UYxW0QWaKjLlu/0=", - created_at: ISODate("2025-09-29T02:33:41Z"), - }, - { - _id: "trk-186e11012a5dcc1a6befda29", - name: "jovial_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "eClDfBHCPZ9Kg/fLpky6AzS9O0HOz8Os6PjlnrKsSwg=", - created_at: ISODate("2025-10-01T18:59:41Z"), + private_key: "K4eXVoUnDViQyeemkL77tJ7PLSTA5LB+dLqNtd8OfH4=", + created_at: ISODate("2025-09-17T02:43:26Z"), }, { - _id: "trk-186e11012a5ddfa3062f0ff4", - name: "playful_euler", + _id: "trk-186e120746e75e602ef60dd6", + name: "determined_jacobi", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "P/K62OGL3lwTqYsRXK+OnlMehWZorMlphuQ3roNexo8=", - created_at: ISODate("2025-09-28T09:33:41Z"), + private_key: "T6f5G5JQUuSrCJ9DnXquzN4IXarA+Og67HsRUQU1eHY=", + created_at: ISODate("2025-10-13T13:50:26Z"), }, { - _id: "trk-186e11012a5df4297b52a885", - name: "original_pauling", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "UxLu9YkY6L0rP3ctdmm9Lzaye9LMCSYPNSKLWyYssMc=", - created_at: ISODate("2025-09-30T20:32:41Z"), - }, - { - _id: "trk-186e11012a5e25d0d813f27a", - name: "dreamy_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "9o3ngbgcWUGQlPEkSflgrOWTiyXLhJ0QYh49t7IqozA=", - created_at: ISODate("2025-09-26T17:36:41Z"), - }, - { - _id: "trk-186e11012a5e3b84ff471fbc", - name: "merry_salam", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "gKiNSB7OCpbcZoHozoLUAYMjMmPDNBMzc979JU+nXp8=", - created_at: ISODate("2025-09-22T13:28:41Z"), - }, - { - _id: "trk-186e11012a5e4fe06bc4b394", - name: "gifted_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "s6lWpBP1VLeSvOzO3oRe8ypkEqOtkwNaLV0UOQNCG14=", - created_at: ISODate("2025-09-20T06:28:41Z"), - }, - { - _id: "trk-186e11012a5e63602bb29a90", - name: "gifted_hopper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "Vjb7DaSJfMV3nITbX00INyTkeOVeVksoA8davwEU7kw=", - created_at: ISODate("2025-09-15T03:44:41Z"), - }, - { - _id: "trk-186e11012a5e779fee7fdd35", - name: "flamboyant_hertz", + _id: "trk-186e120746e77af4a17ef004", + name: "fervent_whitehead", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "z4QNKZrnZ4T6HCRNScL4WkSTUxhjRGTIk28IZupKHno=", - created_at: ISODate("2025-10-07T04:55:41Z"), + private_key: "+klSDF5Jvl3Cjkjr/GwKxBwusArwojYmcgURQQT6DPs=", + created_at: ISODate("2025-09-23T21:27:26Z"), }, { - _id: "trk-186e11012a5e8da24c25c62b", - name: "charming_stallman", + _id: "trk-186e120746e798d285808a70", + name: "bold_fourier", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "G37P8VjO95i4gKG8yTRCQ1UZRoh/JaaRpRNf7A2gVBw=", - created_at: ISODate("2025-09-23T16:34:41Z"), - }, - { - _id: "trk-186e11012a5ebbf1e05fc63e", - name: "fabulous_lovelace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "lsFvUa0rjoRlqjqCUXUUjSI0dE/s9DCcwx59f9pqokU=", - created_at: ISODate("2025-09-25T08:39:41Z"), + device_type: "other", + private_key: "4zwMIKqs8mtNveECyMvcFt+K7OedZ+MnOS6o42EUEWU=", + created_at: ISODate("2025-09-17T06:50:26Z"), }, { - _id: "trk-186e11012a5ee64eba1cad79", - name: "pious_compton", + _id: "trk-186e120746e7b4c678103ccf", + name: "boring_hardy", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "QiSWe4sEtEfa1SfVBNVSkoTmBjvWjAsVjk6cU8qMSsQ=", - created_at: ISODate("2025-09-16T04:17:41Z"), + private_key: "9cgnzOXmKaVWCBpvyfEC1rIo2coYrpOPrW2ZcvmHO9E=", + created_at: ISODate("2025-09-24T18:31:26Z"), }, { - _id: "trk-186e11012a5efba40cd780d6", - name: "merry_carmack", + _id: "trk-186e120746e7d271ec706172", + name: "sleepy_pauling", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "sgHilxpLlIiMOnig/XHEMha97TYevSbZGlW43f1yiJA=", - created_at: ISODate("2025-09-23T05:15:41Z"), + device_type: "other", + private_key: "2+j+X2Im01XBzllw/xpq1fq8M2TxlOos/ClmmD0Gzaw=", + created_at: ISODate("2025-10-10T06:17:26Z"), }, { - _id: "trk-186e11012a5f455a1b0ae79f", - name: "sad_berners", + _id: "trk-186e120746e7ef79f6ee0e1b", + name: "exotic_ritchie", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "tkwiKvo7W+azl1ZgLtmP6KiHbTrctOLCbqJoBVY3+Pg=", - created_at: ISODate("2025-09-27T09:48:41Z"), + private_key: "E+6m5pEZbh0VyR2hmRRe4xJ4HzGBUn3qAVxCu0jeydY=", + created_at: ISODate("2025-10-12T18:18:26Z"), }, { - _id: "trk-186e11012a5f5a92a359b79a", - name: "hopeful_kleene", + _id: "trk-186e120746e80afd0d8d37e1", + name: "beautiful_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "UZNlMvRRozvA3/by9ehRSuaORegK0JDh8hYtWSv5D5E=", - created_at: ISODate("2025-09-25T06:00:41Z"), - }, - { - _id: "trk-186e11012a5f70141806a956", - name: "heartwarming_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "Wyl507rgkRX41yNgrQfTTwagqZJiWVCchcSPf80Vr4Y=", - created_at: ISODate("2025-10-08T18:23:41Z"), - }, - { - _id: "trk-186e11012a5f83c95653663c", - name: "thrilled_bohr", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "SJUN1nvUtlSD63P6M1pNKWYGuqRnClFwySGI67lEtV8=", - created_at: ISODate("2025-10-11T19:04:41Z"), + private_key: "SMPBDRGLD9aVElnzLvrsHyRgrM4ywaxwQa+ybapdStM=", + created_at: ISODate("2025-09-24T17:20:26Z"), }, { - _id: "trk-186e11012a5fbf4095b28646", - name: "crazy_ampere", + _id: "trk-186e120746e833b3dfa6e5ff", + name: "jovial_kolmogorov", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "b7sAMnrwZm2e2JOu7cVFnmMKCIsxRmmX0CLCRvpnteI=", - created_at: ISODate("2025-09-17T06:38:41Z"), - }, - { - _id: "trk-186e11012a5fd5659402dfeb", - name: "beautiful_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "C4HJyzN27U5jNQShQqk7fnHJ0konB+TtJFIj7xs43mA=", - created_at: ISODate("2025-10-01T08:32:41Z"), - }, - { - _id: "trk-186e11012a5fe94d9f033641", - name: "busy_salam", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "GbomR1IEdZvcIsX+Dy851wwBAKv8bUNkysnlhbt9C30=", - created_at: ISODate("2025-09-19T19:45:41Z"), - }, - { - _id: "trk-186e11012a5ffd352413b530", - name: "sweet_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "aE4zj1h+9vRvYSUqtNKT2kK7tyN9T2LSjgoMGkzR0hc=", - created_at: ISODate("2025-09-18T03:51:41Z"), + device_type: "other", + private_key: "X9ZHSPIBXi5gsoXM0LO7Lsuv8LbVA8EMv/y/J8jXKMc=", + created_at: ISODate("2025-10-01T03:02:26Z"), }, { - _id: "trk-186e11012a6011b32b9939db", - name: "cranky_siemens", + _id: "trk-186e120746e851854660544e", + name: "serene_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "WkrTgRmQtbMyiFIRM7JfBCOwGzECjGGi1UiA6dBubJg=", - created_at: ISODate("2025-09-23T16:26:41Z"), - }, - { - _id: "trk-186e11012a6025cbee1dc98f", - name: "blissful_tesla", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "FAfD4UVHwonn9QY8HE3J6YRhnTqwMC/biyPPVTMhIJM=", - created_at: ISODate("2025-09-19T03:15:41Z"), - }, - { - _id: "trk-186e11012a60395b38d1954d", - name: "wonderful_bose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "0ZVm9mi4yq2YZmKogeRDlOGXu7gEnQ7cG82XHajyw7E=", - created_at: ISODate("2025-09-22T20:47:41Z"), + private_key: "L82m2B58IsoddlmF+eoMnwMpmn3VEBQiAjxGlx854CA=", + created_at: ISODate("2025-09-17T21:44:26Z"), }, { - _id: "trk-186e11012a604e0f101a26f5", - name: "keen_salam", + _id: "trk-186e120746e86e09d1953e23", + name: "blissful_leibniz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "G7IWRP6d+zX+f4t06gbwgZb/rX1w+AYdQh6jWKykaio=", - created_at: ISODate("2025-09-22T09:00:41Z"), - }, - { - _id: "trk-186e11012a606e6ca1634990", - name: "dreamy_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "Mh4A9NA3GlJStCAaNbYu63n8pvkDhpHLq2HeYximta8=", - created_at: ISODate("2025-09-21T00:51:41Z"), + private_key: "uW6S9QZqdTN9n8nROsXWugdetpdTwdD/NAgsHfVlKVQ=", + created_at: ISODate("2025-10-11T13:42:26Z"), }, { - _id: "trk-186e11012a6084b2c8b9789b", - name: "brave_markov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "YqbWAlf5lqPZZO61QKdUNMQ5PL85q3AKbgGuMNJLsrE=", - created_at: ISODate("2025-10-10T05:45:41Z"), - }, - { - _id: "trk-186e11012a609969074409b4", - name: "interesting_shockley", + _id: "trk-186e120746e88add15d6df47", + name: "clever_berners", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "X4IIHw+lyQjKqgcB69gAUJ3knVD+o8Ag0SzaDBXLfYM=", - created_at: ISODate("2025-09-25T09:28:41Z"), - }, - { - _id: "trk-186e11012a60b6113f2cd70a", - name: "practical_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "H/obZQPI2CjXl3/+iQvKS91VGPr/54k+HvB/wBjqewA=", - created_at: ISODate("2025-10-12T01:59:41Z"), + private_key: "zioq96s+Os5u0wkjaOfUO9dZId7OHr8otFLIdl+4qfc=", + created_at: ISODate("2025-09-17T09:35:26Z"), }, { - _id: "trk-186e11012a60c9972502d08e", - name: "flamboyant_carmack", + _id: "trk-186e120746e8b7c338ebf0df", + name: "sweet_babbage", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "dCVwn4KsGiF15UDSiICW8XAf3hlt02zRQBFzst2Upa0=", - created_at: ISODate("2025-10-06T16:44:41Z"), + device_type: "other", + private_key: "fDrzR+XXddUMT7sjv1lTdCqCrMxpIuoFhJF/FjORBTM=", + created_at: ISODate("2025-10-13T14:47:26Z"), }, { - _id: "trk-186e11012a60de635b74de91", - name: "fabulous_fizeau", + _id: "trk-186e120746e8ea3b02c4a2e1", + name: "frosty_feynman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "0Diry3mQtd7f6U71EzhhOralUkl5TuXtECAcEs1UvJY=", - created_at: ISODate("2025-09-25T08:13:41Z"), + private_key: "jzW8kxhoYXRGZAEfemost+RLvfyaXeAqCdA6Tvbrx4k=", + created_at: ISODate("2025-09-24T13:14:26Z"), }, { - _id: "trk-186e11012a60f293acfce4bd", - name: "amazing_weinberg", + _id: "trk-186e120746e9075df66cb3b3", + name: "strange_wiener", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "c0uOtAw/jol27F5ACAuPp0ZilplgXsyg0NanHhrvZqY=", - created_at: ISODate("2025-09-25T04:13:41Z"), - }, - { - _id: "trk-186e11012a6106547d1f2ae9", - name: "angry_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ol7nIFhU3b3bcy9yDLnczvFj2nljpwMpSMg7bDzlSuQ=", - created_at: ISODate("2025-10-02T23:11:41Z"), - }, - { - _id: "trk-186e11012a611ae837d02d84", - name: "eloquent_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "FpyhfLIqw3aNKpj92kh9fqtz7V8os4gcBnUkon4NhMc=", - created_at: ISODate("2025-10-05T13:47:41Z"), - }, - { - _id: "trk-186e11012a612e3424e7f252", - name: "eloquent_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "dbFscVYmKeQXtbevJl2NaSCC05aecEO0ERqmCzy/vh8=", - created_at: ISODate("2025-10-12T14:51:41Z"), + private_key: "uv7ZnF4gR7DRC3GsRjup4ai5zG3Lm/V7rmeUW+MN1jg=", + created_at: ISODate("2025-10-05T16:02:26Z"), }, { - _id: "trk-186e11012a614244a9f7ad63", - name: "eager_bohr", + _id: "trk-186e120746e924c657e20745", + name: "noble_gates", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "MCfkq7yy3jSxqVD7foTf2AyApWXuEsSvxRtK1viEqg4=", - created_at: ISODate("2025-10-05T22:56:41Z"), + private_key: "HTPI0EkycKDjtalFGyzwQhWo64m8tWlgruPc6ytZnuU=", + created_at: ISODate("2025-09-26T02:08:26Z"), }, { - _id: "trk-186e11012a6156ad70dbb8a5", - name: "upbeat_pauling", + _id: "trk-186e120746e941381aa9726f", + name: "hyper_cauchy", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "yFKv3ZRd0K0RIU/U4cRQRJ3NgTIDUDqyes4nBvc1tw0=", - created_at: ISODate("2025-09-25T09:30:41Z"), + device_type: "food", + private_key: "BymguFW23joJGerJ6vLEL9MqDeSUD+Gu6nIAY2uLEJw=", + created_at: ISODate("2025-09-17T02:25:26Z"), }, { - _id: "trk-186e11012a616ad6c72ceb10", - name: "energetic_berners", + _id: "trk-186e120746e95d892be20fae", + name: "beautiful_whitehead", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "AKo95ylXOqXlEeFx50EAe0LmXlLpv9AQ4Tj8eSs23rw=", - created_at: ISODate("2025-09-24T10:40:41Z"), + private_key: "CWlkHtuXinZ28j9pb59SPhjAJZtMTwnRtrXWe0ztijA=", + created_at: ISODate("2025-10-06T15:58:26Z"), }, { - _id: "trk-186e11012a617e4c3b7c0314", - name: "thirsty_coulomb", + _id: "trk-186e120746e97c1f615d85ec", + name: "original_kleene", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "pIhsQZ0pLeBgUlN83JnyiyRaUDe3Hd8MO6+PE82K2r8=", - created_at: ISODate("2025-10-03T02:28:41Z"), - }, - { - _id: "trk-186e11012a61a0c003e59de7", - name: "jaunty_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "X0J4Sjvyr4wvcx8ycuehCIJo3Lzhll9Ra7SuN3av/7k=", - created_at: ISODate("2025-09-15T01:27:41Z"), + private_key: "QJ+QtIFC9ydN3CZEHrhY+TYoM95H9JZ9y9fAwNcMCpw=", + created_at: ISODate("2025-09-14T21:36:26Z"), }, { - _id: "trk-186e11012a61e53f8f9d9afa", - name: "frosty_curie", + _id: "trk-186e120746e9f277df403d3d", + name: "jolly_salam", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "+e56TLqJbgbLjvCzKEUYWMKoxEj8bxR/rIl/uo52lGA=", - created_at: ISODate("2025-10-03T14:14:41Z"), + private_key: "HQDyTFoUqsHhVWbmVD148+qm4lQOKBp5bMdtXRwbM1s=", + created_at: ISODate("2025-09-28T18:07:26Z"), }, { - _id: "trk-186e11012a61f975f08a6968", - name: "confident_noether", + _id: "trk-186e120746ea1f2ea4d89687", + name: "exotic_berners", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "DwsZb+mxVf2zfcO3BppyRDKum6jrOwEd0L5QZbQ1Dqo=", - created_at: ISODate("2025-10-11T04:13:41Z"), - }, - { - _id: "trk-186e11012a620da465a07444", - name: "xenodochial_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "WvrUfkbDS9F4ls35iTZLBPr7HYCCpHrAyQlIEZBxy9k=", - created_at: ISODate("2025-09-29T03:14:41Z"), - }, - { - _id: "trk-186e11012a6221372c49d336", - name: "amazing_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "mQYmIvXJbzbkuNOqJOnZuu8Kx1901BNeU1YgeB2NYIg=", - created_at: ISODate("2025-10-09T15:00:41Z"), + private_key: "Y9z4ZdSWN8SPus1VpxPdFwSalBOr0xD60zRJdhCitbg=", + created_at: ISODate("2025-09-21T05:39:26Z"), }, { - _id: "trk-186e11012a623cc2f71b8aa6", - name: "puzzled_einstein", + _id: "trk-186e120746ea41e63919641b", + name: "funny_cooper", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "Dv+emuCZKoZRsiOrnQrUEq4NO58l3Yb11/09cjVMyyc=", - created_at: ISODate("2025-09-17T07:44:41Z"), - }, - { - _id: "trk-186e11012a625185a495eaae", - name: "flamboyant_rutherford", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "XaVo9DLAYQrrs+LtTXtrAZBwCvkOms3Ldgx+os3gXWA=", - created_at: ISODate("2025-09-18T12:19:41Z"), + private_key: "TYzBRY/HUoh5LpTEAeDcfshVDp7XIxVmsLOmAsFCSU4=", + created_at: ISODate("2025-09-25T17:16:26Z"), }, { - _id: "trk-186e11012a62658c881b9e94", - name: "exotic_pauling", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "gbXGqzXlvoAraIZsIhJPe+6ew8YKDINoXZxmzPOUYZs=", - created_at: ISODate("2025-09-14T04:53:41Z"), - }, - { - _id: "trk-186e11012a62792845ddb105", - name: "peaceful_einstein", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "JAoVdd3tl8pt112u3AXdNipRltkELT5rNyrvlCQsicI=", - created_at: ISODate("2025-09-16T11:24:41Z"), - }, - { - _id: "trk-186e11012a628e1ded818cc0", - name: "admiring_heisenberg", + _id: "trk-186e120746ea5c4249128d8b", + name: "jaunty_carmack", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "cHAo2YLBFJ+x4aK2ViC3Nnma2qA0AUN1+C2D8q92z3g=", - created_at: ISODate("2025-10-03T01:37:41Z"), + private_key: "Ln6LyXPBc9OF5bxhYJIoBUZ/r9gMHJYJO9b0fyopzaQ=", + created_at: ISODate("2025-09-30T18:22:26Z"), }, { - _id: "trk-186e11012a62a3fabe73f15b", - name: "epic_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "nSFmaA3II6KyzdSHU3CivmRf3TZuTYdEi0RfYuvfq1s=", - created_at: ISODate("2025-09-28T03:48:41Z"), - }, - { - _id: "trk-186e11012a62b8eaf103143f", - name: "confident_dirac", + _id: "trk-186e120746ea750cf69b169b", + name: "thirsty_stallman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "zMHUy3/proqnKMPc6kjAUN2+owr6XhcrVewX89ANba4=", - created_at: ISODate("2025-10-06T09:43:41Z"), - }, - { - _id: "trk-186e11012a62cddcae8cc82e", - name: "motivated_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "JL3tUaHh8FhQzicHyWHNupHhd/LuNg7p47nHFrexJcA=", - created_at: ISODate("2025-09-24T01:39:41Z"), + private_key: "QAONLFQmus2CGZZzlKfGjAADNanq00bK8vaVcBhJo7o=", + created_at: ISODate("2025-10-07T16:31:26Z"), }, { - _id: "trk-186e11012a63006def7f8e13", - name: "trusting_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "DxqgjFVwM58ge+W/YkpZksJAVRpBwFPbWbGEt1+godU=", - created_at: ISODate("2025-10-08T11:28:41Z"), - }, - { - _id: "trk-186e11012a63168e19f956bd", - name: "noble_fermi", + _id: "trk-186e120746ea8e7196b3093b", + name: "adoring_newton", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "ofkivhvxVIHgzyJ5zqaNEbAWx1vT8QzmmGTkJw5bHEc=", - created_at: ISODate("2025-09-21T20:25:41Z"), + private_key: "aCIzO3EwhWTHXQpWQP7BYEvr6W5HybnsMSUEX13mL30=", + created_at: ISODate("2025-09-18T22:57:26Z"), }, { - _id: "trk-186e11012a632bd8e3481c80", - name: "dreamy_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "Q7TmQiaiMbQjm7VkPzDqRm/eFG8Z+jJyEXXxLfLj00M=", - created_at: ISODate("2025-10-13T13:37:41Z"), - }, - { - _id: "trk-186e11012a6341ed35364f6a", - name: "sweet_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "4FEfi7kRIfruyoU2PWlM5UDOheYCpaQYlYSUnFXrLYY=", - created_at: ISODate("2025-09-22T13:38:41Z"), - }, - { - _id: "trk-186e11012a63557184afd5cb", - name: "thoughtful_cooper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "2skB4VoUcPGktZsj+Lkkvi2SlOCVZDATFrne1YbjTqM=", - created_at: ISODate("2025-09-22T14:20:41Z"), - }, - { - _id: "trk-186e11012a636ae2fc55400f", - name: "fascinated_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "4RWNO5fsnmSZY85qtodAGJTFHotYLFKGM225nl8G29A=", - created_at: ISODate("2025-09-29T10:34:41Z"), - }, - { - _id: "trk-186e11012a637f163120a02f", - name: "phenomenal_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "aupdkGLLAlN+EzxwvJ/ls2CtM2oJW0bmpxAE0Wryug8=", - created_at: ISODate("2025-10-03T21:14:41Z"), - }, - { - _id: "trk-186e11012a63957dad4f6e84", - name: "noble_poincare", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "+S5s9+Eb0b19Xh0JwrM4TXl9HCMJxhvurdQZaEFfQMQ=", - created_at: ISODate("2025-10-13T13:52:41Z"), - }, - { - _id: "trk-186e11012a63a9b488c66966", - name: "naughty_compton", + _id: "trk-186e120746eaa755561196c8", + name: "hungry_planck", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "luZOlyueEBLvwHm/GGRaLO89GmcucBCuhb4FrOnnt2s=", - created_at: ISODate("2025-09-21T06:33:41Z"), + private_key: "VKE7UxvJ2bltuQiytSDm2Nv31Iofy06JUwxP8jagn1M=", + created_at: ISODate("2025-10-12T15:43:26Z"), }, { - _id: "trk-186e11012a63bdb21339d43d", - name: "polite_volta", + _id: "trk-186e120746eac0684a411127", + name: "energetic_carmack", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "I62eYTPe2zoU7qyJXJl2Ho1XDj6779SQu+VZzXytdJU=", - created_at: ISODate("2025-09-21T08:37:41Z"), - }, - { - _id: "trk-186e11012a63d3872a73d928", - name: "fearless_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "9jLZgoYP4hmYmWGAEp8zYOv298Wdl5fZdorRjwP8g4w=", - created_at: ISODate("2025-09-30T20:00:41Z"), - }, - { - _id: "trk-186e11012a63fc2dae48253e", - name: "agitated_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "OOSseKFuzABIgwN77wUsojp9BfDEmYJx2OVtIXlohPc=", - created_at: ISODate("2025-09-19T00:41:41Z"), + private_key: "jBN447T6Cs/2lwJOZsyHmrcYfrsWCMa6L9gGT3sblJA=", + created_at: ISODate("2025-09-21T13:50:26Z"), }, { - _id: "trk-186e11012a6419cd9adf15d4", - name: "merry_ohm", + _id: "trk-186e120746eb21c56b310cda", + name: "admiring_darwin", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "OP+bTdgDMNI2Jj2OUlx6WNvoXEHwQS4SOgGs+jE9HQM=", - created_at: ISODate("2025-09-22T21:45:41Z"), - }, - { - _id: "trk-186e11012a6445e9542ceb3d", - name: "enchanting_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "q/HPagRlkUhkpHpenzzpWVYfZIkgkUGlLygjURoNw/A=", - created_at: ISODate("2025-09-23T19:43:41Z"), + private_key: "s5ryhLp1YeNYA5ac6plvh1XbGAbrSinlGEAfFX+XB/w=", + created_at: ISODate("2025-10-02T21:14:26Z"), }, { - _id: "trk-186e11012a64e64acb34fde0", - name: "goofy_kleene", + _id: "trk-186e120746eb4d6d70cf6733", + name: "pedantic_franklin", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "64ZojcN40nrftTyUp9n/iZWlj4OEpy1AKBC2jCdvR3I=", - created_at: ISODate("2025-09-21T18:52:41Z"), + private_key: "1YZoUDeyundPrkyl0bFKSQYfSloEJtJCJAcxri42jsc=", + created_at: ISODate("2025-09-24T04:37:26Z"), }, { - _id: "trk-186e11012a6562f1d5a6bf8e", - name: "faithful_compton", + _id: "trk-186e120746eb649a77fcbe02", + name: "laughing_born", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "NEkkzMX74+vm7O2T57Nj4J7qh+nn8L6q1T3ccAtzCgY=", - created_at: ISODate("2025-10-12T10:39:41Z"), + private_key: "augBE5IFFPq2uubp+cOpB9XSWe6FNzkXRkLZkubX3Es=", + created_at: ISODate("2025-09-24T20:06:26Z"), }, { - _id: "trk-186e11012a657978bd955932", - name: "fascinated_hawking", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Xc3SVOXn4ldKwBxQ7PvyNR2EVweLC3107RrfVnlyqxQ=", - created_at: ISODate("2025-10-05T03:12:41Z"), - }, - { - _id: "trk-186e11012a658deb1cbc74be", - name: "noble_penrose", + _id: "trk-186e120746eba54428a46768", + name: "groovy_bohr", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "UClXMnEWLA1Yo7UnDrmpZHsEfmJ36NJ2mq0gRi/kzcg=", - created_at: ISODate("2025-09-19T02:03:41Z"), + private_key: "IkcQJDdUzKZ2WMpIIQwpknP998gOt0F7MP+EQo/T1Lc=", + created_at: ISODate("2025-09-17T20:37:26Z"), }, { - _id: "trk-186e11012a65a28d6b20ec16", - name: "admiring_rutherford", + _id: "trk-186e120746ebbc9238d17b60", + name: "gracious_weierstrass", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "xP5B7YbXUDqo03XkmCMoN4HKd11IB2X0v3/PJ9D0j5A=", - created_at: ISODate("2025-10-06T14:03:41Z"), - }, - { - _id: "trk-186e11012a65b65ab4a75d16", - name: "suspicious_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "VuYBRBujCPeJuOxpOx08blAYxKbYvY8Y1ZJA3rM4A1M=", - created_at: ISODate("2025-10-07T01:33:41Z"), - }, - { - _id: "trk-186e11012a65ca7f8e2ff72d", - name: "hungry_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "0uH9j+4TMAyIhwWaPvAlFWJna4VeO5y3msirk5a1AHQ=", - created_at: ISODate("2025-10-13T05:12:41Z"), + device_type: "other", + private_key: "40PvNz4whHc4hLO/7Q9lMe6YGJO6ZkMvjN1dA30zAA4=", + created_at: ISODate("2025-10-04T07:08:26Z"), }, { - _id: "trk-186e11012a65de072aa6fc79", - name: "hyper_millikan", + _id: "trk-186e120746ebd0fa0f990530", + name: "thoughtful_doppler", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "M2V/W+wLV6FLLuRhufazGYXP/W+BPlVlQzd0RctuWu4=", - created_at: ISODate("2025-09-23T13:03:41Z"), - }, - { - _id: "trk-186e11012a65f1bb5c146ab8", - name: "affectionate_euler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "dlukp0jdH/mAVx81Jggq/tTmh4WTocws+XItVGgNZsk=", - created_at: ISODate("2025-10-12T02:49:41Z"), + private_key: "CQqhJ/Qj/x1s9H3Y4QuIo5FSGoMjA+ojGYiXskb0RRw=", + created_at: ISODate("2025-09-17T00:05:26Z"), }, { - _id: "trk-186e11012a6605f6bfc85d5a", - name: "bold_markov", + _id: "trk-186e120746ebe5ac2d343d5f", + name: "zealous_laplace", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "mBbpCjOBP7WYxjfrV1Q4Y2btmPCTN9/CMn69w6n0n74=", - created_at: ISODate("2025-10-01T22:47:41Z"), + device_type: "other", + private_key: "y0VUGEVC3cOc4sX1nj7u10m75QasW8LIdwWVs1rf2TY=", + created_at: ISODate("2025-10-04T13:25:26Z"), }, { - _id: "trk-186e11012a661a9459a61af6", - name: "sad_bohr", + _id: "trk-186e120746ebf958faa8280e", + name: "busy_jobs", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "qO3bw/C4KZHq37XZC80hm2R9YjTIMpeX1+N2zqNrjes=", - created_at: ISODate("2025-09-19T18:22:41Z"), + private_key: "OENsQJipdvtlRI+5C8F/phEfSjTHS2F9CWXt+cXGHcI=", + created_at: ISODate("2025-10-01T16:44:26Z"), }, { - _id: "trk-186e11012a662e2caaacfc79", - name: "bold_coulomb", + _id: "trk-186e120746ec4fb0b411045b", + name: "adoring_hilbert", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "doi0T3NH0KKQFn1B+VeNHvs2cWkhsePu3RcDx8SsXWw=", - created_at: ISODate("2025-10-08T02:06:41Z"), - }, - { - _id: "trk-186e11012a6642fad9ad433b", - name: "noble_millikan", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "WfHngSuEcKKpJYPm3OZzpyy9wdlPoIeY37f3LZyC3U0=", - created_at: ISODate("2025-09-21T08:03:41Z"), + private_key: "SAd8SIi1BnSt/9YexlOGPNZ7PJJkigxkvdnqZnwftwo=", + created_at: ISODate("2025-09-25T07:06:26Z"), }, { - _id: "trk-186e11012a6656542d3d3df5", - name: "brave_darwin", + _id: "trk-186e120746ec648c04ccbdc8", + name: "furious_euler", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "PZMa4LTYOCnbubNuPpBy20SdPCWPKLUbwYQrMRMmSQ4=", - created_at: ISODate("2025-10-12T19:49:41Z"), + private_key: "dSLgwgAmj27cw9ET0w8acChymnMLe24CxGCKwdLswbo=", + created_at: ISODate("2025-10-05T02:30:26Z"), }, { - _id: "trk-186e11012a667f0f999e1788", - name: "objective_dijkstra", + _id: "trk-186e120746ecbbbe654ce1d4", + name: "fascinated_morse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "DSAkYqCzbuUC/IKdYB57958uVdw6xJeh+Udq81Ca7wc=", - created_at: ISODate("2025-09-15T11:31:41Z"), + private_key: "bRVy3298YRSHvb3LE1Z6qj07TqEtH0oooPp5HMcGTJc=", + created_at: ISODate("2025-09-19T14:47:26Z"), }, { - _id: "trk-186e11012a669f7c7a33a3d8", - name: "gifted_edison", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "6X4dOBZb3FIU49NpN3/rIHZAIOAIuByFDG9ZIzzJWig=", - created_at: ISODate("2025-10-06T07:54:41Z"), - }, - { - _id: "trk-186e11012a66c666bee85163", - name: "magnificent_planck", + _id: "trk-186e120746eccff893f335f9", + name: "curious_wozniak", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "217RGR3iUaLIAunipv/M9vUDOSFXoeU+EBV9JVMaoTw=", - created_at: ISODate("2025-10-07T12:07:41Z"), + private_key: "pK3c6YRMn7EgtpNs+blSRqgdQL+Ic8drkEx9tX2Dy6c=", + created_at: ISODate("2025-10-11T13:06:26Z"), }, { - _id: "trk-186e11012a66dad625d30e99", - name: "cool_ritchie", + _id: "trk-186e120746ece530a32af864", + name: "dreamy_jacobi", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "YdQcELI6H7m1non4OGLuEY3q/k0897BelN6ipTyY+Zs=", - created_at: ISODate("2025-10-07T03:51:41Z"), - }, - { - _id: "trk-186e11012a66ef33204f6ab2", - name: "cranky_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "ZoW+dJ5hauh/GgX9X8LHQeyYsQiC9JA4MHcilzB7nHY=", - created_at: ISODate("2025-09-23T08:00:41Z"), + private_key: "Ubp1OPiqYtvjmJCrmp9JrPfCFjtLhiUoB+3oC4BTPFs=", + created_at: ISODate("2025-10-04T04:32:26Z"), }, { - _id: "trk-186e11012a670a7c965ce39e", - name: "hopeful_markov", + _id: "trk-186e120746ed08a67703eabb", + name: "exotic_shockley", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "QEbUtqBt9DKtIKXPCtBColR21KG+/IaGvCX2b5fIX4Q=", - created_at: ISODate("2025-09-29T06:52:41Z"), - }, - { - _id: "trk-186e11012a6724c551a0e03d", - name: "elastic_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "7wQz6sa46OhYPTVHd3hi/J+9IQkzyP75RHHzcb6jVhg=", - created_at: ISODate("2025-09-27T17:24:41Z"), + device_type: "private_transport", + private_key: "d2vpnUwGH7ALIWjUKILDnDshEqdD+Roko77fxsHUUqE=", + created_at: ISODate("2025-10-01T23:44:26Z"), }, { - _id: "trk-186e11012a673a41f95f6110", - name: "fascinated_born", + _id: "trk-186e120746ed58f183b2985f", + name: "outstanding_weinberg", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "tY0ax0s6/Me3StBIBA6WtZeYEqY4xhu92+cztJQT2Gk=", - created_at: ISODate("2025-09-19T20:13:41Z"), + private_key: "awREvy0yYRVf2XsYf/tNNIdBL55RXR96sGy7jTw5kl8=", + created_at: ISODate("2025-10-03T13:15:26Z"), }, { - _id: "trk-186e11012a674d8c49e9f91c", - name: "sharp_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "cu0LhNwYjNhjhtE/iz8dEChXyK7xLD2K/+ARgWLPKi4=", - created_at: ISODate("2025-10-12T05:29:41Z"), - }, - { - _id: "trk-186e11012a6760c305264774", - name: "groovy_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "00gF07p5Idgk9MC1ZBX8G2vgFCGTWn9JNn0vB1mcy38=", - created_at: ISODate("2025-09-22T21:48:41Z"), - }, - { - _id: "trk-186e11012a677ead8f9d2983", - name: "intelligent_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "hlU+G1cSuNlV6AQaPR8otssCa3z2x8ajOe2a7/G0gGM=", - created_at: ISODate("2025-09-16T14:08:41Z"), - }, - { - _id: "trk-186e11012a6792a56e8f9da9", - name: "proud_higgs", + _id: "trk-186e120746ed868a048f5dab", + name: "dreamy_hilbert", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "0j2xg1Dz4wSx9JmrPCzXxBafstNKIJGn3rbP+zI3gyA=", - created_at: ISODate("2025-09-25T05:40:41Z"), + private_key: "/t1Coa70kTMW55Qyu4sFA7+LLafl+vt8LxAoAQ0nDLY=", + created_at: ISODate("2025-10-07T20:10:26Z"), }, { - _id: "trk-186e11012a67a641ea4feb26", - name: "amazing_pauli", + _id: "trk-186e120746edbab38815cdf3", + name: "focused_peano", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "SWM2yiSrJeEREx3ug5kSKizRaawH+wO25UoxZPoBwmY=", - created_at: ISODate("2025-09-26T09:28:41Z"), - }, - { - _id: "trk-186e11012a67bac8eedf29e7", - name: "pedantic_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "NLVwZmEa2OL6Z4pqkx0vnA7dXL/fXjuVPIEHUDmq5uI=", - created_at: ISODate("2025-09-15T06:26:41Z"), + device_type: "food", + private_key: "WfNSRmk1sgJsXH/JVHELwriSEAoB5yD4CCyMuGRD/fs=", + created_at: ISODate("2025-09-24T00:54:26Z"), }, { - _id: "trk-186e11012a67cdedf1345929", - name: "hyper_pauling", + _id: "trk-186e120746edd0917f22f06e", + name: "motivated_compton", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "ZyuDt9mXILdg0RunC1pVVUp2AIqk8VNTDFQMRUwgkHg=", - created_at: ISODate("2025-09-28T04:45:41Z"), + private_key: "t4kvEtHD4zNZl6BciX0xcyU8mWDU8YMWEftEQE3eoRY=", + created_at: ISODate("2025-09-29T00:50:26Z"), }, { - _id: "trk-186e11012a67eb89cd8566db", - name: "graceful_marconi", + _id: "trk-186e120746ee2283b18d3081", + name: "groovy_fermi", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "SqeCBkngmr/ehE77ixnv7qHCYZzveMhTu9CwVbQJYNQ=", - created_at: ISODate("2025-10-11T13:27:41Z"), + private_key: "tlIl/BgRMxvE3+uojFxFVzBsUpgqO0DDieAllWAzULA=", + created_at: ISODate("2025-09-14T17:54:26Z"), }, { - _id: "trk-186e11012a6800ec7f035d74", - name: "magnificent_glashow", + _id: "trk-186e120746ee4e09aceffd05", + name: "xenodochial_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "gtaxlYl/+suWErJ7afCt8ATYhAuLSjlx2yvrhC5z0lQ=", - created_at: ISODate("2025-09-24T06:16:41Z"), + device_type: "other", + private_key: "SR7J6zXtzZ+MzTCt+PULdrBEVstzj3j8FWbY8lIEn90=", + created_at: ISODate("2025-09-14T14:54:26Z"), }, { - _id: "trk-186e11012a681436cb176368", - name: "inventive_knuth", + _id: "trk-186e120746ee68da26273cf5", + name: "lucid_nyquist", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "SRpylP5ew5T5/gTc79UHHuN1pwQ6lvfOD8Wphlgprio=", - created_at: ISODate("2025-10-09T12:50:41Z"), + device_type: "other", + private_key: "iakRwwyTjiD+zM7uC7h/UQm6gz6QIVntEhsL5kChETk=", + created_at: ISODate("2025-09-21T11:01:26Z"), }, { - _id: "trk-186e11012a6827f1305b747a", - name: "heartwarming_edison", + _id: "trk-186e120746ee83e08e9af2ff", + name: "serene_lagrange", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "ZydjOjg0DNTrLegVuZNo3Sn8M1islQZvaT6Zcz8QpLw=", - created_at: ISODate("2025-10-08T10:07:41Z"), + private_key: "sZ9jRJt4nahWRjnYbEr8pROMxPW+rMqaEpwcxSbI25k=", + created_at: ISODate("2025-09-24T14:39:26Z"), }, { - _id: "trk-186e11012a683c40c8614731", - name: "thirsty_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "SxZYpfmJKzIPrm87SNVnJ00GpHuOWrcIcw9OJAavBDI=", - created_at: ISODate("2025-09-18T23:04:41Z"), - }, - { - _id: "trk-186e11012a68503e7753741f", - name: "noble_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "g40bfbGnOLmkUhx1i+gx+Y6yzYadiO5yN+cJTufO+JQ=", - created_at: ISODate("2025-10-11T23:20:41Z"), - }, - { - _id: "trk-186e11012a687194b5861e81", - name: "mystifying_kelvin", + _id: "trk-186e120746ee9c5f3732c18d", + name: "cranky_glashow", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "PptUjRBMZNacloj83BxlkSDjB2Z6gFk9CSA8gkhldDg=", - created_at: ISODate("2025-10-06T12:02:41Z"), + private_key: "0x5c9KZ5LXKSmZZqvoYwIRmfmcI/QdC9pzGSw0iUnhI=", + created_at: ISODate("2025-09-30T09:44:26Z"), }, { - _id: "trk-186e11012a68860d931d5095", - name: "nervous_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "lLAwgfhWZbjkr9VcYPZb0YsZtakY7oGbJcqQK4Uunm0=", - created_at: ISODate("2025-10-07T07:21:41Z"), - }, - { - _id: "trk-186e11012a68997c808f8465", - name: "sleepy_jacobi", + _id: "trk-186e120746eebc6662643d28", + name: "nervous_maxwell", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "voc+y+JNdqp6lX48qNmcu59Lsq6a+uVXJCxct2xRNxk=", - created_at: ISODate("2025-10-01T04:23:41Z"), - }, - { - _id: "trk-186e11012a68ad23b4a73c5a", - name: "jaunty_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "occWle60rL4/Q1k5ZC1YZNFidtrXN1qPpOOQoHJI+0M=", - created_at: ISODate("2025-09-24T13:06:41Z"), + private_key: "R5tvEmp6htqC7RHz/hRTUwhZW6v3lVh3qJ+Pttgw9S8=", + created_at: ISODate("2025-09-30T08:21:26Z"), }, { - _id: "trk-186e11012a68c1d3f71ded27", - name: "lucid_galileo", + _id: "trk-186e120746eedcee1f256e01", + name: "amazing_westinghouse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "DZ1ZHv14wz04AcnlFCgHXUqY0wn2Smxd+AUD67eHDT8=", - created_at: ISODate("2025-09-22T20:28:41Z"), + device_type: "other", + private_key: "UX2Qmw3cmXuF/IcgT0gIzavalplncAuB9c1hCDebu0k=", + created_at: ISODate("2025-09-22T15:06:26Z"), }, { - _id: "trk-186e11012a68d5dc0fbcdc78", - name: "angry_turing", + _id: "trk-186e120746eef951821b96c3", + name: "bold_born", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "yijSK7kAlrVHEkiArf2WHufse4mGsMgyn2zKQmtaFX8=", - created_at: ISODate("2025-09-18T10:02:41Z"), + device_type: "other", + private_key: "YXD9WH6vDeIHC5YQZqEz7WvkHrcKgIAnfFAGl59htyE=", + created_at: ISODate("2025-09-22T18:36:26Z"), }, { - _id: "trk-186e11012a68f3408129aa93", - name: "fervent_torvalds", + _id: "trk-186e120746ef14ada5d82853", + name: "ecstatic_bohr", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "4hYuvxP0lN5zV1E8SYsJdO0CSXHb2LhCUVjfAOcV1uk=", - created_at: ISODate("2025-09-21T10:54:41Z"), + device_type: "other", + private_key: "EyfR76x+gHf56NtxCJrPP2yEbKNAWAytY7GnJ5iD6Dc=", + created_at: ISODate("2025-09-22T14:45:26Z"), }, { - _id: "trk-186e11012a69083580f37301", - name: "nostalgic_tesla", + _id: "trk-186e120746ef30a453a2681f", + name: "xenodochial_yang", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "DSP/IOrE5ULpd3X+i8y+++pq+EHjO2CtR/KN+93Cfu4=", - created_at: ISODate("2025-09-15T07:02:41Z"), + device_type: "other", + private_key: "KA7GeAJz7HYtBr+quD2ByRsih8xN94nkw82YHCa+ekE=", + created_at: ISODate("2025-09-23T11:28:26Z"), }, { - _id: "trk-186e11012a6923b5915a988a", - name: "motivated_schrodinger", + _id: "trk-186e120746ef5962725241a1", + name: "great_pascal", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "eH71/s+dQvQ1xJJL6bLsr4YLpgvhMWpZNkl4XTuhzdY=", - created_at: ISODate("2025-09-27T11:34:41Z"), + private_key: "wTy5ke2Gu8rGjh90ryR4OO3dvnaveRb2lNO2J+DXM+k=", + created_at: ISODate("2025-09-29T17:03:26Z"), }, { - _id: "trk-186e11012a693761f330d104", - name: "proud_faraday", + _id: "trk-186e120746ef7561a82b805e", + name: "puzzled_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "8KlDOWge0E5h6k+nVbYB0aYctn/NPc2Yp8qsgHvYFC4=", - created_at: ISODate("2025-09-21T19:56:41Z"), + private_key: "U3e0bbtRB/4oFdwAyqaUWdiWc3KBJxCdwL4GnrajrvE=", + created_at: ISODate("2025-09-16T18:55:26Z"), }, { - _id: "trk-186e11012a694ba40a1e8528", - name: "intelligent_crick", + _id: "trk-186e120746ef911e84e6d8e2", + name: "flamboyant_wiener", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "egi3qn6qf20/lF+9wA1XlNr9R7UdH1w2tnW/BP1DOD8=", - created_at: ISODate("2025-10-08T00:26:41Z"), + private_key: "ce/RLrLRYmFt61vSvrKtl+OayIQpjaFJRWJVABDKEWA=", + created_at: ISODate("2025-09-18T14:06:26Z"), }, { - _id: "trk-186e11012a695fa93dc370cd", - name: "patient_babbage", + _id: "trk-186e120746efabd4ebae5c25", + name: "modest_pascal", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "C/SrLZcsde5zi+3jVX/1CXO0fyHfFL/LagnN71XM7vM=", - created_at: ISODate("2025-09-29T23:38:41Z"), + device_type: "valuable", + private_key: "Pz4Pu+YceuyuUAEswXesnWSPbZL5PPPXefSAO4ueB3M=", + created_at: ISODate("2025-10-02T22:08:26Z"), }, { - _id: "trk-186e11012a6973a81a95f137", - name: "eloquent_crick", + _id: "trk-186e120746efd20be6218945", + name: "curious_turing", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "j1t3bLVhGQXReRYX36ydg+8L3dmadL9oOMc9xaEDdqc=", - created_at: ISODate("2025-09-15T11:22:41Z"), + private_key: "O2DSUjc6HIFMf8/a/mm+ONOVsXvJ9UmYdvhIirxW5LQ=", + created_at: ISODate("2025-10-10T00:12:26Z"), }, { - _id: "trk-186e11012a6989075fb19370", - name: "eager_compton", + _id: "trk-186e120746efef261a621259", + name: "heuristic_galois", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "QP9cWjfrVAUTlexCgC2EQUZfb+jmVMRFlbcQsU0ULD0=", - created_at: ISODate("2025-09-27T00:58:41Z"), + private_key: "7xF3Ws3DC15XXi+wN0TLJ/xfOYsl1wthIcg1WDJSPGE=", + created_at: ISODate("2025-09-29T07:18:26Z"), }, { - _id: "trk-186e11012a699c62e5346db9", - name: "ecstatic_volta", + _id: "trk-186e120746f00b07b9f277f3", + name: "charming_wozniak", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "dQcTJ19qSW/+XDlTdwlTzogBMQU7qKeGRScV1SV7xgU=", - created_at: ISODate("2025-09-13T20:05:41Z"), + device_type: "public_transport", + private_key: "CkNmnFv3gp6MKDfY7BFED1nGJLC5Gvho5M135S/bcSI=", + created_at: ISODate("2025-10-08T19:56:26Z"), }, { - _id: "trk-186e11012a69afb578bfa279", - name: "naughty_newton", + _id: "trk-186e120746f0271720162899", + name: "cool_dijkstra", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "2MHbKiaRPN0ir35fiIReoNXE4WSK5xtPhgGEQR9N/XU=", - created_at: ISODate("2025-09-26T18:35:41Z"), - }, - { - _id: "trk-186e11012a69c43a870114f4", - name: "objective_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Nj+3MmYrI0qejPktZkaTnW0cj2fxQVtwQr7n6xiiDms=", - created_at: ISODate("2025-09-24T16:11:41Z"), - }, - { - _id: "trk-186e11012a69d76c1d58cb5a", - name: "phenomenal_church", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "1TYnKVXTOmyZcd2ZATl7vQKmaZctz8BaE2eQUqiombA=", - created_at: ISODate("2025-10-11T20:40:41Z"), + private_key: "EXIB21hXaXxf6awOBsQvJF4YnOGec0JcliipsryVoJM=", + created_at: ISODate("2025-09-23T20:59:26Z"), }, { - _id: "trk-186e11012a69eb366151d454", - name: "eloquent_lagrange", + _id: "trk-186e120746f04a21e1fbceb4", + name: "fabulous_henry", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "bogfw5axRNHuqhcZokzzEiOoMQcNfFDJQ+L2lIK8ayY=", - created_at: ISODate("2025-10-03T08:59:41Z"), + private_key: "pA1fAK3JAJfuPhNF0pJ/AXM2x80lCClPT3YBaFm0aWU=", + created_at: ISODate("2025-09-24T14:03:26Z"), }, { - _id: "trk-186e11012a69ff9ce3bb7579", - name: "hardcore_glashow", + _id: "trk-186e120746f082919f1fb039", + name: "calm_glashow", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "dVgfqWA9h+R0tl3KTyeSGyZ+lWCVptMkmzJp6ECtVXo=", - created_at: ISODate("2025-09-23T17:16:41Z"), - }, - { - _id: "trk-186e11012a6a12cf3be6398b", - name: "calm_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "U0pVdwvHtqXH2Mx3kdqFLImQnbwURMVG/jWXPqW+Ugw=", - created_at: ISODate("2025-10-02T11:22:41Z"), + private_key: "cP03j+3EWXeGlrsFWTKdx+/BUsX+yfBpyqfRsHvNtNo=", + created_at: ISODate("2025-10-02T00:58:26Z"), }, { - _id: "trk-186e11012a6a26d34c04e401", - name: "faithful_watson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "FCXiT34AwIloVsGogUfNa5Y20a0W7pC/lB24FCpXZNk=", - created_at: ISODate("2025-09-16T13:27:41Z"), - }, - { - _id: "trk-186e11012a6a4fc90c6da34c", - name: "practical_wirth", + _id: "trk-186e120746f09d390df56184", + name: "gifted_crick", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "OCJwY7fmiHWPQ8a93DY349D0YQV+N3Mkd2TMNT5PDt0=", - created_at: ISODate("2025-09-27T22:12:41Z"), + private_key: "Cd8phmxxYiKZykG4dz12tWjBqldOWLlXS4eHAt+QXuE=", + created_at: ISODate("2025-09-26T09:54:26Z"), }, { - _id: "trk-186e11012a6a6ddd9371f4e1", - name: "jolly_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "zh3fLp0siFfTJx6a5KZaHGOgXQqXDQJNfJ2PNj58HJc=", - created_at: ISODate("2025-10-09T13:14:41Z"), - }, - { - _id: "trk-186e11012a6a8e1d7645a2cc", - name: "iron_feynman", + _id: "trk-186e120746f0b6c58812e233", + name: "merry_torvalds", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "juSPU5T2XW/KKo/kgn3uf6XkkQ9kDR495szH8DZKP6I=", - created_at: ISODate("2025-09-16T21:33:41Z"), + private_key: "SfPGmp/POZ0OJ46PfaCF4YWga1fkw9hxx4Uu2Oqc12U=", + created_at: ISODate("2025-10-02T12:53:26Z"), }, { - _id: "trk-186e11012a6aa3491ef34d6b", - name: "hungry_wu", + _id: "trk-186e120746f0d2223b340dbc", + name: "calm_cantor", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "aHj3TaU2sHN/CZGs7paLUWfnd2PJDk0KZfEtjYSnV6M=", - created_at: ISODate("2025-09-20T15:19:41Z"), + private_key: "6y8OGDDKUegpudM8cpIEJOHa0XFm1kiYGq14k5lGqn8=", + created_at: ISODate("2025-09-25T08:49:26Z"), }, { - _id: "trk-186e11012a6ab6ce0dbd137a", - name: "iron_ramanujan", + _id: "trk-186e120746f0f719e93740d8", + name: "gentle_kleene", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "XUB14u2ASGNYRp4x6GjSXL6P3iDzsEDJp5EYOrlNs7s=", - created_at: ISODate("2025-10-06T05:56:41Z"), - }, - { - _id: "trk-186e11012a6ad190d5f26f5e", - name: "boring_bardeen", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "iohPqYUWmNIM4chluUswul7SDQFnWsHWVbbzYX6Re6o=", - created_at: ISODate("2025-09-28T13:31:41Z"), - }, - { - _id: "trk-186e11012a6ae7df80bb26ac", - name: "laughing_einstein", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "K2XZ26AlCgHNAspK3zvk++/3xKDrWgtSSnF8+AOx0Qs=", - created_at: ISODate("2025-09-21T01:21:41Z"), - }, - { - _id: "trk-186e11012a6afd012573444f", - name: "cool_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "9gj00S3hIZZYYv5J0zDa7Ns4y0YsR3Gj6dIygOsKNFA=", - created_at: ISODate("2025-10-09T22:17:41Z"), - }, - { - _id: "trk-186e11012a6b11e2eea6ad28", - name: "amazing_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "BfxlKuJBjUKOLQwuwmIf+FJVmW3lFXLIy+FNl3r16ZI=", - created_at: ISODate("2025-10-02T07:37:41Z"), - }, - { - _id: "trk-186e11012a6b2618fb757329", - name: "gifted_galois", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "OuR5j02z+qXlcppxPdmPXhv7Kp4RuOWTfhKDM6UHVBM=", - created_at: ISODate("2025-09-27T12:50:41Z"), + private_key: "kTOu2VN72K+KIS6dmhjw6gn7EJv8Sgy7Ftf0EVmyUAM=", + created_at: ISODate("2025-09-17T00:20:26Z"), }, { - _id: "trk-186e11012a6b394bebadc1e6", - name: "magnificent_tesla", + _id: "trk-186e120746f12bb3b3afc7ca", + name: "angry_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "2As5cpb4ZprXazamVQTYm9zZhy+Q0zX2Lj9SkIkhInY=", - created_at: ISODate("2025-10-02T20:26:41Z"), + private_key: "EaVi9jGo670sloZat37TqG9X6MSt9eYttd+OL9xtNmA=", + created_at: ISODate("2025-09-28T01:00:26Z"), }, { - _id: "trk-186e11012a6b4c6979266ad6", - name: "competent_wiener", + _id: "trk-186e120746f146b5f322b565", + name: "furious_planck", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "W9PKV8At5L3ylkfdQpuqpPF3JJOGQ049qgX4g7nd5ts=", - created_at: ISODate("2025-10-04T18:36:41Z"), + private_key: "YsXCrd24M5R0/N8Zo8NptQSAgfuOKlb/6Mquo9+5f6w=", + created_at: ISODate("2025-10-10T19:53:26Z"), }, { - _id: "trk-186e11012a6b6160671c0d6c", - name: "adoring_doppler", + _id: "trk-186e120746f15f4e4ac77e69", + name: "flamboyant_hertz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "InblIn+VqVZmJ+a/q2JxFnVpRzgK3qb+alNsE5yf7u4=", - created_at: ISODate("2025-10-01T02:17:41Z"), + device_type: "other", + private_key: "GwTCImAqU45wG0/+jxkHCuhKym5mzA7ga9AgmiPxXt8=", + created_at: ISODate("2025-10-04T23:43:26Z"), }, { - _id: "trk-186e11012a6b7596da904a86", - name: "zealous_leibniz", + _id: "trk-186e120746f179039c3e5b94", + name: "thirsty_laplace", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "QgJmhzs1pPm4C2QjlnqXUDwMuZppTBi2snmjbaWoEvA=", - created_at: ISODate("2025-10-01T11:39:41Z"), + private_key: "pFQF+nyzLCcElM/v9stFnzBiFOZmnAif8VZEf442V+U=", + created_at: ISODate("2025-10-09T19:46:26Z"), }, { - _id: "trk-186e11012a6b91e714711be0", - name: "condescending_born", + _id: "trk-186e120746f191c526e07e26", + name: "cranky_weber", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "Bn+Dx6FWWuu8kT+8R0Radz1cBsk7JoS1fH4eMpOwrZA=", - created_at: ISODate("2025-09-16T22:07:41Z"), - }, - { - _id: "trk-186e11012a6ba6d028cde8bb", - name: "groovy_euler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "TePeppWG5GrNuh3beskSMFSTcdJBeF9ynGBxfYtb4XI=", - created_at: ISODate("2025-09-22T10:31:41Z"), + private_key: "GsdkxPFdv3TahWmqM9VkaazJQNxCzhS7PENt8gEoT0s=", + created_at: ISODate("2025-09-24T21:13:26Z"), }, { - _id: "trk-186e11012a6bbb009d699414", - name: "distracted_morse", + _id: "trk-186e120746f1b4d87f6a4ab5", + name: "iron_galvani", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "TRbTIZ8UCGBO5/2qXuF2yEQJkz+qJHlzNXM/J7nQGDI=", - created_at: ISODate("2025-09-22T12:40:41Z"), + private_key: "W3QvXGjvUvqvTKippTBM1SFuOpMKW8QWnoD0Mme6OYE=", + created_at: ISODate("2025-09-26T05:09:26Z"), }, { - _id: "trk-186e11012a6bce3eb8cdd023", - name: "boring_weinberg", + _id: "trk-186e120746f1ce4eea4b728b", + name: "relaxed_feynman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "jlXx2lFs5DdjRy0krxykZbO2Fr94IGE0Ern3n5z3R7A=", - created_at: ISODate("2025-09-24T04:43:41Z"), - }, - { - _id: "trk-186e11012a6be2728b0de5f1", - name: "quizzical_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "dlFY1T4NYuyQuEeedZ1IdEsnqnUldf+AFCUVJfgopdI=", - created_at: ISODate("2025-10-04T19:56:41Z"), + device_type: "other", + private_key: "LZR+p/doe7p09bMaY/q8YakuBQGrsGyX74cbpYztN0I=", + created_at: ISODate("2025-09-28T06:39:26Z"), }, { - _id: "trk-186e11012a6bf5e949a6578d", - name: "thrilled_laplace", + _id: "trk-186e120746f1e7f64d2a0414", + name: "merry_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "3AtFcMkrZ4wqFIQkgpE0svSJ6ZWeEv0U/IpAOdLH31s=", - created_at: ISODate("2025-09-16T13:41:41Z"), + device_type: "other", + private_key: "pW2aKuxC2muX5hOWr+bk1aySwlsEof16dOwGGVbv0hE=", + created_at: ISODate("2025-10-06T09:51:26Z"), }, { - _id: "trk-186e11012a6c261e6e410b97", - name: "gifted_chebyshev", + _id: "trk-186e120746f201234290fc20", + name: "youthful_edison", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "mCocNj0D/NXQlQShXi2dcvGDBy7QIpPGg+nakvQ3bEs=", - created_at: ISODate("2025-10-12T19:47:41Z"), + private_key: "p46hK5+FShBIgUZvbfw6Wq3dfrtRYlX9RDMDKAUoE7k=", + created_at: ISODate("2025-09-25T12:29:26Z"), }, { - _id: "trk-186e11012a6c3c6824d60f91", - name: "affectionate_bohr", + _id: "trk-186e120746f21be0e93185c3", + name: "focused_godel", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "TXZDLtPpK6Mau3d2WVLxrKH0EuD8BCZ1KCt/NaHU/Es=", - created_at: ISODate("2025-10-03T01:26:41Z"), - }, - { - _id: "trk-186e11012a6c5038373ca424", - name: "elegant_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "8EDKjQSUKiXXv3BUbQ7Ng91j4f/GSr7+QAIqaqKKMII=", - created_at: ISODate("2025-09-26T23:21:41Z"), + device_type: "public_transport", + private_key: "UcYyvLXTyMi7vygZia8WHT6jtc+F7Ee2C01o5xS1Nr4=", + created_at: ISODate("2025-09-26T23:16:26Z"), }, { - _id: "trk-186e11012a6c63905c65aa55", - name: "gentle_darwin", + _id: "trk-186e120746f234b4f6c9f2c7", + name: "dazzling_babbage", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "Ynce/psEdLCbWCWGioAf0HMx1MoJogKuY2J/IINSvrI=", - created_at: ISODate("2025-09-29T19:02:41Z"), + private_key: "6u6OQXrxzetXHuITD4hRFsWMbJ7MMgaJAGicOFOX19Q=", + created_at: ISODate("2025-09-20T10:30:26Z"), }, { - _id: "trk-186e11012a6c78882c93ea30", - name: "curious_glashow", + _id: "trk-186e120746f24e76ff131fe3", + name: "upbeat_ohm", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "Wi4UYso0KKCSWpEsWXWhwtehcDXOdFaRFWJccD35X34=", - created_at: ISODate("2025-09-22T01:47:41Z"), + private_key: "luzQWGdL+UzgoVO3aaIeSFYdqpx0MOd//U49+sKZBR4=", + created_at: ISODate("2025-09-24T03:21:26Z"), }, { - _id: "trk-186e11012a6c8d0b88d582b1", - name: "groovy_poincare", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "C9UUSbi10tePQNX8CV9S878FAZepKSHW20mstzqcEl4=", - created_at: ISODate("2025-10-06T10:26:41Z"), - }, - { - _id: "trk-186e11012a6ca08e30bd58f3", - name: "eloquent_oppenheimer", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "ckphAdHxUOhQalPf/Alkhrlpn7LdWuIxEU8OM166IPw=", - created_at: ISODate("2025-09-21T06:30:41Z"), - }, - { - _id: "trk-186e11012a6cb4ea3bd9ddc8", - name: "inventive_jobs", + _id: "trk-186e120746f267cbf0b2059a", + name: "furious_hertz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "Nk5bQv/tQLsoZ9sLhMxT7x8ACDjvKCA1HM2kNLDq2gA=", - created_at: ISODate("2025-09-27T12:10:41Z"), + private_key: "nsgQCOmszyc8AS0cr/jasr6AqOfBCjGWWqBOEH3JYAQ=", + created_at: ISODate("2025-09-17T10:52:26Z"), }, { - _id: "trk-186e11012a6cd94db91adead", - name: "kind_einstein", + _id: "trk-186e120746f2814d7e0754b6", + name: "affectionate_poincare", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "oSIz2hlKwllgzLLWEqJiHAvZniIPqIzT7LrB5OpceHY=", - created_at: ISODate("2025-10-04T13:01:41Z"), - }, - { - _id: "trk-186e11012a6cedcd79e9453b", - name: "modest_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "qFydjWVyh4o6yZpaPJ+IyZDayBFD5kMSwUuz5AyDFzc=", - created_at: ISODate("2025-10-09T12:27:41Z"), + device_type: "food", + private_key: "itBD6WM9tftIGfAJilP9de2TJa8Vog2wDz0ipw43Lgc=", + created_at: ISODate("2025-10-11T07:02:26Z"), }, { - _id: "trk-186e11012a6d027b8a123406", - name: "magnificent_faraday", + _id: "trk-186e120746f2a3d87f0eeca4", + name: "frosty_kolmogorov", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "LPcO0cx0s2Uka6nphi9sMBXu3xkSslMYIGQYsXUrv2g=", - created_at: ISODate("2025-09-28T02:23:41Z"), + private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", + created_at: ISODate("2025-09-13T16:47:26Z"), }, ]); diff --git a/services/playbooks/roles/mongo/files/init.js b/services/playbooks/roles/mongo/files/init.js index f1291528..f8abe2d4 100644 --- a/services/playbooks/roles/mongo/files/init.js +++ b/services/playbooks/roles/mongo/files/init.js @@ -51,7 +51,6 @@ db.users.insertMany([ expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), }, ]); - db.devices.insertMany([ { _id: "trk-18608d12c8414acfcb9165b1", @@ -853,1604 +852,805 @@ db.devices.insertMany([ private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, + { - _id: "trk-186e11012a5561d480d2e2eb", - name: "fervent_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "kqtwRUbhMyVd17VSGcNacCgknCqXG/nbTZ0TpdkHuG0=", - created_at: ISODate("2025-10-02T06:02:41Z"), - }, - { - _id: "trk-186e11012a596d43fd69108e", - name: "mystifying_riemann", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "kgpHr5wgALwkGS3rZ++yHMFJVyQyM7PtocptH7xWA8s=", - created_at: ISODate("2025-10-07T20:48:41Z"), - }, - { - _id: "trk-186e11012a598ad93ff98c88", - name: "fabulous_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "qPL22InLNt+qxCMYNI9IbWqUnFX6XMlldzxiwEeIGew=", - created_at: ISODate("2025-10-02T22:25:41Z"), - }, - { - _id: "trk-186e11012a59b19903d892f0", - name: "sweet_ramanujan", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "cFe3cCf75MF+sDHwumwNz/8AarbzIZ8gCjI4K2kzYOY=", - created_at: ISODate("2025-10-11T14:40:41Z"), - }, - { - _id: "trk-186e11012a59cb26e0075b2a", - name: "distracted_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "O5pJz4gxI9odDLTT1yPIZBm6Twnr4C8IGkDt7zoKxho=", - created_at: ISODate("2025-10-08T20:34:41Z"), - }, - { - _id: "trk-186e11012a59e3d14be606df", - name: "proud_weber", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "T4T4gHgXrdMXUd7J1lyDO+f62DcmrAbUUA9qOxc7Uvw=", - created_at: ISODate("2025-09-22T03:41:41Z"), - }, - { - _id: "trk-186e11012a59fa7cd3c6dce1", - name: "hyper_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "AY7Rf9qa1Ly/e6kF10FKT570Bg/qlFAKP7bsMUgb9rg=", - created_at: ISODate("2025-10-13T11:43:41Z"), - }, - { - _id: "trk-186e11012a5a13d3a9db4772", - name: "groovy_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "wv7hUUOS/l5gPcyEyWtqIWfL1B9l+6TOUDaXR1VpqCc=", - created_at: ISODate("2025-09-23T22:15:41Z"), - }, - { - _id: "trk-186e11012a5a2d27c9191da5", - name: "great_cooper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "w3E6srVzISB3/6RwJLThuqXCIuB/mwVUnb1+jjq0tGc=", - created_at: ISODate("2025-09-17T05:12:41Z"), - }, - { - _id: "trk-186e11012a5a4494864fe415", - name: "goofy_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "RD0xX5dLEAtLQqoFSwNI6sXRFt8uXbvBF/kqUb8fWKs=", - created_at: ISODate("2025-10-01T18:21:41Z"), - }, - { - _id: "trk-186e11012a5a5a58df5eaad8", - name: "cranky_tesla", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "olYsIof8//f0fRwqpmsB/oSBGhxAgUd6SDALBkLkEfA=", - created_at: ISODate("2025-09-27T16:56:41Z"), - }, - { - _id: "trk-186e11012a5a6f0b11c08ea9", - name: "optimized_hertz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "/im+6GYjhW6G/az/9KVzuhYzypbLSgxm2feoKBAUVWo=", - created_at: ISODate("2025-10-03T17:42:41Z"), - }, - { - _id: "trk-186e11012a5a8326235064aa", - name: "funny_ampere", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ps9v0p2pfDjjNlIkqZijXseLsZ7I34N1l6w8ss9Gbjo=", - created_at: ISODate("2025-09-20T16:23:41Z"), - }, - { - _id: "trk-186e11012a5a98929c44b902", - name: "phenomenal_schwinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iqgX85qTfX4Xy5rDlMuuw6y+EmGy1qcdLBz+VGr3PtY=", - created_at: ISODate("2025-09-18T23:10:41Z"), - }, - { - _id: "trk-186e11012a5ace77b59f96f0", - name: "inspiring_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "OKkXfWT+lPo+CFBU71O10ahMByiZEteZpBD+ti6q7oI=", - created_at: ISODate("2025-09-28T16:35:41Z"), - }, - { - _id: "trk-186e11012a5ae586a58fdddf", - name: "motivated_ampere", + _id: "trk-186e120746e18c690d2440c6", + name: "busy_torvalds", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "RVbNIWA0ApYY6MJeib+ONiu8s0hKj8rmlOh/bpnk9os=", - created_at: ISODate("2025-09-27T01:17:41Z"), + private_key: "zlaKfT1zfiGUFjuxVy2BuM9SqDVikurwVXUEmjbeuX0=", + created_at: ISODate("2025-09-26T01:56:26Z"), }, { - _id: "trk-186e11012a5afb592361434c", - name: "nervous_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "ZTduEIFal2ZpIn5lUXO3sYyGgbYKUIwDL6QsiOd5OPw=", - created_at: ISODate("2025-09-26T09:06:41Z"), - }, - { - _id: "trk-186e11012a5b0fbc6d8d33d3", - name: "thirsty_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iLa6/opdNyQaQQBu7hidLlvX6pe1vcomQsgxeP4XfzM=", - created_at: ISODate("2025-09-27T22:01:41Z"), - }, - { - _id: "trk-186e11012a5b23c2f89bddba", - name: "quirky_dedekind", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "soINuZ+4XhQ1HuxX/6WwunLQ2X7on/e0uotjk99sSNU=", - created_at: ISODate("2025-09-29T05:28:41Z"), - }, - { - _id: "trk-186e11012a5b38c33d43a45e", - name: "pious_stallman", + _id: "trk-186e120746e5100364a0d88c", + name: "kind_galvani", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "XXLyX9ffOpj1eI2RIUSjry6b/Rzis15TzinrvmoKoKk=", - created_at: ISODate("2025-10-02T06:37:41Z"), + private_key: "HaEBIVX8wM6DzAJe5H/efqhCLc+y/4Z0tk3qgN5G/KE=", + created_at: ISODate("2025-10-04T02:03:26Z"), }, { - _id: "trk-186e11012a5b4cd44a3a45cf", - name: "sweet_watson", + _id: "trk-186e120746e53a7f8b9db50a", + name: "vibrant_abel", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "jFq96uYH10c+0GshcwZjgkaUHrwOlMjxxUg+xF4LmWg=", - created_at: ISODate("2025-10-02T13:16:41Z"), - }, - { - _id: "trk-186e11012a5b6332148cd018", - name: "admiring_turing", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "XcBe4uqZBIDo/I2SjAImJfBrsNk5N5atDrnrBEYlcqE=", - created_at: ISODate("2025-09-20T10:04:41Z"), + private_key: "U9zhxIXPRmXASGaAW2rJ/MHIDQAhlc8/kO4bS/9V8wU=", + created_at: ISODate("2025-09-17T17:58:26Z"), }, { - _id: "trk-186e11012a5b787f126d15f1", - name: "practical_hardy", + _id: "trk-186e120746e5561da2248999", + name: "beautiful_lee", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "TuHP/ofEOd/2slfenIJ2+66Pg5zgH9Dx8zrmUMpiwYQ=", - created_at: ISODate("2025-09-22T21:16:41Z"), + private_key: "PSGrRaqjl2pJybbEnj17F31N/AncTgx7n1A+32GGzgU=", + created_at: ISODate("2025-10-10T15:37:26Z"), }, { - _id: "trk-186e11012a5b99983857d7f5", - name: "compassionate_morley", + _id: "trk-186e120746e571646ff6b00c", + name: "agitated_penrose", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "04IdX2PAwIbnedM7AXRjXOVS8zMataBOSLI7TLW+sJU=", - created_at: ISODate("2025-10-09T21:19:41Z"), + private_key: "/jxYt11fVWtx9+OLZcmO0664Lshxu+L9+Er2/DB5j8I=", + created_at: ISODate("2025-09-15T22:14:26Z"), }, { - _id: "trk-186e11012a5bae42c3d6ccfc", - name: "enchanting_lagrange", + _id: "trk-186e120746e592b6ef437676", + name: "serene_knuth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "jWiaC8MyTsXV7n9K8UswTxuDiTJVEIndjeVBj4wu4WE=", - created_at: ISODate("2025-09-29T10:41:41Z"), + private_key: "TBkHjWmYDA0m2prmSZqqk7wKO3FMAjNfNcwLbamTl14=", + created_at: ISODate("2025-09-18T02:02:26Z"), }, { - _id: "trk-186e11012a5bc46607105b2a", - name: "elated_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "6JHQq/8pK9dyk6FjNo1CJbE8fsysTpVn2qmKtzys390=", - created_at: ISODate("2025-10-09T17:09:41Z"), - }, - { - _id: "trk-186e11012a5bd9cfb0f5b31d", - name: "jolly_fermi", + _id: "trk-186e120746e5b57fe57e549f", + name: "boring_crick", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "+hoDuiVnwHeNSQ5DzwzkgiMxGMKmOE2ni/mX6UfTXhY=", - created_at: ISODate("2025-10-06T04:04:41Z"), + private_key: "r5PJU83UZ0IsuJuMgFEZJy41dymcmoOCTVTGNe+fYp4=", + created_at: ISODate("2025-09-16T16:44:26Z"), }, { - _id: "trk-186e11012a5bed6777eda1c8", - name: "elated_stallman", + _id: "trk-186e120746e5d2cfd3ad47f8", + name: "proud_curie", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "B6a9x6vz+tkuC+S2OQzxuJCv/MAGViKAPMjokDzYZhU=", - created_at: ISODate("2025-10-09T01:10:41Z"), + private_key: "rwrEdWc3CovyYsAYXvhIojm2vM7RQf7R4waNRm7rZDQ=", + created_at: ISODate("2025-09-18T01:04:26Z"), }, { - _id: "trk-186e11012a5c1ccccb9b0a4e", - name: "gifted_noether", + _id: "trk-186e120746e5f3b0e0bd40a6", + name: "epic_hopper", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "mjsPzOv/5a+iF09A8svypYFonKHJCZuQWTOjzWLyhbc=", - created_at: ISODate("2025-10-03T05:26:41Z"), + device_type: "food", + private_key: "NH0AzwhXWUdFM8m6r6FVT+2C2f9KsD++CHWAqRsrCIg=", + created_at: ISODate("2025-09-25T17:10:26Z"), }, { - _id: "trk-186e11012a5c4401a63b0f3c", - name: "confident_thompson", + _id: "trk-186e120746e61249f492cc92", + name: "fervent_ritchie", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "lS2fQ0b5IPEvW0EClWkOxPbRrWl45bp1EZe0psee2pc=", - created_at: ISODate("2025-09-17T06:55:41Z"), + private_key: "IpaYNNClPfrs776+wldgliZ/UenF/fN5qlY6R+R99kA=", + created_at: ISODate("2025-09-26T00:33:26Z"), }, { - _id: "trk-186e11012a5c59dd750d2c06", - name: "fascinated_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "h5di5PLrxdJirC1m7RDe61/DqOgoSfJ6XiELleXZKjE=", - created_at: ISODate("2025-09-21T10:00:41Z"), - }, - { - _id: "trk-186e11012a5c6ee1af951199", - name: "keen_jobs", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iUvf42OIcqd1e5Nbemgjy/vLfAwaZERGyd2TAgbX61c=", - created_at: ISODate("2025-09-19T06:23:41Z"), - }, - { - _id: "trk-186e11012a5c830dd37874fe", - name: "goofy_curie", + _id: "trk-186e120746e62e8b1e50c009", + name: "optimistic_noether", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "MsqIwOOiR1bYD/zWIOo0HGFH4rJ/nQXKMUPHxZeA86w=", - created_at: ISODate("2025-09-18T06:06:41Z"), - }, - { - _id: "trk-186e11012a5c98b36f264650", - name: "hyper_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "4Pjt6Nz5Cggifiww9tnVOs+TA/Z4ETuw5FLqlsQ87bs=", - created_at: ISODate("2025-10-03T02:10:41Z"), - }, - { - _id: "trk-186e11012a5cad311c595ad1", - name: "determined_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "YfSXzGiI3cbp/vM2b6ke/UUkxwUhKkywqAyvmFGXPp8=", - created_at: ISODate("2025-09-15T15:21:41Z"), + private_key: "dPgcLmsJh0nU5IyAjyhyCfHij0NkswJC7aLqhGnKdE4=", + created_at: ISODate("2025-10-01T22:39:26Z"), }, { - _id: "trk-186e11012a5cc574d6d81de8", - name: "sleepy_pascal", + _id: "trk-186e120746e6498c6e55e12f", + name: "keen_ohm", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "RpSxQsx5LqFUFbbolTRrnA2C/LsiAwMoS/NbIorA0Rc=", - created_at: ISODate("2025-10-13T02:34:41Z"), - }, - { - _id: "trk-186e11012a5cd92693beffd9", - name: "tender_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "SiyPQhaSZFCUe0EwhzwEHn0ZGF+auw09D5WdkXv5JUY=", - created_at: ISODate("2025-09-13T16:36:41Z"), - }, - { - _id: "trk-186e11012a5ced9d9a7f3282", - name: "thrilled_fourier", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "z5hY1D4uamwjhBUigsuQIVYStk8LkS7IHGffvP1g+Ig=", - created_at: ISODate("2025-10-08T08:28:41Z"), + private_key: "6sBH2HqlO06ZS6qpAZ75i/0LOb5FEWXK+bbBfyTDZrU=", + created_at: ISODate("2025-09-23T09:49:26Z"), }, { - _id: "trk-186e11012a5d018136d48bad", - name: "enchanting_euler", + _id: "trk-186e120746e6a53392e5a1d6", + name: "dreamy_morse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "pr3lrF2O5U3f0Yf1DbFhdmz7g1YZ9ORKszdAOQ4n1Ek=", - created_at: ISODate("2025-09-23T02:49:41Z"), + private_key: "AdaUNQ0ddcyYZlMHzoFPFDiM+lQS9akdrF086C5uvnU=", + created_at: ISODate("2025-09-19T01:06:26Z"), }, { - _id: "trk-186e11012a5d1517f5b46305", - name: "lucid_gauss", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "FOZHubOJabF1/4rPcKbm2R/RqIACyC3tS+Pw3L9QCzI=", - created_at: ISODate("2025-09-25T15:54:41Z"), - }, - { - _id: "trk-186e11012a5d2988550c5169", - name: "admiring_torvalds", + _id: "trk-186e120746e6c07ef43e3d13", + name: "outstanding_stallman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "GkO3pzWOMm260vTOzGd/uvB6+Qh4gMrYQlObQBrJQ1k=", - created_at: ISODate("2025-09-27T13:02:41Z"), + private_key: "yVvpMOeozwtyH1gS4y8hrDO9hftYbwpzjZeVPwwYwZs=", + created_at: ISODate("2025-09-21T03:27:26Z"), }, { - _id: "trk-186e11012a5d3cf2b2ca7686", - name: "polite_heisenberg", + _id: "trk-186e120746e70513852edb0f", + name: "faithful_knuth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "wxoIImrWfV0Ni4PHBqwv4AX4HL7g+AOyRII7dYyWrZk=", - created_at: ISODate("2025-09-28T10:14:41Z"), + private_key: "8GbhtHVXcN9Yyi41F2wh/aR5Wdarq9uvYZLMoOyD8NM=", + created_at: ISODate("2025-10-09T08:08:26Z"), }, { - _id: "trk-186e11012a5d598c29d80cbd", - name: "pious_pascal", + _id: "trk-186e120746e7235b73eb8923", + name: "modest_gauss", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "pgtlmBy0mJuE+ekgqsI0DfDv/QS36Yr3Ma87avO+KOw=", - created_at: ISODate("2025-09-24T19:23:41Z"), + private_key: "NmFP6t/trYYOSAQLQgdDJhheahC7kO3kDwuwEFLqeCE=", + created_at: ISODate("2025-10-10T04:12:26Z"), }, { - _id: "trk-186e11012a5d7a7b4bf73935", - name: "quizzical_ramanujan", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "ncLNvzOa6UENXO7wLqTs+rCICEF7vJDmSZiX4ir+8Ow=", - created_at: ISODate("2025-09-14T23:15:41Z"), - }, - { - _id: "trk-186e11012a5d8ece5f7bdd8e", - name: "youthful_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "OJc1uL9AIAsjFi4Dptjh3CpPrmTUF8B6DkjskEMsjTg=", - created_at: ISODate("2025-09-16T03:07:41Z"), - }, - { - _id: "trk-186e11012a5da3cbc19a0fb8", - name: "admiring_weinberg", + _id: "trk-186e120746e74151fb9b3cf6", + name: "clever_volta", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "ISYhC21HlX9IcsYUexG5NV0yDjNTmn9lfUQvKSe+JlQ=", - created_at: ISODate("2025-10-11T17:33:41Z"), - }, - { - _id: "trk-186e11012a5db8028171234f", - name: "compassionate_fermi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "gSyfyQDT6eZsiT8tI2wzDGv5Q6g/UYxW0QWaKjLlu/0=", - created_at: ISODate("2025-09-29T02:33:41Z"), - }, - { - _id: "trk-186e11012a5dcc1a6befda29", - name: "jovial_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "eClDfBHCPZ9Kg/fLpky6AzS9O0HOz8Os6PjlnrKsSwg=", - created_at: ISODate("2025-10-01T18:59:41Z"), + private_key: "K4eXVoUnDViQyeemkL77tJ7PLSTA5LB+dLqNtd8OfH4=", + created_at: ISODate("2025-09-17T02:43:26Z"), }, { - _id: "trk-186e11012a5ddfa3062f0ff4", - name: "playful_euler", + _id: "trk-186e120746e75e602ef60dd6", + name: "determined_jacobi", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "P/K62OGL3lwTqYsRXK+OnlMehWZorMlphuQ3roNexo8=", - created_at: ISODate("2025-09-28T09:33:41Z"), + private_key: "T6f5G5JQUuSrCJ9DnXquzN4IXarA+Og67HsRUQU1eHY=", + created_at: ISODate("2025-10-13T13:50:26Z"), }, { - _id: "trk-186e11012a5df4297b52a885", - name: "original_pauling", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "UxLu9YkY6L0rP3ctdmm9Lzaye9LMCSYPNSKLWyYssMc=", - created_at: ISODate("2025-09-30T20:32:41Z"), - }, - { - _id: "trk-186e11012a5e25d0d813f27a", - name: "dreamy_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "9o3ngbgcWUGQlPEkSflgrOWTiyXLhJ0QYh49t7IqozA=", - created_at: ISODate("2025-09-26T17:36:41Z"), - }, - { - _id: "trk-186e11012a5e3b84ff471fbc", - name: "merry_salam", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "gKiNSB7OCpbcZoHozoLUAYMjMmPDNBMzc979JU+nXp8=", - created_at: ISODate("2025-09-22T13:28:41Z"), - }, - { - _id: "trk-186e11012a5e4fe06bc4b394", - name: "gifted_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "s6lWpBP1VLeSvOzO3oRe8ypkEqOtkwNaLV0UOQNCG14=", - created_at: ISODate("2025-09-20T06:28:41Z"), - }, - { - _id: "trk-186e11012a5e63602bb29a90", - name: "gifted_hopper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "Vjb7DaSJfMV3nITbX00INyTkeOVeVksoA8davwEU7kw=", - created_at: ISODate("2025-09-15T03:44:41Z"), - }, - { - _id: "trk-186e11012a5e779fee7fdd35", - name: "flamboyant_hertz", + _id: "trk-186e120746e77af4a17ef004", + name: "fervent_whitehead", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "z4QNKZrnZ4T6HCRNScL4WkSTUxhjRGTIk28IZupKHno=", - created_at: ISODate("2025-10-07T04:55:41Z"), + private_key: "+klSDF5Jvl3Cjkjr/GwKxBwusArwojYmcgURQQT6DPs=", + created_at: ISODate("2025-09-23T21:27:26Z"), }, { - _id: "trk-186e11012a5e8da24c25c62b", - name: "charming_stallman", + _id: "trk-186e120746e798d285808a70", + name: "bold_fourier", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "G37P8VjO95i4gKG8yTRCQ1UZRoh/JaaRpRNf7A2gVBw=", - created_at: ISODate("2025-09-23T16:34:41Z"), - }, - { - _id: "trk-186e11012a5ebbf1e05fc63e", - name: "fabulous_lovelace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "lsFvUa0rjoRlqjqCUXUUjSI0dE/s9DCcwx59f9pqokU=", - created_at: ISODate("2025-09-25T08:39:41Z"), + device_type: "other", + private_key: "4zwMIKqs8mtNveECyMvcFt+K7OedZ+MnOS6o42EUEWU=", + created_at: ISODate("2025-09-17T06:50:26Z"), }, { - _id: "trk-186e11012a5ee64eba1cad79", - name: "pious_compton", + _id: "trk-186e120746e7b4c678103ccf", + name: "boring_hardy", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "QiSWe4sEtEfa1SfVBNVSkoTmBjvWjAsVjk6cU8qMSsQ=", - created_at: ISODate("2025-09-16T04:17:41Z"), + private_key: "9cgnzOXmKaVWCBpvyfEC1rIo2coYrpOPrW2ZcvmHO9E=", + created_at: ISODate("2025-09-24T18:31:26Z"), }, { - _id: "trk-186e11012a5efba40cd780d6", - name: "merry_carmack", + _id: "trk-186e120746e7d271ec706172", + name: "sleepy_pauling", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "sgHilxpLlIiMOnig/XHEMha97TYevSbZGlW43f1yiJA=", - created_at: ISODate("2025-09-23T05:15:41Z"), + device_type: "other", + private_key: "2+j+X2Im01XBzllw/xpq1fq8M2TxlOos/ClmmD0Gzaw=", + created_at: ISODate("2025-10-10T06:17:26Z"), }, { - _id: "trk-186e11012a5f455a1b0ae79f", - name: "sad_berners", + _id: "trk-186e120746e7ef79f6ee0e1b", + name: "exotic_ritchie", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "tkwiKvo7W+azl1ZgLtmP6KiHbTrctOLCbqJoBVY3+Pg=", - created_at: ISODate("2025-09-27T09:48:41Z"), + private_key: "E+6m5pEZbh0VyR2hmRRe4xJ4HzGBUn3qAVxCu0jeydY=", + created_at: ISODate("2025-10-12T18:18:26Z"), }, { - _id: "trk-186e11012a5f5a92a359b79a", - name: "hopeful_kleene", + _id: "trk-186e120746e80afd0d8d37e1", + name: "beautiful_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "UZNlMvRRozvA3/by9ehRSuaORegK0JDh8hYtWSv5D5E=", - created_at: ISODate("2025-09-25T06:00:41Z"), - }, - { - _id: "trk-186e11012a5f70141806a956", - name: "heartwarming_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "Wyl507rgkRX41yNgrQfTTwagqZJiWVCchcSPf80Vr4Y=", - created_at: ISODate("2025-10-08T18:23:41Z"), - }, - { - _id: "trk-186e11012a5f83c95653663c", - name: "thrilled_bohr", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "SJUN1nvUtlSD63P6M1pNKWYGuqRnClFwySGI67lEtV8=", - created_at: ISODate("2025-10-11T19:04:41Z"), + private_key: "SMPBDRGLD9aVElnzLvrsHyRgrM4ywaxwQa+ybapdStM=", + created_at: ISODate("2025-09-24T17:20:26Z"), }, { - _id: "trk-186e11012a5fbf4095b28646", - name: "crazy_ampere", + _id: "trk-186e120746e833b3dfa6e5ff", + name: "jovial_kolmogorov", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "b7sAMnrwZm2e2JOu7cVFnmMKCIsxRmmX0CLCRvpnteI=", - created_at: ISODate("2025-09-17T06:38:41Z"), - }, - { - _id: "trk-186e11012a5fd5659402dfeb", - name: "beautiful_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "C4HJyzN27U5jNQShQqk7fnHJ0konB+TtJFIj7xs43mA=", - created_at: ISODate("2025-10-01T08:32:41Z"), - }, - { - _id: "trk-186e11012a5fe94d9f033641", - name: "busy_salam", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "GbomR1IEdZvcIsX+Dy851wwBAKv8bUNkysnlhbt9C30=", - created_at: ISODate("2025-09-19T19:45:41Z"), - }, - { - _id: "trk-186e11012a5ffd352413b530", - name: "sweet_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "aE4zj1h+9vRvYSUqtNKT2kK7tyN9T2LSjgoMGkzR0hc=", - created_at: ISODate("2025-09-18T03:51:41Z"), + device_type: "other", + private_key: "X9ZHSPIBXi5gsoXM0LO7Lsuv8LbVA8EMv/y/J8jXKMc=", + created_at: ISODate("2025-10-01T03:02:26Z"), }, { - _id: "trk-186e11012a6011b32b9939db", - name: "cranky_siemens", + _id: "trk-186e120746e851854660544e", + name: "serene_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "WkrTgRmQtbMyiFIRM7JfBCOwGzECjGGi1UiA6dBubJg=", - created_at: ISODate("2025-09-23T16:26:41Z"), - }, - { - _id: "trk-186e11012a6025cbee1dc98f", - name: "blissful_tesla", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "FAfD4UVHwonn9QY8HE3J6YRhnTqwMC/biyPPVTMhIJM=", - created_at: ISODate("2025-09-19T03:15:41Z"), - }, - { - _id: "trk-186e11012a60395b38d1954d", - name: "wonderful_bose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "0ZVm9mi4yq2YZmKogeRDlOGXu7gEnQ7cG82XHajyw7E=", - created_at: ISODate("2025-09-22T20:47:41Z"), + private_key: "L82m2B58IsoddlmF+eoMnwMpmn3VEBQiAjxGlx854CA=", + created_at: ISODate("2025-09-17T21:44:26Z"), }, { - _id: "trk-186e11012a604e0f101a26f5", - name: "keen_salam", + _id: "trk-186e120746e86e09d1953e23", + name: "blissful_leibniz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "G7IWRP6d+zX+f4t06gbwgZb/rX1w+AYdQh6jWKykaio=", - created_at: ISODate("2025-09-22T09:00:41Z"), - }, - { - _id: "trk-186e11012a606e6ca1634990", - name: "dreamy_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "Mh4A9NA3GlJStCAaNbYu63n8pvkDhpHLq2HeYximta8=", - created_at: ISODate("2025-09-21T00:51:41Z"), + private_key: "uW6S9QZqdTN9n8nROsXWugdetpdTwdD/NAgsHfVlKVQ=", + created_at: ISODate("2025-10-11T13:42:26Z"), }, { - _id: "trk-186e11012a6084b2c8b9789b", - name: "brave_markov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "YqbWAlf5lqPZZO61QKdUNMQ5PL85q3AKbgGuMNJLsrE=", - created_at: ISODate("2025-10-10T05:45:41Z"), - }, - { - _id: "trk-186e11012a609969074409b4", - name: "interesting_shockley", + _id: "trk-186e120746e88add15d6df47", + name: "clever_berners", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "X4IIHw+lyQjKqgcB69gAUJ3knVD+o8Ag0SzaDBXLfYM=", - created_at: ISODate("2025-09-25T09:28:41Z"), - }, - { - _id: "trk-186e11012a60b6113f2cd70a", - name: "practical_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "H/obZQPI2CjXl3/+iQvKS91VGPr/54k+HvB/wBjqewA=", - created_at: ISODate("2025-10-12T01:59:41Z"), + private_key: "zioq96s+Os5u0wkjaOfUO9dZId7OHr8otFLIdl+4qfc=", + created_at: ISODate("2025-09-17T09:35:26Z"), }, { - _id: "trk-186e11012a60c9972502d08e", - name: "flamboyant_carmack", + _id: "trk-186e120746e8b7c338ebf0df", + name: "sweet_babbage", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "dCVwn4KsGiF15UDSiICW8XAf3hlt02zRQBFzst2Upa0=", - created_at: ISODate("2025-10-06T16:44:41Z"), + device_type: "other", + private_key: "fDrzR+XXddUMT7sjv1lTdCqCrMxpIuoFhJF/FjORBTM=", + created_at: ISODate("2025-10-13T14:47:26Z"), }, { - _id: "trk-186e11012a60de635b74de91", - name: "fabulous_fizeau", + _id: "trk-186e120746e8ea3b02c4a2e1", + name: "frosty_feynman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "0Diry3mQtd7f6U71EzhhOralUkl5TuXtECAcEs1UvJY=", - created_at: ISODate("2025-09-25T08:13:41Z"), + private_key: "jzW8kxhoYXRGZAEfemost+RLvfyaXeAqCdA6Tvbrx4k=", + created_at: ISODate("2025-09-24T13:14:26Z"), }, { - _id: "trk-186e11012a60f293acfce4bd", - name: "amazing_weinberg", + _id: "trk-186e120746e9075df66cb3b3", + name: "strange_wiener", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "c0uOtAw/jol27F5ACAuPp0ZilplgXsyg0NanHhrvZqY=", - created_at: ISODate("2025-09-25T04:13:41Z"), - }, - { - _id: "trk-186e11012a6106547d1f2ae9", - name: "angry_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ol7nIFhU3b3bcy9yDLnczvFj2nljpwMpSMg7bDzlSuQ=", - created_at: ISODate("2025-10-02T23:11:41Z"), - }, - { - _id: "trk-186e11012a611ae837d02d84", - name: "eloquent_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "FpyhfLIqw3aNKpj92kh9fqtz7V8os4gcBnUkon4NhMc=", - created_at: ISODate("2025-10-05T13:47:41Z"), - }, - { - _id: "trk-186e11012a612e3424e7f252", - name: "eloquent_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "dbFscVYmKeQXtbevJl2NaSCC05aecEO0ERqmCzy/vh8=", - created_at: ISODate("2025-10-12T14:51:41Z"), + private_key: "uv7ZnF4gR7DRC3GsRjup4ai5zG3Lm/V7rmeUW+MN1jg=", + created_at: ISODate("2025-10-05T16:02:26Z"), }, { - _id: "trk-186e11012a614244a9f7ad63", - name: "eager_bohr", + _id: "trk-186e120746e924c657e20745", + name: "noble_gates", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "MCfkq7yy3jSxqVD7foTf2AyApWXuEsSvxRtK1viEqg4=", - created_at: ISODate("2025-10-05T22:56:41Z"), + private_key: "HTPI0EkycKDjtalFGyzwQhWo64m8tWlgruPc6ytZnuU=", + created_at: ISODate("2025-09-26T02:08:26Z"), }, { - _id: "trk-186e11012a6156ad70dbb8a5", - name: "upbeat_pauling", + _id: "trk-186e120746e941381aa9726f", + name: "hyper_cauchy", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "yFKv3ZRd0K0RIU/U4cRQRJ3NgTIDUDqyes4nBvc1tw0=", - created_at: ISODate("2025-09-25T09:30:41Z"), + device_type: "food", + private_key: "BymguFW23joJGerJ6vLEL9MqDeSUD+Gu6nIAY2uLEJw=", + created_at: ISODate("2025-09-17T02:25:26Z"), }, { - _id: "trk-186e11012a616ad6c72ceb10", - name: "energetic_berners", + _id: "trk-186e120746e95d892be20fae", + name: "beautiful_whitehead", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "AKo95ylXOqXlEeFx50EAe0LmXlLpv9AQ4Tj8eSs23rw=", - created_at: ISODate("2025-09-24T10:40:41Z"), + private_key: "CWlkHtuXinZ28j9pb59SPhjAJZtMTwnRtrXWe0ztijA=", + created_at: ISODate("2025-10-06T15:58:26Z"), }, { - _id: "trk-186e11012a617e4c3b7c0314", - name: "thirsty_coulomb", + _id: "trk-186e120746e97c1f615d85ec", + name: "original_kleene", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "pIhsQZ0pLeBgUlN83JnyiyRaUDe3Hd8MO6+PE82K2r8=", - created_at: ISODate("2025-10-03T02:28:41Z"), - }, - { - _id: "trk-186e11012a61a0c003e59de7", - name: "jaunty_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "X0J4Sjvyr4wvcx8ycuehCIJo3Lzhll9Ra7SuN3av/7k=", - created_at: ISODate("2025-09-15T01:27:41Z"), + private_key: "QJ+QtIFC9ydN3CZEHrhY+TYoM95H9JZ9y9fAwNcMCpw=", + created_at: ISODate("2025-09-14T21:36:26Z"), }, { - _id: "trk-186e11012a61e53f8f9d9afa", - name: "frosty_curie", + _id: "trk-186e120746e9f277df403d3d", + name: "jolly_salam", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "+e56TLqJbgbLjvCzKEUYWMKoxEj8bxR/rIl/uo52lGA=", - created_at: ISODate("2025-10-03T14:14:41Z"), + private_key: "HQDyTFoUqsHhVWbmVD148+qm4lQOKBp5bMdtXRwbM1s=", + created_at: ISODate("2025-09-28T18:07:26Z"), }, { - _id: "trk-186e11012a61f975f08a6968", - name: "confident_noether", + _id: "trk-186e120746ea1f2ea4d89687", + name: "exotic_berners", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "DwsZb+mxVf2zfcO3BppyRDKum6jrOwEd0L5QZbQ1Dqo=", - created_at: ISODate("2025-10-11T04:13:41Z"), - }, - { - _id: "trk-186e11012a620da465a07444", - name: "xenodochial_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "WvrUfkbDS9F4ls35iTZLBPr7HYCCpHrAyQlIEZBxy9k=", - created_at: ISODate("2025-09-29T03:14:41Z"), - }, - { - _id: "trk-186e11012a6221372c49d336", - name: "amazing_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "mQYmIvXJbzbkuNOqJOnZuu8Kx1901BNeU1YgeB2NYIg=", - created_at: ISODate("2025-10-09T15:00:41Z"), + private_key: "Y9z4ZdSWN8SPus1VpxPdFwSalBOr0xD60zRJdhCitbg=", + created_at: ISODate("2025-09-21T05:39:26Z"), }, { - _id: "trk-186e11012a623cc2f71b8aa6", - name: "puzzled_einstein", + _id: "trk-186e120746ea41e63919641b", + name: "funny_cooper", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "Dv+emuCZKoZRsiOrnQrUEq4NO58l3Yb11/09cjVMyyc=", - created_at: ISODate("2025-09-17T07:44:41Z"), - }, - { - _id: "trk-186e11012a625185a495eaae", - name: "flamboyant_rutherford", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "XaVo9DLAYQrrs+LtTXtrAZBwCvkOms3Ldgx+os3gXWA=", - created_at: ISODate("2025-09-18T12:19:41Z"), + private_key: "TYzBRY/HUoh5LpTEAeDcfshVDp7XIxVmsLOmAsFCSU4=", + created_at: ISODate("2025-09-25T17:16:26Z"), }, { - _id: "trk-186e11012a62658c881b9e94", - name: "exotic_pauling", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "gbXGqzXlvoAraIZsIhJPe+6ew8YKDINoXZxmzPOUYZs=", - created_at: ISODate("2025-09-14T04:53:41Z"), - }, - { - _id: "trk-186e11012a62792845ddb105", - name: "peaceful_einstein", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "JAoVdd3tl8pt112u3AXdNipRltkELT5rNyrvlCQsicI=", - created_at: ISODate("2025-09-16T11:24:41Z"), - }, - { - _id: "trk-186e11012a628e1ded818cc0", - name: "admiring_heisenberg", + _id: "trk-186e120746ea5c4249128d8b", + name: "jaunty_carmack", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "cHAo2YLBFJ+x4aK2ViC3Nnma2qA0AUN1+C2D8q92z3g=", - created_at: ISODate("2025-10-03T01:37:41Z"), + private_key: "Ln6LyXPBc9OF5bxhYJIoBUZ/r9gMHJYJO9b0fyopzaQ=", + created_at: ISODate("2025-09-30T18:22:26Z"), }, { - _id: "trk-186e11012a62a3fabe73f15b", - name: "epic_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "nSFmaA3II6KyzdSHU3CivmRf3TZuTYdEi0RfYuvfq1s=", - created_at: ISODate("2025-09-28T03:48:41Z"), - }, - { - _id: "trk-186e11012a62b8eaf103143f", - name: "confident_dirac", + _id: "trk-186e120746ea750cf69b169b", + name: "thirsty_stallman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "zMHUy3/proqnKMPc6kjAUN2+owr6XhcrVewX89ANba4=", - created_at: ISODate("2025-10-06T09:43:41Z"), - }, - { - _id: "trk-186e11012a62cddcae8cc82e", - name: "motivated_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "JL3tUaHh8FhQzicHyWHNupHhd/LuNg7p47nHFrexJcA=", - created_at: ISODate("2025-09-24T01:39:41Z"), + private_key: "QAONLFQmus2CGZZzlKfGjAADNanq00bK8vaVcBhJo7o=", + created_at: ISODate("2025-10-07T16:31:26Z"), }, { - _id: "trk-186e11012a63006def7f8e13", - name: "trusting_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "DxqgjFVwM58ge+W/YkpZksJAVRpBwFPbWbGEt1+godU=", - created_at: ISODate("2025-10-08T11:28:41Z"), - }, - { - _id: "trk-186e11012a63168e19f956bd", - name: "noble_fermi", + _id: "trk-186e120746ea8e7196b3093b", + name: "adoring_newton", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "ofkivhvxVIHgzyJ5zqaNEbAWx1vT8QzmmGTkJw5bHEc=", - created_at: ISODate("2025-09-21T20:25:41Z"), + private_key: "aCIzO3EwhWTHXQpWQP7BYEvr6W5HybnsMSUEX13mL30=", + created_at: ISODate("2025-09-18T22:57:26Z"), }, { - _id: "trk-186e11012a632bd8e3481c80", - name: "dreamy_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "Q7TmQiaiMbQjm7VkPzDqRm/eFG8Z+jJyEXXxLfLj00M=", - created_at: ISODate("2025-10-13T13:37:41Z"), - }, - { - _id: "trk-186e11012a6341ed35364f6a", - name: "sweet_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "4FEfi7kRIfruyoU2PWlM5UDOheYCpaQYlYSUnFXrLYY=", - created_at: ISODate("2025-09-22T13:38:41Z"), - }, - { - _id: "trk-186e11012a63557184afd5cb", - name: "thoughtful_cooper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "2skB4VoUcPGktZsj+Lkkvi2SlOCVZDATFrne1YbjTqM=", - created_at: ISODate("2025-09-22T14:20:41Z"), - }, - { - _id: "trk-186e11012a636ae2fc55400f", - name: "fascinated_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "4RWNO5fsnmSZY85qtodAGJTFHotYLFKGM225nl8G29A=", - created_at: ISODate("2025-09-29T10:34:41Z"), - }, - { - _id: "trk-186e11012a637f163120a02f", - name: "phenomenal_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "aupdkGLLAlN+EzxwvJ/ls2CtM2oJW0bmpxAE0Wryug8=", - created_at: ISODate("2025-10-03T21:14:41Z"), - }, - { - _id: "trk-186e11012a63957dad4f6e84", - name: "noble_poincare", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "+S5s9+Eb0b19Xh0JwrM4TXl9HCMJxhvurdQZaEFfQMQ=", - created_at: ISODate("2025-10-13T13:52:41Z"), - }, - { - _id: "trk-186e11012a63a9b488c66966", - name: "naughty_compton", + _id: "trk-186e120746eaa755561196c8", + name: "hungry_planck", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "luZOlyueEBLvwHm/GGRaLO89GmcucBCuhb4FrOnnt2s=", - created_at: ISODate("2025-09-21T06:33:41Z"), + private_key: "VKE7UxvJ2bltuQiytSDm2Nv31Iofy06JUwxP8jagn1M=", + created_at: ISODate("2025-10-12T15:43:26Z"), }, { - _id: "trk-186e11012a63bdb21339d43d", - name: "polite_volta", + _id: "trk-186e120746eac0684a411127", + name: "energetic_carmack", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "I62eYTPe2zoU7qyJXJl2Ho1XDj6779SQu+VZzXytdJU=", - created_at: ISODate("2025-09-21T08:37:41Z"), - }, - { - _id: "trk-186e11012a63d3872a73d928", - name: "fearless_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "9jLZgoYP4hmYmWGAEp8zYOv298Wdl5fZdorRjwP8g4w=", - created_at: ISODate("2025-09-30T20:00:41Z"), - }, - { - _id: "trk-186e11012a63fc2dae48253e", - name: "agitated_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "OOSseKFuzABIgwN77wUsojp9BfDEmYJx2OVtIXlohPc=", - created_at: ISODate("2025-09-19T00:41:41Z"), + private_key: "jBN447T6Cs/2lwJOZsyHmrcYfrsWCMa6L9gGT3sblJA=", + created_at: ISODate("2025-09-21T13:50:26Z"), }, { - _id: "trk-186e11012a6419cd9adf15d4", - name: "merry_ohm", + _id: "trk-186e120746eb21c56b310cda", + name: "admiring_darwin", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "OP+bTdgDMNI2Jj2OUlx6WNvoXEHwQS4SOgGs+jE9HQM=", - created_at: ISODate("2025-09-22T21:45:41Z"), - }, - { - _id: "trk-186e11012a6445e9542ceb3d", - name: "enchanting_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "q/HPagRlkUhkpHpenzzpWVYfZIkgkUGlLygjURoNw/A=", - created_at: ISODate("2025-09-23T19:43:41Z"), + private_key: "s5ryhLp1YeNYA5ac6plvh1XbGAbrSinlGEAfFX+XB/w=", + created_at: ISODate("2025-10-02T21:14:26Z"), }, { - _id: "trk-186e11012a64e64acb34fde0", - name: "goofy_kleene", + _id: "trk-186e120746eb4d6d70cf6733", + name: "pedantic_franklin", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "64ZojcN40nrftTyUp9n/iZWlj4OEpy1AKBC2jCdvR3I=", - created_at: ISODate("2025-09-21T18:52:41Z"), + private_key: "1YZoUDeyundPrkyl0bFKSQYfSloEJtJCJAcxri42jsc=", + created_at: ISODate("2025-09-24T04:37:26Z"), }, { - _id: "trk-186e11012a6562f1d5a6bf8e", - name: "faithful_compton", + _id: "trk-186e120746eb649a77fcbe02", + name: "laughing_born", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "NEkkzMX74+vm7O2T57Nj4J7qh+nn8L6q1T3ccAtzCgY=", - created_at: ISODate("2025-10-12T10:39:41Z"), + private_key: "augBE5IFFPq2uubp+cOpB9XSWe6FNzkXRkLZkubX3Es=", + created_at: ISODate("2025-09-24T20:06:26Z"), }, { - _id: "trk-186e11012a657978bd955932", - name: "fascinated_hawking", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Xc3SVOXn4ldKwBxQ7PvyNR2EVweLC3107RrfVnlyqxQ=", - created_at: ISODate("2025-10-05T03:12:41Z"), - }, - { - _id: "trk-186e11012a658deb1cbc74be", - name: "noble_penrose", + _id: "trk-186e120746eba54428a46768", + name: "groovy_bohr", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "UClXMnEWLA1Yo7UnDrmpZHsEfmJ36NJ2mq0gRi/kzcg=", - created_at: ISODate("2025-09-19T02:03:41Z"), + private_key: "IkcQJDdUzKZ2WMpIIQwpknP998gOt0F7MP+EQo/T1Lc=", + created_at: ISODate("2025-09-17T20:37:26Z"), }, { - _id: "trk-186e11012a65a28d6b20ec16", - name: "admiring_rutherford", + _id: "trk-186e120746ebbc9238d17b60", + name: "gracious_weierstrass", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "xP5B7YbXUDqo03XkmCMoN4HKd11IB2X0v3/PJ9D0j5A=", - created_at: ISODate("2025-10-06T14:03:41Z"), - }, - { - _id: "trk-186e11012a65b65ab4a75d16", - name: "suspicious_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "VuYBRBujCPeJuOxpOx08blAYxKbYvY8Y1ZJA3rM4A1M=", - created_at: ISODate("2025-10-07T01:33:41Z"), - }, - { - _id: "trk-186e11012a65ca7f8e2ff72d", - name: "hungry_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "0uH9j+4TMAyIhwWaPvAlFWJna4VeO5y3msirk5a1AHQ=", - created_at: ISODate("2025-10-13T05:12:41Z"), + device_type: "other", + private_key: "40PvNz4whHc4hLO/7Q9lMe6YGJO6ZkMvjN1dA30zAA4=", + created_at: ISODate("2025-10-04T07:08:26Z"), }, { - _id: "trk-186e11012a65de072aa6fc79", - name: "hyper_millikan", + _id: "trk-186e120746ebd0fa0f990530", + name: "thoughtful_doppler", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "M2V/W+wLV6FLLuRhufazGYXP/W+BPlVlQzd0RctuWu4=", - created_at: ISODate("2025-09-23T13:03:41Z"), - }, - { - _id: "trk-186e11012a65f1bb5c146ab8", - name: "affectionate_euler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "dlukp0jdH/mAVx81Jggq/tTmh4WTocws+XItVGgNZsk=", - created_at: ISODate("2025-10-12T02:49:41Z"), + private_key: "CQqhJ/Qj/x1s9H3Y4QuIo5FSGoMjA+ojGYiXskb0RRw=", + created_at: ISODate("2025-09-17T00:05:26Z"), }, { - _id: "trk-186e11012a6605f6bfc85d5a", - name: "bold_markov", + _id: "trk-186e120746ebe5ac2d343d5f", + name: "zealous_laplace", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "mBbpCjOBP7WYxjfrV1Q4Y2btmPCTN9/CMn69w6n0n74=", - created_at: ISODate("2025-10-01T22:47:41Z"), + device_type: "other", + private_key: "y0VUGEVC3cOc4sX1nj7u10m75QasW8LIdwWVs1rf2TY=", + created_at: ISODate("2025-10-04T13:25:26Z"), }, { - _id: "trk-186e11012a661a9459a61af6", - name: "sad_bohr", + _id: "trk-186e120746ebf958faa8280e", + name: "busy_jobs", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "qO3bw/C4KZHq37XZC80hm2R9YjTIMpeX1+N2zqNrjes=", - created_at: ISODate("2025-09-19T18:22:41Z"), + private_key: "OENsQJipdvtlRI+5C8F/phEfSjTHS2F9CWXt+cXGHcI=", + created_at: ISODate("2025-10-01T16:44:26Z"), }, { - _id: "trk-186e11012a662e2caaacfc79", - name: "bold_coulomb", + _id: "trk-186e120746ec4fb0b411045b", + name: "adoring_hilbert", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "doi0T3NH0KKQFn1B+VeNHvs2cWkhsePu3RcDx8SsXWw=", - created_at: ISODate("2025-10-08T02:06:41Z"), - }, - { - _id: "trk-186e11012a6642fad9ad433b", - name: "noble_millikan", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "WfHngSuEcKKpJYPm3OZzpyy9wdlPoIeY37f3LZyC3U0=", - created_at: ISODate("2025-09-21T08:03:41Z"), + private_key: "SAd8SIi1BnSt/9YexlOGPNZ7PJJkigxkvdnqZnwftwo=", + created_at: ISODate("2025-09-25T07:06:26Z"), }, { - _id: "trk-186e11012a6656542d3d3df5", - name: "brave_darwin", + _id: "trk-186e120746ec648c04ccbdc8", + name: "furious_euler", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "PZMa4LTYOCnbubNuPpBy20SdPCWPKLUbwYQrMRMmSQ4=", - created_at: ISODate("2025-10-12T19:49:41Z"), + private_key: "dSLgwgAmj27cw9ET0w8acChymnMLe24CxGCKwdLswbo=", + created_at: ISODate("2025-10-05T02:30:26Z"), }, { - _id: "trk-186e11012a667f0f999e1788", - name: "objective_dijkstra", + _id: "trk-186e120746ecbbbe654ce1d4", + name: "fascinated_morse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "DSAkYqCzbuUC/IKdYB57958uVdw6xJeh+Udq81Ca7wc=", - created_at: ISODate("2025-09-15T11:31:41Z"), + private_key: "bRVy3298YRSHvb3LE1Z6qj07TqEtH0oooPp5HMcGTJc=", + created_at: ISODate("2025-09-19T14:47:26Z"), }, { - _id: "trk-186e11012a669f7c7a33a3d8", - name: "gifted_edison", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "6X4dOBZb3FIU49NpN3/rIHZAIOAIuByFDG9ZIzzJWig=", - created_at: ISODate("2025-10-06T07:54:41Z"), - }, - { - _id: "trk-186e11012a66c666bee85163", - name: "magnificent_planck", + _id: "trk-186e120746eccff893f335f9", + name: "curious_wozniak", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "217RGR3iUaLIAunipv/M9vUDOSFXoeU+EBV9JVMaoTw=", - created_at: ISODate("2025-10-07T12:07:41Z"), + private_key: "pK3c6YRMn7EgtpNs+blSRqgdQL+Ic8drkEx9tX2Dy6c=", + created_at: ISODate("2025-10-11T13:06:26Z"), }, { - _id: "trk-186e11012a66dad625d30e99", - name: "cool_ritchie", + _id: "trk-186e120746ece530a32af864", + name: "dreamy_jacobi", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "YdQcELI6H7m1non4OGLuEY3q/k0897BelN6ipTyY+Zs=", - created_at: ISODate("2025-10-07T03:51:41Z"), - }, - { - _id: "trk-186e11012a66ef33204f6ab2", - name: "cranky_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "ZoW+dJ5hauh/GgX9X8LHQeyYsQiC9JA4MHcilzB7nHY=", - created_at: ISODate("2025-09-23T08:00:41Z"), + private_key: "Ubp1OPiqYtvjmJCrmp9JrPfCFjtLhiUoB+3oC4BTPFs=", + created_at: ISODate("2025-10-04T04:32:26Z"), }, { - _id: "trk-186e11012a670a7c965ce39e", - name: "hopeful_markov", + _id: "trk-186e120746ed08a67703eabb", + name: "exotic_shockley", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "QEbUtqBt9DKtIKXPCtBColR21KG+/IaGvCX2b5fIX4Q=", - created_at: ISODate("2025-09-29T06:52:41Z"), - }, - { - _id: "trk-186e11012a6724c551a0e03d", - name: "elastic_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "7wQz6sa46OhYPTVHd3hi/J+9IQkzyP75RHHzcb6jVhg=", - created_at: ISODate("2025-09-27T17:24:41Z"), + device_type: "private_transport", + private_key: "d2vpnUwGH7ALIWjUKILDnDshEqdD+Roko77fxsHUUqE=", + created_at: ISODate("2025-10-01T23:44:26Z"), }, { - _id: "trk-186e11012a673a41f95f6110", - name: "fascinated_born", + _id: "trk-186e120746ed58f183b2985f", + name: "outstanding_weinberg", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "tY0ax0s6/Me3StBIBA6WtZeYEqY4xhu92+cztJQT2Gk=", - created_at: ISODate("2025-09-19T20:13:41Z"), + private_key: "awREvy0yYRVf2XsYf/tNNIdBL55RXR96sGy7jTw5kl8=", + created_at: ISODate("2025-10-03T13:15:26Z"), }, { - _id: "trk-186e11012a674d8c49e9f91c", - name: "sharp_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "cu0LhNwYjNhjhtE/iz8dEChXyK7xLD2K/+ARgWLPKi4=", - created_at: ISODate("2025-10-12T05:29:41Z"), - }, - { - _id: "trk-186e11012a6760c305264774", - name: "groovy_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "00gF07p5Idgk9MC1ZBX8G2vgFCGTWn9JNn0vB1mcy38=", - created_at: ISODate("2025-09-22T21:48:41Z"), - }, - { - _id: "trk-186e11012a677ead8f9d2983", - name: "intelligent_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "hlU+G1cSuNlV6AQaPR8otssCa3z2x8ajOe2a7/G0gGM=", - created_at: ISODate("2025-09-16T14:08:41Z"), - }, - { - _id: "trk-186e11012a6792a56e8f9da9", - name: "proud_higgs", + _id: "trk-186e120746ed868a048f5dab", + name: "dreamy_hilbert", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "0j2xg1Dz4wSx9JmrPCzXxBafstNKIJGn3rbP+zI3gyA=", - created_at: ISODate("2025-09-25T05:40:41Z"), + private_key: "/t1Coa70kTMW55Qyu4sFA7+LLafl+vt8LxAoAQ0nDLY=", + created_at: ISODate("2025-10-07T20:10:26Z"), }, { - _id: "trk-186e11012a67a641ea4feb26", - name: "amazing_pauli", + _id: "trk-186e120746edbab38815cdf3", + name: "focused_peano", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "SWM2yiSrJeEREx3ug5kSKizRaawH+wO25UoxZPoBwmY=", - created_at: ISODate("2025-09-26T09:28:41Z"), - }, - { - _id: "trk-186e11012a67bac8eedf29e7", - name: "pedantic_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "NLVwZmEa2OL6Z4pqkx0vnA7dXL/fXjuVPIEHUDmq5uI=", - created_at: ISODate("2025-09-15T06:26:41Z"), + device_type: "food", + private_key: "WfNSRmk1sgJsXH/JVHELwriSEAoB5yD4CCyMuGRD/fs=", + created_at: ISODate("2025-09-24T00:54:26Z"), }, { - _id: "trk-186e11012a67cdedf1345929", - name: "hyper_pauling", + _id: "trk-186e120746edd0917f22f06e", + name: "motivated_compton", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "ZyuDt9mXILdg0RunC1pVVUp2AIqk8VNTDFQMRUwgkHg=", - created_at: ISODate("2025-09-28T04:45:41Z"), + private_key: "t4kvEtHD4zNZl6BciX0xcyU8mWDU8YMWEftEQE3eoRY=", + created_at: ISODate("2025-09-29T00:50:26Z"), }, { - _id: "trk-186e11012a67eb89cd8566db", - name: "graceful_marconi", + _id: "trk-186e120746ee2283b18d3081", + name: "groovy_fermi", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "SqeCBkngmr/ehE77ixnv7qHCYZzveMhTu9CwVbQJYNQ=", - created_at: ISODate("2025-10-11T13:27:41Z"), + private_key: "tlIl/BgRMxvE3+uojFxFVzBsUpgqO0DDieAllWAzULA=", + created_at: ISODate("2025-09-14T17:54:26Z"), }, { - _id: "trk-186e11012a6800ec7f035d74", - name: "magnificent_glashow", + _id: "trk-186e120746ee4e09aceffd05", + name: "xenodochial_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "gtaxlYl/+suWErJ7afCt8ATYhAuLSjlx2yvrhC5z0lQ=", - created_at: ISODate("2025-09-24T06:16:41Z"), + device_type: "other", + private_key: "SR7J6zXtzZ+MzTCt+PULdrBEVstzj3j8FWbY8lIEn90=", + created_at: ISODate("2025-09-14T14:54:26Z"), }, { - _id: "trk-186e11012a681436cb176368", - name: "inventive_knuth", + _id: "trk-186e120746ee68da26273cf5", + name: "lucid_nyquist", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "SRpylP5ew5T5/gTc79UHHuN1pwQ6lvfOD8Wphlgprio=", - created_at: ISODate("2025-10-09T12:50:41Z"), + device_type: "other", + private_key: "iakRwwyTjiD+zM7uC7h/UQm6gz6QIVntEhsL5kChETk=", + created_at: ISODate("2025-09-21T11:01:26Z"), }, { - _id: "trk-186e11012a6827f1305b747a", - name: "heartwarming_edison", + _id: "trk-186e120746ee83e08e9af2ff", + name: "serene_lagrange", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "ZydjOjg0DNTrLegVuZNo3Sn8M1islQZvaT6Zcz8QpLw=", - created_at: ISODate("2025-10-08T10:07:41Z"), + private_key: "sZ9jRJt4nahWRjnYbEr8pROMxPW+rMqaEpwcxSbI25k=", + created_at: ISODate("2025-09-24T14:39:26Z"), }, { - _id: "trk-186e11012a683c40c8614731", - name: "thirsty_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "SxZYpfmJKzIPrm87SNVnJ00GpHuOWrcIcw9OJAavBDI=", - created_at: ISODate("2025-09-18T23:04:41Z"), - }, - { - _id: "trk-186e11012a68503e7753741f", - name: "noble_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "g40bfbGnOLmkUhx1i+gx+Y6yzYadiO5yN+cJTufO+JQ=", - created_at: ISODate("2025-10-11T23:20:41Z"), - }, - { - _id: "trk-186e11012a687194b5861e81", - name: "mystifying_kelvin", + _id: "trk-186e120746ee9c5f3732c18d", + name: "cranky_glashow", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "PptUjRBMZNacloj83BxlkSDjB2Z6gFk9CSA8gkhldDg=", - created_at: ISODate("2025-10-06T12:02:41Z"), + private_key: "0x5c9KZ5LXKSmZZqvoYwIRmfmcI/QdC9pzGSw0iUnhI=", + created_at: ISODate("2025-09-30T09:44:26Z"), }, { - _id: "trk-186e11012a68860d931d5095", - name: "nervous_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "lLAwgfhWZbjkr9VcYPZb0YsZtakY7oGbJcqQK4Uunm0=", - created_at: ISODate("2025-10-07T07:21:41Z"), - }, - { - _id: "trk-186e11012a68997c808f8465", - name: "sleepy_jacobi", + _id: "trk-186e120746eebc6662643d28", + name: "nervous_maxwell", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "voc+y+JNdqp6lX48qNmcu59Lsq6a+uVXJCxct2xRNxk=", - created_at: ISODate("2025-10-01T04:23:41Z"), - }, - { - _id: "trk-186e11012a68ad23b4a73c5a", - name: "jaunty_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "occWle60rL4/Q1k5ZC1YZNFidtrXN1qPpOOQoHJI+0M=", - created_at: ISODate("2025-09-24T13:06:41Z"), + private_key: "R5tvEmp6htqC7RHz/hRTUwhZW6v3lVh3qJ+Pttgw9S8=", + created_at: ISODate("2025-09-30T08:21:26Z"), }, { - _id: "trk-186e11012a68c1d3f71ded27", - name: "lucid_galileo", + _id: "trk-186e120746eedcee1f256e01", + name: "amazing_westinghouse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "DZ1ZHv14wz04AcnlFCgHXUqY0wn2Smxd+AUD67eHDT8=", - created_at: ISODate("2025-09-22T20:28:41Z"), + device_type: "other", + private_key: "UX2Qmw3cmXuF/IcgT0gIzavalplncAuB9c1hCDebu0k=", + created_at: ISODate("2025-09-22T15:06:26Z"), }, { - _id: "trk-186e11012a68d5dc0fbcdc78", - name: "angry_turing", + _id: "trk-186e120746eef951821b96c3", + name: "bold_born", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "yijSK7kAlrVHEkiArf2WHufse4mGsMgyn2zKQmtaFX8=", - created_at: ISODate("2025-09-18T10:02:41Z"), + device_type: "other", + private_key: "YXD9WH6vDeIHC5YQZqEz7WvkHrcKgIAnfFAGl59htyE=", + created_at: ISODate("2025-09-22T18:36:26Z"), }, { - _id: "trk-186e11012a68f3408129aa93", - name: "fervent_torvalds", + _id: "trk-186e120746ef14ada5d82853", + name: "ecstatic_bohr", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "4hYuvxP0lN5zV1E8SYsJdO0CSXHb2LhCUVjfAOcV1uk=", - created_at: ISODate("2025-09-21T10:54:41Z"), + device_type: "other", + private_key: "EyfR76x+gHf56NtxCJrPP2yEbKNAWAytY7GnJ5iD6Dc=", + created_at: ISODate("2025-09-22T14:45:26Z"), }, { - _id: "trk-186e11012a69083580f37301", - name: "nostalgic_tesla", + _id: "trk-186e120746ef30a453a2681f", + name: "xenodochial_yang", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "DSP/IOrE5ULpd3X+i8y+++pq+EHjO2CtR/KN+93Cfu4=", - created_at: ISODate("2025-09-15T07:02:41Z"), + device_type: "other", + private_key: "KA7GeAJz7HYtBr+quD2ByRsih8xN94nkw82YHCa+ekE=", + created_at: ISODate("2025-09-23T11:28:26Z"), }, { - _id: "trk-186e11012a6923b5915a988a", - name: "motivated_schrodinger", + _id: "trk-186e120746ef5962725241a1", + name: "great_pascal", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "eH71/s+dQvQ1xJJL6bLsr4YLpgvhMWpZNkl4XTuhzdY=", - created_at: ISODate("2025-09-27T11:34:41Z"), + private_key: "wTy5ke2Gu8rGjh90ryR4OO3dvnaveRb2lNO2J+DXM+k=", + created_at: ISODate("2025-09-29T17:03:26Z"), }, { - _id: "trk-186e11012a693761f330d104", - name: "proud_faraday", + _id: "trk-186e120746ef7561a82b805e", + name: "puzzled_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "8KlDOWge0E5h6k+nVbYB0aYctn/NPc2Yp8qsgHvYFC4=", - created_at: ISODate("2025-09-21T19:56:41Z"), + private_key: "U3e0bbtRB/4oFdwAyqaUWdiWc3KBJxCdwL4GnrajrvE=", + created_at: ISODate("2025-09-16T18:55:26Z"), }, { - _id: "trk-186e11012a694ba40a1e8528", - name: "intelligent_crick", + _id: "trk-186e120746ef911e84e6d8e2", + name: "flamboyant_wiener", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "egi3qn6qf20/lF+9wA1XlNr9R7UdH1w2tnW/BP1DOD8=", - created_at: ISODate("2025-10-08T00:26:41Z"), + private_key: "ce/RLrLRYmFt61vSvrKtl+OayIQpjaFJRWJVABDKEWA=", + created_at: ISODate("2025-09-18T14:06:26Z"), }, { - _id: "trk-186e11012a695fa93dc370cd", - name: "patient_babbage", + _id: "trk-186e120746efabd4ebae5c25", + name: "modest_pascal", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "C/SrLZcsde5zi+3jVX/1CXO0fyHfFL/LagnN71XM7vM=", - created_at: ISODate("2025-09-29T23:38:41Z"), + device_type: "valuable", + private_key: "Pz4Pu+YceuyuUAEswXesnWSPbZL5PPPXefSAO4ueB3M=", + created_at: ISODate("2025-10-02T22:08:26Z"), }, { - _id: "trk-186e11012a6973a81a95f137", - name: "eloquent_crick", + _id: "trk-186e120746efd20be6218945", + name: "curious_turing", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "j1t3bLVhGQXReRYX36ydg+8L3dmadL9oOMc9xaEDdqc=", - created_at: ISODate("2025-09-15T11:22:41Z"), + private_key: "O2DSUjc6HIFMf8/a/mm+ONOVsXvJ9UmYdvhIirxW5LQ=", + created_at: ISODate("2025-10-10T00:12:26Z"), }, { - _id: "trk-186e11012a6989075fb19370", - name: "eager_compton", + _id: "trk-186e120746efef261a621259", + name: "heuristic_galois", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "QP9cWjfrVAUTlexCgC2EQUZfb+jmVMRFlbcQsU0ULD0=", - created_at: ISODate("2025-09-27T00:58:41Z"), + private_key: "7xF3Ws3DC15XXi+wN0TLJ/xfOYsl1wthIcg1WDJSPGE=", + created_at: ISODate("2025-09-29T07:18:26Z"), }, { - _id: "trk-186e11012a699c62e5346db9", - name: "ecstatic_volta", + _id: "trk-186e120746f00b07b9f277f3", + name: "charming_wozniak", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "dQcTJ19qSW/+XDlTdwlTzogBMQU7qKeGRScV1SV7xgU=", - created_at: ISODate("2025-09-13T20:05:41Z"), + device_type: "public_transport", + private_key: "CkNmnFv3gp6MKDfY7BFED1nGJLC5Gvho5M135S/bcSI=", + created_at: ISODate("2025-10-08T19:56:26Z"), }, { - _id: "trk-186e11012a69afb578bfa279", - name: "naughty_newton", + _id: "trk-186e120746f0271720162899", + name: "cool_dijkstra", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "2MHbKiaRPN0ir35fiIReoNXE4WSK5xtPhgGEQR9N/XU=", - created_at: ISODate("2025-09-26T18:35:41Z"), - }, - { - _id: "trk-186e11012a69c43a870114f4", - name: "objective_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Nj+3MmYrI0qejPktZkaTnW0cj2fxQVtwQr7n6xiiDms=", - created_at: ISODate("2025-09-24T16:11:41Z"), - }, - { - _id: "trk-186e11012a69d76c1d58cb5a", - name: "phenomenal_church", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "1TYnKVXTOmyZcd2ZATl7vQKmaZctz8BaE2eQUqiombA=", - created_at: ISODate("2025-10-11T20:40:41Z"), + private_key: "EXIB21hXaXxf6awOBsQvJF4YnOGec0JcliipsryVoJM=", + created_at: ISODate("2025-09-23T20:59:26Z"), }, { - _id: "trk-186e11012a69eb366151d454", - name: "eloquent_lagrange", + _id: "trk-186e120746f04a21e1fbceb4", + name: "fabulous_henry", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "bogfw5axRNHuqhcZokzzEiOoMQcNfFDJQ+L2lIK8ayY=", - created_at: ISODate("2025-10-03T08:59:41Z"), + private_key: "pA1fAK3JAJfuPhNF0pJ/AXM2x80lCClPT3YBaFm0aWU=", + created_at: ISODate("2025-09-24T14:03:26Z"), }, { - _id: "trk-186e11012a69ff9ce3bb7579", - name: "hardcore_glashow", + _id: "trk-186e120746f082919f1fb039", + name: "calm_glashow", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "dVgfqWA9h+R0tl3KTyeSGyZ+lWCVptMkmzJp6ECtVXo=", - created_at: ISODate("2025-09-23T17:16:41Z"), - }, - { - _id: "trk-186e11012a6a12cf3be6398b", - name: "calm_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "U0pVdwvHtqXH2Mx3kdqFLImQnbwURMVG/jWXPqW+Ugw=", - created_at: ISODate("2025-10-02T11:22:41Z"), + private_key: "cP03j+3EWXeGlrsFWTKdx+/BUsX+yfBpyqfRsHvNtNo=", + created_at: ISODate("2025-10-02T00:58:26Z"), }, { - _id: "trk-186e11012a6a26d34c04e401", - name: "faithful_watson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "FCXiT34AwIloVsGogUfNa5Y20a0W7pC/lB24FCpXZNk=", - created_at: ISODate("2025-09-16T13:27:41Z"), - }, - { - _id: "trk-186e11012a6a4fc90c6da34c", - name: "practical_wirth", + _id: "trk-186e120746f09d390df56184", + name: "gifted_crick", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", - private_key: "OCJwY7fmiHWPQ8a93DY349D0YQV+N3Mkd2TMNT5PDt0=", - created_at: ISODate("2025-09-27T22:12:41Z"), + private_key: "Cd8phmxxYiKZykG4dz12tWjBqldOWLlXS4eHAt+QXuE=", + created_at: ISODate("2025-09-26T09:54:26Z"), }, { - _id: "trk-186e11012a6a6ddd9371f4e1", - name: "jolly_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "zh3fLp0siFfTJx6a5KZaHGOgXQqXDQJNfJ2PNj58HJc=", - created_at: ISODate("2025-10-09T13:14:41Z"), - }, - { - _id: "trk-186e11012a6a8e1d7645a2cc", - name: "iron_feynman", + _id: "trk-186e120746f0b6c58812e233", + name: "merry_torvalds", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "juSPU5T2XW/KKo/kgn3uf6XkkQ9kDR495szH8DZKP6I=", - created_at: ISODate("2025-09-16T21:33:41Z"), + private_key: "SfPGmp/POZ0OJ46PfaCF4YWga1fkw9hxx4Uu2Oqc12U=", + created_at: ISODate("2025-10-02T12:53:26Z"), }, { - _id: "trk-186e11012a6aa3491ef34d6b", - name: "hungry_wu", + _id: "trk-186e120746f0d2223b340dbc", + name: "calm_cantor", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "aHj3TaU2sHN/CZGs7paLUWfnd2PJDk0KZfEtjYSnV6M=", - created_at: ISODate("2025-09-20T15:19:41Z"), + private_key: "6y8OGDDKUegpudM8cpIEJOHa0XFm1kiYGq14k5lGqn8=", + created_at: ISODate("2025-09-25T08:49:26Z"), }, { - _id: "trk-186e11012a6ab6ce0dbd137a", - name: "iron_ramanujan", + _id: "trk-186e120746f0f719e93740d8", + name: "gentle_kleene", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "XUB14u2ASGNYRp4x6GjSXL6P3iDzsEDJp5EYOrlNs7s=", - created_at: ISODate("2025-10-06T05:56:41Z"), - }, - { - _id: "trk-186e11012a6ad190d5f26f5e", - name: "boring_bardeen", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "iohPqYUWmNIM4chluUswul7SDQFnWsHWVbbzYX6Re6o=", - created_at: ISODate("2025-09-28T13:31:41Z"), - }, - { - _id: "trk-186e11012a6ae7df80bb26ac", - name: "laughing_einstein", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "K2XZ26AlCgHNAspK3zvk++/3xKDrWgtSSnF8+AOx0Qs=", - created_at: ISODate("2025-09-21T01:21:41Z"), - }, - { - _id: "trk-186e11012a6afd012573444f", - name: "cool_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "9gj00S3hIZZYYv5J0zDa7Ns4y0YsR3Gj6dIygOsKNFA=", - created_at: ISODate("2025-10-09T22:17:41Z"), - }, - { - _id: "trk-186e11012a6b11e2eea6ad28", - name: "amazing_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "BfxlKuJBjUKOLQwuwmIf+FJVmW3lFXLIy+FNl3r16ZI=", - created_at: ISODate("2025-10-02T07:37:41Z"), - }, - { - _id: "trk-186e11012a6b2618fb757329", - name: "gifted_galois", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "OuR5j02z+qXlcppxPdmPXhv7Kp4RuOWTfhKDM6UHVBM=", - created_at: ISODate("2025-09-27T12:50:41Z"), + private_key: "kTOu2VN72K+KIS6dmhjw6gn7EJv8Sgy7Ftf0EVmyUAM=", + created_at: ISODate("2025-09-17T00:20:26Z"), }, { - _id: "trk-186e11012a6b394bebadc1e6", - name: "magnificent_tesla", + _id: "trk-186e120746f12bb3b3afc7ca", + name: "angry_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "2As5cpb4ZprXazamVQTYm9zZhy+Q0zX2Lj9SkIkhInY=", - created_at: ISODate("2025-10-02T20:26:41Z"), + private_key: "EaVi9jGo670sloZat37TqG9X6MSt9eYttd+OL9xtNmA=", + created_at: ISODate("2025-09-28T01:00:26Z"), }, { - _id: "trk-186e11012a6b4c6979266ad6", - name: "competent_wiener", + _id: "trk-186e120746f146b5f322b565", + name: "furious_planck", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "W9PKV8At5L3ylkfdQpuqpPF3JJOGQ049qgX4g7nd5ts=", - created_at: ISODate("2025-10-04T18:36:41Z"), + private_key: "YsXCrd24M5R0/N8Zo8NptQSAgfuOKlb/6Mquo9+5f6w=", + created_at: ISODate("2025-10-10T19:53:26Z"), }, { - _id: "trk-186e11012a6b6160671c0d6c", - name: "adoring_doppler", + _id: "trk-186e120746f15f4e4ac77e69", + name: "flamboyant_hertz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "InblIn+VqVZmJ+a/q2JxFnVpRzgK3qb+alNsE5yf7u4=", - created_at: ISODate("2025-10-01T02:17:41Z"), + device_type: "other", + private_key: "GwTCImAqU45wG0/+jxkHCuhKym5mzA7ga9AgmiPxXt8=", + created_at: ISODate("2025-10-04T23:43:26Z"), }, { - _id: "trk-186e11012a6b7596da904a86", - name: "zealous_leibniz", + _id: "trk-186e120746f179039c3e5b94", + name: "thirsty_laplace", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "QgJmhzs1pPm4C2QjlnqXUDwMuZppTBi2snmjbaWoEvA=", - created_at: ISODate("2025-10-01T11:39:41Z"), + private_key: "pFQF+nyzLCcElM/v9stFnzBiFOZmnAif8VZEf442V+U=", + created_at: ISODate("2025-10-09T19:46:26Z"), }, { - _id: "trk-186e11012a6b91e714711be0", - name: "condescending_born", + _id: "trk-186e120746f191c526e07e26", + name: "cranky_weber", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "Bn+Dx6FWWuu8kT+8R0Radz1cBsk7JoS1fH4eMpOwrZA=", - created_at: ISODate("2025-09-16T22:07:41Z"), - }, - { - _id: "trk-186e11012a6ba6d028cde8bb", - name: "groovy_euler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "TePeppWG5GrNuh3beskSMFSTcdJBeF9ynGBxfYtb4XI=", - created_at: ISODate("2025-09-22T10:31:41Z"), + private_key: "GsdkxPFdv3TahWmqM9VkaazJQNxCzhS7PENt8gEoT0s=", + created_at: ISODate("2025-09-24T21:13:26Z"), }, { - _id: "trk-186e11012a6bbb009d699414", - name: "distracted_morse", + _id: "trk-186e120746f1b4d87f6a4ab5", + name: "iron_galvani", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "TRbTIZ8UCGBO5/2qXuF2yEQJkz+qJHlzNXM/J7nQGDI=", - created_at: ISODate("2025-09-22T12:40:41Z"), + private_key: "W3QvXGjvUvqvTKippTBM1SFuOpMKW8QWnoD0Mme6OYE=", + created_at: ISODate("2025-09-26T05:09:26Z"), }, { - _id: "trk-186e11012a6bce3eb8cdd023", - name: "boring_weinberg", + _id: "trk-186e120746f1ce4eea4b728b", + name: "relaxed_feynman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "jlXx2lFs5DdjRy0krxykZbO2Fr94IGE0Ern3n5z3R7A=", - created_at: ISODate("2025-09-24T04:43:41Z"), - }, - { - _id: "trk-186e11012a6be2728b0de5f1", - name: "quizzical_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "dlFY1T4NYuyQuEeedZ1IdEsnqnUldf+AFCUVJfgopdI=", - created_at: ISODate("2025-10-04T19:56:41Z"), + device_type: "other", + private_key: "LZR+p/doe7p09bMaY/q8YakuBQGrsGyX74cbpYztN0I=", + created_at: ISODate("2025-09-28T06:39:26Z"), }, { - _id: "trk-186e11012a6bf5e949a6578d", - name: "thrilled_laplace", + _id: "trk-186e120746f1e7f64d2a0414", + name: "merry_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "3AtFcMkrZ4wqFIQkgpE0svSJ6ZWeEv0U/IpAOdLH31s=", - created_at: ISODate("2025-09-16T13:41:41Z"), + device_type: "other", + private_key: "pW2aKuxC2muX5hOWr+bk1aySwlsEof16dOwGGVbv0hE=", + created_at: ISODate("2025-10-06T09:51:26Z"), }, { - _id: "trk-186e11012a6c261e6e410b97", - name: "gifted_chebyshev", + _id: "trk-186e120746f201234290fc20", + name: "youthful_edison", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", - private_key: "mCocNj0D/NXQlQShXi2dcvGDBy7QIpPGg+nakvQ3bEs=", - created_at: ISODate("2025-10-12T19:47:41Z"), + private_key: "p46hK5+FShBIgUZvbfw6Wq3dfrtRYlX9RDMDKAUoE7k=", + created_at: ISODate("2025-09-25T12:29:26Z"), }, { - _id: "trk-186e11012a6c3c6824d60f91", - name: "affectionate_bohr", + _id: "trk-186e120746f21be0e93185c3", + name: "focused_godel", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "TXZDLtPpK6Mau3d2WVLxrKH0EuD8BCZ1KCt/NaHU/Es=", - created_at: ISODate("2025-10-03T01:26:41Z"), - }, - { - _id: "trk-186e11012a6c5038373ca424", - name: "elegant_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "8EDKjQSUKiXXv3BUbQ7Ng91j4f/GSr7+QAIqaqKKMII=", - created_at: ISODate("2025-09-26T23:21:41Z"), + device_type: "public_transport", + private_key: "UcYyvLXTyMi7vygZia8WHT6jtc+F7Ee2C01o5xS1Nr4=", + created_at: ISODate("2025-09-26T23:16:26Z"), }, { - _id: "trk-186e11012a6c63905c65aa55", - name: "gentle_darwin", + _id: "trk-186e120746f234b4f6c9f2c7", + name: "dazzling_babbage", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "Ynce/psEdLCbWCWGioAf0HMx1MoJogKuY2J/IINSvrI=", - created_at: ISODate("2025-09-29T19:02:41Z"), + private_key: "6u6OQXrxzetXHuITD4hRFsWMbJ7MMgaJAGicOFOX19Q=", + created_at: ISODate("2025-09-20T10:30:26Z"), }, { - _id: "trk-186e11012a6c78882c93ea30", - name: "curious_glashow", + _id: "trk-186e120746f24e76ff131fe3", + name: "upbeat_ohm", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", - private_key: "Wi4UYso0KKCSWpEsWXWhwtehcDXOdFaRFWJccD35X34=", - created_at: ISODate("2025-09-22T01:47:41Z"), + private_key: "luzQWGdL+UzgoVO3aaIeSFYdqpx0MOd//U49+sKZBR4=", + created_at: ISODate("2025-09-24T03:21:26Z"), }, { - _id: "trk-186e11012a6c8d0b88d582b1", - name: "groovy_poincare", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "C9UUSbi10tePQNX8CV9S878FAZepKSHW20mstzqcEl4=", - created_at: ISODate("2025-10-06T10:26:41Z"), - }, - { - _id: "trk-186e11012a6ca08e30bd58f3", - name: "eloquent_oppenheimer", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "ckphAdHxUOhQalPf/Alkhrlpn7LdWuIxEU8OM166IPw=", - created_at: ISODate("2025-09-21T06:30:41Z"), - }, - { - _id: "trk-186e11012a6cb4ea3bd9ddc8", - name: "inventive_jobs", + _id: "trk-186e120746f267cbf0b2059a", + name: "furious_hertz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", - private_key: "Nk5bQv/tQLsoZ9sLhMxT7x8ACDjvKCA1HM2kNLDq2gA=", - created_at: ISODate("2025-09-27T12:10:41Z"), + private_key: "nsgQCOmszyc8AS0cr/jasr6AqOfBCjGWWqBOEH3JYAQ=", + created_at: ISODate("2025-09-17T10:52:26Z"), }, { - _id: "trk-186e11012a6cd94db91adead", - name: "kind_einstein", + _id: "trk-186e120746f2814d7e0754b6", + name: "affectionate_poincare", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "oSIz2hlKwllgzLLWEqJiHAvZniIPqIzT7LrB5OpceHY=", - created_at: ISODate("2025-10-04T13:01:41Z"), - }, - { - _id: "trk-186e11012a6cedcd79e9453b", - name: "modest_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "qFydjWVyh4o6yZpaPJ+IyZDayBFD5kMSwUuz5AyDFzc=", - created_at: ISODate("2025-10-09T12:27:41Z"), + device_type: "food", + private_key: "itBD6WM9tftIGfAJilP9de2TJa8Vog2wDz0ipw43Lgc=", + created_at: ISODate("2025-10-11T07:02:26Z"), }, { - _id: "trk-186e11012a6d027b8a123406", - name: "magnificent_faraday", + _id: "trk-186e120746f2a3d87f0eeca4", + name: "frosty_kolmogorov", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", - private_key: "LPcO0cx0s2Uka6nphi9sMBXu3xkSslMYIGQYsXUrv2g=", - created_at: ISODate("2025-09-28T02:23:41Z"), + private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", + created_at: ISODate("2025-09-13T16:47:26Z"), }, ]); diff --git a/utils/gen_mongo_dev/main.go b/utils/gen_mongo_dev/main.go index 1e33ba84..5dfc665e 100644 --- a/utils/gen_mongo_dev/main.go +++ b/utils/gen_mongo_dev/main.go @@ -194,7 +194,7 @@ func generateJSObjectList(count int) error { func main() { rand.Seed(time.Now().UnixNano()) - count := 200 + count := 100 fmt.Printf("// Generated %d JS objects with no duplicates:\n", count) err := generateJSObjectList(count) if err != nil { From 8e8359b12ffbbe811053981c193f249f78aff66a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 16:11:00 +0200 Subject: [PATCH 041/242] increased publish period --- tracky/make_compose.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 1a78c207..7593cfe6 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -77,12 +77,11 @@ def create_compose(credentials: List[Dict]): "dockerfile": "Dockerfile" }, environment={ - "GEOCODING_SERVICE_URL": "http://localhost:8082", "ROUTING_SERVICE_URL": "http://localhost:5000", "OVERPASS_URL": "http://localhost:12345/api/interpreter", "REGIONAL": regional, "URBAN": urban, - "PUBLISH_PERIOD": "500", + "PUBLISH_PERIOD": "2000", "PIRATE": "true" if random.randint(1, 100) < 10 else "false" }, # depends_on=["nominatim", "osrm"], From a7810e783409f0288b54e3ec9e0c44e48eeceea0 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 16:14:51 +0200 Subject: [PATCH 042/242] increased publish period --- tracky/make_compose.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 7593cfe6..2b64c2cc 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -72,10 +72,7 @@ def create_compose(credentials: List[Dict]): regional = "true" if random.randint(1, 100) > 10 else "false" urban = "true" if random.randint(1, 100) > 50 and regional == "true" else "false" compose.services[cred["id"]] = ServiceConfig( - build={ - "context": "src", - "dockerfile": "Dockerfile" - }, + image="tracky:latest", environment={ "ROUTING_SERVICE_URL": "http://localhost:5000", "OVERPASS_URL": "http://localhost:12345/api/interpreter", From 8d84a617f778c02b0c7feddd6fbb564e460ca96a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 16:16:10 +0200 Subject: [PATCH 043/242] build --- tracky/build.sh | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 tracky/build.sh diff --git a/tracky/build.sh b/tracky/build.sh new file mode 100755 index 00000000..91200e08 --- /dev/null +++ b/tracky/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +docker build -t tracky:latest src From 5122935d6f9a7070901c40a189a3ea675722d427 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 13 Oct 2025 16:25:09 +0200 Subject: [PATCH 044/242] added 100 devices --- mongo/init.js | 800 +++++++++++++++++++ services/playbooks/roles/mongo/files/init.js | 800 +++++++++++++++++++ 2 files changed, 1600 insertions(+) diff --git a/mongo/init.js b/mongo/init.js index f8abe2d4..d030e316 100644 --- a/mongo/init.js +++ b/mongo/init.js @@ -1653,4 +1653,804 @@ db.devices.insertMany([ private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", created_at: ISODate("2025-09-13T16:47:26Z"), }, + { + _id: "trk-186e1309839bbd54be8f785e", + name: "gifted_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ZCw5gk1MaebMg2IsOivMuSZgCAJQxYPZ8o3KMTn0oSY=", + created_at: ISODate("2025-10-02T18:57:55Z"), + }, + { + _id: "trk-186e1309839e1ffe329ebf18", + name: "zealous_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "LOjfvsoJj7zNBoByyrJqgnfbVuvg2oqSWSo23k5szrw=", + created_at: ISODate("2025-10-05T07:08:55Z"), + }, + { + _id: "trk-186e1309839e3cc066512dbd", + name: "elastic_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "k7fQ1A277mZYtLp4yZwgQv5SAHg+CQykl65IYmBOcLw=", + created_at: ISODate("2025-10-13T05:51:55Z"), + }, + { + _id: "trk-186e1309839e5c57c7e9af1b", + name: "energetic_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "cTlwhna05v7wqUSh4A6t7V59z5nfZPwlmu5phCNjhzs=", + created_at: ISODate("2025-09-15T01:26:55Z"), + }, + { + _id: "trk-186e1309839e7274fbb77443", + name: "noble_schwinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "zWDBZnVqBcN60DwbxryQ+eLp/b+dr/xlpafTcWfFs1c=", + created_at: ISODate("2025-09-23T19:53:55Z"), + }, + { + _id: "trk-186e1309839e85fe0ba301ac", + name: "puzzled_heisenberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "EE/TZ0jS3mEwbZx/YqElSKS2qxTLiADL3wTZc7UtTR4=", + created_at: ISODate("2025-09-15T11:31:55Z"), + }, + { + _id: "trk-186e1309839e99c2655eb597", + name: "magical_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "zaDTN2SiXFRcxdsnSyeZST0eJO2ymNrnWVh9KSiBjmQ=", + created_at: ISODate("2025-09-19T07:21:55Z"), + }, + { + _id: "trk-186e1309839eae938abbb06e", + name: "polite_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "3E5qvFq6m7TZW5scw/ZYc39zAnhourZwtQbte1KRFcg=", + created_at: ISODate("2025-09-22T23:00:55Z"), + }, + { + _id: "trk-186e1309839ec6a5f176f269", + name: "suspicious_weber", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "vPKKppUdZeMiXY5HYgFgHETpYx3jtWRHuMeNPNX+gIo=", + created_at: ISODate("2025-09-24T20:49:55Z"), + }, + { + _id: "trk-186e1309839edcbc0e9ccdee", + name: "hyper_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "m6ltZvHHeKGnbg/7OCLoDwz5JuXP2lr1pcY4Vj+iY6Y=", + created_at: ISODate("2025-09-15T11:08:55Z"), + }, + { + _id: "trk-186e1309839ef37e250b2ac1", + name: "flamboyant_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "IZrX9Tvi8DNKS7uFTtf/HLwYxivfO6gnriULc081BW4=", + created_at: ISODate("2025-09-27T03:18:55Z"), + }, + { + _id: "trk-186e1309839f7ba1a81d392e", + name: "laughing_oppenheimer", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "sTqUXGZmpiGZHGxXEFElISIe3iJz9VW5h7LrKbdbT5Q=", + created_at: ISODate("2025-09-21T19:38:55Z"), + }, + { + _id: "trk-186e1309839fda077e230f18", + name: "sleepy_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "K/fnViP3HJeORW02MDQiODA2KJIIOklTQ95dp8KR1Aw=", + created_at: ISODate("2025-10-08T09:06:55Z"), + }, + { + _id: "trk-186e1309839fef6604700630", + name: "cranky_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "LhU6aqY/E9DHusg8AbbavTuikkHRVaOKAceEX4erXb8=", + created_at: ISODate("2025-10-13T10:22:55Z"), + }, + { + _id: "trk-186e130983a01ae99c930d78", + name: "brave_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "DdkJUpGmJY7ZMiMKeyTIUh+NOId0DzLi7dp6alJhQ88=", + created_at: ISODate("2025-09-18T08:13:55Z"), + }, + { + _id: "trk-186e130983a034f970090b84", + name: "keen_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "bb/3zD4PlygRSNYJ2JfXWtQOGXRlw4iqjv0nESpWnnw=", + created_at: ISODate("2025-10-12T15:58:55Z"), + }, + { + _id: "trk-186e130983a059f6f1438b3e", + name: "awesome_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "KGd+GfOfvoG61VkVQFjTJR0Yq/znautGUH+9WAnDLoQ=", + created_at: ISODate("2025-09-24T09:31:55Z"), + }, + { + _id: "trk-186e130983a07ae5a7263ec1", + name: "crazy_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hbTWXcPaFt/C79Q3ljLio7j7GkYT4DT6UKavFR/7tOg=", + created_at: ISODate("2025-10-04T02:54:55Z"), + }, + { + _id: "trk-186e130983a09704293604ee", + name: "calm_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "OU1L1O+EUhwPhwmKJ8OtajzN5xPrV4wyWeLsTaoY1I8=", + created_at: ISODate("2025-10-01T22:19:55Z"), + }, + { + _id: "trk-186e130983a0b6016eeb4331", + name: "proud_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Je7MWPdNzzyVBGdsKH0ZrdkDCkkk52S0sa9OOaloRQM=", + created_at: ISODate("2025-09-24T22:52:55Z"), + }, + { + _id: "trk-186e130983a0db3e0cc11f28", + name: "furious_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "rINraJ2KTESEfAph/IFXaUIsFf2DwvcV46lED/a+XZQ=", + created_at: ISODate("2025-09-30T07:18:55Z"), + }, + { + _id: "trk-186e130983a14583c71a2172", + name: "faithful_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "oaNmemljb/RTXF5lwD+aYiyJduErvUitnjU9P6O3Qcc=", + created_at: ISODate("2025-10-06T15:35:55Z"), + }, + { + _id: "trk-186e130983a159e2bbb9f5f8", + name: "upbeat_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "FlfO21D9qS/voZQhw7ALRXcQpl+4P0+bcsAVx+HqTys=", + created_at: ISODate("2025-10-10T03:06:55Z"), + }, + { + _id: "trk-186e130983a1c1a1f3cb2f24", + name: "hungry_gauss", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "MP/K9fmbN8gjGL2dlUgPwvfkmH1AUPDCjdAiUqu944g=", + created_at: ISODate("2025-10-11T22:35:55Z"), + }, + { + _id: "trk-186e130983a1d5c90eeb7be5", + name: "motivated_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "yKTjLolSSeYIykBPgT5XtvoUQdKALNFkkNu44kNoGP4=", + created_at: ISODate("2025-10-05T00:01:55Z"), + }, + { + _id: "trk-186e130983a1ea63e8dbee65", + name: "laughing_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gqr+1LMynMxT9/LCZi34YT7w7kNetDPAIM5vgxuJ62E=", + created_at: ISODate("2025-09-26T16:11:55Z"), + }, + { + _id: "trk-186e130983a1fd7e0e4791cc", + name: "blissful_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "46eu29Cek7uXQbQIikPXWXXtb5Mj4uF8qiNAjlAhHAg=", + created_at: ISODate("2025-09-20T07:34:55Z"), + }, + { + _id: "trk-186e130983a2109dd0df3463", + name: "modest_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wDLjDpT2iWWujj+LVSJmdJiiJvgBj4cZ+79LZdPwQ9s=", + created_at: ISODate("2025-09-23T15:00:55Z"), + }, + { + _id: "trk-186e130983a234a9618f898e", + name: "confident_peano", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "v6fr9Q4/AQTAwGGrEszqok6AU/RlCO7EmsWoaHPR1Wg=", + created_at: ISODate("2025-09-27T05:29:55Z"), + }, + { + _id: "trk-186e130983a2560f98ea7e47", + name: "jovial_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "KcMeDL6RVjQrEE3xf+j2tcYleM26p60oLqaVvRhQFDM=", + created_at: ISODate("2025-09-25T14:14:55Z"), + }, + { + _id: "trk-186e130983a26a15f661928b", + name: "eloquent_dedekind", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "X8atklQ+PoJ0GuKFPwfSs49w1C1tjiwstgnvu+3Uaq8=", + created_at: ISODate("2025-09-29T19:35:55Z"), + }, + { + _id: "trk-186e130983a27e5bc05251b9", + name: "frosty_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "1kASDQP73a3z2SN8IkuNtI3cYmX3jjvmO+/bU1sQwHY=", + created_at: ISODate("2025-09-21T07:50:55Z"), + }, + { + _id: "trk-186e130983a291f1e443cd5a", + name: "proud_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "UzmsA89/TC3Y9HXzAj/FFajvNUheAN9dGb/0axlXtb8=", + created_at: ISODate("2025-10-01T10:25:55Z"), + }, + { + _id: "trk-186e130983a2a576491ef9af", + name: "angry_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "sKpBt81A5fAZFsm4npMR5KEv3eJY9csJ0lU2dV09slw=", + created_at: ISODate("2025-10-08T07:07:55Z"), + }, + { + _id: "trk-186e130983a2d186e5d486fb", + name: "hungry_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "fH0z5owaDwYFtDAHOTndNz6bZboOOrfJS7G0FcLWwSc=", + created_at: ISODate("2025-09-26T13:34:55Z"), + }, + { + _id: "trk-186e130983a2e58a9f17fdc3", + name: "distracted_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "T9pkDWyxASF5yTI/tPUa0oYGkbS7kEJw658mWEYmXuw=", + created_at: ISODate("2025-09-15T03:42:55Z"), + }, + { + _id: "trk-186e130983a2fe87872f4f49", + name: "thoughtful_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hcUkyXC/+F/nxBV8iOeTaXlbPlVbefYzFfrbXkGV8Sg=", + created_at: ISODate("2025-10-05T01:51:55Z"), + }, + { + _id: "trk-186e130983a322c165ec9526", + name: "sad_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "vNNucwhglkB7Y1aVZrx8AmdKQH0T8NQ/nDA6WvAmHYA=", + created_at: ISODate("2025-09-28T01:45:55Z"), + }, + { + _id: "trk-186e130983a340ddf0bf05e4", + name: "vibrant_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "JD9CEeoyzLC/HXULUtZRds3Zt3W73rlEK9SaMNABxX4=", + created_at: ISODate("2025-10-13T14:53:55Z"), + }, + { + _id: "trk-186e130983a35bf2a8e986cb", + name: "original_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "B7fsNi61OSIwh7sOPijfiaXcO35j4b8D4RzaOO9AI9o=", + created_at: ISODate("2025-09-13T22:37:55Z"), + }, + { + _id: "trk-186e130983a37e04ea2b2ff2", + name: "fabulous_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "BgA+RZUSOglE9OOaC64uOPYBH2Q3FXKTh92P7kevJmo=", + created_at: ISODate("2025-09-26T15:11:55Z"), + }, + { + _id: "trk-186e130983a39b9455bdeedf", + name: "awesome_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ttzL9AQTJ9RKMTlAF7il5xpv84u4wPLSCxzJ7QgAK2o=", + created_at: ISODate("2025-10-07T23:48:55Z"), + }, + { + _id: "trk-186e130983a3c77bb7a4f5d7", + name: "heartwarming_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "HXOc5oU5YLvbceVhUGdpPTmDfF3FROJAPjZ2XkjjTvo=", + created_at: ISODate("2025-10-02T15:09:55Z"), + }, + { + _id: "trk-186e130983a42d5fb53a30e9", + name: "sweet_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Cogel1ZaSvbfbwjKN9kzoFdMkNmRVyjLhdVO1TIXRX8=", + created_at: ISODate("2025-09-21T15:57:55Z"), + }, + { + _id: "trk-186e130983a45e7421d17024", + name: "heuristic_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XO/6YycdUYkH63d460y/NTW0dxLBPiAygeMjHuRmag8=", + created_at: ISODate("2025-10-05T02:06:55Z"), + }, + { + _id: "trk-186e130983a47ab26312a621", + name: "serene_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "ZEey/z8mahhYZ6P2370knAdpoBRxrl+rUc8IRGe7X+s=", + created_at: ISODate("2025-10-11T19:15:55Z"), + }, + { + _id: "trk-186e130983a49cc1a4ead31d", + name: "admiring_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "z1UanROYzQtod+7GLLbw9qYdIvet+pQQEc85sdmE1tI=", + created_at: ISODate("2025-10-10T21:17:55Z"), + }, + { + _id: "trk-186e130983a4af6de88c809f", + name: "practical_cantor", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "n7DXivw4BcVLW2WE3NGNZGADmQgpJuAqcDxd/3ys6oo=", + created_at: ISODate("2025-09-14T14:27:55Z"), + }, + { + _id: "trk-186e130983a4c1a2c1717cf8", + name: "keen_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "QzRG4fj6Ieu/CEDn4y6+Bu1gBFqY4ISF+tHNhDtlNOU=", + created_at: ISODate("2025-10-11T10:09:55Z"), + }, + { + _id: "trk-186e130983a4d36ac7ba8b7a", + name: "proud_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "EX3KV2PKMP/B3ZQ2W/lWny+J+Ph56ZZvPU5Ee4JyKN4=", + created_at: ISODate("2025-09-25T21:44:55Z"), + }, + { + _id: "trk-186e130983a4e47156945059", + name: "goofy_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "vazs6yunKp5x6D8iixRFQWIPPtuhKeHi8k+cnv/oP10=", + created_at: ISODate("2025-09-19T10:10:55Z"), + }, + { + _id: "trk-186e130983a4f6d211f892ab", + name: "phenomenal_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "F5ynV08uXxR+VAwDWviUzRt5DJSK4tZkuw76KO8gICI=", + created_at: ISODate("2025-09-25T04:49:55Z"), + }, + { + _id: "trk-186e130983a508c15816b9c0", + name: "nervous_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "wcyoP8iDI3UU5H1r/qqVYLR1tsMuB0fwqilajOO4+vc=", + created_at: ISODate("2025-09-19T21:06:55Z"), + }, + { + _id: "trk-186e130983a519b7a38da4ea", + name: "polite_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1tk9YjVrNKneUDY1Osjo/Dwi4i10Gso/pN46e3GvYYY=", + created_at: ISODate("2025-09-14T23:19:55Z"), + }, + { + _id: "trk-186e130983a52afe9fa16029", + name: "proud_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1f2wPh9Ox2inN18mT1YuK4jRHKvVGoKG8SpgAzQkHSY=", + created_at: ISODate("2025-09-23T19:32:55Z"), + }, + { + _id: "trk-186e130983a53d672348d95f", + name: "wonderful_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "wTtqmRD/kVPjzkiGiJwEi6Ki7iSk/zTlmXS+hp4yNSo=", + created_at: ISODate("2025-10-04T21:25:55Z"), + }, + { + _id: "trk-186e130983a565faaf6e26d7", + name: "enchanting_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZVUDm/FzS/zzVL4cCFnt3GhgJWabExYb4opnpTH0EF0=", + created_at: ISODate("2025-09-19T07:10:55Z"), + }, + { + _id: "trk-186e130983a5847b2c0e34c5", + name: "compassionate_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "fc20Hdx9vXJ178vB52/ZIhUUQdM5xEC06cYBsFH6qFQ=", + created_at: ISODate("2025-10-05T12:11:55Z"), + }, + { + _id: "trk-186e130983a5965d6dada7f4", + name: "quirky_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "baCodUXLbJPBkTX0SYlNZoiS+wCQNxSCOQVl11U/nlw=", + created_at: ISODate("2025-09-26T23:13:55Z"), + }, + { + _id: "trk-186e130983a5c49aeba044f5", + name: "original_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "8Fc0JUIo5wNsW9YpeJgMyIWoMB6efwN8TNO1wREwMn4=", + created_at: ISODate("2025-09-16T16:39:55Z"), + }, + { + _id: "trk-186e130983a5d7349ac354d7", + name: "epic_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1Dw3ZR9Thr0Hcy4/nSnpDXiBfPsctFt9l+vlsNJ0IPk=", + created_at: ISODate("2025-10-05T23:44:55Z"), + }, + { + _id: "trk-186e130983a5e91f31ee5429", + name: "clever_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "T1XjWjDNQy1lBxDSvVgKpThI1K4POhliXJOFvtZFo/k=", + created_at: ISODate("2025-10-09T21:17:55Z"), + }, + { + _id: "trk-186e130983a5fa39a2a976c0", + name: "gifted_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "fr61QFVGUvqpBS8uWwQ49iudcMYGxgi9PW8RZcVg6so=", + created_at: ISODate("2025-09-19T08:34:55Z"), + }, + { + _id: "trk-186e130983a61fe1c2dd259e", + name: "jaunty_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "DpeFAN8wyPtjf1rGLO7JbAwB0VqowdXasLZOs8d0VXw=", + created_at: ISODate("2025-09-30T06:29:55Z"), + }, + { + _id: "trk-186e130983a6336076acfe23", + name: "nostalgic_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "+8M4KNmUM9/n0mPsZJZdTKUCXZILPHMNfmPPNNkcTXc=", + created_at: ISODate("2025-09-19T23:53:55Z"), + }, + { + _id: "trk-186e130983a644b5f71646b8", + name: "fancy_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Pf5p7rwp5Kz6sm9i5tkjoCze/i2Fg5YuTzJHBLSpNPs=", + created_at: ISODate("2025-09-27T10:30:55Z"), + }, + { + _id: "trk-186e130983a655ddcb922063", + name: "great_henry", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ZhajzgyxcVnZi0u9Hm6C58119AdBDZyXhtMSF76y/G4=", + created_at: ISODate("2025-09-30T21:42:55Z"), + }, + { + _id: "trk-186e130983a667a828ff844f", + name: "grieving_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "iKFwj7MKj0zd5ON6UBQyqlhZlEUqHuSd6jmKr905gq4=", + created_at: ISODate("2025-10-04T07:32:55Z"), + }, + { + _id: "trk-186e130983a6794fd7167c67", + name: "dreamy_yang", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "RKml+qYAdgRUFEbo7NYC6v6L5x9iH1WAyZkg3ywu/Mc=", + created_at: ISODate("2025-09-29T12:13:55Z"), + }, + { + _id: "trk-186e130983a68a6c4e789068", + name: "xenodochial_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "5jEOTEisy9PAHGo2cUxTLjcS7U/j1z+iDVu4AmPAQB4=", + created_at: ISODate("2025-10-09T09:38:55Z"), + }, + { + _id: "trk-186e130983a6a42c3aa15795", + name: "eloquent_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "fktsbKDjJeccJCECW3jEVln0OHXFMvTFa/JQb2T7zX4=", + created_at: ISODate("2025-09-27T11:41:55Z"), + }, + { + _id: "trk-186e130983a6b654add2ea90", + name: "optimized_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "kQeoHG8z2ONEFoa3e/6dviH2WAgRiAScU9R3czQHhiA=", + created_at: ISODate("2025-09-17T00:43:55Z"), + }, + { + _id: "trk-186e130983a6c82b57b03fe5", + name: "outstanding_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "cmzsUIvVt8wibHWzZd9Ej5CaoTDDDN325i7lsSTNfnk=", + created_at: ISODate("2025-09-24T14:47:55Z"), + }, + { + _id: "trk-186e130983a6da34cfc550e0", + name: "quizzical_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "pax2Gn8effRWcUhmxW/9Uc/KvWrfv6+IejTdzMlA7bk=", + created_at: ISODate("2025-09-15T21:11:55Z"), + }, + { + _id: "trk-186e130983a6ebaaea0d4795", + name: "competent_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "P6dDQCF6Fgjub8xGk93uxOQKX/KYcyB6e5bVrDrmHZ0=", + created_at: ISODate("2025-09-25T07:45:55Z"), + }, + { + _id: "trk-186e130983a6fd0db9d5a841", + name: "keen_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "wW1zdnRBu/V+TTrdSPjtT/enxkpbwHgcngL/n5oKQGI=", + created_at: ISODate("2025-09-22T07:56:55Z"), + }, + { + _id: "trk-186e130983a70f40a79fedae", + name: "fabulous_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "2Rg2uMXrpuF9EtKsOXnqxokMWKCDy6Qtgy/92Vq6WHI=", + created_at: ISODate("2025-09-21T20:54:55Z"), + }, + { + _id: "trk-186e130983a720eff34ba9c8", + name: "interesting_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "38OdyJBYXtEDLQ1W6Ay98X7QXHbs/rvV1Slbn+DVDIQ=", + created_at: ISODate("2025-09-20T08:01:55Z"), + }, + { + _id: "trk-186e130983a739bb2f817dda", + name: "adoring_dyson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "XNp46numS1q+uFS4mLsd3ixSmP98hQFwZpxJQvefmOA=", + created_at: ISODate("2025-09-27T23:47:55Z"), + }, + { + _id: "trk-186e130983a74c17ec7515dd", + name: "agitated_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "egIN2RS4kylE+AN+PL4GUXYr1L1D23aOOWHaFMua8dA=", + created_at: ISODate("2025-10-11T05:41:55Z"), + }, + { + _id: "trk-186e130983a75eb0efc4d28f", + name: "merry_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "nELHiKhUE7Y7U8Zni+levsFKjHkUj8L7nlmXeKV5upA=", + created_at: ISODate("2025-09-14T02:49:55Z"), + }, + { + _id: "trk-186e130983a770bd6a437b45", + name: "inspiring_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "GJRtvBmPmKbU2LIEG1J4qP5kjhin6FjzjpxcfdgmYHg=", + created_at: ISODate("2025-09-15T04:05:55Z"), + }, + { + _id: "trk-186e130983a782e44f0bccee", + name: "epic_wu", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "6WFt4fLWdRwbKb56kxs3UG7gbEmSRZJcWrs0Witu60I=", + created_at: ISODate("2025-09-25T11:46:55Z"), + }, + { + _id: "trk-186e130983a79453f87f853d", + name: "funny_hardy", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "DdlS8ZewVy8MnaPEyQ6ExhyVzZ+Ym6pmplr2OdFyVu8=", + created_at: ISODate("2025-10-09T09:21:55Z"), + }, + { + _id: "trk-186e130983a7abf10c38fab8", + name: "iron_hopper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "jxb07WpM4h93Gdp+I+RcoQKmvhFapFRDedoY3KTRuAk=", + created_at: ISODate("2025-10-11T16:29:55Z"), + }, + { + _id: "trk-186e130983a7c5a7c28ded10", + name: "lucid_shockley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "lQmhvYl/A6RCnqgQkuKmAgeI8w8+3XKoosilNbF3ls8=", + created_at: ISODate("2025-09-19T02:32:55Z"), + }, + { + _id: "trk-186e130983a7f22eb4ae7f9f", + name: "relaxed_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "KOf+6+kC7nFU7uRBYQG1Kn8fB0AWQnEs+JzKSVpmt60=", + created_at: ISODate("2025-09-17T22:44:55Z"), + }, + { + _id: "trk-186e130983a8041d25549f0e", + name: "pedantic_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XjirKNQ0apJVVa03WWRHnhQU3/ucgTKHRo+ydtYvQf4=", + created_at: ISODate("2025-09-17T17:43:55Z"), + }, + { + _id: "trk-186e130983a8165b1981350b", + name: "nervous_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "u8kNHC3Cm0xRQYyNVAY4RCsBpacPE8gOG6yupuQehsY=", + created_at: ISODate("2025-10-01T09:36:55Z"), + }, + { + _id: "trk-186e130983a827f007a9b2b3", + name: "thoughtful_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "rWTp82vUW/6XjsvgtDfREFW5crHPAtI6fhHQMUalNTQ=", + created_at: ISODate("2025-09-16T19:10:55Z"), + }, + { + _id: "trk-186e130983a839a432f99c62", + name: "fearless_galvani", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "VPh59T5lqElB/rv7YVdSvF8jVC/MUKYPZe7AQrjP8Oo=", + created_at: ISODate("2025-09-28T04:08:55Z"), + }, + { + _id: "trk-186e130983a84c6c80d3a12d", + name: "merry_watson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZdoTuYQHaObGbs+3cL1Snf2Z81VdKSm9+rpK88YgFHg=", + created_at: ISODate("2025-10-04T09:58:55Z"), + }, + { + _id: "trk-186e130983a85f66521883b1", + name: "awesome_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "+mc3lyjvdmOs9fvgfehZmJD2ayxnCim9ejoV2M6+aYc=", + created_at: ISODate("2025-09-24T06:51:55Z"), + }, + { + _id: "trk-186e130983a870935e563e9f", + name: "sad_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "70AYubA/PkCQBM54UEFGUK2FQyqpOYdonEt4/qVgEOE=", + created_at: ISODate("2025-10-02T14:01:55Z"), + }, + { + _id: "trk-186e130983a88346a0103419", + name: "trusting_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "V2Gm/mIE2Uxwcrplrf/glr7A8e/VQFK/iBqjTdXarxw=", + created_at: ISODate("2025-09-22T03:30:55Z"), + }, + { + _id: "trk-186e130983a8948dd91d5777", + name: "enchanting_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "GpAgMGQ/TifcNTlfVC5jyOC4riwOaJZ7YGyiycZ3hfc=", + created_at: ISODate("2025-09-18T07:52:55Z"), + }, + { + _id: "trk-186e130983a8a62ec36b8234", + name: "noble_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "TWKFkqd+aAj+YNskjVxR6ftBy6AnldQ+UvzUXYr27kE=", + created_at: ISODate("2025-09-24T08:20:55Z"), + }, + { + _id: "trk-186e130983a8b81ed167fa68", + name: "relaxed_fourier", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "vShTmZ1PkdComu1SSjKsqbsJALZIcFpIQCP6e7m+mTE=", + created_at: ISODate("2025-09-15T07:10:55Z"), + }, + { + _id: "trk-186e130983a8cae50b739184", + name: "adoring_marconi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "tKns/mbBJ1Vj+M2XMvIg2t4a5clE8LKNcU4REn7kYb0=", + created_at: ISODate("2025-10-06T13:19:55Z"), + }, + { + _id: "trk-186e130983a8e3cfea83018f", + name: "blissful_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gzu43V5D0h7gjzYWkhV8eGecgWY97ULsA+GAFp0votU=", + created_at: ISODate("2025-09-26T15:42:55Z"), + }, ]); diff --git a/services/playbooks/roles/mongo/files/init.js b/services/playbooks/roles/mongo/files/init.js index f8abe2d4..d030e316 100644 --- a/services/playbooks/roles/mongo/files/init.js +++ b/services/playbooks/roles/mongo/files/init.js @@ -1653,4 +1653,804 @@ db.devices.insertMany([ private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", created_at: ISODate("2025-09-13T16:47:26Z"), }, + { + _id: "trk-186e1309839bbd54be8f785e", + name: "gifted_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ZCw5gk1MaebMg2IsOivMuSZgCAJQxYPZ8o3KMTn0oSY=", + created_at: ISODate("2025-10-02T18:57:55Z"), + }, + { + _id: "trk-186e1309839e1ffe329ebf18", + name: "zealous_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "LOjfvsoJj7zNBoByyrJqgnfbVuvg2oqSWSo23k5szrw=", + created_at: ISODate("2025-10-05T07:08:55Z"), + }, + { + _id: "trk-186e1309839e3cc066512dbd", + name: "elastic_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "k7fQ1A277mZYtLp4yZwgQv5SAHg+CQykl65IYmBOcLw=", + created_at: ISODate("2025-10-13T05:51:55Z"), + }, + { + _id: "trk-186e1309839e5c57c7e9af1b", + name: "energetic_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "cTlwhna05v7wqUSh4A6t7V59z5nfZPwlmu5phCNjhzs=", + created_at: ISODate("2025-09-15T01:26:55Z"), + }, + { + _id: "trk-186e1309839e7274fbb77443", + name: "noble_schwinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "zWDBZnVqBcN60DwbxryQ+eLp/b+dr/xlpafTcWfFs1c=", + created_at: ISODate("2025-09-23T19:53:55Z"), + }, + { + _id: "trk-186e1309839e85fe0ba301ac", + name: "puzzled_heisenberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "EE/TZ0jS3mEwbZx/YqElSKS2qxTLiADL3wTZc7UtTR4=", + created_at: ISODate("2025-09-15T11:31:55Z"), + }, + { + _id: "trk-186e1309839e99c2655eb597", + name: "magical_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "zaDTN2SiXFRcxdsnSyeZST0eJO2ymNrnWVh9KSiBjmQ=", + created_at: ISODate("2025-09-19T07:21:55Z"), + }, + { + _id: "trk-186e1309839eae938abbb06e", + name: "polite_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "3E5qvFq6m7TZW5scw/ZYc39zAnhourZwtQbte1KRFcg=", + created_at: ISODate("2025-09-22T23:00:55Z"), + }, + { + _id: "trk-186e1309839ec6a5f176f269", + name: "suspicious_weber", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "vPKKppUdZeMiXY5HYgFgHETpYx3jtWRHuMeNPNX+gIo=", + created_at: ISODate("2025-09-24T20:49:55Z"), + }, + { + _id: "trk-186e1309839edcbc0e9ccdee", + name: "hyper_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "m6ltZvHHeKGnbg/7OCLoDwz5JuXP2lr1pcY4Vj+iY6Y=", + created_at: ISODate("2025-09-15T11:08:55Z"), + }, + { + _id: "trk-186e1309839ef37e250b2ac1", + name: "flamboyant_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "IZrX9Tvi8DNKS7uFTtf/HLwYxivfO6gnriULc081BW4=", + created_at: ISODate("2025-09-27T03:18:55Z"), + }, + { + _id: "trk-186e1309839f7ba1a81d392e", + name: "laughing_oppenheimer", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "sTqUXGZmpiGZHGxXEFElISIe3iJz9VW5h7LrKbdbT5Q=", + created_at: ISODate("2025-09-21T19:38:55Z"), + }, + { + _id: "trk-186e1309839fda077e230f18", + name: "sleepy_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "K/fnViP3HJeORW02MDQiODA2KJIIOklTQ95dp8KR1Aw=", + created_at: ISODate("2025-10-08T09:06:55Z"), + }, + { + _id: "trk-186e1309839fef6604700630", + name: "cranky_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "LhU6aqY/E9DHusg8AbbavTuikkHRVaOKAceEX4erXb8=", + created_at: ISODate("2025-10-13T10:22:55Z"), + }, + { + _id: "trk-186e130983a01ae99c930d78", + name: "brave_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "DdkJUpGmJY7ZMiMKeyTIUh+NOId0DzLi7dp6alJhQ88=", + created_at: ISODate("2025-09-18T08:13:55Z"), + }, + { + _id: "trk-186e130983a034f970090b84", + name: "keen_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "bb/3zD4PlygRSNYJ2JfXWtQOGXRlw4iqjv0nESpWnnw=", + created_at: ISODate("2025-10-12T15:58:55Z"), + }, + { + _id: "trk-186e130983a059f6f1438b3e", + name: "awesome_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "KGd+GfOfvoG61VkVQFjTJR0Yq/znautGUH+9WAnDLoQ=", + created_at: ISODate("2025-09-24T09:31:55Z"), + }, + { + _id: "trk-186e130983a07ae5a7263ec1", + name: "crazy_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hbTWXcPaFt/C79Q3ljLio7j7GkYT4DT6UKavFR/7tOg=", + created_at: ISODate("2025-10-04T02:54:55Z"), + }, + { + _id: "trk-186e130983a09704293604ee", + name: "calm_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "OU1L1O+EUhwPhwmKJ8OtajzN5xPrV4wyWeLsTaoY1I8=", + created_at: ISODate("2025-10-01T22:19:55Z"), + }, + { + _id: "trk-186e130983a0b6016eeb4331", + name: "proud_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Je7MWPdNzzyVBGdsKH0ZrdkDCkkk52S0sa9OOaloRQM=", + created_at: ISODate("2025-09-24T22:52:55Z"), + }, + { + _id: "trk-186e130983a0db3e0cc11f28", + name: "furious_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "rINraJ2KTESEfAph/IFXaUIsFf2DwvcV46lED/a+XZQ=", + created_at: ISODate("2025-09-30T07:18:55Z"), + }, + { + _id: "trk-186e130983a14583c71a2172", + name: "faithful_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "oaNmemljb/RTXF5lwD+aYiyJduErvUitnjU9P6O3Qcc=", + created_at: ISODate("2025-10-06T15:35:55Z"), + }, + { + _id: "trk-186e130983a159e2bbb9f5f8", + name: "upbeat_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "FlfO21D9qS/voZQhw7ALRXcQpl+4P0+bcsAVx+HqTys=", + created_at: ISODate("2025-10-10T03:06:55Z"), + }, + { + _id: "trk-186e130983a1c1a1f3cb2f24", + name: "hungry_gauss", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "MP/K9fmbN8gjGL2dlUgPwvfkmH1AUPDCjdAiUqu944g=", + created_at: ISODate("2025-10-11T22:35:55Z"), + }, + { + _id: "trk-186e130983a1d5c90eeb7be5", + name: "motivated_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "yKTjLolSSeYIykBPgT5XtvoUQdKALNFkkNu44kNoGP4=", + created_at: ISODate("2025-10-05T00:01:55Z"), + }, + { + _id: "trk-186e130983a1ea63e8dbee65", + name: "laughing_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gqr+1LMynMxT9/LCZi34YT7w7kNetDPAIM5vgxuJ62E=", + created_at: ISODate("2025-09-26T16:11:55Z"), + }, + { + _id: "trk-186e130983a1fd7e0e4791cc", + name: "blissful_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "46eu29Cek7uXQbQIikPXWXXtb5Mj4uF8qiNAjlAhHAg=", + created_at: ISODate("2025-09-20T07:34:55Z"), + }, + { + _id: "trk-186e130983a2109dd0df3463", + name: "modest_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wDLjDpT2iWWujj+LVSJmdJiiJvgBj4cZ+79LZdPwQ9s=", + created_at: ISODate("2025-09-23T15:00:55Z"), + }, + { + _id: "trk-186e130983a234a9618f898e", + name: "confident_peano", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "v6fr9Q4/AQTAwGGrEszqok6AU/RlCO7EmsWoaHPR1Wg=", + created_at: ISODate("2025-09-27T05:29:55Z"), + }, + { + _id: "trk-186e130983a2560f98ea7e47", + name: "jovial_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "KcMeDL6RVjQrEE3xf+j2tcYleM26p60oLqaVvRhQFDM=", + created_at: ISODate("2025-09-25T14:14:55Z"), + }, + { + _id: "trk-186e130983a26a15f661928b", + name: "eloquent_dedekind", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "X8atklQ+PoJ0GuKFPwfSs49w1C1tjiwstgnvu+3Uaq8=", + created_at: ISODate("2025-09-29T19:35:55Z"), + }, + { + _id: "trk-186e130983a27e5bc05251b9", + name: "frosty_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "1kASDQP73a3z2SN8IkuNtI3cYmX3jjvmO+/bU1sQwHY=", + created_at: ISODate("2025-09-21T07:50:55Z"), + }, + { + _id: "trk-186e130983a291f1e443cd5a", + name: "proud_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "UzmsA89/TC3Y9HXzAj/FFajvNUheAN9dGb/0axlXtb8=", + created_at: ISODate("2025-10-01T10:25:55Z"), + }, + { + _id: "trk-186e130983a2a576491ef9af", + name: "angry_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "sKpBt81A5fAZFsm4npMR5KEv3eJY9csJ0lU2dV09slw=", + created_at: ISODate("2025-10-08T07:07:55Z"), + }, + { + _id: "trk-186e130983a2d186e5d486fb", + name: "hungry_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "fH0z5owaDwYFtDAHOTndNz6bZboOOrfJS7G0FcLWwSc=", + created_at: ISODate("2025-09-26T13:34:55Z"), + }, + { + _id: "trk-186e130983a2e58a9f17fdc3", + name: "distracted_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "T9pkDWyxASF5yTI/tPUa0oYGkbS7kEJw658mWEYmXuw=", + created_at: ISODate("2025-09-15T03:42:55Z"), + }, + { + _id: "trk-186e130983a2fe87872f4f49", + name: "thoughtful_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hcUkyXC/+F/nxBV8iOeTaXlbPlVbefYzFfrbXkGV8Sg=", + created_at: ISODate("2025-10-05T01:51:55Z"), + }, + { + _id: "trk-186e130983a322c165ec9526", + name: "sad_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "vNNucwhglkB7Y1aVZrx8AmdKQH0T8NQ/nDA6WvAmHYA=", + created_at: ISODate("2025-09-28T01:45:55Z"), + }, + { + _id: "trk-186e130983a340ddf0bf05e4", + name: "vibrant_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "JD9CEeoyzLC/HXULUtZRds3Zt3W73rlEK9SaMNABxX4=", + created_at: ISODate("2025-10-13T14:53:55Z"), + }, + { + _id: "trk-186e130983a35bf2a8e986cb", + name: "original_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "B7fsNi61OSIwh7sOPijfiaXcO35j4b8D4RzaOO9AI9o=", + created_at: ISODate("2025-09-13T22:37:55Z"), + }, + { + _id: "trk-186e130983a37e04ea2b2ff2", + name: "fabulous_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "BgA+RZUSOglE9OOaC64uOPYBH2Q3FXKTh92P7kevJmo=", + created_at: ISODate("2025-09-26T15:11:55Z"), + }, + { + _id: "trk-186e130983a39b9455bdeedf", + name: "awesome_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ttzL9AQTJ9RKMTlAF7il5xpv84u4wPLSCxzJ7QgAK2o=", + created_at: ISODate("2025-10-07T23:48:55Z"), + }, + { + _id: "trk-186e130983a3c77bb7a4f5d7", + name: "heartwarming_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "HXOc5oU5YLvbceVhUGdpPTmDfF3FROJAPjZ2XkjjTvo=", + created_at: ISODate("2025-10-02T15:09:55Z"), + }, + { + _id: "trk-186e130983a42d5fb53a30e9", + name: "sweet_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Cogel1ZaSvbfbwjKN9kzoFdMkNmRVyjLhdVO1TIXRX8=", + created_at: ISODate("2025-09-21T15:57:55Z"), + }, + { + _id: "trk-186e130983a45e7421d17024", + name: "heuristic_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XO/6YycdUYkH63d460y/NTW0dxLBPiAygeMjHuRmag8=", + created_at: ISODate("2025-10-05T02:06:55Z"), + }, + { + _id: "trk-186e130983a47ab26312a621", + name: "serene_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "ZEey/z8mahhYZ6P2370knAdpoBRxrl+rUc8IRGe7X+s=", + created_at: ISODate("2025-10-11T19:15:55Z"), + }, + { + _id: "trk-186e130983a49cc1a4ead31d", + name: "admiring_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "z1UanROYzQtod+7GLLbw9qYdIvet+pQQEc85sdmE1tI=", + created_at: ISODate("2025-10-10T21:17:55Z"), + }, + { + _id: "trk-186e130983a4af6de88c809f", + name: "practical_cantor", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "n7DXivw4BcVLW2WE3NGNZGADmQgpJuAqcDxd/3ys6oo=", + created_at: ISODate("2025-09-14T14:27:55Z"), + }, + { + _id: "trk-186e130983a4c1a2c1717cf8", + name: "keen_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "QzRG4fj6Ieu/CEDn4y6+Bu1gBFqY4ISF+tHNhDtlNOU=", + created_at: ISODate("2025-10-11T10:09:55Z"), + }, + { + _id: "trk-186e130983a4d36ac7ba8b7a", + name: "proud_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "EX3KV2PKMP/B3ZQ2W/lWny+J+Ph56ZZvPU5Ee4JyKN4=", + created_at: ISODate("2025-09-25T21:44:55Z"), + }, + { + _id: "trk-186e130983a4e47156945059", + name: "goofy_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "vazs6yunKp5x6D8iixRFQWIPPtuhKeHi8k+cnv/oP10=", + created_at: ISODate("2025-09-19T10:10:55Z"), + }, + { + _id: "trk-186e130983a4f6d211f892ab", + name: "phenomenal_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "F5ynV08uXxR+VAwDWviUzRt5DJSK4tZkuw76KO8gICI=", + created_at: ISODate("2025-09-25T04:49:55Z"), + }, + { + _id: "trk-186e130983a508c15816b9c0", + name: "nervous_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "wcyoP8iDI3UU5H1r/qqVYLR1tsMuB0fwqilajOO4+vc=", + created_at: ISODate("2025-09-19T21:06:55Z"), + }, + { + _id: "trk-186e130983a519b7a38da4ea", + name: "polite_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1tk9YjVrNKneUDY1Osjo/Dwi4i10Gso/pN46e3GvYYY=", + created_at: ISODate("2025-09-14T23:19:55Z"), + }, + { + _id: "trk-186e130983a52afe9fa16029", + name: "proud_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1f2wPh9Ox2inN18mT1YuK4jRHKvVGoKG8SpgAzQkHSY=", + created_at: ISODate("2025-09-23T19:32:55Z"), + }, + { + _id: "trk-186e130983a53d672348d95f", + name: "wonderful_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "wTtqmRD/kVPjzkiGiJwEi6Ki7iSk/zTlmXS+hp4yNSo=", + created_at: ISODate("2025-10-04T21:25:55Z"), + }, + { + _id: "trk-186e130983a565faaf6e26d7", + name: "enchanting_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZVUDm/FzS/zzVL4cCFnt3GhgJWabExYb4opnpTH0EF0=", + created_at: ISODate("2025-09-19T07:10:55Z"), + }, + { + _id: "trk-186e130983a5847b2c0e34c5", + name: "compassionate_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "fc20Hdx9vXJ178vB52/ZIhUUQdM5xEC06cYBsFH6qFQ=", + created_at: ISODate("2025-10-05T12:11:55Z"), + }, + { + _id: "trk-186e130983a5965d6dada7f4", + name: "quirky_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "baCodUXLbJPBkTX0SYlNZoiS+wCQNxSCOQVl11U/nlw=", + created_at: ISODate("2025-09-26T23:13:55Z"), + }, + { + _id: "trk-186e130983a5c49aeba044f5", + name: "original_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "8Fc0JUIo5wNsW9YpeJgMyIWoMB6efwN8TNO1wREwMn4=", + created_at: ISODate("2025-09-16T16:39:55Z"), + }, + { + _id: "trk-186e130983a5d7349ac354d7", + name: "epic_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1Dw3ZR9Thr0Hcy4/nSnpDXiBfPsctFt9l+vlsNJ0IPk=", + created_at: ISODate("2025-10-05T23:44:55Z"), + }, + { + _id: "trk-186e130983a5e91f31ee5429", + name: "clever_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "T1XjWjDNQy1lBxDSvVgKpThI1K4POhliXJOFvtZFo/k=", + created_at: ISODate("2025-10-09T21:17:55Z"), + }, + { + _id: "trk-186e130983a5fa39a2a976c0", + name: "gifted_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "fr61QFVGUvqpBS8uWwQ49iudcMYGxgi9PW8RZcVg6so=", + created_at: ISODate("2025-09-19T08:34:55Z"), + }, + { + _id: "trk-186e130983a61fe1c2dd259e", + name: "jaunty_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "DpeFAN8wyPtjf1rGLO7JbAwB0VqowdXasLZOs8d0VXw=", + created_at: ISODate("2025-09-30T06:29:55Z"), + }, + { + _id: "trk-186e130983a6336076acfe23", + name: "nostalgic_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "+8M4KNmUM9/n0mPsZJZdTKUCXZILPHMNfmPPNNkcTXc=", + created_at: ISODate("2025-09-19T23:53:55Z"), + }, + { + _id: "trk-186e130983a644b5f71646b8", + name: "fancy_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Pf5p7rwp5Kz6sm9i5tkjoCze/i2Fg5YuTzJHBLSpNPs=", + created_at: ISODate("2025-09-27T10:30:55Z"), + }, + { + _id: "trk-186e130983a655ddcb922063", + name: "great_henry", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ZhajzgyxcVnZi0u9Hm6C58119AdBDZyXhtMSF76y/G4=", + created_at: ISODate("2025-09-30T21:42:55Z"), + }, + { + _id: "trk-186e130983a667a828ff844f", + name: "grieving_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "iKFwj7MKj0zd5ON6UBQyqlhZlEUqHuSd6jmKr905gq4=", + created_at: ISODate("2025-10-04T07:32:55Z"), + }, + { + _id: "trk-186e130983a6794fd7167c67", + name: "dreamy_yang", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "RKml+qYAdgRUFEbo7NYC6v6L5x9iH1WAyZkg3ywu/Mc=", + created_at: ISODate("2025-09-29T12:13:55Z"), + }, + { + _id: "trk-186e130983a68a6c4e789068", + name: "xenodochial_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "5jEOTEisy9PAHGo2cUxTLjcS7U/j1z+iDVu4AmPAQB4=", + created_at: ISODate("2025-10-09T09:38:55Z"), + }, + { + _id: "trk-186e130983a6a42c3aa15795", + name: "eloquent_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "fktsbKDjJeccJCECW3jEVln0OHXFMvTFa/JQb2T7zX4=", + created_at: ISODate("2025-09-27T11:41:55Z"), + }, + { + _id: "trk-186e130983a6b654add2ea90", + name: "optimized_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "kQeoHG8z2ONEFoa3e/6dviH2WAgRiAScU9R3czQHhiA=", + created_at: ISODate("2025-09-17T00:43:55Z"), + }, + { + _id: "trk-186e130983a6c82b57b03fe5", + name: "outstanding_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "cmzsUIvVt8wibHWzZd9Ej5CaoTDDDN325i7lsSTNfnk=", + created_at: ISODate("2025-09-24T14:47:55Z"), + }, + { + _id: "trk-186e130983a6da34cfc550e0", + name: "quizzical_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "pax2Gn8effRWcUhmxW/9Uc/KvWrfv6+IejTdzMlA7bk=", + created_at: ISODate("2025-09-15T21:11:55Z"), + }, + { + _id: "trk-186e130983a6ebaaea0d4795", + name: "competent_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "P6dDQCF6Fgjub8xGk93uxOQKX/KYcyB6e5bVrDrmHZ0=", + created_at: ISODate("2025-09-25T07:45:55Z"), + }, + { + _id: "trk-186e130983a6fd0db9d5a841", + name: "keen_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "wW1zdnRBu/V+TTrdSPjtT/enxkpbwHgcngL/n5oKQGI=", + created_at: ISODate("2025-09-22T07:56:55Z"), + }, + { + _id: "trk-186e130983a70f40a79fedae", + name: "fabulous_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "2Rg2uMXrpuF9EtKsOXnqxokMWKCDy6Qtgy/92Vq6WHI=", + created_at: ISODate("2025-09-21T20:54:55Z"), + }, + { + _id: "trk-186e130983a720eff34ba9c8", + name: "interesting_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "38OdyJBYXtEDLQ1W6Ay98X7QXHbs/rvV1Slbn+DVDIQ=", + created_at: ISODate("2025-09-20T08:01:55Z"), + }, + { + _id: "trk-186e130983a739bb2f817dda", + name: "adoring_dyson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "XNp46numS1q+uFS4mLsd3ixSmP98hQFwZpxJQvefmOA=", + created_at: ISODate("2025-09-27T23:47:55Z"), + }, + { + _id: "trk-186e130983a74c17ec7515dd", + name: "agitated_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "egIN2RS4kylE+AN+PL4GUXYr1L1D23aOOWHaFMua8dA=", + created_at: ISODate("2025-10-11T05:41:55Z"), + }, + { + _id: "trk-186e130983a75eb0efc4d28f", + name: "merry_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "nELHiKhUE7Y7U8Zni+levsFKjHkUj8L7nlmXeKV5upA=", + created_at: ISODate("2025-09-14T02:49:55Z"), + }, + { + _id: "trk-186e130983a770bd6a437b45", + name: "inspiring_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "GJRtvBmPmKbU2LIEG1J4qP5kjhin6FjzjpxcfdgmYHg=", + created_at: ISODate("2025-09-15T04:05:55Z"), + }, + { + _id: "trk-186e130983a782e44f0bccee", + name: "epic_wu", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "6WFt4fLWdRwbKb56kxs3UG7gbEmSRZJcWrs0Witu60I=", + created_at: ISODate("2025-09-25T11:46:55Z"), + }, + { + _id: "trk-186e130983a79453f87f853d", + name: "funny_hardy", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "DdlS8ZewVy8MnaPEyQ6ExhyVzZ+Ym6pmplr2OdFyVu8=", + created_at: ISODate("2025-10-09T09:21:55Z"), + }, + { + _id: "trk-186e130983a7abf10c38fab8", + name: "iron_hopper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "jxb07WpM4h93Gdp+I+RcoQKmvhFapFRDedoY3KTRuAk=", + created_at: ISODate("2025-10-11T16:29:55Z"), + }, + { + _id: "trk-186e130983a7c5a7c28ded10", + name: "lucid_shockley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "lQmhvYl/A6RCnqgQkuKmAgeI8w8+3XKoosilNbF3ls8=", + created_at: ISODate("2025-09-19T02:32:55Z"), + }, + { + _id: "trk-186e130983a7f22eb4ae7f9f", + name: "relaxed_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "KOf+6+kC7nFU7uRBYQG1Kn8fB0AWQnEs+JzKSVpmt60=", + created_at: ISODate("2025-09-17T22:44:55Z"), + }, + { + _id: "trk-186e130983a8041d25549f0e", + name: "pedantic_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XjirKNQ0apJVVa03WWRHnhQU3/ucgTKHRo+ydtYvQf4=", + created_at: ISODate("2025-09-17T17:43:55Z"), + }, + { + _id: "trk-186e130983a8165b1981350b", + name: "nervous_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "u8kNHC3Cm0xRQYyNVAY4RCsBpacPE8gOG6yupuQehsY=", + created_at: ISODate("2025-10-01T09:36:55Z"), + }, + { + _id: "trk-186e130983a827f007a9b2b3", + name: "thoughtful_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "rWTp82vUW/6XjsvgtDfREFW5crHPAtI6fhHQMUalNTQ=", + created_at: ISODate("2025-09-16T19:10:55Z"), + }, + { + _id: "trk-186e130983a839a432f99c62", + name: "fearless_galvani", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "VPh59T5lqElB/rv7YVdSvF8jVC/MUKYPZe7AQrjP8Oo=", + created_at: ISODate("2025-09-28T04:08:55Z"), + }, + { + _id: "trk-186e130983a84c6c80d3a12d", + name: "merry_watson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZdoTuYQHaObGbs+3cL1Snf2Z81VdKSm9+rpK88YgFHg=", + created_at: ISODate("2025-10-04T09:58:55Z"), + }, + { + _id: "trk-186e130983a85f66521883b1", + name: "awesome_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "+mc3lyjvdmOs9fvgfehZmJD2ayxnCim9ejoV2M6+aYc=", + created_at: ISODate("2025-09-24T06:51:55Z"), + }, + { + _id: "trk-186e130983a870935e563e9f", + name: "sad_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "70AYubA/PkCQBM54UEFGUK2FQyqpOYdonEt4/qVgEOE=", + created_at: ISODate("2025-10-02T14:01:55Z"), + }, + { + _id: "trk-186e130983a88346a0103419", + name: "trusting_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "V2Gm/mIE2Uxwcrplrf/glr7A8e/VQFK/iBqjTdXarxw=", + created_at: ISODate("2025-09-22T03:30:55Z"), + }, + { + _id: "trk-186e130983a8948dd91d5777", + name: "enchanting_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "GpAgMGQ/TifcNTlfVC5jyOC4riwOaJZ7YGyiycZ3hfc=", + created_at: ISODate("2025-09-18T07:52:55Z"), + }, + { + _id: "trk-186e130983a8a62ec36b8234", + name: "noble_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "TWKFkqd+aAj+YNskjVxR6ftBy6AnldQ+UvzUXYr27kE=", + created_at: ISODate("2025-09-24T08:20:55Z"), + }, + { + _id: "trk-186e130983a8b81ed167fa68", + name: "relaxed_fourier", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "vShTmZ1PkdComu1SSjKsqbsJALZIcFpIQCP6e7m+mTE=", + created_at: ISODate("2025-09-15T07:10:55Z"), + }, + { + _id: "trk-186e130983a8cae50b739184", + name: "adoring_marconi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "tKns/mbBJ1Vj+M2XMvIg2t4a5clE8LKNcU4REn7kYb0=", + created_at: ISODate("2025-10-06T13:19:55Z"), + }, + { + _id: "trk-186e130983a8e3cfea83018f", + name: "blissful_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gzu43V5D0h7gjzYWkhV8eGecgWY97ULsA+GAFp0votU=", + created_at: ISODate("2025-09-26T15:42:55Z"), + }, ]); From 7f47307584a5b41911f9a335842ec124c4e87ea2 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 15:35:22 +0200 Subject: [PATCH 045/242] checkpointing --- .../com/example/job/AggregationHandler.class | Bin 11231 -> 11527 bytes tracky/src/firmware.go | 43 +++++++++++------- tracky/src/trackeroo/driving.go | 27 ++++++++--- tracky/src/trackeroo/routes.go | 24 ++++++---- 4 files changed, 63 insertions(+), 31 deletions(-) diff --git a/flink_job/bin/main/com/example/job/AggregationHandler.class b/flink_job/bin/main/com/example/job/AggregationHandler.class index a3d34df03ddf850f379d68291ad40581a3a312ac..70875bce5205804cc6b7a79dd280d07a7225bbd1 100644 GIT binary patch literal 11527 zcmdT~33yfInSQ@)=icOm#IS}cjYw<~2vIgA5tOir2CxL75jEZ0v z6O^uwtc}#gBJs|;#civd_Oyip!7wu#P1H3z$!H`N-56<$Ib57F-DOTPMKGr?m?Mx= z1jVxx@l-kzPcMtadYpVxq5p}Xpexed?IZ=YO-jznNGk0l*LTJ0R!7>`q!RJEjz~Jv z7L9j!xEGq`4cvG_G#*XQ6y#P_FB9a=PINeh$VHirAt)&XDYP*hC4xd-=2PJ2(GKDK1j)wtcs*o%}yke9np9s?U0RR)gbs7m)+8Ekjtx^vL@1; zPDbOM6iOw&WZ`Hk_J23C0BRdmsHRe5ku)u5j)EC)V}d)Dh?mi7CfcaOF@lj@ku?tO zsy&ik9!-;D*TTr}sH!>qZvd)7m?W^8Po7mfY3j5>Ou;k@Q>i^ee#&X@Nk-Ef>J~bw zRHW0H6YX?TX&cAkctH_WvcMo{r&2uQ>Y z6AeLNo>?eu%{G?ebb?b?j(5;P1^{>9UXMFcG#krpd<89(SvuhYrnl2ivixPx)nkQ? zGjWz6oa$*y8RHa;s9LaKfaMli1*5Z2mh{Ba(Jp81`gW&VqhbgV&d*II6Uho%b$3si zre2Xu^rW2%b-F^FjdqPcWU6KWrUC>mU6o9%(}2@Zz086NKZ`blPms@`nWV()4$>p( zK}NLs(Kx9Tlm$?GvJo8N4t|Ek(tMOBLCy+VV0e|Y-WPTG0l<9S&}G~B$Mr%l86H@d z;iZb#IP6K1ux99enj2s1#1h?3!%W)yAVS>%q**vmF!`_8S%{4&E5e1i$igP7IBP(@uxwn6OXww0 z6<#{QEIY#Y5}IzT&aC5jLlG{+6&5b{q4b-zaV4&zHN>6uw50xi=6Sk>YrMqw`MGkO zFRd_Xzs|;2alOEfG3mEDt|j<|z#!o;&s>cgZQO*L8Kb)+8)At_$0@8E1QQ0Mjnmv6 z1hWyh+V~o7qtCS`==U_?1!3HQJ1uOcHxEKT9xNMQ$6X{Q)$KSPt+8lVbU*)_lju>u zFT_3griE|x%LwkAjeBt)L3Egvrerd84%6XAJfH}wm9&R!Y{42`=d6vkJFW3Zm!m5l zQlV_M@hzRqO-DL)aI5Zk+(su>X=|H}C>XE=PuUoYqjbr38@;-v&_uLW^?qHt!^TeK zDBo~YaMCzayFqt++s3naj?NWLwRT5oV{|S#LuX#F@f}Ut;SML3jYr9!LuV>+ZP;W9o?040@Y~Vcg;ZzDG47(s`rsmEaFQ*P zl|e618`gBsR9mL$p0Hv!Ax}q-w`IB+Rdkur23t;WM+x7IhGeF1>&q7`nzMMhYva)l zTKEJOjm#`FDm!TFa*{M!GK&HZ2#7T%w@JIQiC<>0(X+7Ozs+I1FhG~nAFFx zfF%9g&vjZnYDAtom`r#;T|zugd@bdpak146q=I7x11k_5Nk)n9P8lFm1_NY2pCTa3 z%kLCT|1&!Sh<9?HJ%A(*wv1yKYtxgIFA=9>iPO&0wBW)4Le5}V@gdQrn@u@-P?e&O zpB2M0DGA9|rIN11mqllx9smdjbT zoQ)90o=&y)#G~siImfRLQ|HF&6f+I1tGiHIrH!W^X=k#oI;DD`oH%J^Ce*UT@Cs0O+(c=&EO!TVpHF;t#OE$M65z-k%wz(u>!*P1mO$>x zZaHwUe{OPDYUu7sF==Rt7xgM#iq z>I=L7Xh7iEiHy(#L%!g%Ly9UO=j_CO#X?}BzY?+&t|HhUTbUYbxXq{|JD5?5?rXb% z#at>RH;RP!H(I|+I~0bSDJ*FT6{eIl4YHnb)vVPSjd)#OUT$|kS!K5b1eo1;z~CSa zH6%BSj5~D3lwsaToO&?=$aI22&_UO1|6dqSNNyFpx}V`33VUHq?AEAR6$h;1|H=$* z6a4YenL&o9&sFk%y!Brju;{?Vp$!M8cuCqn`kW9bQ@u7FI5JQGdoPO6Og8CMIvMF+=%iOAI#PwQMIN!_VZOa(&qdMr z+Qb^C&XvJz^Wrlv($0&^4SWict%5s({CcZhfG)b!xTZv6O;7g#5)DYD-^QgpR1C2E zvu_y81E~jMb|e;S=B;Z(Nr5~RlE+v?%LHlQAFHJWaaM5V>PO$^N`2Y*fK0KvO`dLfJ6t9ktMqXV?KW=OFCDeq+k(G0Sg^{ zP)*@T-Y4erFCRG=4GST*!@MrcK_M>D7gDxa(&`H>|1D*&fnVV_T(bj*)%0QLlVOfN<&$XsMW z#z|QMWjHqga;OLLi)O8q5o(2DM~OU+J(oxlsPMNLk_Mq`907tn5 zN;{b-;@VB)w__atY9{c@znW)I3oI%-b|)s+=auKx_F;M-POQ)0joD;iZhb*{eoKAf zbJN1P(?VM?uDoz~X!10xyr67e-m}PU$sKO(#L3M&v8WGAmR}Z<;i2K-d-uIwUeJeS zxuvCjIAhzQ-8j3Y?3~&iXnWppl0*uQCzKj80bD=T{YWn!t*!AEJ?4F%=);q}c-rgr zaccm|Fzjl-{T_sBiEVdn3(@4A(~DcQ^}M(2yY0Q1_KRhI--nks;|6c;$9r&@Zhb{< z(H|?@+lNU0-1ZUd6@+RKWiC?)Brv0`z@vct1?M}S=6#h{5 zAFi2scwTJo!w1W^;0nKA_7_9jTAz+RSfjLk5~OXYK#8Nkl{m@SY*?3k?G$*OuyzVv zBBa=K3=vXHB8E!o08~(OQYN_b(-WzwYxiJdt$tNkGNMSbzPLOy6C9T&C}?uQvqF$T!|NzPTk&?PjN(Xe3puu_DhzpZn+p zz>VzP#6WfnBg3tz#%*+n%{2KtF`o}R&A5xt)pyes?#0cx54Yn%wjRP$cmzMfR=mPj zop%fCdPh@sD-_wMty|QA7i$~ggR;;NgWWzmB{M{ zT7Po%Wm!UA7#LXQ6f(&Gy^O;2^L*L1Q<@tmY?opkxH2(4pWnBPmT&kgv`n_C-z&*6Wh-H~ z=?S;=Z=>m(4pP$@5|tc}!U9i&e|v39F>+-Hisdj&XPLWPhN4S`@pl-*sp(>DdJ$Hk4dVy&i=dZ&t<*j!FC{dWh=3_6 zIUWs4jz@zo@MutSlm^mbXi!=X^u=lPKu9IEb2PP6MeS5$vDBcO@0?e0{5qM)U#Cps z!|`PNRHpDveX7_}YqV0~$~L2w(u`J0J+0*Eqb$AN6vlG9IeT5iz83r#_M=2jZ)%y)*jPWsJjND7>(ZkXhLqkqB z^P9Q*IH#dM4>?2lTqO6iog)v(gZ%QeDBt4Wqw+X=jeL7r&fXJ@`?Mn2#&0FRPx5;; szfbYIm*1!Py@TKF;3GP}z5MpcPI(69vYT*9dG=mT2$kHmm+!v#A6Ltph5!Hn literal 11231 zcmdT~3wTx4mHt;==icNb#PAGNj7T&ggeVGX0w@rkMnHnlh#D@*AzZk*H{5%JL914= zVq04ksTQBbs?;Z_B!N<`?X=k1jx%FtMrX9NQ`>57ZR^;_Xl?1g_BrR?6F?{Qqw{^k z2b}#nYyW$#f33at+4qINeDzrXXG))i9KqPOL}#7T6Y1=VIdy9jtLkQSbR?aQNIIH` z&x^#{V@}dSo}hGXWJ9Db7KwM%En2nKX-iuu5DYV|(L`OdlZ-}U(JLaWVh#tVOm&%) zOi|25^BV=SKu|m@5l^Kf@$|AttlP;a3jHI3g3d@+my;CKHYuFdkyP4A_H@ST)<)Xa zr4sSF_DDLiDjIM1=DxrTZ{Uklqw#2Zx*)fzdYK?^R-)Z0L@vr~lwe39h|tDx3=tIS zK=(btkfvzdS=imV%1JJD5tlV3+9I)K5w3zO@EY^dYoaN^I0NdVb<_~%TpzPxqu9a; zf|{dPMKLrwgnNO1DL;1;eWvkASie<8X!&=1d)N_$sQGg)oIvP0)d7+c*dH zWS&wm-cImGdgCx5-kM31Q!&-XG5X+4IH^>m!)c6mIH|Oa z3$Rd7MC#2quG&U#KK;X2cw{L=S&PLsF2oX|q^y}64FmJ4s#nZZAWLmr1o~@1yP1`R zsueR$-#CAy(j03zrB=vWrt$YS_yJL#t*6m#sZ!>XkMkSVgI;6Uk0x z$vH<@!HR&w+=$i?6y`BlSJH070ofByb+1YpVhcu8&7XgS;TF~iMrXk;>5iwPozCo@ zHm6G?Y6xrDKRcOBBr8bzuI@D5q#~Ks9)JLYsc@igPxr5~-Y`P@=mbqz)n zfnAVcnY`ixnxh>IrQJyayJ>K9O&!csv*R0_Sfa~mm`(x?A`%`3&BFD9GyaA*3$Y1h zMc9l_Tey)X&JxI1mW|Kgv-IJpDleVj4n4w;G^B2<&WvMwLlHiQn=O3amolKy& zY=}EOWYWM`<++}P+q_NlqxacyzP7@|{skMi;|_rxW5UqtxJ>Yqh(XF>MBajJHtxh- zjC);?jj=?eeF1Y0!GytBW3l@N#caYoHtxlJ^trYK{hkz_AI5fk*~0zw=0VuUlV#%p zJV-F9F2`wajYT`7hxlJ(qFepG5IgX&g|7_Q`P@DmkKj>?Xg4EGx@B^tMuqvfPEe!J zcG}nl3NLDRHbmQ;)_A1T(GfdUDNozjt)02)NQX8)t#9<(=)!s}?X{7_dQGwR*%*tH zb;vU|p4C?hO+;%|@7JNv+4zR8DBrB8;Jk5e;-_zX+s1x8Pv?rJTDzj;m_xN)tUceg z@q+G>;dUpMjIToOmjc15_^!lJ(LI~%{(7lx?#0eyeOdlvp@09TtgGSBa{@jm`UnsF1%M0}no7BhoP zbHi{Voy=tZ%#+IW>C-D#ES|BXd3Iy#oJEToD;Ax9X$6_vs+OKsnW|(qbx_12gS^df zpcq?nB$w9jQpw!Urv`QF?P(vL6%3Ts5R!aqRx?Z8RJe4pYzZk7ipT`N-I7AVq(QJj zT~q~mj0j6uY+H(rYqTX|v8W!TbQW8?N^Ln#yYeHkNRocBNlLYOm@UKADB%s!RWynB z#zdfQ|DEmU%7U37-9`HNwe6Tj~r8DX}#$eMop5$nA_8O`c)PnPw2{0|znL z&+Ux#sHC%PImaCo=?MN{bb-Gn@CongyN)2h>DS{rSd z?Y2_BX${F-pX($zw90mJUFOUAmL98*3+&tRwA0}vnIB7& zNm7G3>U_78sZ8!VXCv9`?U=O3uz)80y`SSWdDMtJc`!TSVR;GXapD`OAB~HxZXgw$ zHW*of;7Axle0RzSIdd>V4)G}pvb_DBsu_6RX8`d|-LsCMiK9*97{*rV8Q0f{)4s%M z<4Ig_^$|kOV3y)bqDwcMbo8h)MSp%~41bhMZMjTZ)h)Y|NoLMVc|N%ysu70vs;XXK zN#y9VNnd)QtVEgjQ78A!u&k8TwsaswwWm|9-SKFTB~d>=Os$XA>C7ZpXIG)Dk##)v zNQ|3x)q?6}`f}Wsgmm%npz*@v=YY2wI110`(3CA{6M=Lyh_-9{(;7%Fx1~o&^ipFD z<&>9U2`)QUhG=X&(kBH)b)_biX~l7sEmzAmT!q2m(=vnQl4FJ?=BKW>^;mrwC?8??;i4&0mEks7+YQ`|H(Me>t-t!6UqX_c!q zW!fR1*ZtyVO@{|?**|8;t#X?sTLx@2GZTrJ6N&4KTXmzkIB0yYlWMeRA*A3WXo0D5*2T{B5#}!JlQ2!1)cSInkYLbLK?#LUCju0rqYsCn|WR4)fzo zXUumHz2qwO2l{(|pvh03DLZ@1#bc2FNs%X&z`28IYbHe+;^%DM@f;`d6GJZlAdF5|CwPUU~`1|4UhG;8XYvkMGBE{5SMTGkgU9FQF(Piae~Ppmi9@ zn(Yq8D3qIVyuBpE}j8>7k$cl^;SpsEP9}qdz6M3Q; zD`k{gVV0vH&tlC7Y2@!RldHr+t_?^NWOqPX*ptQ+D^7L+$|e+`h-2^DhjA@6yK%}M zOz6j?vdMioi`9lcOfQ?k@&tBiS=(9G_CCy7ST=VL=GW(y=hgOMQ6HM?^Hokime&`Q z=eN`sK076xJ0-LOwjb-hZdSSlw;}E+Z9EqVT!ksPniq7}U>>gJ71niF&F@-Q z@wpi{aP($u#f?SV5iYlnR@IOOc||aw%^aue`dczIiww8*n+P zb0KD;2OFub)s%MyuB5rPQgxr;Y`IVaosHasXho3)v2d#STWeu~g{v*z1M*WBk)q-t zO`Mw9L&tsUhqp^ z`ta3We9fzUov#L@48u3u?zk7BTF&;Z+7?cex3U*^Yw0`QuI;5b*?~U%_&FRPUkY~Pr~5HX#l2xFoSouK`7N*GZS8o=?J(uvdL8d- z$8X(^cb~!^%06&u=FRhBb07Y)d?8iESlY$_)p%PYf5;o|hXq#EP zlyEK?;#JDDGSo#OBTU7hkP$>NRLYM4gQk;@3GV#Mbed}Geq2$jPc@dD*eheb3eBq4 zk&}nYsr^#jE47*WX{J6YQ=e?=XSwxyfBdve-5q~krtXfPWdP2}H||)|+>)on*(39e zs%kZu271_*otc2<(!UftBDZo?k=686eo?30&x!}J=y zA+O_`@(%t%-p99d3b8+DG@j2HkMHKxLFJU~UzxW=W(<2uU z4=mcHc%Q6kIjLXP_DW}YF-Lx_SJsyo*Yrx# zRC{}+o2{>I!^raD@ih}hg-2PViuz?kuUxSMm4r~R4MW|o{C@d_X)ZDKe)%M8<;6-X zch_5jVJyGQHNV2p{3>_hA9DLVfJ*#`)cP@l@J}!YuVXQO%E0_HhTWedhBp|Nf5D*p z7Pb9L8t_-V9ebNsYriJd-U$TyUY`aemq!DZ)c84^=__(Q$&$HTy!5U?`g%Bm2 z=N4&LndKG>S*&%7MJ!Hoi#CgAxkZ{)#x}Q_#_Na57fOd1h#cj@ z%VWO_Pl3Ad6sQZ&a^Z!1bOk;-uE0m9Ks|H{)I+C0J#-4xL#IF$osv({DN2KmiGorm z$3&#*%&)+!t6cnnCV7uP$a$X;=ugbbKHwGjpBaCC4<^UhCHZ(o3h)lEnJm$3i?EzW zAJu3vo%<{8;?qPLeVVXzhoK334H1~{v83eS_fnRW68dXAekJs*{C(E7ugO^Xi+_Wa zx$F`(LQ5%iD`jrcQ*Pm%-`c!g%asxo^D6Be=E2KlD1UV` zj6Y!*PD>Z#5#E~ZmJ{%rjKO@T@ z^82f2*{f+;wSTFx?A@isNA15LDSP%MZ0;uLxyq>|P-h1RK}b*iyQ#-mGW z_%oGC=BN{KyG+8f-1C3HJG|e?WU-~zSf#?%ZN@648LO0fR>{%JMS8u-jF}y9|1+7g zp25b{>_>6UguSvo2hStFWT#htPImOk!#g>`&0oxkP0rzsMLkMoYIbIf@n^;ud4%{G zGFZ~>A}71^o4!Zcr=dR&IVHU1kjGfgk;ml;KI@^8Ut}jEJ$WO$_&k-*C;8mM=Tm$h T;PYudxAVChy#D307vaAG_y9!| diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index f066d805..1ad6fe55 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -104,7 +104,7 @@ func Terminate() { func Loop() { rand.Seed(time.Now().UnixNano()) creds, _ := trackeroo.GetCredentials() - lastRouteFile := "/data/last_route.json" + checkpointFile := "/data/checkpoint.json" deviceType := creds.DeviceType overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL"), overpassClient) @@ -119,6 +119,7 @@ func Loop() { } } lastPublish := time.Now() + lastCheckpoint := time.Now() isPirate := os.Getenv("PIRATE") == "true" || os.Getenv("PIRATE") == "1" isRegional := os.Getenv("REGIONAL") == "true" isUrban := os.Getenv("URBAN") == "true" @@ -131,14 +132,14 @@ func Loop() { if err != nil || len(regions) == 0 { trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) regions = []string{"Toscana"} - trackeroo.DeleteRoute(lastRouteFile) + trackeroo.DeleteCheckpoit(checkpointFile) } region := regions[rand.Intn(len(regions))] cities, err = overpassClient.GetCities(region) if err != nil || len(cities) == 0 { trackeroo.Error("Error getting cities for %s, falling back to default cities: %v", region, err) cities = []string{"Firenze", "Pisa", "Siena", "Lucca", "Vinci", "Prato", "Montecatini", "Arezzo", "Grosseto", "Massa"} - trackeroo.DeleteRoute(lastRouteFile) + trackeroo.DeleteCheckpoit(checkpointFile) } if isUrban { @@ -150,7 +151,7 @@ func Loop() { if err != nil || len(regions) == 0 { trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) regions = []string{"Toscana"} - trackeroo.DeleteRoute(lastRouteFile) + trackeroo.DeleteCheckpoit(checkpointFile) } cities = make([]string, 0) for _, region := range regions { @@ -166,21 +167,22 @@ func Loop() { speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - var route []trackeroo.Street + var checkpoint *trackeroo.Checkpoint var err error - if trackeroo.ExistsPrevRoute(lastRouteFile) { - route, err = trackeroo.LoadRoute(lastRouteFile) + if trackeroo.ExistsCheckpoint(checkpointFile) { + checkpoint, err = trackeroo.LoadCheckpoint(checkpointFile) if err != nil { trackeroo.Error("Error loading route %v, discarding file", err) - trackeroo.DeleteRoute(lastRouteFile) + trackeroo.DeleteCheckpoit(checkpointFile) continue } - lastEnd = route[1] + lastEnd = checkpoint.Poles[1] trackeroo.Info("Route loaded successfully") } else { + checkpoint = &trackeroo.Checkpoint{} trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, isRegional, isUrban) - var cityErr string - route, err, cityErr = trackeroo.GetRoute(streetProvider, cities, lastEnd, isUrban) + route, err, cityErr := trackeroo.GetRoute(streetProvider, cities, lastEnd, isUrban) + checkpoint.Poles = route if err != nil { trackeroo.Error("Error getting route from %s %v", cityErr, err) trackeroo.Warning("Removing %s", cityErr) @@ -192,20 +194,20 @@ func Loop() { continue } } - trackeroo.Info("Route: %+v -> %+v", route[0], route[1]) - err = trackeroo.SaveRoute(route, lastRouteFile) + trackeroo.Info("Route: %+v -> %+v @ %+v", checkpoint.Poles[0], checkpoint.Poles[1], checkpoint.LastPosition) + err = trackeroo.SaveCheckpoint(checkpoint, checkpointFile) if err != nil { trackeroo.Error("Error saving route %v", err) } else { - trackeroo.Info("Route saved to %s", lastRouteFile) + trackeroo.Info("Route saved to %s", checkpointFile) } - drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, route, 60, 100, isPirate, creds.DeviceType) + drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, checkpoint, 60, 100, isPirate, creds.DeviceType) if err != nil { trackeroo.Error("Error initializing driving simulator %v", err) continue } - lastEnd = route[len(route)-1] + lastEnd = checkpoint.Poles[len(checkpoint.Poles)-1] positionChan := drivingSimulator.SimulateDrive() if rand.Float64() < 0.05 || os.Getenv("NORMAL_RUN") == "false" { @@ -216,6 +218,13 @@ func Loop() { speedVar.Add(position.Speed) consumptionVar.Add(position.Consumption) if time.Since(lastPublish) > pubPeriod || lastStatus != position.Status { + if time.Since(lastCheckpoint) > 60*time.Second { + err := trackeroo.SaveCheckpoint(&trackeroo.Checkpoint{ + Poles: checkpoint.Poles, + LastPosition: position.Coordinate, + }, checkpointFile) + trackeroo.Warning("Cannot save checkpoint: %+v", err) + } lastStatus = position.Status payload := Payload{ TS: position.Timestamp.Unix(), @@ -263,7 +272,7 @@ func Loop() { trackeroo.Millisleep(100) } /* Routing terminated, waiting before next route */ - trackeroo.DeleteRoute(lastRouteFile) + trackeroo.DeleteCheckpoit(checkpointFile) time.Sleep(time.Second * 120) if !normalRun { /* Wait some more */ diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 1fadf6d7..e3ed3304 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -171,15 +171,30 @@ type DrivingSimulator struct { Distance float64 } -func NewDrivingSimulator(routingService *RoutingService, waypoints []Street, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { +func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { route := make([]RouteSegment, 0) - for i := 0; i < len(waypoints)-1; i++ { - start := waypoints[i].Coordinate - end := waypoints[i+1].Coordinate + for i := 0; i < len(checkpoint.Poles)-1; i++ { + start := checkpoint.Poles[i].Coordinate + end := checkpoint.Poles[i+1].Coordinate r, err := routingService.GetRoute(start, end) if err != nil { return nil, err } + checkpointIndex := -1 + + for i, pos := range r { + if checkpoint == nil { + break + } + if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 1 { + checkpointIndex = i + Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) + break + } + } + if checkpointIndex >= 0 { + r = r[checkpointIndex:] + } route = append(route, r...) } @@ -224,7 +239,7 @@ func (ds *DrivingSimulator) SimulateDrive() <-chan DrivePosition { nextPos := segment.Coordinates[i+1] // Calculate distance between points - distance := ds.haversineDistance(currentPos, nextPos) + distance := haversineDistance(currentPos, nextPos) // Check if we should stop if i == 0 && segment.ShouldStop { @@ -329,7 +344,7 @@ func (ds *DrivingSimulator) SimulateDrive() <-chan DrivePosition { } // haversineDistance calculates the great circle distance between two points -func (ds *DrivingSimulator) haversineDistance(pos1, pos2 Coordinate) float64 { +func haversineDistance(pos1, pos2 Coordinate) float64 { const R = 6371 // Earth's radius in kilometers lat1Rad := pos1.Lat * math.Pi / 180 diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index e620b561..2945f4d6 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -13,6 +13,11 @@ type Street struct { City string `json:"city"` } +type Checkpoint struct { + Poles []Street `json:"poles"` + LastPosition Coordinate `json:"last_position"` +} + func stringToStreet(city string, street OverpassElement) Street { return Street{ Coordinate: street.Geometry[rand.Intn(len(street.Geometry))], @@ -77,19 +82,22 @@ func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street, i return route, nil, "" } -func ExistsPrevRoute(filename string) bool { +func ExistsCheckpoint(filename string) bool { _, err := os.Stat(filename) return !os.IsNotExist(err) } -func SaveRoute(route []Street, filename string) error { +func SaveCheckpoint(checkpoint *Checkpoint, filename string) error { + if checkpoint == nil { + return fmt.Errorf("cannot save nil checkpoint") + } file, err := os.Create(filename) if err != nil { return err } defer file.Close() - jsonData, err := json.Marshal(route) + jsonData, err := json.Marshal(checkpoint) if err != nil { return err } @@ -98,22 +106,22 @@ func SaveRoute(route []Street, filename string) error { return nil } -func LoadRoute(filename string) ([]Street, error) { +func LoadCheckpoint(filename string) (*Checkpoint, error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() - var route []Street - err = json.NewDecoder(file).Decode(&route) + var checkpoint Checkpoint + err = json.NewDecoder(file).Decode(&checkpoint) if err != nil { return nil, err } - return route, nil + return &checkpoint, nil } -func DeleteRoute(filename string) error { +func DeleteCheckpoit(filename string) error { return os.Remove(filename) } From 8f208dc1e5d4ac4f1f9816c03496242d5ec1ee2a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 15:40:35 +0200 Subject: [PATCH 046/242] checkpointing --- tracky/src/firmware.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 1ad6fe55..6c0c0906 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -223,6 +223,7 @@ func Loop() { Poles: checkpoint.Poles, LastPosition: position.Coordinate, }, checkpointFile) + lastCheckpoint = time.Now() trackeroo.Warning("Cannot save checkpoint: %+v", err) } lastStatus = position.Status From 4a1409defaf2b1fe25e5c08bb2bb499ae313b575 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 15:46:31 +0200 Subject: [PATCH 047/242] checkpointing --- tracky/src/firmware.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 6c0c0906..cff17a89 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -167,19 +167,20 @@ func Loop() { speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - var checkpoint *trackeroo.Checkpoint + var checkpoint trackeroo.Checkpoint var err error if trackeroo.ExistsCheckpoint(checkpointFile) { - checkpoint, err = trackeroo.LoadCheckpoint(checkpointFile) + c, err := trackeroo.LoadCheckpoint(checkpointFile) if err != nil { trackeroo.Error("Error loading route %v, discarding file", err) trackeroo.DeleteCheckpoit(checkpointFile) continue } + checkpoint = *c lastEnd = checkpoint.Poles[1] trackeroo.Info("Route loaded successfully") } else { - checkpoint = &trackeroo.Checkpoint{} + checkpoint = trackeroo.Checkpoint{} trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, isRegional, isUrban) route, err, cityErr := trackeroo.GetRoute(streetProvider, cities, lastEnd, isUrban) checkpoint.Poles = route @@ -195,14 +196,14 @@ func Loop() { } } trackeroo.Info("Route: %+v -> %+v @ %+v", checkpoint.Poles[0], checkpoint.Poles[1], checkpoint.LastPosition) - err = trackeroo.SaveCheckpoint(checkpoint, checkpointFile) + err = trackeroo.SaveCheckpoint(&checkpoint, checkpointFile) if err != nil { trackeroo.Error("Error saving route %v", err) } else { trackeroo.Info("Route saved to %s", checkpointFile) } - drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, checkpoint, 60, 100, isPirate, creds.DeviceType) + drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, &checkpoint, 60, 100, isPirate, creds.DeviceType) if err != nil { trackeroo.Error("Error initializing driving simulator %v", err) continue @@ -219,10 +220,8 @@ func Loop() { consumptionVar.Add(position.Consumption) if time.Since(lastPublish) > pubPeriod || lastStatus != position.Status { if time.Since(lastCheckpoint) > 60*time.Second { - err := trackeroo.SaveCheckpoint(&trackeroo.Checkpoint{ - Poles: checkpoint.Poles, - LastPosition: position.Coordinate, - }, checkpointFile) + checkpoint.LastPosition = position.Coordinate + err := trackeroo.SaveCheckpoint(&checkpoint, checkpointFile) lastCheckpoint = time.Now() trackeroo.Warning("Cannot save checkpoint: %+v", err) } From 623942c89965fe61525a46f5c644b578248983fc Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 15:50:41 +0200 Subject: [PATCH 048/242] checkpointing --- tracky/src/firmware.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index cff17a89..3e0aaa9b 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -167,20 +167,19 @@ func Loop() { speedVar := trackeroo.NewStatVar[float64]() consumptionVar := trackeroo.NewStatVar[float64]() for { - var checkpoint trackeroo.Checkpoint + var checkpoint *trackeroo.Checkpoint var err error if trackeroo.ExistsCheckpoint(checkpointFile) { - c, err := trackeroo.LoadCheckpoint(checkpointFile) + checkpoint, err = trackeroo.LoadCheckpoint(checkpointFile) if err != nil { trackeroo.Error("Error loading route %v, discarding file", err) trackeroo.DeleteCheckpoit(checkpointFile) continue } - checkpoint = *c lastEnd = checkpoint.Poles[1] trackeroo.Info("Route loaded successfully") } else { - checkpoint = trackeroo.Checkpoint{} + checkpoint = &trackeroo.Checkpoint{} trackeroo.Info("Getting route from %+v - REGIONAL: %t - URBAN: %t", lastEnd, isRegional, isUrban) route, err, cityErr := trackeroo.GetRoute(streetProvider, cities, lastEnd, isUrban) checkpoint.Poles = route @@ -196,14 +195,14 @@ func Loop() { } } trackeroo.Info("Route: %+v -> %+v @ %+v", checkpoint.Poles[0], checkpoint.Poles[1], checkpoint.LastPosition) - err = trackeroo.SaveCheckpoint(&checkpoint, checkpointFile) + err = trackeroo.SaveCheckpoint(checkpoint, checkpointFile) if err != nil { trackeroo.Error("Error saving route %v", err) } else { trackeroo.Info("Route saved to %s", checkpointFile) } - drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, &checkpoint, 60, 100, isPirate, creds.DeviceType) + drivingSimulator, err := trackeroo.NewDrivingSimulator(routingService, checkpoint, 60, 100, isPirate, creds.DeviceType) if err != nil { trackeroo.Error("Error initializing driving simulator %v", err) continue @@ -220,10 +219,14 @@ func Loop() { consumptionVar.Add(position.Consumption) if time.Since(lastPublish) > pubPeriod || lastStatus != position.Status { if time.Since(lastCheckpoint) > 60*time.Second { - checkpoint.LastPosition = position.Coordinate - err := trackeroo.SaveCheckpoint(&checkpoint, checkpointFile) + err := trackeroo.SaveCheckpoint(&trackeroo.Checkpoint{ + Poles: checkpoint.Poles, + LastPosition: position.Coordinate, + }, checkpointFile) + if err != nil { + trackeroo.Warning("Cannot save checkpoint: %+v", err) + } lastCheckpoint = time.Now() - trackeroo.Warning("Cannot save checkpoint: %+v", err) } lastStatus = position.Status payload := Payload{ From d788f270229462f82d74a1fed3cce0bc4bffa516 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 15:58:54 +0200 Subject: [PATCH 049/242] checkpointing --- tracky/src/trackeroo/driving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index e3ed3304..55b2b939 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -186,7 +186,7 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, if checkpoint == nil { break } - if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 1 { + if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 0.5 { checkpointIndex = i Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) break From 3b0698ea44d2fcd438ba722372fab75e9cea700c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 15:59:51 +0200 Subject: [PATCH 050/242] checkpointing --- tracky/src/trackeroo/driving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 55b2b939..a5d2be98 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -186,7 +186,7 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, if checkpoint == nil { break } - if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 0.5 { + if checkpoint.LastPosition != pos.Coordinates[0] { checkpointIndex = i Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) break From fae3ff25032d3c64750bfa1b04481c5fd284f092 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 16:05:24 +0200 Subject: [PATCH 051/242] checkpointing --- tracky/src/trackeroo/driving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index a5d2be98..d418d213 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -186,7 +186,7 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, if checkpoint == nil { break } - if checkpoint.LastPosition != pos.Coordinates[0] { + if checkpoint.LastPosition == pos.Coordinates[0] { checkpointIndex = i Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) break From e47b1cfbb11060560bc93c2fc20646bcee8275d4 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 16:55:49 +0200 Subject: [PATCH 052/242] checkpointing --- tracky/src/trackeroo/driving.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index d418d213..5412f6ba 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -186,7 +186,8 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, if checkpoint == nil { break } - if checkpoint.LastPosition == pos.Coordinates[0] { + // 50 meters + if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 0.05 { checkpointIndex = i Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) break From d14a89db8ea3629f74e1b9e2de9b325fa2021136 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 17:00:31 +0200 Subject: [PATCH 053/242] checkpointing --- tracky/src/trackeroo/driving.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 5412f6ba..8a08a5e6 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -183,11 +183,12 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, checkpointIndex := -1 for i, pos := range r { - if checkpoint == nil { + if checkpoint == nil || checkpoint.LastPosition.Lat == 0.0 || checkpoint.LastPosition.Lng == 0.0 { + Warning("Invalid checkpoit +%v, starting from first waypoint", checkpoint) break } - // 50 meters - if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 0.05 { + // 500 meters + if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 0.5 { checkpointIndex = i Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) break From 9648711b0a1fcfefae8f6e1a306a8f67ff9d912f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 17:03:28 +0200 Subject: [PATCH 054/242] checkpointing --- tracky/src/trackeroo/driving.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 8a08a5e6..4ed44bbd 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -194,6 +194,9 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, break } } + if checkpointIndex == len(r)-1 { + checkpointIndex = -1 + } if checkpointIndex >= 0 { r = r[checkpointIndex:] } @@ -341,6 +344,7 @@ func (ds *DrivingSimulator) SimulateDrive() <-chan DrivePosition { Distance: 0, } }() + Info("Simulation started") return positionChan } From fa5fe4b4c027e5fad17c758f24d69d7432b34c81 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 17:12:55 +0200 Subject: [PATCH 055/242] checkpointing --- tracky/src/trackeroo/driving.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 4ed44bbd..5d8567c0 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -187,8 +187,11 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, Warning("Invalid checkpoit +%v, starting from first waypoint", checkpoint) break } - // 500 meters - if haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) < 0.5 { + // 100 meters + distPos1 := haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) + distPos2 := haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) + Info("Index %d: pos1 %f - pos2 %f", i, distPos1, distPos2) + if distPos1 < 0.1 || distPos2 < 0.1 { checkpointIndex = i Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) break From b9e5e8847e94f3cb2edc7b7ff7add2da95381792 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 17:13:56 +0200 Subject: [PATCH 056/242] checkpointing --- tracky/src/trackeroo/driving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 5d8567c0..1bb30d7a 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -190,7 +190,7 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, // 100 meters distPos1 := haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) distPos2 := haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) - Info("Index %d: pos1 %f - pos2 %f", i, distPos1, distPos2) + Info("Index %d, %+v: pos1 %f - pos2 %f", i, pos, distPos1, distPos2) if distPos1 < 0.1 || distPos2 < 0.1 { checkpointIndex = i Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) From c0027745c73d0197f066a45816fe24ffd17f1e28 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 17:23:57 +0200 Subject: [PATCH 057/242] checkpointing --- tracky/src/trackeroo/driving.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 1bb30d7a..81b26791 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -180,28 +180,28 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, if err != nil { return nil, err } - checkpointIndex := -1 + checkpointRouteIndex := -1 + checkpointCoordinatesIndex := -1 for i, pos := range r { if checkpoint == nil || checkpoint.LastPosition.Lat == 0.0 || checkpoint.LastPosition.Lng == 0.0 { Warning("Invalid checkpoit +%v, starting from first waypoint", checkpoint) break } - // 100 meters - distPos1 := haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) - distPos2 := haversineDistance(checkpoint.LastPosition, pos.Coordinates[0]) - Info("Index %d, %+v: pos1 %f - pos2 %f", i, pos, distPos1, distPos2) - if distPos1 < 0.1 || distPos2 < 0.1 { - checkpointIndex = i - Info("Found checkpoint %+v at index %d", checkpoint, checkpointIndex) - break + for j, c := range pos.Coordinates { + // 50 meters + if haversineDistance(checkpoint.LastPosition, c) < 0.05 { + checkpointRouteIndex = i + checkpointCoordinatesIndex = j + Info("Found checkpoint %+v at index (%d, %d)", checkpoint, checkpointRouteIndex, checkpointCoordinatesIndex) + goto found + } } } - if checkpointIndex == len(r)-1 { - checkpointIndex = -1 - } - if checkpointIndex >= 0 { - r = r[checkpointIndex:] + found: + if checkpointRouteIndex >= 0 { + r = r[checkpointRouteIndex:] + r[0].Coordinates = r[0].Coordinates[checkpointCoordinatesIndex:] } route = append(route, r...) } From 10cb495c5b08197fc6eadb89f6d38fd26650a547 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 17:27:54 +0200 Subject: [PATCH 058/242] checkpointing --- tracky/src/trackeroo/driving.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 81b26791..e828a6ee 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -157,6 +157,8 @@ func getConsumption(speed float64, devType string) float64 { // DrivingSimulator simulates realistic car driving type DrivingSimulator struct { Route []RouteSegment + Start Coordinate + End Coordinate DefaultAverageSpeed float64 // km/h SpeedVariation float64 // percentage (0.0-1.0) StopProbability float64 // probability of stopping per segment (0.0-1.0) @@ -209,6 +211,8 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, return &DrivingSimulator{ Route: route, DefaultAverageSpeed: avgSpeed, + Start: checkpoint.Poles[0].Coordinate, + End: checkpoint.Poles[1].Coordinate, SpeedVariation: 0.03, // 3% speed variation StopProbability: 0.05, // 5% chance of stopping per segment StopDuration: struct { @@ -258,8 +262,8 @@ func (ds *DrivingSimulator) SimulateDrive() <-chan DrivePosition { Speed: 0, SpeedLimit: speedLimit, Status: STOPPED, - Start: ds.Route[0].Coordinates[0], - End: lastCoord, + Start: ds.Start, + End: ds.End, Consumption: 0, Distance: 0, } @@ -323,8 +327,8 @@ func (ds *DrivingSimulator) SimulateDrive() <-chan DrivePosition { Speed: currentSpeed, SpeedLimit: speedLimit, Status: status, - Start: ds.Route[0].Coordinates[0], - End: lastCoord, + Start: ds.Start, + End: ds.End, Consumption: getConsumption(currentSpeed, ds.DevType) * consumptionCompensation, Distance: distance, } @@ -341,8 +345,8 @@ func (ds *DrivingSimulator) SimulateDrive() <-chan DrivePosition { Speed: 0, SpeedLimit: speedLimit, Status: ARRIVED, - Start: ds.Route[0].Coordinates[0], - End: lastCoord, + Start: ds.Start, + End: ds.End, Consumption: 0, Distance: 0, } From 64bcce8b6e61d2ceaed6068a2c13a4c58b402979 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 16 Oct 2025 17:34:22 +0200 Subject: [PATCH 059/242] checkpointing --- tracky/src/firmware.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 3e0aaa9b..1ad3c214 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -91,7 +91,22 @@ func alteredFoodData(position trackeroo.DrivePosition) FoodSensors { var taskManager *trackeroo.TaskManager func Init() { - trackeroo.InitLogger(trackeroo.INFO, "") + debugLevel := os.Getenv("DEBUG_LEVEL") + level := trackeroo.INFO + switch debugLevel { + case "DEBUG": + level = trackeroo.DEBUG + case "INFO": + level = trackeroo.INFO + case "WARN": + case "WARNING": + level = trackeroo.WARNING + case "ERROR": + level = trackeroo.ERROR + default: + level = trackeroo.INFO + } + trackeroo.InitLogger(level, "") trackeroo.InitQueue("data") taskManager = trackeroo.NewTaskManager() go taskManager.Start() From 864c662d2bbe246b5cfbeee70d340cbb12ac08ab Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 13:38:52 +0200 Subject: [PATCH 060/242] swarm --- tracky/geo-services/docker-compose.yml | 44 ++++++++++--- tracky/make_compose.py | 87 +++++++++++++------------- 2 files changed, 79 insertions(+), 52 deletions(-) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index 3f2649d8..6d13dfc0 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -2,29 +2,40 @@ services: overpass: image: wiktorn/overpass-api environment: - - OVERPASS_META=yes - - OVERPASS_MODE=init - - OVERPASS_PLANET_URL=http://download.geofabrik.de/europe/italy-latest.osm.bz2-disabled - - OVERPASS_RATE_LIMIT=0 - - OVERPASS_RATE_SPACE=1073741824 - - OVERPASS_ALLOW_DUPLICATE_QUERIES=yes + OVERPASS_META: "yes" + OVERPASS_MODE: "init" + OVERPASS_PLANET_URL: "http://download.geofabrik.de/europe/italy-latest.osm.bz2-disabled" + OVERPASS_RATE_LIMIT: "0" + OVERPASS_RATE_SPACE: "1073741824" + OVERPASS_ALLOW_DUPLICATE_QUERIES: "yes" volumes: - ./overpass-data:/db + networks: + - trackynet + deploy: + placement: + constraints: [node.role == manager] + restart_policy: + condition: on-failure nginx: image: nginx:alpine ports: - - "12345:80" + - "12345:80" # external port for Overpass volumes: - ./nginx:/etc/nginx:ro depends_on: - overpass + networks: + - trackynet + deploy: + placement: + constraints: [node.role == manager] + restart_policy: + condition: on-failure osrm: image: osrm/osrm-backend - container_name: osrm - ports: - - "5000:5000" volumes: - ./osrm-data:/data command: > @@ -36,3 +47,16 @@ services: fi && osrm-routed --algorithm mld /data/italy-latest.osrm " + ports: + - "5000:5000" + networks: + - trackynet + deploy: + placement: + constraints: [node.role == manager] + restart_policy: + condition: on-failure + +networks: + trackynet: + driver: overlay diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 2b64c2cc..cf908c5f 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -4,10 +4,10 @@ from typing import Dict, List, Optional, Union from pydantic import BaseModel import json - import requests import yaml + class VolumeConfig(BaseModel): driver: Optional[str] = None driver_opts: Optional[Dict[str, str]] = None @@ -29,9 +29,9 @@ class ServiceConfig(BaseModel): volumes: Optional[List[str]] = None depends_on: Optional[List[str]] = None networks: Optional[List[str]] = None - network_mode: Optional[str] = None restart: Optional[str] = None extra_hosts: Optional[List[str]] = None + deploy: Optional[Dict] = None class DockerCompose(BaseModel): @@ -40,72 +40,71 @@ class DockerCompose(BaseModel): networks: Optional[Dict[str, NetworkConfig]] = None include: Optional[List[str]] = None + def load_credentials(path: str): - with open(path, 'r') as file: + with open(path, "r") as file: return json.load(file) + def create_compose(credentials: List[Dict]): - """ - Create a DockerCompose object from a dictionary of credentials. - An example item of the credentials list is: - { - "id": "trk-5dac1f15577caca3", - "name": "fancy_shockley", - "device_type": "valuable", - "private_key": "2mtRLJjIO0yB1UDtOzEVOpiBnAxebQagR7LvaM9MMLM=", - "mqtt_host": "localhost", - "mqtt_port": 1883, - "mqtt_mode": "insecure", - "ca_cert": "" - } - Args: - credentials (Dict[str, Dict]): A dictionary of credentials. - - Returns: - DockerCompose: A DockerCompose object. - """ - compose = DockerCompose(services={} )#, include=["geo-services/docker-compose.yml"]) - print("SELECT * FROM ( VALUES ") + compose = DockerCompose( + services={}, + networks={"trackynet": NetworkConfig(driver="overlay")}, + volumes={} + ) + + # Generate per-device services for i, cred in enumerate(credentials): - # print(f"Processing device {cred}") - # continue regional = "true" if random.randint(1, 100) > 10 else "false" urban = "true" if random.randint(1, 100) > 50 and regional == "true" else "false" + + cred_vol = f"{cred['id']}-credentials" + data_vol = f"{cred['id']}-data" + compose.services[cred["id"]] = ServiceConfig( image="tracky:latest", environment={ - "ROUTING_SERVICE_URL": "http://localhost:5000", - "OVERPASS_URL": "http://localhost:12345/api/interpreter", + "ROUTING_SERVICE_URL": "http://osrm:5000", + "OVERPASS_URL": "http://nginx:80/api/interpreter", "REGIONAL": regional, "URBAN": urban, "PUBLISH_PERIOD": "2000", - "PIRATE": "true" if random.randint(1, 100) < 10 else "false" + "PIRATE": "true" if random.randint(1, 100) < 10 else "false", }, - # depends_on=["nominatim", "osrm"], - network_mode="host", - volumes=[f"./{cred["id"]}:/app/credentials", f"./data/{cred["id"]}:/data"], + volumes=[f"{cred_vol}:/app/credentials", f"{data_vol}:/data"], + networks=["trackynet"], restart="no", + deploy={ + "replicas": 1, + "restart_policy": {"condition": "on-failure"}, + }, ) - # if compose.services[cred["id"]].environment["PIRATE"] == "true": - # print(f"{cred['id']} is a pirate 🏴‍☠️") + + # Register the volumes + if compose.volumes: + compose.volumes[cred_vol] = VolumeConfig() + compose.volumes[data_vol] = VolumeConfig() + + # Optionally still write local files (for secrets/config) os.makedirs(f"{cred['id']}", exist_ok=True) with open(f"{cred['id']}/tdevice.json", "w") as f: json.dump(cred, f, indent=2) - if i == len(credentials) - 1: - print(f"('{cred['name']}', '{cred['id']}')") - else: - print(f"('{cred['name']}', '{cred['id']}'),") - print(") AS t (__text, __value)") + + # Write compose to file with open("docker-compose.yml", "w") as f: compose_dict = compose.model_dump(exclude_none=True) - yaml_str = yaml.safe_dump(compose_dict, sort_keys=False) f.write(yaml_str) + def token(): - response = requests.post(f"http://{sys.argv[1]}/login/", json={"username": "leonardo", "password": "subemelaradio"}) + response = requests.post( + f"http://{sys.argv[1]}/login/", + json={"username": "leonardo", "password": "subemelaradio"}, + ) return response.json()["token"] + def main(): if len(sys.argv) != 2: print(f"Usage: python {sys.argv[0]} ") @@ -113,12 +112,16 @@ def main(): try: t = token() - credentials = requests.get(f"http://{sys.argv[1]}/devices/credentials", headers={"Authorization": f"Bearer {t}"}).json() + credentials = requests.get( + f"http://{sys.argv[1]}/devices/credentials", + headers={"Authorization": f"Bearer {t}"}, + ).json() except Exception as e: print(f"Error fetching credentials: {e}") sys.exit(1) create_compose(sorted(credentials, key=lambda x: x["name"])) + if __name__ == "__main__": main() From 1247727993a8e05fdcdfa227fddece0a021e3f7c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 13:48:01 +0200 Subject: [PATCH 061/242] swarm --- tracky/make_compose.py | 97 +++++++++++------------------------------- 1 file changed, 25 insertions(+), 72 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index cf908c5f..e7eeac11 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -8,60 +8,53 @@ import yaml -class VolumeConfig(BaseModel): - driver: Optional[str] = None - driver_opts: Optional[Dict[str, str]] = None - external: Optional[Union[bool, Dict[str, str]]] = None +class SecretConfig(BaseModel): + file: str class NetworkConfig(BaseModel): driver: Optional[str] = None - driver_opts: Optional[Dict[str, str]] = None - external: Optional[Union[bool, Dict[str, str]]] = None class ServiceConfig(BaseModel): image: Optional[str] = None - build: Optional[Union[str, Dict[str, Union[str, Dict[str, str]]]]] = None - command: Optional[Union[str, List[str]]] = None - ports: Optional[List[str]] = None environment: Optional[Dict[str, Union[str, int]]] = None - volumes: Optional[List[str]] = None - depends_on: Optional[List[str]] = None networks: Optional[List[str]] = None - restart: Optional[str] = None - extra_hosts: Optional[List[str]] = None + secrets: Optional[List[Dict[str, str]]] = None deploy: Optional[Dict] = None class DockerCompose(BaseModel): services: Dict[str, ServiceConfig] - volumes: Optional[Dict[str, VolumeConfig]] = None - networks: Optional[Dict[str, NetworkConfig]] = None - include: Optional[List[str]] = None - - -def load_credentials(path: str): - with open(path, "r") as file: - return json.load(file) + secrets: Dict[str, SecretConfig] + networks: Dict[str, NetworkConfig] def create_compose(credentials: List[Dict]): compose = DockerCompose( services={}, + secrets={}, networks={"trackynet": NetworkConfig(driver="overlay")}, - volumes={} ) - # Generate per-device services - for i, cred in enumerate(credentials): + # Device-specific services + for cred in credentials: regional = "true" if random.randint(1, 100) > 10 else "false" urban = "true" if random.randint(1, 100) > 50 and regional == "true" else "false" - cred_vol = f"{cred['id']}-credentials" - data_vol = f"{cred['id']}-data" + service_name = cred["id"] + + # ensure dir exists + dump files + os.makedirs(service_name, exist_ok=True) + with open(f"{service_name}/tdevice.json", "w") as f: + json.dump(cred, f, indent=2) - compose.services[cred["id"]] = ServiceConfig( + # register secrets + tdevice_secret = f"{service_name}_tdevice" + compose.secrets[tdevice_secret] = SecretConfig(file=f"./{service_name}/tdevice.json") + + # define service with secrets mounted + compose.services[service_name] = ServiceConfig( image="tracky:latest", environment={ "ROUTING_SERVICE_URL": "http://osrm:5000", @@ -71,57 +64,17 @@ def create_compose(credentials: List[Dict]): "PUBLISH_PERIOD": "2000", "PIRATE": "true" if random.randint(1, 100) < 10 else "false", }, - volumes=[f"{cred_vol}:/app/credentials", f"{data_vol}:/data"], networks=["trackynet"], - restart="no", + secrets=[ + {"source": tdevice_secret, "target": "/app/credentials/tdevice.json"}, + ], deploy={ "replicas": 1, "restart_policy": {"condition": "on-failure"}, }, ) - # Register the volumes - if compose.volumes: - compose.volumes[cred_vol] = VolumeConfig() - compose.volumes[data_vol] = VolumeConfig() - - # Optionally still write local files (for secrets/config) - os.makedirs(f"{cred['id']}", exist_ok=True) - with open(f"{cred['id']}/tdevice.json", "w") as f: - json.dump(cred, f, indent=2) - - # Write compose to file + # write compose file with open("docker-compose.yml", "w") as f: - compose_dict = compose.model_dump(exclude_none=True) - yaml_str = yaml.safe_dump(compose_dict, sort_keys=False) + yaml_str = yaml.safe_dump(compose.model_dump(exclude_none=True), sort_keys=False) f.write(yaml_str) - - -def token(): - response = requests.post( - f"http://{sys.argv[1]}/login/", - json={"username": "leonardo", "password": "subemelaradio"}, - ) - return response.json()["token"] - - -def main(): - if len(sys.argv) != 2: - print(f"Usage: python {sys.argv[0]} ") - sys.exit(1) - - try: - t = token() - credentials = requests.get( - f"http://{sys.argv[1]}/devices/credentials", - headers={"Authorization": f"Bearer {t}"}, - ).json() - except Exception as e: - print(f"Error fetching credentials: {e}") - sys.exit(1) - - create_compose(sorted(credentials, key=lambda x: x["name"])) - - -if __name__ == "__main__": - main() From 36535e891e8b1080b4be54eb31bf37f8418b3a9f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 13:50:13 +0200 Subject: [PATCH 062/242] swarm --- tracky/geo-services/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index 6d13dfc0..9a96a128 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -60,3 +60,4 @@ services: networks: trackynet: driver: overlay + attachable: true From 751543915e44d2b2dad532da0c4310ba825da0e8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 13:54:02 +0200 Subject: [PATCH 063/242] swarm --- tracky/make_compose.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index e7eeac11..ec79dd0c 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -14,13 +14,19 @@ class SecretConfig(BaseModel): class NetworkConfig(BaseModel): driver: Optional[str] = None + attachable: Optional[bool] = None + + +class ServiceSecret(BaseModel): + source: str + target: str class ServiceConfig(BaseModel): image: Optional[str] = None environment: Optional[Dict[str, Union[str, int]]] = None networks: Optional[List[str]] = None - secrets: Optional[List[Dict[str, str]]] = None + secrets: Optional[List[ServiceSecret]] = None deploy: Optional[Dict] = None @@ -34,26 +40,25 @@ def create_compose(credentials: List[Dict]): compose = DockerCompose( services={}, secrets={}, - networks={"trackynet": NetworkConfig(driver="overlay")}, + networks={"trackynet": NetworkConfig(driver="overlay", attachable=True)}, ) - # Device-specific services for cred in credentials: regional = "true" if random.randint(1, 100) > 10 else "false" urban = "true" if random.randint(1, 100) > 50 and regional == "true" else "false" service_name = cred["id"] - # ensure dir exists + dump files + # Ensure dir exists + dump credential file os.makedirs(service_name, exist_ok=True) with open(f"{service_name}/tdevice.json", "w") as f: json.dump(cred, f, indent=2) - # register secrets + # Register secrets tdevice_secret = f"{service_name}_tdevice" compose.secrets[tdevice_secret] = SecretConfig(file=f"./{service_name}/tdevice.json") - # define service with secrets mounted + # Define service with secrets mounted compose.services[service_name] = ServiceConfig( image="tracky:latest", environment={ @@ -66,7 +71,10 @@ def create_compose(credentials: List[Dict]): }, networks=["trackynet"], secrets=[ - {"source": tdevice_secret, "target": "/app/credentials/tdevice.json"}, + ServiceSecret( + source=tdevice_secret, + target="/app/credentials/tdevice.json", + ) ], deploy={ "replicas": 1, @@ -74,7 +82,10 @@ def create_compose(credentials: List[Dict]): }, ) - # write compose file + # Dump YAML correctly with open("docker-compose.yml", "w") as f: - yaml_str = yaml.safe_dump(compose.model_dump(exclude_none=True), sort_keys=False) + compose_dict = compose.model_dump(exclude_none=True) + + # yaml.safe_dump handles Pydantic dict fine + yaml_str = yaml.safe_dump(compose_dict, sort_keys=False) f.write(yaml_str) From 9d357fe08f2eec5ca8a6093a38f5feb54576249b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 13:55:35 +0200 Subject: [PATCH 064/242] swarm --- tracky/make_compose.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index ec79dd0c..62fbff5e 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -89,3 +89,25 @@ def create_compose(credentials: List[Dict]): # yaml.safe_dump handles Pydantic dict fine yaml_str = yaml.safe_dump(compose_dict, sort_keys=False) f.write(yaml_str) + + +def token(): + response = requests.post(f"http://{sys.argv[1]}/login/", json={"username": "leonardo", "password": "subemelaradio"}) + return response.json()["token"] + +def main(): + if len(sys.argv) != 2: + print(f"Usage: python {sys.argv[0]} ") + sys.exit(1) + + try: + t = token() + credentials = requests.get(f"http://{sys.argv[1]}/devices/credentials", headers={"Authorization": f"Bearer {t}"}).json() + except Exception as e: + print(f"Error fetching credentials: {e}") + sys.exit(1) + + create_compose(sorted(credentials, key=lambda x: x["name"])) + +if __name__ == "__main__": + main() From f71d6c0e4094dba515ce2a986916ca3c12c5b2a1 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 14:12:57 +0200 Subject: [PATCH 065/242] swarm --- tracky/make_compose.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 62fbff5e..08d3efc2 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -15,6 +15,9 @@ class SecretConfig(BaseModel): class NetworkConfig(BaseModel): driver: Optional[str] = None attachable: Optional[bool] = None + external: Optional[bool] = None + name: Optional[str] = None + class ServiceSecret(BaseModel): @@ -40,7 +43,8 @@ def create_compose(credentials: List[Dict]): compose = DockerCompose( services={}, secrets={}, - networks={"trackynet": NetworkConfig(driver="overlay", attachable=True)}, + # networks={"trackynet": NetworkConfig(driver="overlay", attachable=True)}, + networks={"trackynet": NetworkConfig(external=True, name="geoservices_trackynet")}, ) for cred in credentials: From d23d7c7d03b77693f293ae63bda53398079f11e3 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 14:36:32 +0200 Subject: [PATCH 066/242] redis checkpoint --- tracky/geo-services/docker-compose.yml | 19 +++++ tracky/make_compose.py | 1 + tracky/src/firmware.go | 13 +-- tracky/src/go.mod | 3 + tracky/src/go.sum | 6 ++ tracky/src/trackeroo/checkpoint.go | 106 +++++++++++++++++++++++++ tracky/src/trackeroo/routes.go | 47 ----------- 7 files changed, 142 insertions(+), 53 deletions(-) create mode 100644 tracky/src/trackeroo/checkpoint.go diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index 9a96a128..d35e0501 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -57,6 +57,25 @@ services: restart_policy: condition: on-failure + redis: + container_name: redis + image: redis:8.2.1-alpine + volumes: + - ./redis-data:/data + healthcheck: + test: ["CMD", "redis-cli", "ping"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + networks: + - trackynet + deploy: + placement: + constraints: [node.role == manager] + restart_policy: + condition: on-failure + networks: trackynet: driver: overlay diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 08d3efc2..ce8830ac 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -68,6 +68,7 @@ def create_compose(credentials: List[Dict]): environment={ "ROUTING_SERVICE_URL": "http://osrm:5000", "OVERPASS_URL": "http://nginx:80/api/interpreter", + "REDIS_URI": "redis://redis:6379", "REGIONAL": regional, "URBAN": urban, "PUBLISH_PERIOD": "2000", diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 1ad3c214..dda8992e 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "math/rand" "os" "strconv" @@ -119,7 +120,7 @@ func Terminate() { func Loop() { rand.Seed(time.Now().UnixNano()) creds, _ := trackeroo.GetCredentials() - checkpointFile := "/data/checkpoint.json" + checkpointFile := fmt.Sprintf("/data/%s_checkpoint.json", creds.ID) deviceType := creds.DeviceType overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL"), overpassClient) @@ -147,14 +148,14 @@ func Loop() { if err != nil || len(regions) == 0 { trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) regions = []string{"Toscana"} - trackeroo.DeleteCheckpoit(checkpointFile) + trackeroo.DeleteCheckpoint(checkpointFile) } region := regions[rand.Intn(len(regions))] cities, err = overpassClient.GetCities(region) if err != nil || len(cities) == 0 { trackeroo.Error("Error getting cities for %s, falling back to default cities: %v", region, err) cities = []string{"Firenze", "Pisa", "Siena", "Lucca", "Vinci", "Prato", "Montecatini", "Arezzo", "Grosseto", "Massa"} - trackeroo.DeleteCheckpoit(checkpointFile) + trackeroo.DeleteCheckpoint(checkpointFile) } if isUrban { @@ -166,7 +167,7 @@ func Loop() { if err != nil || len(regions) == 0 { trackeroo.Error("Error getting regions, falling back to Toscana: %v", err) regions = []string{"Toscana"} - trackeroo.DeleteCheckpoit(checkpointFile) + trackeroo.DeleteCheckpoint(checkpointFile) } cities = make([]string, 0) for _, region := range regions { @@ -188,7 +189,7 @@ func Loop() { checkpoint, err = trackeroo.LoadCheckpoint(checkpointFile) if err != nil { trackeroo.Error("Error loading route %v, discarding file", err) - trackeroo.DeleteCheckpoit(checkpointFile) + trackeroo.DeleteCheckpoint(checkpointFile) continue } lastEnd = checkpoint.Poles[1] @@ -290,7 +291,7 @@ func Loop() { trackeroo.Millisleep(100) } /* Routing terminated, waiting before next route */ - trackeroo.DeleteCheckpoit(checkpointFile) + trackeroo.DeleteCheckpoint(checkpointFile) time.Sleep(time.Second * 120) if !normalRun { /* Wait some more */ diff --git a/tracky/src/go.mod b/tracky/src/go.mod index d86d95e7..fcdbcd21 100755 --- a/tracky/src/go.mod +++ b/tracky/src/go.mod @@ -11,11 +11,14 @@ require ( ) require ( + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/redis/go-redis/v9 v9.14.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect golang.org/x/net v0.22.0 // indirect diff --git a/tracky/src/go.sum b/tracky/src/go.sum index ad9d40cc..31e3d6d4 100755 --- a/tracky/src/go.sum +++ b/tracky/src/go.sum @@ -1,3 +1,7 @@ +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= @@ -14,6 +18,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/redis/go-redis/v9 v9.14.0 h1:u4tNCjXOyzfgeLN+vAZaW1xUooqWDqVEsZN0U01jfAE= +github.com/redis/go-redis/v9 v9.14.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo= diff --git a/tracky/src/trackeroo/checkpoint.go b/tracky/src/trackeroo/checkpoint.go new file mode 100644 index 00000000..831ad1ad --- /dev/null +++ b/tracky/src/trackeroo/checkpoint.go @@ -0,0 +1,106 @@ +package trackeroo + +import ( + "context" + "encoding/json" + "fmt" + "os" + + "github.com/redis/go-redis/v9" +) + +var ( + redisClient *redis.Client + ctx = context.Background() +) + +func InitCheckpoint() { + redisURI := os.Getenv("REDIS_URI") + if redisURI != "" { + opt, err := redis.ParseURL(redisURI) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to parse REDIS_URI: %v\n", err) + return + } + redisClient = redis.NewClient(opt) + + // Test connection + if err := redisClient.Ping(ctx).Err(); err != nil { + fmt.Fprintf(os.Stderr, "Failed to connect to Redis: %v\n", err) + redisClient = nil + } + } +} + +func ExistsCheckpoint(filename string) bool { + if redisClient != nil { + exists, err := redisClient.Exists(ctx, filename).Result() + return err == nil && exists > 0 + } + + _, err := os.Stat(filename) + return !os.IsNotExist(err) +} + +func SaveCheckpoint(checkpoint *Checkpoint, filename string) error { + if checkpoint == nil { + return fmt.Errorf("cannot save nil checkpoint") + } + + jsonData, err := json.Marshal(checkpoint) + if err != nil { + return err + } + + if redisClient != nil { + return redisClient.Set(ctx, filename, jsonData, 0).Err() + } + + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + + fmt.Fprintf(file, "%s\n", jsonData) + return nil +} + +func LoadCheckpoint(filename string) (*Checkpoint, error) { + var jsonData []byte + var err error + + if redisClient != nil { + jsonData, err = redisClient.Get(ctx, filename).Bytes() + if err != nil { + return nil, err + } + } else { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + var checkpoint Checkpoint + err = json.NewDecoder(file).Decode(&checkpoint) + if err != nil { + return nil, err + } + return &checkpoint, nil + } + + var checkpoint Checkpoint + err = json.Unmarshal(jsonData, &checkpoint) + if err != nil { + return nil, err + } + return &checkpoint, nil +} + +func DeleteCheckpoint(filename string) error { + if redisClient != nil { + return redisClient.Del(ctx, filename).Err() + } + return os.Remove(filename) +} diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 2945f4d6..09c85052 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -1,10 +1,7 @@ package trackeroo import ( - "encoding/json" - "fmt" "math/rand" - "os" ) type Street struct { @@ -81,47 +78,3 @@ func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street, i return route, nil, "" } - -func ExistsCheckpoint(filename string) bool { - _, err := os.Stat(filename) - return !os.IsNotExist(err) -} - -func SaveCheckpoint(checkpoint *Checkpoint, filename string) error { - if checkpoint == nil { - return fmt.Errorf("cannot save nil checkpoint") - } - file, err := os.Create(filename) - if err != nil { - return err - } - defer file.Close() - - jsonData, err := json.Marshal(checkpoint) - if err != nil { - return err - } - fmt.Fprintf(file, "%s\n", jsonData) - - return nil -} - -func LoadCheckpoint(filename string) (*Checkpoint, error) { - file, err := os.Open(filename) - if err != nil { - return nil, err - } - defer file.Close() - - var checkpoint Checkpoint - err = json.NewDecoder(file).Decode(&checkpoint) - if err != nil { - return nil, err - } - - return &checkpoint, nil -} - -func DeleteCheckpoit(filename string) error { - return os.Remove(filename) -} From 3a8570e8c601b2b729edc4b5c88687973b631049 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 14:40:22 +0200 Subject: [PATCH 067/242] redis checkpoint --- tracky/geo-services/docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index d35e0501..8e93fb07 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -58,7 +58,6 @@ services: condition: on-failure redis: - container_name: redis image: redis:8.2.1-alpine volumes: - ./redis-data:/data From b0803bbc832ebb9bfcfa0f463ee325252726703c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 14:46:50 +0200 Subject: [PATCH 068/242] redis checkpoint --- tracky/src/firmware.go | 1 + tracky/src/trackeroo/checkpoint.go | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index dda8992e..85c7700b 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -121,6 +121,7 @@ func Loop() { rand.Seed(time.Now().UnixNano()) creds, _ := trackeroo.GetCredentials() checkpointFile := fmt.Sprintf("/data/%s_checkpoint.json", creds.ID) + trackeroo.InitCheckpointService() deviceType := creds.DeviceType overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL"), overpassClient) diff --git a/tracky/src/trackeroo/checkpoint.go b/tracky/src/trackeroo/checkpoint.go index 831ad1ad..189602ce 100644 --- a/tracky/src/trackeroo/checkpoint.go +++ b/tracky/src/trackeroo/checkpoint.go @@ -14,22 +14,25 @@ var ( ctx = context.Background() ) -func InitCheckpoint() { +func InitCheckpointService() { redisURI := os.Getenv("REDIS_URI") if redisURI != "" { opt, err := redis.ParseURL(redisURI) if err != nil { - fmt.Fprintf(os.Stderr, "Failed to parse REDIS_URI: %v\n", err) + Error("Failed to parse REDIS_URI: %v\n", err) return } redisClient = redis.NewClient(opt) // Test connection if err := redisClient.Ping(ctx).Err(); err != nil { - fmt.Fprintf(os.Stderr, "Failed to connect to Redis: %v\n", err) + Error("Failed to connect to Redis: %v\n", err) redisClient = nil } } + if redisClient != nil { + Info("Saving checkpoint to %s", redisURI) + } } func ExistsCheckpoint(filename string) bool { From 3d893069f452c97f32faeb9a49caadff49a1239e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 15:06:14 +0200 Subject: [PATCH 069/242] redis checkpoint --- tracky/make_compose.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index ce8830ac..52734bf0 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -46,8 +46,8 @@ def create_compose(credentials: List[Dict]): # networks={"trackynet": NetworkConfig(driver="overlay", attachable=True)}, networks={"trackynet": NetworkConfig(external=True, name="geoservices_trackynet")}, ) - - for cred in credentials: + print("SELECT * FROM ( VALUES ") + for i, cred in enumerate(credentials): regional = "true" if random.randint(1, 100) > 10 else "false" urban = "true" if random.randint(1, 100) > 50 and regional == "true" else "false" @@ -86,7 +86,11 @@ def create_compose(credentials: List[Dict]): "restart_policy": {"condition": "on-failure"}, }, ) - + if i == len(credentials) - 1: + print(f"('{cred['name']}', '{cred['id']}')") + else: + print(f"('{cred['name']}', '{cred['id']}'),") + print(") AS t (__text, __value)") # Dump YAML correctly with open("docker-compose.yml", "w") as f: compose_dict = compose.model_dump(exclude_none=True) From 3b48ca5300314c562ac2ce161c250fd705731055 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 15:14:07 +0200 Subject: [PATCH 070/242] redis checkpoint --- tracky/geo-services/docker-compose.yml | 13 ++++++------- tracky/make_compose.py | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/tracky/geo-services/docker-compose.yml b/tracky/geo-services/docker-compose.yml index 8e93fb07..cea0128e 100644 --- a/tracky/geo-services/docker-compose.yml +++ b/tracky/geo-services/docker-compose.yml @@ -11,7 +11,7 @@ services: volumes: - ./overpass-data:/db networks: - - trackynet + - tracky deploy: placement: constraints: [node.role == manager] @@ -27,7 +27,7 @@ services: depends_on: - overpass networks: - - trackynet + - tracky deploy: placement: constraints: [node.role == manager] @@ -50,7 +50,7 @@ services: ports: - "5000:5000" networks: - - trackynet + - tracky deploy: placement: constraints: [node.role == manager] @@ -68,7 +68,7 @@ services: retries: 3 start_period: 30s networks: - - trackynet + - tracky deploy: placement: constraints: [node.role == manager] @@ -76,6 +76,5 @@ services: condition: on-failure networks: - trackynet: - driver: overlay - attachable: true + tracky: + external: true diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 52734bf0..bebf3abd 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -44,7 +44,7 @@ def create_compose(credentials: List[Dict]): services={}, secrets={}, # networks={"trackynet": NetworkConfig(driver="overlay", attachable=True)}, - networks={"trackynet": NetworkConfig(external=True, name="geoservices_trackynet")}, + networks={"trackynet": NetworkConfig(external=True, name="tracky")}, ) print("SELECT * FROM ( VALUES ") for i, cred in enumerate(credentials): From 034b5e93e0dba6588f5dc4e9c639e7f815ae0fbd Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 15:15:27 +0200 Subject: [PATCH 071/242] redis checkpoint --- tracky/make_compose.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index bebf3abd..6ce69681 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -44,7 +44,7 @@ def create_compose(credentials: List[Dict]): services={}, secrets={}, # networks={"trackynet": NetworkConfig(driver="overlay", attachable=True)}, - networks={"trackynet": NetworkConfig(external=True, name="tracky")}, + networks={"tracky": NetworkConfig(external=True)}, ) print("SELECT * FROM ( VALUES ") for i, cred in enumerate(credentials): From 49d24d60301963fcfd3706cc3937b8a46eb0efd6 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 15:16:24 +0200 Subject: [PATCH 072/242] redis checkpoint --- tracky/make_compose.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 6ce69681..ceec4adc 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -74,7 +74,7 @@ def create_compose(credentials: List[Dict]): "PUBLISH_PERIOD": "2000", "PIRATE": "true" if random.randint(1, 100) < 10 else "false", }, - networks=["trackynet"], + networks=["tracky"], secrets=[ ServiceSecret( source=tdevice_secret, From 5e61af83fb7471f857eaaa60bda92cddede554c7 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 15:54:50 +0200 Subject: [PATCH 073/242] networks --- tracky/create_local_network.sh | 5 +++++ tracky/create_swarm_network.sh | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 tracky/create_local_network.sh create mode 100644 tracky/create_swarm_network.sh diff --git a/tracky/create_local_network.sh b/tracky/create_local_network.sh new file mode 100644 index 00000000..c4235d12 --- /dev/null +++ b/tracky/create_local_network.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +docker network rm tracky + +docker network create tracky diff --git a/tracky/create_swarm_network.sh b/tracky/create_swarm_network.sh new file mode 100644 index 00000000..af0a333a --- /dev/null +++ b/tracky/create_swarm_network.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +docker network rm tracky + +docker network create \ + --driver overlay \ + --attachable \ + tracky From 54a2fc4b8098f6f2e80ec6f405d1236e47071ee9 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 15:59:16 +0200 Subject: [PATCH 074/242] networks --- tracky/create_local_network.sh | 0 tracky/create_swarm_network.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tracky/create_local_network.sh mode change 100644 => 100755 tracky/create_swarm_network.sh diff --git a/tracky/create_local_network.sh b/tracky/create_local_network.sh old mode 100644 new mode 100755 diff --git a/tracky/create_swarm_network.sh b/tracky/create_swarm_network.sh old mode 100644 new mode 100755 From 505cef9ae87838c91952cee8dba1b2dbe5865b15 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 20:14:01 +0200 Subject: [PATCH 075/242] overpass cache --- tracky/src/firmware.go | 2 +- tracky/src/trackeroo/checkpoint.go | 29 ------------ tracky/src/trackeroo/overpass.go | 76 +++++++++++++++++++++++++++++- tracky/src/trackeroo/redis.go | 34 +++++++++++++ 4 files changed, 110 insertions(+), 31 deletions(-) create mode 100644 tracky/src/trackeroo/redis.go diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 85c7700b..8e61837d 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -121,7 +121,7 @@ func Loop() { rand.Seed(time.Now().UnixNano()) creds, _ := trackeroo.GetCredentials() checkpointFile := fmt.Sprintf("/data/%s_checkpoint.json", creds.ID) - trackeroo.InitCheckpointService() + trackeroo.InitRedisClient() deviceType := creds.DeviceType overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL"), overpassClient) diff --git a/tracky/src/trackeroo/checkpoint.go b/tracky/src/trackeroo/checkpoint.go index 189602ce..f84d42f8 100644 --- a/tracky/src/trackeroo/checkpoint.go +++ b/tracky/src/trackeroo/checkpoint.go @@ -1,40 +1,11 @@ package trackeroo import ( - "context" "encoding/json" "fmt" "os" - - "github.com/redis/go-redis/v9" -) - -var ( - redisClient *redis.Client - ctx = context.Background() ) -func InitCheckpointService() { - redisURI := os.Getenv("REDIS_URI") - if redisURI != "" { - opt, err := redis.ParseURL(redisURI) - if err != nil { - Error("Failed to parse REDIS_URI: %v\n", err) - return - } - redisClient = redis.NewClient(opt) - - // Test connection - if err := redisClient.Ping(ctx).Err(); err != nil { - Error("Failed to connect to Redis: %v\n", err) - redisClient = nil - } - } - if redisClient != nil { - Info("Saving checkpoint to %s", redisURI) - } -} - func ExistsCheckpoint(filename string) bool { if redisClient != nil { exists, err := redisClient.Exists(ctx, filename).Result() diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 675dd5cf..3df14cbc 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -10,6 +10,8 @@ import ( "net/url" "strings" "time" + + "github.com/redis/go-redis/v9" ) type OverpassElement struct { @@ -95,6 +97,21 @@ func (c *OverpassClient) GetStreets(city string, limit int, radiusMeters int) ([ limit = 100 } + cityKey := fmt.Sprintf("tracky::cities::%s::limits::%d::radius::%d", city, limit, radiusMeters) + if redisClient != nil { + cached, err := redisClient.Get(ctx, cityKey).Result() + if err == nil { + var elements []OverpassElement + if err := json.Unmarshal([]byte(cached), &elements); err == nil { + Info("Retrieved %d streets from Redis cache", len(elements)) + return elements, nil + } + Warning("Failed to unmarshal cached streets: %v", err) + } else if err != redis.Nil { + Warning("Redis get error: %v", err) + } + } + query := fmt.Sprintf(` [out:json][timeout:60]; area["ISO3166-1"="IT"][admin_level=2]->.italy; @@ -114,6 +131,16 @@ out tags geom %d; return nil, fmt.Errorf("no streets found for city: %s", city) } + if redisClient != nil { + data, err := json.Marshal(overpassResp.Elements) + if err == nil { + if err := redisClient.Set(ctx, cityKey, data, 0).Err(); err != nil { + Warning("Failed to cache regions in Redis: %v", err) + } else { + Info("Cached %d streets (city: %s, limit: %d, radius: %d) in Redis", len(overpassResp.Elements), city, limit, radiusMeters) + } + } + } return overpassResp.Elements, nil } @@ -127,7 +154,19 @@ func (c *OverpassClient) GetRandomStreet(city string, radiusMeters int) (Street, } func (c *OverpassClient) GetRegions() ([]string, error) { - + if redisClient != nil { + cached, err := redisClient.Get(ctx, "tracky::regions").Result() + if err == nil { + var regions []string + if err := json.Unmarshal([]byte(cached), ®ions); err == nil { + Info("Retrieved %d regions from Redis cache", len(regions)) + return regions, nil + } + Warning("Failed to unmarshal cached regions: %v", err) + } else if err != redis.Nil { + Warning("Redis get error: %v", err) + } + } query := `[out:json][timeout:60]; area["ISO3166-1"="IT"][admin_level=2]->.italy; relation["boundary"="administrative"]["admin_level"=4]["ISO3166-2"~"^IT-"](area.italy); @@ -147,10 +186,34 @@ out tags;` regions = append(regions, element.Tags["name"]) } } + if redisClient != nil { + data, err := json.Marshal(regions) + if err == nil { + if err := redisClient.Set(ctx, "tracky::regions", data, 0).Err(); err != nil { + Warning("Failed to cache regions in Redis: %v", err) + } else { + Info("Cached %d regions in Redis", len(regions)) + } + } + } return regions, nil } func (c *OverpassClient) GetCities(region string) ([]string, error) { + regionKey := fmt.Sprintf("tracky::regions::%s", region) + if redisClient != nil { + cached, err := redisClient.Get(ctx, regionKey).Result() + if err == nil { + var cities []string + if err := json.Unmarshal([]byte(cached), &cities); err == nil { + Info("Retrieved %d cities from Redis cache", len(cities)) + return cities, nil + } + Warning("Failed to unmarshal cached cities: %v", err) + } else if err != redis.Nil { + Warning("Redis get error: %v", err) + } + } query := fmt.Sprintf(`[out:json][timeout:60]; relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; .reg map_to_area->.region; @@ -171,5 +234,16 @@ out tags;`, region) cities = append(cities, element.Tags["name"]) } } + + if redisClient != nil { + data, err := json.Marshal(cities) + if err == nil { + if err := redisClient.Set(ctx, regionKey, data, 0).Err(); err != nil { + Warning("Failed to cache regions in Redis: %v", err) + } else { + Info("Cached %d cities in Redis", len(cities)) + } + } + } return cities, nil } diff --git a/tracky/src/trackeroo/redis.go b/tracky/src/trackeroo/redis.go new file mode 100644 index 00000000..a266d32c --- /dev/null +++ b/tracky/src/trackeroo/redis.go @@ -0,0 +1,34 @@ +package trackeroo + +import ( + "context" + "os" + + "github.com/redis/go-redis/v9" +) + +var ( + redisClient *redis.Client + ctx = context.Background() +) + +func InitRedisClient() { + redisURI := os.Getenv("REDIS_URI") + if redisURI != "" { + opt, err := redis.ParseURL(redisURI) + if err != nil { + Error("Failed to parse REDIS_URI: %v\n", err) + return + } + redisClient = redis.NewClient(opt) + + // Test connection + if err := redisClient.Ping(ctx).Err(); err != nil { + Error("Failed to connect to Redis: %v\n", err) + redisClient = nil + } + } + if redisClient != nil { + Info("Saving checkpoint to %s", redisURI) + } +} From 5daa2ae7a50f89d72aad6070c78c5fedb2d5bb50 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 20:17:13 +0200 Subject: [PATCH 076/242] overpass cache --- tracky/src/trackeroo/overpass.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 3df14cbc..38974f12 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -206,7 +206,7 @@ func (c *OverpassClient) GetCities(region string) ([]string, error) { if err == nil { var cities []string if err := json.Unmarshal([]byte(cached), &cities); err == nil { - Info("Retrieved %d cities from Redis cache", len(cities)) + Info("Retrieved %d cities (%s) from Redis cache", len(cities), region) return cities, nil } Warning("Failed to unmarshal cached cities: %v", err) From 39754e27e1df655ba863de485fd79f8040fdd644 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 21:41:33 +0200 Subject: [PATCH 077/242] tracky image --- .github/workflows/tracky-publish.yml | 58 ++++++++++++++++++++++++++++ tracky/make_compose.py | 2 +- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/tracky-publish.yml diff --git a/.github/workflows/tracky-publish.yml b/.github/workflows/tracky-publish.yml new file mode 100644 index 00000000..75c2c1a2 --- /dev/null +++ b/.github/workflows/tracky-publish.yml @@ -0,0 +1,58 @@ +name: Build and Push Tracky Image + +on: + push: + branches: ["*"] + paths: + - "tracky/**" + workflow_dispatch: + +jobs: + detect: + runs-on: ubuntu-latest + outputs: + images: ${{ steps.filter.outputs.changes }} + steps: + - uses: actions/checkout@v4 + + - name: Detect changed images + id: filter + uses: dorny/paths-filter@v3 + with: + list-files: shell + filters: | + tracky: + - 'tracky/**' + + build: + needs: detect + if: needs.detect.outputs.images != '[]' + runs-on: ubuntu-latest + strategy: + matrix: + include: + - image: tracky + context: ./tracky/src + dockerfile: ./tsdb/src/Dockerfile + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v4 + + - name: Log in to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and Push Docker image + uses: docker/build-push-action@v6 + with: + context: ${{ matrix.context }} + file: ${{ matrix.dockerfile }} + push: true + tags: | + ghcr.io/${{ github.repository_owner }}/${{ matrix.image }}:latest + ghcr.io/${{ github.repository_owner }}/${{ matrix.image }}:${{ github.sha }} diff --git a/tracky/make_compose.py b/tracky/make_compose.py index ceec4adc..2395eef8 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -64,7 +64,7 @@ def create_compose(credentials: List[Dict]): # Define service with secrets mounted compose.services[service_name] = ServiceConfig( - image="tracky:latest", + image="ghcr.io/skiby7/tracky:latest", environment={ "ROUTING_SERVICE_URL": "http://osrm:5000", "OVERPASS_URL": "http://nginx:80/api/interpreter", From 81bcd8fd636089f4d05db29e0fe572d2f4555b86 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 21:43:02 +0200 Subject: [PATCH 078/242] tracky image --- .github/workflows/tracky-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tracky-publish.yml b/.github/workflows/tracky-publish.yml index 75c2c1a2..ad6d2540 100644 --- a/.github/workflows/tracky-publish.yml +++ b/.github/workflows/tracky-publish.yml @@ -2,7 +2,7 @@ name: Build and Push Tracky Image on: push: - branches: ["*"] + branches: ["**"] paths: - "tracky/**" workflow_dispatch: From 123ae330ea2e57749ec126236e0ddc18f818e227 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 21:43:45 +0200 Subject: [PATCH 079/242] trigger --- tracky/src/trackeroo/redis.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tracky/src/trackeroo/redis.go b/tracky/src/trackeroo/redis.go index a266d32c..ae18d9b4 100644 --- a/tracky/src/trackeroo/redis.go +++ b/tracky/src/trackeroo/redis.go @@ -22,7 +22,6 @@ func InitRedisClient() { } redisClient = redis.NewClient(opt) - // Test connection if err := redisClient.Ping(ctx).Err(); err != nil { Error("Failed to connect to Redis: %v\n", err) redisClient = nil From 21755464463e772cfa2111aac913af4f144e204d Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 21:44:50 +0200 Subject: [PATCH 080/242] trigger --- .github/workflows/tracky-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tracky-publish.yml b/.github/workflows/tracky-publish.yml index ad6d2540..8b956f5a 100644 --- a/.github/workflows/tracky-publish.yml +++ b/.github/workflows/tracky-publish.yml @@ -33,7 +33,7 @@ jobs: include: - image: tracky context: ./tracky/src - dockerfile: ./tsdb/src/Dockerfile + dockerfile: ./tracky/src/Dockerfile permissions: contents: read packages: write From 57c42a6c2276cda502a9d0085d9067dfc7e8bfde Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 21:46:08 +0200 Subject: [PATCH 081/242] trigger --- tracky/src/trackeroo/driving.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index e828a6ee..346cf4e1 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -213,8 +213,8 @@ func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, DefaultAverageSpeed: avgSpeed, Start: checkpoint.Poles[0].Coordinate, End: checkpoint.Poles[1].Coordinate, - SpeedVariation: 0.03, // 3% speed variation - StopProbability: 0.05, // 5% chance of stopping per segment + SpeedVariation: 0.03, + StopProbability: 0.05, StopDuration: struct { Min time.Duration Max time.Duration From 1165eb6acfa73b69dc14b6086ab54b8709a5de9c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 22:15:46 +0200 Subject: [PATCH 082/242] trigger --- tracky/make_compose.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 2395eef8..5d494ec4 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -66,9 +66,9 @@ def create_compose(credentials: List[Dict]): compose.services[service_name] = ServiceConfig( image="ghcr.io/skiby7/tracky:latest", environment={ - "ROUTING_SERVICE_URL": "http://osrm:5000", - "OVERPASS_URL": "http://nginx:80/api/interpreter", - "REDIS_URI": "redis://redis:6379", + "ROUTING_SERVICE_URL": "http://tracky_osrm:5000", + "OVERPASS_URL": "http://tracky_nginx:80/api/interpreter", + "REDIS_URI": "redis://tracky_redis:6379", "REGIONAL": regional, "URBAN": urban, "PUBLISH_PERIOD": "2000", @@ -83,7 +83,7 @@ def create_compose(credentials: List[Dict]): ], deploy={ "replicas": 1, - "restart_policy": {"condition": "on-failure"}, + "restart_policy": {"condition": "unless-stopped"}, }, ) if i == len(credentials) - 1: From 5ac1f20c8feb92c286c8a4c59134f62794268ea6 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 22:19:06 +0200 Subject: [PATCH 083/242] trigger --- tracky/make_compose.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 5d494ec4..936e0ae7 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -83,7 +83,7 @@ def create_compose(credentials: List[Dict]): ], deploy={ "replicas": 1, - "restart_policy": {"condition": "unless-stopped"}, + "restart_policy": {"condition": "any"}, }, ) if i == len(credentials) - 1: From d2762c7a1c5a58ef7b06c2cbac36007b6663f65d Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 22:51:55 +0200 Subject: [PATCH 084/242] service name --- tracky/make_compose.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 936e0ae7..d82982e9 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -66,9 +66,9 @@ def create_compose(credentials: List[Dict]): compose.services[service_name] = ServiceConfig( image="ghcr.io/skiby7/tracky:latest", environment={ - "ROUTING_SERVICE_URL": "http://tracky_osrm:5000", - "OVERPASS_URL": "http://tracky_nginx:80/api/interpreter", - "REDIS_URI": "redis://tracky_redis:6379", + "ROUTING_SERVICE_URL": "http://osrm:5000", + "OVERPASS_URL": "http://nginx:80/api/interpreter", + "REDIS_URI": "redis://redis:6379", "REGIONAL": regional, "URBAN": urban, "PUBLISH_PERIOD": "2000", From cade0071ea50ed3be486631a0fdcdfa6f4d8b0c5 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 23:42:17 +0200 Subject: [PATCH 085/242] giving more timeout --- tracky/src/trackeroo/overpass.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tracky/src/trackeroo/overpass.go b/tracky/src/trackeroo/overpass.go index 38974f12..c4575f14 100644 --- a/tracky/src/trackeroo/overpass.go +++ b/tracky/src/trackeroo/overpass.go @@ -34,7 +34,7 @@ func NewOverpassClient(baseURL string) *OverpassClient { return &OverpassClient{ BaseURL: baseURL, Client: &http.Client{ - Timeout: 60 * time.Second, + Timeout: 120 * time.Second, }, } } @@ -113,7 +113,7 @@ func (c *OverpassClient) GetStreets(city string, limit int, radiusMeters int) ([ } query := fmt.Sprintf(` -[out:json][timeout:60]; +[out:json][timeout:120]; area["ISO3166-1"="IT"][admin_level=2]->.italy; node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; ( @@ -167,7 +167,7 @@ func (c *OverpassClient) GetRegions() ([]string, error) { Warning("Redis get error: %v", err) } } - query := `[out:json][timeout:60]; + query := `[out:json][timeout:120]; area["ISO3166-1"="IT"][admin_level=2]->.italy; relation["boundary"="administrative"]["admin_level"=4]["ISO3166-2"~"^IT-"](area.italy); out tags;` @@ -214,7 +214,7 @@ func (c *OverpassClient) GetCities(region string) ([]string, error) { Warning("Redis get error: %v", err) } } - query := fmt.Sprintf(`[out:json][timeout:60]; + query := fmt.Sprintf(`[out:json][timeout:120]; relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; .reg map_to_area->.region; node["place"~"city|town"](area.region); From d7252fdf67a244c5ca4da9bee61a47ac61bfdb8d Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 17 Oct 2025 23:52:45 +0200 Subject: [PATCH 086/242] giving more timeout --- tracky/src/trackeroo/driving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 346cf4e1..908d9604 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -83,7 +83,7 @@ type RoutingService struct { func NewRoutingService(osrmURL string) *RoutingService { return &RoutingService{ OSRMURL: osrmURL, - httpClient: &http.Client{Timeout: 30 * time.Second}, + httpClient: &http.Client{Timeout: 120 * time.Second}, } } From 903d6c8b6f35bf41318714e2a1d23c936b205b60 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 18 Oct 2025 00:09:34 +0200 Subject: [PATCH 087/242] removing 100 devs --- mongo/init.js | 801 ------------------- services/playbooks/roles/mongo/files/init.js | 801 ------------------- 2 files changed, 1602 deletions(-) diff --git a/mongo/init.js b/mongo/init.js index d030e316..6e1ec4c1 100644 --- a/mongo/init.js +++ b/mongo/init.js @@ -852,7 +852,6 @@ db.devices.insertMany([ private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, - { _id: "trk-186e120746e18c690d2440c6", name: "busy_torvalds", @@ -1653,804 +1652,4 @@ db.devices.insertMany([ private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", created_at: ISODate("2025-09-13T16:47:26Z"), }, - { - _id: "trk-186e1309839bbd54be8f785e", - name: "gifted_hawking", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ZCw5gk1MaebMg2IsOivMuSZgCAJQxYPZ8o3KMTn0oSY=", - created_at: ISODate("2025-10-02T18:57:55Z"), - }, - { - _id: "trk-186e1309839e1ffe329ebf18", - name: "zealous_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "LOjfvsoJj7zNBoByyrJqgnfbVuvg2oqSWSo23k5szrw=", - created_at: ISODate("2025-10-05T07:08:55Z"), - }, - { - _id: "trk-186e1309839e3cc066512dbd", - name: "elastic_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "k7fQ1A277mZYtLp4yZwgQv5SAHg+CQykl65IYmBOcLw=", - created_at: ISODate("2025-10-13T05:51:55Z"), - }, - { - _id: "trk-186e1309839e5c57c7e9af1b", - name: "energetic_lovelace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "cTlwhna05v7wqUSh4A6t7V59z5nfZPwlmu5phCNjhzs=", - created_at: ISODate("2025-09-15T01:26:55Z"), - }, - { - _id: "trk-186e1309839e7274fbb77443", - name: "noble_schwinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "zWDBZnVqBcN60DwbxryQ+eLp/b+dr/xlpafTcWfFs1c=", - created_at: ISODate("2025-09-23T19:53:55Z"), - }, - { - _id: "trk-186e1309839e85fe0ba301ac", - name: "puzzled_heisenberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "EE/TZ0jS3mEwbZx/YqElSKS2qxTLiADL3wTZc7UtTR4=", - created_at: ISODate("2025-09-15T11:31:55Z"), - }, - { - _id: "trk-186e1309839e99c2655eb597", - name: "magical_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "zaDTN2SiXFRcxdsnSyeZST0eJO2ymNrnWVh9KSiBjmQ=", - created_at: ISODate("2025-09-19T07:21:55Z"), - }, - { - _id: "trk-186e1309839eae938abbb06e", - name: "polite_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "3E5qvFq6m7TZW5scw/ZYc39zAnhourZwtQbte1KRFcg=", - created_at: ISODate("2025-09-22T23:00:55Z"), - }, - { - _id: "trk-186e1309839ec6a5f176f269", - name: "suspicious_weber", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "vPKKppUdZeMiXY5HYgFgHETpYx3jtWRHuMeNPNX+gIo=", - created_at: ISODate("2025-09-24T20:49:55Z"), - }, - { - _id: "trk-186e1309839edcbc0e9ccdee", - name: "hyper_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "m6ltZvHHeKGnbg/7OCLoDwz5JuXP2lr1pcY4Vj+iY6Y=", - created_at: ISODate("2025-09-15T11:08:55Z"), - }, - { - _id: "trk-186e1309839ef37e250b2ac1", - name: "flamboyant_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "IZrX9Tvi8DNKS7uFTtf/HLwYxivfO6gnriULc081BW4=", - created_at: ISODate("2025-09-27T03:18:55Z"), - }, - { - _id: "trk-186e1309839f7ba1a81d392e", - name: "laughing_oppenheimer", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "sTqUXGZmpiGZHGxXEFElISIe3iJz9VW5h7LrKbdbT5Q=", - created_at: ISODate("2025-09-21T19:38:55Z"), - }, - { - _id: "trk-186e1309839fda077e230f18", - name: "sleepy_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "K/fnViP3HJeORW02MDQiODA2KJIIOklTQ95dp8KR1Aw=", - created_at: ISODate("2025-10-08T09:06:55Z"), - }, - { - _id: "trk-186e1309839fef6604700630", - name: "cranky_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "LhU6aqY/E9DHusg8AbbavTuikkHRVaOKAceEX4erXb8=", - created_at: ISODate("2025-10-13T10:22:55Z"), - }, - { - _id: "trk-186e130983a01ae99c930d78", - name: "brave_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "DdkJUpGmJY7ZMiMKeyTIUh+NOId0DzLi7dp6alJhQ88=", - created_at: ISODate("2025-09-18T08:13:55Z"), - }, - { - _id: "trk-186e130983a034f970090b84", - name: "keen_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "bb/3zD4PlygRSNYJ2JfXWtQOGXRlw4iqjv0nESpWnnw=", - created_at: ISODate("2025-10-12T15:58:55Z"), - }, - { - _id: "trk-186e130983a059f6f1438b3e", - name: "awesome_fermi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "KGd+GfOfvoG61VkVQFjTJR0Yq/znautGUH+9WAnDLoQ=", - created_at: ISODate("2025-09-24T09:31:55Z"), - }, - { - _id: "trk-186e130983a07ae5a7263ec1", - name: "crazy_thompson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "hbTWXcPaFt/C79Q3ljLio7j7GkYT4DT6UKavFR/7tOg=", - created_at: ISODate("2025-10-04T02:54:55Z"), - }, - { - _id: "trk-186e130983a09704293604ee", - name: "calm_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "OU1L1O+EUhwPhwmKJ8OtajzN5xPrV4wyWeLsTaoY1I8=", - created_at: ISODate("2025-10-01T22:19:55Z"), - }, - { - _id: "trk-186e130983a0b6016eeb4331", - name: "proud_jobs", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "Je7MWPdNzzyVBGdsKH0ZrdkDCkkk52S0sa9OOaloRQM=", - created_at: ISODate("2025-09-24T22:52:55Z"), - }, - { - _id: "trk-186e130983a0db3e0cc11f28", - name: "furious_chebyshev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "rINraJ2KTESEfAph/IFXaUIsFf2DwvcV46lED/a+XZQ=", - created_at: ISODate("2025-09-30T07:18:55Z"), - }, - { - _id: "trk-186e130983a14583c71a2172", - name: "faithful_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "oaNmemljb/RTXF5lwD+aYiyJduErvUitnjU9P6O3Qcc=", - created_at: ISODate("2025-10-06T15:35:55Z"), - }, - { - _id: "trk-186e130983a159e2bbb9f5f8", - name: "upbeat_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "FlfO21D9qS/voZQhw7ALRXcQpl+4P0+bcsAVx+HqTys=", - created_at: ISODate("2025-10-10T03:06:55Z"), - }, - { - _id: "trk-186e130983a1c1a1f3cb2f24", - name: "hungry_gauss", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "MP/K9fmbN8gjGL2dlUgPwvfkmH1AUPDCjdAiUqu944g=", - created_at: ISODate("2025-10-11T22:35:55Z"), - }, - { - _id: "trk-186e130983a1d5c90eeb7be5", - name: "motivated_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "yKTjLolSSeYIykBPgT5XtvoUQdKALNFkkNu44kNoGP4=", - created_at: ISODate("2025-10-05T00:01:55Z"), - }, - { - _id: "trk-186e130983a1ea63e8dbee65", - name: "laughing_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "gqr+1LMynMxT9/LCZi34YT7w7kNetDPAIM5vgxuJ62E=", - created_at: ISODate("2025-09-26T16:11:55Z"), - }, - { - _id: "trk-186e130983a1fd7e0e4791cc", - name: "blissful_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "46eu29Cek7uXQbQIikPXWXXtb5Mj4uF8qiNAjlAhHAg=", - created_at: ISODate("2025-09-20T07:34:55Z"), - }, - { - _id: "trk-186e130983a2109dd0df3463", - name: "modest_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "wDLjDpT2iWWujj+LVSJmdJiiJvgBj4cZ+79LZdPwQ9s=", - created_at: ISODate("2025-09-23T15:00:55Z"), - }, - { - _id: "trk-186e130983a234a9618f898e", - name: "confident_peano", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "v6fr9Q4/AQTAwGGrEszqok6AU/RlCO7EmsWoaHPR1Wg=", - created_at: ISODate("2025-09-27T05:29:55Z"), - }, - { - _id: "trk-186e130983a2560f98ea7e47", - name: "jovial_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "KcMeDL6RVjQrEE3xf+j2tcYleM26p60oLqaVvRhQFDM=", - created_at: ISODate("2025-09-25T14:14:55Z"), - }, - { - _id: "trk-186e130983a26a15f661928b", - name: "eloquent_dedekind", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "X8atklQ+PoJ0GuKFPwfSs49w1C1tjiwstgnvu+3Uaq8=", - created_at: ISODate("2025-09-29T19:35:55Z"), - }, - { - _id: "trk-186e130983a27e5bc05251b9", - name: "frosty_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "1kASDQP73a3z2SN8IkuNtI3cYmX3jjvmO+/bU1sQwHY=", - created_at: ISODate("2025-09-21T07:50:55Z"), - }, - { - _id: "trk-186e130983a291f1e443cd5a", - name: "proud_markov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "UzmsA89/TC3Y9HXzAj/FFajvNUheAN9dGb/0axlXtb8=", - created_at: ISODate("2025-10-01T10:25:55Z"), - }, - { - _id: "trk-186e130983a2a576491ef9af", - name: "angry_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "sKpBt81A5fAZFsm4npMR5KEv3eJY9csJ0lU2dV09slw=", - created_at: ISODate("2025-10-08T07:07:55Z"), - }, - { - _id: "trk-186e130983a2d186e5d486fb", - name: "hungry_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "fH0z5owaDwYFtDAHOTndNz6bZboOOrfJS7G0FcLWwSc=", - created_at: ISODate("2025-09-26T13:34:55Z"), - }, - { - _id: "trk-186e130983a2e58a9f17fdc3", - name: "distracted_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "T9pkDWyxASF5yTI/tPUa0oYGkbS7kEJw658mWEYmXuw=", - created_at: ISODate("2025-09-15T03:42:55Z"), - }, - { - _id: "trk-186e130983a2fe87872f4f49", - name: "thoughtful_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "hcUkyXC/+F/nxBV8iOeTaXlbPlVbefYzFfrbXkGV8Sg=", - created_at: ISODate("2025-10-05T01:51:55Z"), - }, - { - _id: "trk-186e130983a322c165ec9526", - name: "sad_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "vNNucwhglkB7Y1aVZrx8AmdKQH0T8NQ/nDA6WvAmHYA=", - created_at: ISODate("2025-09-28T01:45:55Z"), - }, - { - _id: "trk-186e130983a340ddf0bf05e4", - name: "vibrant_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "JD9CEeoyzLC/HXULUtZRds3Zt3W73rlEK9SaMNABxX4=", - created_at: ISODate("2025-10-13T14:53:55Z"), - }, - { - _id: "trk-186e130983a35bf2a8e986cb", - name: "original_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "B7fsNi61OSIwh7sOPijfiaXcO35j4b8D4RzaOO9AI9o=", - created_at: ISODate("2025-09-13T22:37:55Z"), - }, - { - _id: "trk-186e130983a37e04ea2b2ff2", - name: "fabulous_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "BgA+RZUSOglE9OOaC64uOPYBH2Q3FXKTh92P7kevJmo=", - created_at: ISODate("2025-09-26T15:11:55Z"), - }, - { - _id: "trk-186e130983a39b9455bdeedf", - name: "awesome_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "ttzL9AQTJ9RKMTlAF7il5xpv84u4wPLSCxzJ7QgAK2o=", - created_at: ISODate("2025-10-07T23:48:55Z"), - }, - { - _id: "trk-186e130983a3c77bb7a4f5d7", - name: "heartwarming_michelson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HXOc5oU5YLvbceVhUGdpPTmDfF3FROJAPjZ2XkjjTvo=", - created_at: ISODate("2025-10-02T15:09:55Z"), - }, - { - _id: "trk-186e130983a42d5fb53a30e9", - name: "sweet_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "Cogel1ZaSvbfbwjKN9kzoFdMkNmRVyjLhdVO1TIXRX8=", - created_at: ISODate("2025-09-21T15:57:55Z"), - }, - { - _id: "trk-186e130983a45e7421d17024", - name: "heuristic_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "XO/6YycdUYkH63d460y/NTW0dxLBPiAygeMjHuRmag8=", - created_at: ISODate("2025-10-05T02:06:55Z"), - }, - { - _id: "trk-186e130983a47ab26312a621", - name: "serene_leibniz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "ZEey/z8mahhYZ6P2370knAdpoBRxrl+rUc8IRGe7X+s=", - created_at: ISODate("2025-10-11T19:15:55Z"), - }, - { - _id: "trk-186e130983a49cc1a4ead31d", - name: "admiring_markov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "z1UanROYzQtod+7GLLbw9qYdIvet+pQQEc85sdmE1tI=", - created_at: ISODate("2025-10-10T21:17:55Z"), - }, - { - _id: "trk-186e130983a4af6de88c809f", - name: "practical_cantor", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "n7DXivw4BcVLW2WE3NGNZGADmQgpJuAqcDxd/3ys6oo=", - created_at: ISODate("2025-09-14T14:27:55Z"), - }, - { - _id: "trk-186e130983a4c1a2c1717cf8", - name: "keen_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "QzRG4fj6Ieu/CEDn4y6+Bu1gBFqY4ISF+tHNhDtlNOU=", - created_at: ISODate("2025-10-11T10:09:55Z"), - }, - { - _id: "trk-186e130983a4d36ac7ba8b7a", - name: "proud_tesla", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "EX3KV2PKMP/B3ZQ2W/lWny+J+Ph56ZZvPU5Ee4JyKN4=", - created_at: ISODate("2025-09-25T21:44:55Z"), - }, - { - _id: "trk-186e130983a4e47156945059", - name: "goofy_crick", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "vazs6yunKp5x6D8iixRFQWIPPtuhKeHi8k+cnv/oP10=", - created_at: ISODate("2025-09-19T10:10:55Z"), - }, - { - _id: "trk-186e130983a4f6d211f892ab", - name: "phenomenal_chebyshev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "F5ynV08uXxR+VAwDWviUzRt5DJSK4tZkuw76KO8gICI=", - created_at: ISODate("2025-09-25T04:49:55Z"), - }, - { - _id: "trk-186e130983a508c15816b9c0", - name: "nervous_shannon", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "wcyoP8iDI3UU5H1r/qqVYLR1tsMuB0fwqilajOO4+vc=", - created_at: ISODate("2025-09-19T21:06:55Z"), - }, - { - _id: "trk-186e130983a519b7a38da4ea", - name: "polite_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "1tk9YjVrNKneUDY1Osjo/Dwi4i10Gso/pN46e3GvYYY=", - created_at: ISODate("2025-09-14T23:19:55Z"), - }, - { - _id: "trk-186e130983a52afe9fa16029", - name: "proud_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "1f2wPh9Ox2inN18mT1YuK4jRHKvVGoKG8SpgAzQkHSY=", - created_at: ISODate("2025-09-23T19:32:55Z"), - }, - { - _id: "trk-186e130983a53d672348d95f", - name: "wonderful_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "wTtqmRD/kVPjzkiGiJwEi6Ki7iSk/zTlmXS+hp4yNSo=", - created_at: ISODate("2025-10-04T21:25:55Z"), - }, - { - _id: "trk-186e130983a565faaf6e26d7", - name: "enchanting_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "ZVUDm/FzS/zzVL4cCFnt3GhgJWabExYb4opnpTH0EF0=", - created_at: ISODate("2025-09-19T07:10:55Z"), - }, - { - _id: "trk-186e130983a5847b2c0e34c5", - name: "compassionate_pauli", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "fc20Hdx9vXJ178vB52/ZIhUUQdM5xEC06cYBsFH6qFQ=", - created_at: ISODate("2025-10-05T12:11:55Z"), - }, - { - _id: "trk-186e130983a5965d6dada7f4", - name: "quirky_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "baCodUXLbJPBkTX0SYlNZoiS+wCQNxSCOQVl11U/nlw=", - created_at: ISODate("2025-09-26T23:13:55Z"), - }, - { - _id: "trk-186e130983a5c49aeba044f5", - name: "original_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "8Fc0JUIo5wNsW9YpeJgMyIWoMB6efwN8TNO1wREwMn4=", - created_at: ISODate("2025-09-16T16:39:55Z"), - }, - { - _id: "trk-186e130983a5d7349ac354d7", - name: "epic_michelson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "1Dw3ZR9Thr0Hcy4/nSnpDXiBfPsctFt9l+vlsNJ0IPk=", - created_at: ISODate("2025-10-05T23:44:55Z"), - }, - { - _id: "trk-186e130983a5e91f31ee5429", - name: "clever_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "T1XjWjDNQy1lBxDSvVgKpThI1K4POhliXJOFvtZFo/k=", - created_at: ISODate("2025-10-09T21:17:55Z"), - }, - { - _id: "trk-186e130983a5fa39a2a976c0", - name: "gifted_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "fr61QFVGUvqpBS8uWwQ49iudcMYGxgi9PW8RZcVg6so=", - created_at: ISODate("2025-09-19T08:34:55Z"), - }, - { - _id: "trk-186e130983a61fe1c2dd259e", - name: "jaunty_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "DpeFAN8wyPtjf1rGLO7JbAwB0VqowdXasLZOs8d0VXw=", - created_at: ISODate("2025-09-30T06:29:55Z"), - }, - { - _id: "trk-186e130983a6336076acfe23", - name: "nostalgic_rutherford", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "+8M4KNmUM9/n0mPsZJZdTKUCXZILPHMNfmPPNNkcTXc=", - created_at: ISODate("2025-09-19T23:53:55Z"), - }, - { - _id: "trk-186e130983a644b5f71646b8", - name: "fancy_shannon", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Pf5p7rwp5Kz6sm9i5tkjoCze/i2Fg5YuTzJHBLSpNPs=", - created_at: ISODate("2025-09-27T10:30:55Z"), - }, - { - _id: "trk-186e130983a655ddcb922063", - name: "great_henry", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "ZhajzgyxcVnZi0u9Hm6C58119AdBDZyXhtMSF76y/G4=", - created_at: ISODate("2025-09-30T21:42:55Z"), - }, - { - _id: "trk-186e130983a667a828ff844f", - name: "grieving_shannon", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "iKFwj7MKj0zd5ON6UBQyqlhZlEUqHuSd6jmKr905gq4=", - created_at: ISODate("2025-10-04T07:32:55Z"), - }, - { - _id: "trk-186e130983a6794fd7167c67", - name: "dreamy_yang", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "RKml+qYAdgRUFEbo7NYC6v6L5x9iH1WAyZkg3ywu/Mc=", - created_at: ISODate("2025-09-29T12:13:55Z"), - }, - { - _id: "trk-186e130983a68a6c4e789068", - name: "xenodochial_pauli", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "5jEOTEisy9PAHGo2cUxTLjcS7U/j1z+iDVu4AmPAQB4=", - created_at: ISODate("2025-10-09T09:38:55Z"), - }, - { - _id: "trk-186e130983a6a42c3aa15795", - name: "eloquent_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "fktsbKDjJeccJCECW3jEVln0OHXFMvTFa/JQb2T7zX4=", - created_at: ISODate("2025-09-27T11:41:55Z"), - }, - { - _id: "trk-186e130983a6b654add2ea90", - name: "optimized_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "kQeoHG8z2ONEFoa3e/6dviH2WAgRiAScU9R3czQHhiA=", - created_at: ISODate("2025-09-17T00:43:55Z"), - }, - { - _id: "trk-186e130983a6c82b57b03fe5", - name: "outstanding_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "cmzsUIvVt8wibHWzZd9Ej5CaoTDDDN325i7lsSTNfnk=", - created_at: ISODate("2025-09-24T14:47:55Z"), - }, - { - _id: "trk-186e130983a6da34cfc550e0", - name: "quizzical_lovelace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "pax2Gn8effRWcUhmxW/9Uc/KvWrfv6+IejTdzMlA7bk=", - created_at: ISODate("2025-09-15T21:11:55Z"), - }, - { - _id: "trk-186e130983a6ebaaea0d4795", - name: "competent_leibniz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "P6dDQCF6Fgjub8xGk93uxOQKX/KYcyB6e5bVrDrmHZ0=", - created_at: ISODate("2025-09-25T07:45:55Z"), - }, - { - _id: "trk-186e130983a6fd0db9d5a841", - name: "keen_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "wW1zdnRBu/V+TTrdSPjtT/enxkpbwHgcngL/n5oKQGI=", - created_at: ISODate("2025-09-22T07:56:55Z"), - }, - { - _id: "trk-186e130983a70f40a79fedae", - name: "fabulous_rutherford", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "2Rg2uMXrpuF9EtKsOXnqxokMWKCDy6Qtgy/92Vq6WHI=", - created_at: ISODate("2025-09-21T20:54:55Z"), - }, - { - _id: "trk-186e130983a720eff34ba9c8", - name: "interesting_thompson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "38OdyJBYXtEDLQ1W6Ay98X7QXHbs/rvV1Slbn+DVDIQ=", - created_at: ISODate("2025-09-20T08:01:55Z"), - }, - { - _id: "trk-186e130983a739bb2f817dda", - name: "adoring_dyson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "XNp46numS1q+uFS4mLsd3ixSmP98hQFwZpxJQvefmOA=", - created_at: ISODate("2025-09-27T23:47:55Z"), - }, - { - _id: "trk-186e130983a74c17ec7515dd", - name: "agitated_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "egIN2RS4kylE+AN+PL4GUXYr1L1D23aOOWHaFMua8dA=", - created_at: ISODate("2025-10-11T05:41:55Z"), - }, - { - _id: "trk-186e130983a75eb0efc4d28f", - name: "merry_kleene", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "nELHiKhUE7Y7U8Zni+levsFKjHkUj8L7nlmXeKV5upA=", - created_at: ISODate("2025-09-14T02:49:55Z"), - }, - { - _id: "trk-186e130983a770bd6a437b45", - name: "inspiring_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "GJRtvBmPmKbU2LIEG1J4qP5kjhin6FjzjpxcfdgmYHg=", - created_at: ISODate("2025-09-15T04:05:55Z"), - }, - { - _id: "trk-186e130983a782e44f0bccee", - name: "epic_wu", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "6WFt4fLWdRwbKb56kxs3UG7gbEmSRZJcWrs0Witu60I=", - created_at: ISODate("2025-09-25T11:46:55Z"), - }, - { - _id: "trk-186e130983a79453f87f853d", - name: "funny_hardy", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "DdlS8ZewVy8MnaPEyQ6ExhyVzZ+Ym6pmplr2OdFyVu8=", - created_at: ISODate("2025-10-09T09:21:55Z"), - }, - { - _id: "trk-186e130983a7abf10c38fab8", - name: "iron_hopper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "jxb07WpM4h93Gdp+I+RcoQKmvhFapFRDedoY3KTRuAk=", - created_at: ISODate("2025-10-11T16:29:55Z"), - }, - { - _id: "trk-186e130983a7c5a7c28ded10", - name: "lucid_shockley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "lQmhvYl/A6RCnqgQkuKmAgeI8w8+3XKoosilNbF3ls8=", - created_at: ISODate("2025-09-19T02:32:55Z"), - }, - { - _id: "trk-186e130983a7f22eb4ae7f9f", - name: "relaxed_hawking", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "KOf+6+kC7nFU7uRBYQG1Kn8fB0AWQnEs+JzKSVpmt60=", - created_at: ISODate("2025-09-17T22:44:55Z"), - }, - { - _id: "trk-186e130983a8041d25549f0e", - name: "pedantic_pauli", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "XjirKNQ0apJVVa03WWRHnhQU3/ucgTKHRo+ydtYvQf4=", - created_at: ISODate("2025-09-17T17:43:55Z"), - }, - { - _id: "trk-186e130983a8165b1981350b", - name: "nervous_michelson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "u8kNHC3Cm0xRQYyNVAY4RCsBpacPE8gOG6yupuQehsY=", - created_at: ISODate("2025-10-01T09:36:55Z"), - }, - { - _id: "trk-186e130983a827f007a9b2b3", - name: "thoughtful_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "rWTp82vUW/6XjsvgtDfREFW5crHPAtI6fhHQMUalNTQ=", - created_at: ISODate("2025-09-16T19:10:55Z"), - }, - { - _id: "trk-186e130983a839a432f99c62", - name: "fearless_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "VPh59T5lqElB/rv7YVdSvF8jVC/MUKYPZe7AQrjP8Oo=", - created_at: ISODate("2025-09-28T04:08:55Z"), - }, - { - _id: "trk-186e130983a84c6c80d3a12d", - name: "merry_watson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "ZdoTuYQHaObGbs+3cL1Snf2Z81VdKSm9+rpK88YgFHg=", - created_at: ISODate("2025-10-04T09:58:55Z"), - }, - { - _id: "trk-186e130983a85f66521883b1", - name: "awesome_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "+mc3lyjvdmOs9fvgfehZmJD2ayxnCim9ejoV2M6+aYc=", - created_at: ISODate("2025-09-24T06:51:55Z"), - }, - { - _id: "trk-186e130983a870935e563e9f", - name: "sad_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "70AYubA/PkCQBM54UEFGUK2FQyqpOYdonEt4/qVgEOE=", - created_at: ISODate("2025-10-02T14:01:55Z"), - }, - { - _id: "trk-186e130983a88346a0103419", - name: "trusting_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "V2Gm/mIE2Uxwcrplrf/glr7A8e/VQFK/iBqjTdXarxw=", - created_at: ISODate("2025-09-22T03:30:55Z"), - }, - { - _id: "trk-186e130983a8948dd91d5777", - name: "enchanting_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "GpAgMGQ/TifcNTlfVC5jyOC4riwOaJZ7YGyiycZ3hfc=", - created_at: ISODate("2025-09-18T07:52:55Z"), - }, - { - _id: "trk-186e130983a8a62ec36b8234", - name: "noble_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "TWKFkqd+aAj+YNskjVxR6ftBy6AnldQ+UvzUXYr27kE=", - created_at: ISODate("2025-09-24T08:20:55Z"), - }, - { - _id: "trk-186e130983a8b81ed167fa68", - name: "relaxed_fourier", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "vShTmZ1PkdComu1SSjKsqbsJALZIcFpIQCP6e7m+mTE=", - created_at: ISODate("2025-09-15T07:10:55Z"), - }, - { - _id: "trk-186e130983a8cae50b739184", - name: "adoring_marconi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "tKns/mbBJ1Vj+M2XMvIg2t4a5clE8LKNcU4REn7kYb0=", - created_at: ISODate("2025-10-06T13:19:55Z"), - }, - { - _id: "trk-186e130983a8e3cfea83018f", - name: "blissful_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "gzu43V5D0h7gjzYWkhV8eGecgWY97ULsA+GAFp0votU=", - created_at: ISODate("2025-09-26T15:42:55Z"), - }, ]); diff --git a/services/playbooks/roles/mongo/files/init.js b/services/playbooks/roles/mongo/files/init.js index d030e316..6e1ec4c1 100644 --- a/services/playbooks/roles/mongo/files/init.js +++ b/services/playbooks/roles/mongo/files/init.js @@ -852,7 +852,6 @@ db.devices.insertMany([ private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, - { _id: "trk-186e120746e18c690d2440c6", name: "busy_torvalds", @@ -1653,804 +1652,4 @@ db.devices.insertMany([ private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", created_at: ISODate("2025-09-13T16:47:26Z"), }, - { - _id: "trk-186e1309839bbd54be8f785e", - name: "gifted_hawking", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ZCw5gk1MaebMg2IsOivMuSZgCAJQxYPZ8o3KMTn0oSY=", - created_at: ISODate("2025-10-02T18:57:55Z"), - }, - { - _id: "trk-186e1309839e1ffe329ebf18", - name: "zealous_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "LOjfvsoJj7zNBoByyrJqgnfbVuvg2oqSWSo23k5szrw=", - created_at: ISODate("2025-10-05T07:08:55Z"), - }, - { - _id: "trk-186e1309839e3cc066512dbd", - name: "elastic_morley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "k7fQ1A277mZYtLp4yZwgQv5SAHg+CQykl65IYmBOcLw=", - created_at: ISODate("2025-10-13T05:51:55Z"), - }, - { - _id: "trk-186e1309839e5c57c7e9af1b", - name: "energetic_lovelace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "cTlwhna05v7wqUSh4A6t7V59z5nfZPwlmu5phCNjhzs=", - created_at: ISODate("2025-09-15T01:26:55Z"), - }, - { - _id: "trk-186e1309839e7274fbb77443", - name: "noble_schwinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "zWDBZnVqBcN60DwbxryQ+eLp/b+dr/xlpafTcWfFs1c=", - created_at: ISODate("2025-09-23T19:53:55Z"), - }, - { - _id: "trk-186e1309839e85fe0ba301ac", - name: "puzzled_heisenberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "EE/TZ0jS3mEwbZx/YqElSKS2qxTLiADL3wTZc7UtTR4=", - created_at: ISODate("2025-09-15T11:31:55Z"), - }, - { - _id: "trk-186e1309839e99c2655eb597", - name: "magical_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "zaDTN2SiXFRcxdsnSyeZST0eJO2ymNrnWVh9KSiBjmQ=", - created_at: ISODate("2025-09-19T07:21:55Z"), - }, - { - _id: "trk-186e1309839eae938abbb06e", - name: "polite_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "3E5qvFq6m7TZW5scw/ZYc39zAnhourZwtQbte1KRFcg=", - created_at: ISODate("2025-09-22T23:00:55Z"), - }, - { - _id: "trk-186e1309839ec6a5f176f269", - name: "suspicious_weber", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "vPKKppUdZeMiXY5HYgFgHETpYx3jtWRHuMeNPNX+gIo=", - created_at: ISODate("2025-09-24T20:49:55Z"), - }, - { - _id: "trk-186e1309839edcbc0e9ccdee", - name: "hyper_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "m6ltZvHHeKGnbg/7OCLoDwz5JuXP2lr1pcY4Vj+iY6Y=", - created_at: ISODate("2025-09-15T11:08:55Z"), - }, - { - _id: "trk-186e1309839ef37e250b2ac1", - name: "flamboyant_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "IZrX9Tvi8DNKS7uFTtf/HLwYxivfO6gnriULc081BW4=", - created_at: ISODate("2025-09-27T03:18:55Z"), - }, - { - _id: "trk-186e1309839f7ba1a81d392e", - name: "laughing_oppenheimer", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "sTqUXGZmpiGZHGxXEFElISIe3iJz9VW5h7LrKbdbT5Q=", - created_at: ISODate("2025-09-21T19:38:55Z"), - }, - { - _id: "trk-186e1309839fda077e230f18", - name: "sleepy_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "K/fnViP3HJeORW02MDQiODA2KJIIOklTQ95dp8KR1Aw=", - created_at: ISODate("2025-10-08T09:06:55Z"), - }, - { - _id: "trk-186e1309839fef6604700630", - name: "cranky_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "LhU6aqY/E9DHusg8AbbavTuikkHRVaOKAceEX4erXb8=", - created_at: ISODate("2025-10-13T10:22:55Z"), - }, - { - _id: "trk-186e130983a01ae99c930d78", - name: "brave_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "DdkJUpGmJY7ZMiMKeyTIUh+NOId0DzLi7dp6alJhQ88=", - created_at: ISODate("2025-09-18T08:13:55Z"), - }, - { - _id: "trk-186e130983a034f970090b84", - name: "keen_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "bb/3zD4PlygRSNYJ2JfXWtQOGXRlw4iqjv0nESpWnnw=", - created_at: ISODate("2025-10-12T15:58:55Z"), - }, - { - _id: "trk-186e130983a059f6f1438b3e", - name: "awesome_fermi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "KGd+GfOfvoG61VkVQFjTJR0Yq/znautGUH+9WAnDLoQ=", - created_at: ISODate("2025-09-24T09:31:55Z"), - }, - { - _id: "trk-186e130983a07ae5a7263ec1", - name: "crazy_thompson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "hbTWXcPaFt/C79Q3ljLio7j7GkYT4DT6UKavFR/7tOg=", - created_at: ISODate("2025-10-04T02:54:55Z"), - }, - { - _id: "trk-186e130983a09704293604ee", - name: "calm_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "OU1L1O+EUhwPhwmKJ8OtajzN5xPrV4wyWeLsTaoY1I8=", - created_at: ISODate("2025-10-01T22:19:55Z"), - }, - { - _id: "trk-186e130983a0b6016eeb4331", - name: "proud_jobs", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "Je7MWPdNzzyVBGdsKH0ZrdkDCkkk52S0sa9OOaloRQM=", - created_at: ISODate("2025-09-24T22:52:55Z"), - }, - { - _id: "trk-186e130983a0db3e0cc11f28", - name: "furious_chebyshev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "rINraJ2KTESEfAph/IFXaUIsFf2DwvcV46lED/a+XZQ=", - created_at: ISODate("2025-09-30T07:18:55Z"), - }, - { - _id: "trk-186e130983a14583c71a2172", - name: "faithful_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "oaNmemljb/RTXF5lwD+aYiyJduErvUitnjU9P6O3Qcc=", - created_at: ISODate("2025-10-06T15:35:55Z"), - }, - { - _id: "trk-186e130983a159e2bbb9f5f8", - name: "upbeat_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "FlfO21D9qS/voZQhw7ALRXcQpl+4P0+bcsAVx+HqTys=", - created_at: ISODate("2025-10-10T03:06:55Z"), - }, - { - _id: "trk-186e130983a1c1a1f3cb2f24", - name: "hungry_gauss", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "MP/K9fmbN8gjGL2dlUgPwvfkmH1AUPDCjdAiUqu944g=", - created_at: ISODate("2025-10-11T22:35:55Z"), - }, - { - _id: "trk-186e130983a1d5c90eeb7be5", - name: "motivated_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "yKTjLolSSeYIykBPgT5XtvoUQdKALNFkkNu44kNoGP4=", - created_at: ISODate("2025-10-05T00:01:55Z"), - }, - { - _id: "trk-186e130983a1ea63e8dbee65", - name: "laughing_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "gqr+1LMynMxT9/LCZi34YT7w7kNetDPAIM5vgxuJ62E=", - created_at: ISODate("2025-09-26T16:11:55Z"), - }, - { - _id: "trk-186e130983a1fd7e0e4791cc", - name: "blissful_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "46eu29Cek7uXQbQIikPXWXXtb5Mj4uF8qiNAjlAhHAg=", - created_at: ISODate("2025-09-20T07:34:55Z"), - }, - { - _id: "trk-186e130983a2109dd0df3463", - name: "modest_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "wDLjDpT2iWWujj+LVSJmdJiiJvgBj4cZ+79LZdPwQ9s=", - created_at: ISODate("2025-09-23T15:00:55Z"), - }, - { - _id: "trk-186e130983a234a9618f898e", - name: "confident_peano", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "v6fr9Q4/AQTAwGGrEszqok6AU/RlCO7EmsWoaHPR1Wg=", - created_at: ISODate("2025-09-27T05:29:55Z"), - }, - { - _id: "trk-186e130983a2560f98ea7e47", - name: "jovial_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "KcMeDL6RVjQrEE3xf+j2tcYleM26p60oLqaVvRhQFDM=", - created_at: ISODate("2025-09-25T14:14:55Z"), - }, - { - _id: "trk-186e130983a26a15f661928b", - name: "eloquent_dedekind", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "X8atklQ+PoJ0GuKFPwfSs49w1C1tjiwstgnvu+3Uaq8=", - created_at: ISODate("2025-09-29T19:35:55Z"), - }, - { - _id: "trk-186e130983a27e5bc05251b9", - name: "frosty_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "1kASDQP73a3z2SN8IkuNtI3cYmX3jjvmO+/bU1sQwHY=", - created_at: ISODate("2025-09-21T07:50:55Z"), - }, - { - _id: "trk-186e130983a291f1e443cd5a", - name: "proud_markov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "UzmsA89/TC3Y9HXzAj/FFajvNUheAN9dGb/0axlXtb8=", - created_at: ISODate("2025-10-01T10:25:55Z"), - }, - { - _id: "trk-186e130983a2a576491ef9af", - name: "angry_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "sKpBt81A5fAZFsm4npMR5KEv3eJY9csJ0lU2dV09slw=", - created_at: ISODate("2025-10-08T07:07:55Z"), - }, - { - _id: "trk-186e130983a2d186e5d486fb", - name: "hungry_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "fH0z5owaDwYFtDAHOTndNz6bZboOOrfJS7G0FcLWwSc=", - created_at: ISODate("2025-09-26T13:34:55Z"), - }, - { - _id: "trk-186e130983a2e58a9f17fdc3", - name: "distracted_mendeleev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "T9pkDWyxASF5yTI/tPUa0oYGkbS7kEJw658mWEYmXuw=", - created_at: ISODate("2025-09-15T03:42:55Z"), - }, - { - _id: "trk-186e130983a2fe87872f4f49", - name: "thoughtful_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "hcUkyXC/+F/nxBV8iOeTaXlbPlVbefYzFfrbXkGV8Sg=", - created_at: ISODate("2025-10-05T01:51:55Z"), - }, - { - _id: "trk-186e130983a322c165ec9526", - name: "sad_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "vNNucwhglkB7Y1aVZrx8AmdKQH0T8NQ/nDA6WvAmHYA=", - created_at: ISODate("2025-09-28T01:45:55Z"), - }, - { - _id: "trk-186e130983a340ddf0bf05e4", - name: "vibrant_erdos", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "JD9CEeoyzLC/HXULUtZRds3Zt3W73rlEK9SaMNABxX4=", - created_at: ISODate("2025-10-13T14:53:55Z"), - }, - { - _id: "trk-186e130983a35bf2a8e986cb", - name: "original_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "B7fsNi61OSIwh7sOPijfiaXcO35j4b8D4RzaOO9AI9o=", - created_at: ISODate("2025-09-13T22:37:55Z"), - }, - { - _id: "trk-186e130983a37e04ea2b2ff2", - name: "fabulous_schrodinger", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "BgA+RZUSOglE9OOaC64uOPYBH2Q3FXKTh92P7kevJmo=", - created_at: ISODate("2025-09-26T15:11:55Z"), - }, - { - _id: "trk-186e130983a39b9455bdeedf", - name: "awesome_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "ttzL9AQTJ9RKMTlAF7il5xpv84u4wPLSCxzJ7QgAK2o=", - created_at: ISODate("2025-10-07T23:48:55Z"), - }, - { - _id: "trk-186e130983a3c77bb7a4f5d7", - name: "heartwarming_michelson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HXOc5oU5YLvbceVhUGdpPTmDfF3FROJAPjZ2XkjjTvo=", - created_at: ISODate("2025-10-02T15:09:55Z"), - }, - { - _id: "trk-186e130983a42d5fb53a30e9", - name: "sweet_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "Cogel1ZaSvbfbwjKN9kzoFdMkNmRVyjLhdVO1TIXRX8=", - created_at: ISODate("2025-09-21T15:57:55Z"), - }, - { - _id: "trk-186e130983a45e7421d17024", - name: "heuristic_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "XO/6YycdUYkH63d460y/NTW0dxLBPiAygeMjHuRmag8=", - created_at: ISODate("2025-10-05T02:06:55Z"), - }, - { - _id: "trk-186e130983a47ab26312a621", - name: "serene_leibniz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "ZEey/z8mahhYZ6P2370knAdpoBRxrl+rUc8IRGe7X+s=", - created_at: ISODate("2025-10-11T19:15:55Z"), - }, - { - _id: "trk-186e130983a49cc1a4ead31d", - name: "admiring_markov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "z1UanROYzQtod+7GLLbw9qYdIvet+pQQEc85sdmE1tI=", - created_at: ISODate("2025-10-10T21:17:55Z"), - }, - { - _id: "trk-186e130983a4af6de88c809f", - name: "practical_cantor", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "n7DXivw4BcVLW2WE3NGNZGADmQgpJuAqcDxd/3ys6oo=", - created_at: ISODate("2025-09-14T14:27:55Z"), - }, - { - _id: "trk-186e130983a4c1a2c1717cf8", - name: "keen_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "QzRG4fj6Ieu/CEDn4y6+Bu1gBFqY4ISF+tHNhDtlNOU=", - created_at: ISODate("2025-10-11T10:09:55Z"), - }, - { - _id: "trk-186e130983a4d36ac7ba8b7a", - name: "proud_tesla", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "EX3KV2PKMP/B3ZQ2W/lWny+J+Ph56ZZvPU5Ee4JyKN4=", - created_at: ISODate("2025-09-25T21:44:55Z"), - }, - { - _id: "trk-186e130983a4e47156945059", - name: "goofy_crick", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "vazs6yunKp5x6D8iixRFQWIPPtuhKeHi8k+cnv/oP10=", - created_at: ISODate("2025-09-19T10:10:55Z"), - }, - { - _id: "trk-186e130983a4f6d211f892ab", - name: "phenomenal_chebyshev", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "F5ynV08uXxR+VAwDWviUzRt5DJSK4tZkuw76KO8gICI=", - created_at: ISODate("2025-09-25T04:49:55Z"), - }, - { - _id: "trk-186e130983a508c15816b9c0", - name: "nervous_shannon", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "wcyoP8iDI3UU5H1r/qqVYLR1tsMuB0fwqilajOO4+vc=", - created_at: ISODate("2025-09-19T21:06:55Z"), - }, - { - _id: "trk-186e130983a519b7a38da4ea", - name: "polite_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "1tk9YjVrNKneUDY1Osjo/Dwi4i10Gso/pN46e3GvYYY=", - created_at: ISODate("2025-09-14T23:19:55Z"), - }, - { - _id: "trk-186e130983a52afe9fa16029", - name: "proud_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "1f2wPh9Ox2inN18mT1YuK4jRHKvVGoKG8SpgAzQkHSY=", - created_at: ISODate("2025-09-23T19:32:55Z"), - }, - { - _id: "trk-186e130983a53d672348d95f", - name: "wonderful_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "wTtqmRD/kVPjzkiGiJwEi6Ki7iSk/zTlmXS+hp4yNSo=", - created_at: ISODate("2025-10-04T21:25:55Z"), - }, - { - _id: "trk-186e130983a565faaf6e26d7", - name: "enchanting_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "ZVUDm/FzS/zzVL4cCFnt3GhgJWabExYb4opnpTH0EF0=", - created_at: ISODate("2025-09-19T07:10:55Z"), - }, - { - _id: "trk-186e130983a5847b2c0e34c5", - name: "compassionate_pauli", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "fc20Hdx9vXJ178vB52/ZIhUUQdM5xEC06cYBsFH6qFQ=", - created_at: ISODate("2025-10-05T12:11:55Z"), - }, - { - _id: "trk-186e130983a5965d6dada7f4", - name: "quirky_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "baCodUXLbJPBkTX0SYlNZoiS+wCQNxSCOQVl11U/nlw=", - created_at: ISODate("2025-09-26T23:13:55Z"), - }, - { - _id: "trk-186e130983a5c49aeba044f5", - name: "original_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "8Fc0JUIo5wNsW9YpeJgMyIWoMB6efwN8TNO1wREwMn4=", - created_at: ISODate("2025-09-16T16:39:55Z"), - }, - { - _id: "trk-186e130983a5d7349ac354d7", - name: "epic_michelson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "1Dw3ZR9Thr0Hcy4/nSnpDXiBfPsctFt9l+vlsNJ0IPk=", - created_at: ISODate("2025-10-05T23:44:55Z"), - }, - { - _id: "trk-186e130983a5e91f31ee5429", - name: "clever_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "T1XjWjDNQy1lBxDSvVgKpThI1K4POhliXJOFvtZFo/k=", - created_at: ISODate("2025-10-09T21:17:55Z"), - }, - { - _id: "trk-186e130983a5fa39a2a976c0", - name: "gifted_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "fr61QFVGUvqpBS8uWwQ49iudcMYGxgi9PW8RZcVg6so=", - created_at: ISODate("2025-09-19T08:34:55Z"), - }, - { - _id: "trk-186e130983a61fe1c2dd259e", - name: "jaunty_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "DpeFAN8wyPtjf1rGLO7JbAwB0VqowdXasLZOs8d0VXw=", - created_at: ISODate("2025-09-30T06:29:55Z"), - }, - { - _id: "trk-186e130983a6336076acfe23", - name: "nostalgic_rutherford", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "+8M4KNmUM9/n0mPsZJZdTKUCXZILPHMNfmPPNNkcTXc=", - created_at: ISODate("2025-09-19T23:53:55Z"), - }, - { - _id: "trk-186e130983a644b5f71646b8", - name: "fancy_shannon", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Pf5p7rwp5Kz6sm9i5tkjoCze/i2Fg5YuTzJHBLSpNPs=", - created_at: ISODate("2025-09-27T10:30:55Z"), - }, - { - _id: "trk-186e130983a655ddcb922063", - name: "great_henry", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "ZhajzgyxcVnZi0u9Hm6C58119AdBDZyXhtMSF76y/G4=", - created_at: ISODate("2025-09-30T21:42:55Z"), - }, - { - _id: "trk-186e130983a667a828ff844f", - name: "grieving_shannon", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "iKFwj7MKj0zd5ON6UBQyqlhZlEUqHuSd6jmKr905gq4=", - created_at: ISODate("2025-10-04T07:32:55Z"), - }, - { - _id: "trk-186e130983a6794fd7167c67", - name: "dreamy_yang", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "RKml+qYAdgRUFEbo7NYC6v6L5x9iH1WAyZkg3ywu/Mc=", - created_at: ISODate("2025-09-29T12:13:55Z"), - }, - { - _id: "trk-186e130983a68a6c4e789068", - name: "xenodochial_pauli", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "5jEOTEisy9PAHGo2cUxTLjcS7U/j1z+iDVu4AmPAQB4=", - created_at: ISODate("2025-10-09T09:38:55Z"), - }, - { - _id: "trk-186e130983a6a42c3aa15795", - name: "eloquent_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "fktsbKDjJeccJCECW3jEVln0OHXFMvTFa/JQb2T7zX4=", - created_at: ISODate("2025-09-27T11:41:55Z"), - }, - { - _id: "trk-186e130983a6b654add2ea90", - name: "optimized_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "kQeoHG8z2ONEFoa3e/6dviH2WAgRiAScU9R3czQHhiA=", - created_at: ISODate("2025-09-17T00:43:55Z"), - }, - { - _id: "trk-186e130983a6c82b57b03fe5", - name: "outstanding_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "cmzsUIvVt8wibHWzZd9Ej5CaoTDDDN325i7lsSTNfnk=", - created_at: ISODate("2025-09-24T14:47:55Z"), - }, - { - _id: "trk-186e130983a6da34cfc550e0", - name: "quizzical_lovelace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "pax2Gn8effRWcUhmxW/9Uc/KvWrfv6+IejTdzMlA7bk=", - created_at: ISODate("2025-09-15T21:11:55Z"), - }, - { - _id: "trk-186e130983a6ebaaea0d4795", - name: "competent_leibniz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "P6dDQCF6Fgjub8xGk93uxOQKX/KYcyB6e5bVrDrmHZ0=", - created_at: ISODate("2025-09-25T07:45:55Z"), - }, - { - _id: "trk-186e130983a6fd0db9d5a841", - name: "keen_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "wW1zdnRBu/V+TTrdSPjtT/enxkpbwHgcngL/n5oKQGI=", - created_at: ISODate("2025-09-22T07:56:55Z"), - }, - { - _id: "trk-186e130983a70f40a79fedae", - name: "fabulous_rutherford", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "2Rg2uMXrpuF9EtKsOXnqxokMWKCDy6Qtgy/92Vq6WHI=", - created_at: ISODate("2025-09-21T20:54:55Z"), - }, - { - _id: "trk-186e130983a720eff34ba9c8", - name: "interesting_thompson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "38OdyJBYXtEDLQ1W6Ay98X7QXHbs/rvV1Slbn+DVDIQ=", - created_at: ISODate("2025-09-20T08:01:55Z"), - }, - { - _id: "trk-186e130983a739bb2f817dda", - name: "adoring_dyson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "XNp46numS1q+uFS4mLsd3ixSmP98hQFwZpxJQvefmOA=", - created_at: ISODate("2025-09-27T23:47:55Z"), - }, - { - _id: "trk-186e130983a74c17ec7515dd", - name: "agitated_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "egIN2RS4kylE+AN+PL4GUXYr1L1D23aOOWHaFMua8dA=", - created_at: ISODate("2025-10-11T05:41:55Z"), - }, - { - _id: "trk-186e130983a75eb0efc4d28f", - name: "merry_kleene", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "nELHiKhUE7Y7U8Zni+levsFKjHkUj8L7nlmXeKV5upA=", - created_at: ISODate("2025-09-14T02:49:55Z"), - }, - { - _id: "trk-186e130983a770bd6a437b45", - name: "inspiring_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "GJRtvBmPmKbU2LIEG1J4qP5kjhin6FjzjpxcfdgmYHg=", - created_at: ISODate("2025-09-15T04:05:55Z"), - }, - { - _id: "trk-186e130983a782e44f0bccee", - name: "epic_wu", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "6WFt4fLWdRwbKb56kxs3UG7gbEmSRZJcWrs0Witu60I=", - created_at: ISODate("2025-09-25T11:46:55Z"), - }, - { - _id: "trk-186e130983a79453f87f853d", - name: "funny_hardy", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "DdlS8ZewVy8MnaPEyQ6ExhyVzZ+Ym6pmplr2OdFyVu8=", - created_at: ISODate("2025-10-09T09:21:55Z"), - }, - { - _id: "trk-186e130983a7abf10c38fab8", - name: "iron_hopper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "jxb07WpM4h93Gdp+I+RcoQKmvhFapFRDedoY3KTRuAk=", - created_at: ISODate("2025-10-11T16:29:55Z"), - }, - { - _id: "trk-186e130983a7c5a7c28ded10", - name: "lucid_shockley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "lQmhvYl/A6RCnqgQkuKmAgeI8w8+3XKoosilNbF3ls8=", - created_at: ISODate("2025-09-19T02:32:55Z"), - }, - { - _id: "trk-186e130983a7f22eb4ae7f9f", - name: "relaxed_hawking", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "KOf+6+kC7nFU7uRBYQG1Kn8fB0AWQnEs+JzKSVpmt60=", - created_at: ISODate("2025-09-17T22:44:55Z"), - }, - { - _id: "trk-186e130983a8041d25549f0e", - name: "pedantic_pauli", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "XjirKNQ0apJVVa03WWRHnhQU3/ucgTKHRo+ydtYvQf4=", - created_at: ISODate("2025-09-17T17:43:55Z"), - }, - { - _id: "trk-186e130983a8165b1981350b", - name: "nervous_michelson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "u8kNHC3Cm0xRQYyNVAY4RCsBpacPE8gOG6yupuQehsY=", - created_at: ISODate("2025-10-01T09:36:55Z"), - }, - { - _id: "trk-186e130983a827f007a9b2b3", - name: "thoughtful_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "rWTp82vUW/6XjsvgtDfREFW5crHPAtI6fhHQMUalNTQ=", - created_at: ISODate("2025-09-16T19:10:55Z"), - }, - { - _id: "trk-186e130983a839a432f99c62", - name: "fearless_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "VPh59T5lqElB/rv7YVdSvF8jVC/MUKYPZe7AQrjP8Oo=", - created_at: ISODate("2025-09-28T04:08:55Z"), - }, - { - _id: "trk-186e130983a84c6c80d3a12d", - name: "merry_watson", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "ZdoTuYQHaObGbs+3cL1Snf2Z81VdKSm9+rpK88YgFHg=", - created_at: ISODate("2025-10-04T09:58:55Z"), - }, - { - _id: "trk-186e130983a85f66521883b1", - name: "awesome_russell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "+mc3lyjvdmOs9fvgfehZmJD2ayxnCim9ejoV2M6+aYc=", - created_at: ISODate("2025-09-24T06:51:55Z"), - }, - { - _id: "trk-186e130983a870935e563e9f", - name: "sad_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "70AYubA/PkCQBM54UEFGUK2FQyqpOYdonEt4/qVgEOE=", - created_at: ISODate("2025-10-02T14:01:55Z"), - }, - { - _id: "trk-186e130983a88346a0103419", - name: "trusting_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "V2Gm/mIE2Uxwcrplrf/glr7A8e/VQFK/iBqjTdXarxw=", - created_at: ISODate("2025-09-22T03:30:55Z"), - }, - { - _id: "trk-186e130983a8948dd91d5777", - name: "enchanting_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "GpAgMGQ/TifcNTlfVC5jyOC4riwOaJZ7YGyiycZ3hfc=", - created_at: ISODate("2025-09-18T07:52:55Z"), - }, - { - _id: "trk-186e130983a8a62ec36b8234", - name: "noble_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "TWKFkqd+aAj+YNskjVxR6ftBy6AnldQ+UvzUXYr27kE=", - created_at: ISODate("2025-09-24T08:20:55Z"), - }, - { - _id: "trk-186e130983a8b81ed167fa68", - name: "relaxed_fourier", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "vShTmZ1PkdComu1SSjKsqbsJALZIcFpIQCP6e7m+mTE=", - created_at: ISODate("2025-09-15T07:10:55Z"), - }, - { - _id: "trk-186e130983a8cae50b739184", - name: "adoring_marconi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "tKns/mbBJ1Vj+M2XMvIg2t4a5clE8LKNcU4REn7kYb0=", - created_at: ISODate("2025-10-06T13:19:55Z"), - }, - { - _id: "trk-186e130983a8e3cfea83018f", - name: "blissful_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "gzu43V5D0h7gjzYWkhV8eGecgWY97ULsA+GAFp0votU=", - created_at: ISODate("2025-09-26T15:42:55Z"), - }, ]); From 0954eace376aaf2b94c8534dc04e6d34588e4f58 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 18 Oct 2025 00:21:26 +0200 Subject: [PATCH 088/242] removing 100 devs --- mongo/init.js | 800 ------------------- services/playbooks/roles/mongo/files/init.js | 800 ------------------- 2 files changed, 1600 deletions(-) diff --git a/mongo/init.js b/mongo/init.js index 6e1ec4c1..f1391798 100644 --- a/mongo/init.js +++ b/mongo/init.js @@ -852,804 +852,4 @@ db.devices.insertMany([ private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, - { - _id: "trk-186e120746e18c690d2440c6", - name: "busy_torvalds", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "zlaKfT1zfiGUFjuxVy2BuM9SqDVikurwVXUEmjbeuX0=", - created_at: ISODate("2025-09-26T01:56:26Z"), - }, - { - _id: "trk-186e120746e5100364a0d88c", - name: "kind_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HaEBIVX8wM6DzAJe5H/efqhCLc+y/4Z0tk3qgN5G/KE=", - created_at: ISODate("2025-10-04T02:03:26Z"), - }, - { - _id: "trk-186e120746e53a7f8b9db50a", - name: "vibrant_abel", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "U9zhxIXPRmXASGaAW2rJ/MHIDQAhlc8/kO4bS/9V8wU=", - created_at: ISODate("2025-09-17T17:58:26Z"), - }, - { - _id: "trk-186e120746e5561da2248999", - name: "beautiful_lee", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "PSGrRaqjl2pJybbEnj17F31N/AncTgx7n1A+32GGzgU=", - created_at: ISODate("2025-10-10T15:37:26Z"), - }, - { - _id: "trk-186e120746e571646ff6b00c", - name: "agitated_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "/jxYt11fVWtx9+OLZcmO0664Lshxu+L9+Er2/DB5j8I=", - created_at: ISODate("2025-09-15T22:14:26Z"), - }, - { - _id: "trk-186e120746e592b6ef437676", - name: "serene_knuth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "TBkHjWmYDA0m2prmSZqqk7wKO3FMAjNfNcwLbamTl14=", - created_at: ISODate("2025-09-18T02:02:26Z"), - }, - { - _id: "trk-186e120746e5b57fe57e549f", - name: "boring_crick", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "r5PJU83UZ0IsuJuMgFEZJy41dymcmoOCTVTGNe+fYp4=", - created_at: ISODate("2025-09-16T16:44:26Z"), - }, - { - _id: "trk-186e120746e5d2cfd3ad47f8", - name: "proud_curie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "rwrEdWc3CovyYsAYXvhIojm2vM7RQf7R4waNRm7rZDQ=", - created_at: ISODate("2025-09-18T01:04:26Z"), - }, - { - _id: "trk-186e120746e5f3b0e0bd40a6", - name: "epic_hopper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "NH0AzwhXWUdFM8m6r6FVT+2C2f9KsD++CHWAqRsrCIg=", - created_at: ISODate("2025-09-25T17:10:26Z"), - }, - { - _id: "trk-186e120746e61249f492cc92", - name: "fervent_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "IpaYNNClPfrs776+wldgliZ/UenF/fN5qlY6R+R99kA=", - created_at: ISODate("2025-09-26T00:33:26Z"), - }, - { - _id: "trk-186e120746e62e8b1e50c009", - name: "optimistic_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "dPgcLmsJh0nU5IyAjyhyCfHij0NkswJC7aLqhGnKdE4=", - created_at: ISODate("2025-10-01T22:39:26Z"), - }, - { - _id: "trk-186e120746e6498c6e55e12f", - name: "keen_ohm", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "6sBH2HqlO06ZS6qpAZ75i/0LOb5FEWXK+bbBfyTDZrU=", - created_at: ISODate("2025-09-23T09:49:26Z"), - }, - { - _id: "trk-186e120746e6a53392e5a1d6", - name: "dreamy_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "AdaUNQ0ddcyYZlMHzoFPFDiM+lQS9akdrF086C5uvnU=", - created_at: ISODate("2025-09-19T01:06:26Z"), - }, - { - _id: "trk-186e120746e6c07ef43e3d13", - name: "outstanding_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "yVvpMOeozwtyH1gS4y8hrDO9hftYbwpzjZeVPwwYwZs=", - created_at: ISODate("2025-09-21T03:27:26Z"), - }, - { - _id: "trk-186e120746e70513852edb0f", - name: "faithful_knuth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "8GbhtHVXcN9Yyi41F2wh/aR5Wdarq9uvYZLMoOyD8NM=", - created_at: ISODate("2025-10-09T08:08:26Z"), - }, - { - _id: "trk-186e120746e7235b73eb8923", - name: "modest_gauss", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "NmFP6t/trYYOSAQLQgdDJhheahC7kO3kDwuwEFLqeCE=", - created_at: ISODate("2025-10-10T04:12:26Z"), - }, - { - _id: "trk-186e120746e74151fb9b3cf6", - name: "clever_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "K4eXVoUnDViQyeemkL77tJ7PLSTA5LB+dLqNtd8OfH4=", - created_at: ISODate("2025-09-17T02:43:26Z"), - }, - { - _id: "trk-186e120746e75e602ef60dd6", - name: "determined_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "T6f5G5JQUuSrCJ9DnXquzN4IXarA+Og67HsRUQU1eHY=", - created_at: ISODate("2025-10-13T13:50:26Z"), - }, - { - _id: "trk-186e120746e77af4a17ef004", - name: "fervent_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "+klSDF5Jvl3Cjkjr/GwKxBwusArwojYmcgURQQT6DPs=", - created_at: ISODate("2025-09-23T21:27:26Z"), - }, - { - _id: "trk-186e120746e798d285808a70", - name: "bold_fourier", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "4zwMIKqs8mtNveECyMvcFt+K7OedZ+MnOS6o42EUEWU=", - created_at: ISODate("2025-09-17T06:50:26Z"), - }, - { - _id: "trk-186e120746e7b4c678103ccf", - name: "boring_hardy", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "9cgnzOXmKaVWCBpvyfEC1rIo2coYrpOPrW2ZcvmHO9E=", - created_at: ISODate("2025-09-24T18:31:26Z"), - }, - { - _id: "trk-186e120746e7d271ec706172", - name: "sleepy_pauling", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "2+j+X2Im01XBzllw/xpq1fq8M2TxlOos/ClmmD0Gzaw=", - created_at: ISODate("2025-10-10T06:17:26Z"), - }, - { - _id: "trk-186e120746e7ef79f6ee0e1b", - name: "exotic_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "E+6m5pEZbh0VyR2hmRRe4xJ4HzGBUn3qAVxCu0jeydY=", - created_at: ISODate("2025-10-12T18:18:26Z"), - }, - { - _id: "trk-186e120746e80afd0d8d37e1", - name: "beautiful_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "SMPBDRGLD9aVElnzLvrsHyRgrM4ywaxwQa+ybapdStM=", - created_at: ISODate("2025-09-24T17:20:26Z"), - }, - { - _id: "trk-186e120746e833b3dfa6e5ff", - name: "jovial_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "X9ZHSPIBXi5gsoXM0LO7Lsuv8LbVA8EMv/y/J8jXKMc=", - created_at: ISODate("2025-10-01T03:02:26Z"), - }, - { - _id: "trk-186e120746e851854660544e", - name: "serene_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "L82m2B58IsoddlmF+eoMnwMpmn3VEBQiAjxGlx854CA=", - created_at: ISODate("2025-09-17T21:44:26Z"), - }, - { - _id: "trk-186e120746e86e09d1953e23", - name: "blissful_leibniz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "uW6S9QZqdTN9n8nROsXWugdetpdTwdD/NAgsHfVlKVQ=", - created_at: ISODate("2025-10-11T13:42:26Z"), - }, - { - _id: "trk-186e120746e88add15d6df47", - name: "clever_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "zioq96s+Os5u0wkjaOfUO9dZId7OHr8otFLIdl+4qfc=", - created_at: ISODate("2025-09-17T09:35:26Z"), - }, - { - _id: "trk-186e120746e8b7c338ebf0df", - name: "sweet_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "fDrzR+XXddUMT7sjv1lTdCqCrMxpIuoFhJF/FjORBTM=", - created_at: ISODate("2025-10-13T14:47:26Z"), - }, - { - _id: "trk-186e120746e8ea3b02c4a2e1", - name: "frosty_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "jzW8kxhoYXRGZAEfemost+RLvfyaXeAqCdA6Tvbrx4k=", - created_at: ISODate("2025-09-24T13:14:26Z"), - }, - { - _id: "trk-186e120746e9075df66cb3b3", - name: "strange_wiener", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "uv7ZnF4gR7DRC3GsRjup4ai5zG3Lm/V7rmeUW+MN1jg=", - created_at: ISODate("2025-10-05T16:02:26Z"), - }, - { - _id: "trk-186e120746e924c657e20745", - name: "noble_gates", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HTPI0EkycKDjtalFGyzwQhWo64m8tWlgruPc6ytZnuU=", - created_at: ISODate("2025-09-26T02:08:26Z"), - }, - { - _id: "trk-186e120746e941381aa9726f", - name: "hyper_cauchy", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "BymguFW23joJGerJ6vLEL9MqDeSUD+Gu6nIAY2uLEJw=", - created_at: ISODate("2025-09-17T02:25:26Z"), - }, - { - _id: "trk-186e120746e95d892be20fae", - name: "beautiful_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "CWlkHtuXinZ28j9pb59SPhjAJZtMTwnRtrXWe0ztijA=", - created_at: ISODate("2025-10-06T15:58:26Z"), - }, - { - _id: "trk-186e120746e97c1f615d85ec", - name: "original_kleene", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "QJ+QtIFC9ydN3CZEHrhY+TYoM95H9JZ9y9fAwNcMCpw=", - created_at: ISODate("2025-09-14T21:36:26Z"), - }, - { - _id: "trk-186e120746e9f277df403d3d", - name: "jolly_salam", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "HQDyTFoUqsHhVWbmVD148+qm4lQOKBp5bMdtXRwbM1s=", - created_at: ISODate("2025-09-28T18:07:26Z"), - }, - { - _id: "trk-186e120746ea1f2ea4d89687", - name: "exotic_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Y9z4ZdSWN8SPus1VpxPdFwSalBOr0xD60zRJdhCitbg=", - created_at: ISODate("2025-09-21T05:39:26Z"), - }, - { - _id: "trk-186e120746ea41e63919641b", - name: "funny_cooper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "TYzBRY/HUoh5LpTEAeDcfshVDp7XIxVmsLOmAsFCSU4=", - created_at: ISODate("2025-09-25T17:16:26Z"), - }, - { - _id: "trk-186e120746ea5c4249128d8b", - name: "jaunty_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "Ln6LyXPBc9OF5bxhYJIoBUZ/r9gMHJYJO9b0fyopzaQ=", - created_at: ISODate("2025-09-30T18:22:26Z"), - }, - { - _id: "trk-186e120746ea750cf69b169b", - name: "thirsty_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "QAONLFQmus2CGZZzlKfGjAADNanq00bK8vaVcBhJo7o=", - created_at: ISODate("2025-10-07T16:31:26Z"), - }, - { - _id: "trk-186e120746ea8e7196b3093b", - name: "adoring_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "aCIzO3EwhWTHXQpWQP7BYEvr6W5HybnsMSUEX13mL30=", - created_at: ISODate("2025-09-18T22:57:26Z"), - }, - { - _id: "trk-186e120746eaa755561196c8", - name: "hungry_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "VKE7UxvJ2bltuQiytSDm2Nv31Iofy06JUwxP8jagn1M=", - created_at: ISODate("2025-10-12T15:43:26Z"), - }, - { - _id: "trk-186e120746eac0684a411127", - name: "energetic_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "jBN447T6Cs/2lwJOZsyHmrcYfrsWCMa6L9gGT3sblJA=", - created_at: ISODate("2025-09-21T13:50:26Z"), - }, - { - _id: "trk-186e120746eb21c56b310cda", - name: "admiring_darwin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "s5ryhLp1YeNYA5ac6plvh1XbGAbrSinlGEAfFX+XB/w=", - created_at: ISODate("2025-10-02T21:14:26Z"), - }, - { - _id: "trk-186e120746eb4d6d70cf6733", - name: "pedantic_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "1YZoUDeyundPrkyl0bFKSQYfSloEJtJCJAcxri42jsc=", - created_at: ISODate("2025-09-24T04:37:26Z"), - }, - { - _id: "trk-186e120746eb649a77fcbe02", - name: "laughing_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "augBE5IFFPq2uubp+cOpB9XSWe6FNzkXRkLZkubX3Es=", - created_at: ISODate("2025-09-24T20:06:26Z"), - }, - { - _id: "trk-186e120746eba54428a46768", - name: "groovy_bohr", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "IkcQJDdUzKZ2WMpIIQwpknP998gOt0F7MP+EQo/T1Lc=", - created_at: ISODate("2025-09-17T20:37:26Z"), - }, - { - _id: "trk-186e120746ebbc9238d17b60", - name: "gracious_weierstrass", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "40PvNz4whHc4hLO/7Q9lMe6YGJO6ZkMvjN1dA30zAA4=", - created_at: ISODate("2025-10-04T07:08:26Z"), - }, - { - _id: "trk-186e120746ebd0fa0f990530", - name: "thoughtful_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "CQqhJ/Qj/x1s9H3Y4QuIo5FSGoMjA+ojGYiXskb0RRw=", - created_at: ISODate("2025-09-17T00:05:26Z"), - }, - { - _id: "trk-186e120746ebe5ac2d343d5f", - name: "zealous_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "y0VUGEVC3cOc4sX1nj7u10m75QasW8LIdwWVs1rf2TY=", - created_at: ISODate("2025-10-04T13:25:26Z"), - }, - { - _id: "trk-186e120746ebf958faa8280e", - name: "busy_jobs", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "OENsQJipdvtlRI+5C8F/phEfSjTHS2F9CWXt+cXGHcI=", - created_at: ISODate("2025-10-01T16:44:26Z"), - }, - { - _id: "trk-186e120746ec4fb0b411045b", - name: "adoring_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "SAd8SIi1BnSt/9YexlOGPNZ7PJJkigxkvdnqZnwftwo=", - created_at: ISODate("2025-09-25T07:06:26Z"), - }, - { - _id: "trk-186e120746ec648c04ccbdc8", - name: "furious_euler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "dSLgwgAmj27cw9ET0w8acChymnMLe24CxGCKwdLswbo=", - created_at: ISODate("2025-10-05T02:30:26Z"), - }, - { - _id: "trk-186e120746ecbbbe654ce1d4", - name: "fascinated_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "bRVy3298YRSHvb3LE1Z6qj07TqEtH0oooPp5HMcGTJc=", - created_at: ISODate("2025-09-19T14:47:26Z"), - }, - { - _id: "trk-186e120746eccff893f335f9", - name: "curious_wozniak", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "pK3c6YRMn7EgtpNs+blSRqgdQL+Ic8drkEx9tX2Dy6c=", - created_at: ISODate("2025-10-11T13:06:26Z"), - }, - { - _id: "trk-186e120746ece530a32af864", - name: "dreamy_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "Ubp1OPiqYtvjmJCrmp9JrPfCFjtLhiUoB+3oC4BTPFs=", - created_at: ISODate("2025-10-04T04:32:26Z"), - }, - { - _id: "trk-186e120746ed08a67703eabb", - name: "exotic_shockley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "d2vpnUwGH7ALIWjUKILDnDshEqdD+Roko77fxsHUUqE=", - created_at: ISODate("2025-10-01T23:44:26Z"), - }, - { - _id: "trk-186e120746ed58f183b2985f", - name: "outstanding_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "awREvy0yYRVf2XsYf/tNNIdBL55RXR96sGy7jTw5kl8=", - created_at: ISODate("2025-10-03T13:15:26Z"), - }, - { - _id: "trk-186e120746ed868a048f5dab", - name: "dreamy_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "/t1Coa70kTMW55Qyu4sFA7+LLafl+vt8LxAoAQ0nDLY=", - created_at: ISODate("2025-10-07T20:10:26Z"), - }, - { - _id: "trk-186e120746edbab38815cdf3", - name: "focused_peano", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "WfNSRmk1sgJsXH/JVHELwriSEAoB5yD4CCyMuGRD/fs=", - created_at: ISODate("2025-09-24T00:54:26Z"), - }, - { - _id: "trk-186e120746edd0917f22f06e", - name: "motivated_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "t4kvEtHD4zNZl6BciX0xcyU8mWDU8YMWEftEQE3eoRY=", - created_at: ISODate("2025-09-29T00:50:26Z"), - }, - { - _id: "trk-186e120746ee2283b18d3081", - name: "groovy_fermi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "tlIl/BgRMxvE3+uojFxFVzBsUpgqO0DDieAllWAzULA=", - created_at: ISODate("2025-09-14T17:54:26Z"), - }, - { - _id: "trk-186e120746ee4e09aceffd05", - name: "xenodochial_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "SR7J6zXtzZ+MzTCt+PULdrBEVstzj3j8FWbY8lIEn90=", - created_at: ISODate("2025-09-14T14:54:26Z"), - }, - { - _id: "trk-186e120746ee68da26273cf5", - name: "lucid_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iakRwwyTjiD+zM7uC7h/UQm6gz6QIVntEhsL5kChETk=", - created_at: ISODate("2025-09-21T11:01:26Z"), - }, - { - _id: "trk-186e120746ee83e08e9af2ff", - name: "serene_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "sZ9jRJt4nahWRjnYbEr8pROMxPW+rMqaEpwcxSbI25k=", - created_at: ISODate("2025-09-24T14:39:26Z"), - }, - { - _id: "trk-186e120746ee9c5f3732c18d", - name: "cranky_glashow", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "0x5c9KZ5LXKSmZZqvoYwIRmfmcI/QdC9pzGSw0iUnhI=", - created_at: ISODate("2025-09-30T09:44:26Z"), - }, - { - _id: "trk-186e120746eebc6662643d28", - name: "nervous_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "R5tvEmp6htqC7RHz/hRTUwhZW6v3lVh3qJ+Pttgw9S8=", - created_at: ISODate("2025-09-30T08:21:26Z"), - }, - { - _id: "trk-186e120746eedcee1f256e01", - name: "amazing_westinghouse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "UX2Qmw3cmXuF/IcgT0gIzavalplncAuB9c1hCDebu0k=", - created_at: ISODate("2025-09-22T15:06:26Z"), - }, - { - _id: "trk-186e120746eef951821b96c3", - name: "bold_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "YXD9WH6vDeIHC5YQZqEz7WvkHrcKgIAnfFAGl59htyE=", - created_at: ISODate("2025-09-22T18:36:26Z"), - }, - { - _id: "trk-186e120746ef14ada5d82853", - name: "ecstatic_bohr", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "EyfR76x+gHf56NtxCJrPP2yEbKNAWAytY7GnJ5iD6Dc=", - created_at: ISODate("2025-09-22T14:45:26Z"), - }, - { - _id: "trk-186e120746ef30a453a2681f", - name: "xenodochial_yang", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "KA7GeAJz7HYtBr+quD2ByRsih8xN94nkw82YHCa+ekE=", - created_at: ISODate("2025-09-23T11:28:26Z"), - }, - { - _id: "trk-186e120746ef5962725241a1", - name: "great_pascal", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "wTy5ke2Gu8rGjh90ryR4OO3dvnaveRb2lNO2J+DXM+k=", - created_at: ISODate("2025-09-29T17:03:26Z"), - }, - { - _id: "trk-186e120746ef7561a82b805e", - name: "puzzled_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "U3e0bbtRB/4oFdwAyqaUWdiWc3KBJxCdwL4GnrajrvE=", - created_at: ISODate("2025-09-16T18:55:26Z"), - }, - { - _id: "trk-186e120746ef911e84e6d8e2", - name: "flamboyant_wiener", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ce/RLrLRYmFt61vSvrKtl+OayIQpjaFJRWJVABDKEWA=", - created_at: ISODate("2025-09-18T14:06:26Z"), - }, - { - _id: "trk-186e120746efabd4ebae5c25", - name: "modest_pascal", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "Pz4Pu+YceuyuUAEswXesnWSPbZL5PPPXefSAO4ueB3M=", - created_at: ISODate("2025-10-02T22:08:26Z"), - }, - { - _id: "trk-186e120746efd20be6218945", - name: "curious_turing", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "O2DSUjc6HIFMf8/a/mm+ONOVsXvJ9UmYdvhIirxW5LQ=", - created_at: ISODate("2025-10-10T00:12:26Z"), - }, - { - _id: "trk-186e120746efef261a621259", - name: "heuristic_galois", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "7xF3Ws3DC15XXi+wN0TLJ/xfOYsl1wthIcg1WDJSPGE=", - created_at: ISODate("2025-09-29T07:18:26Z"), - }, - { - _id: "trk-186e120746f00b07b9f277f3", - name: "charming_wozniak", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "CkNmnFv3gp6MKDfY7BFED1nGJLC5Gvho5M135S/bcSI=", - created_at: ISODate("2025-10-08T19:56:26Z"), - }, - { - _id: "trk-186e120746f0271720162899", - name: "cool_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "EXIB21hXaXxf6awOBsQvJF4YnOGec0JcliipsryVoJM=", - created_at: ISODate("2025-09-23T20:59:26Z"), - }, - { - _id: "trk-186e120746f04a21e1fbceb4", - name: "fabulous_henry", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "pA1fAK3JAJfuPhNF0pJ/AXM2x80lCClPT3YBaFm0aWU=", - created_at: ISODate("2025-09-24T14:03:26Z"), - }, - { - _id: "trk-186e120746f082919f1fb039", - name: "calm_glashow", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "cP03j+3EWXeGlrsFWTKdx+/BUsX+yfBpyqfRsHvNtNo=", - created_at: ISODate("2025-10-02T00:58:26Z"), - }, - { - _id: "trk-186e120746f09d390df56184", - name: "gifted_crick", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Cd8phmxxYiKZykG4dz12tWjBqldOWLlXS4eHAt+QXuE=", - created_at: ISODate("2025-09-26T09:54:26Z"), - }, - { - _id: "trk-186e120746f0b6c58812e233", - name: "merry_torvalds", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "SfPGmp/POZ0OJ46PfaCF4YWga1fkw9hxx4Uu2Oqc12U=", - created_at: ISODate("2025-10-02T12:53:26Z"), - }, - { - _id: "trk-186e120746f0d2223b340dbc", - name: "calm_cantor", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "6y8OGDDKUegpudM8cpIEJOHa0XFm1kiYGq14k5lGqn8=", - created_at: ISODate("2025-09-25T08:49:26Z"), - }, - { - _id: "trk-186e120746f0f719e93740d8", - name: "gentle_kleene", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "kTOu2VN72K+KIS6dmhjw6gn7EJv8Sgy7Ftf0EVmyUAM=", - created_at: ISODate("2025-09-17T00:20:26Z"), - }, - { - _id: "trk-186e120746f12bb3b3afc7ca", - name: "angry_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "EaVi9jGo670sloZat37TqG9X6MSt9eYttd+OL9xtNmA=", - created_at: ISODate("2025-09-28T01:00:26Z"), - }, - { - _id: "trk-186e120746f146b5f322b565", - name: "furious_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "YsXCrd24M5R0/N8Zo8NptQSAgfuOKlb/6Mquo9+5f6w=", - created_at: ISODate("2025-10-10T19:53:26Z"), - }, - { - _id: "trk-186e120746f15f4e4ac77e69", - name: "flamboyant_hertz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "GwTCImAqU45wG0/+jxkHCuhKym5mzA7ga9AgmiPxXt8=", - created_at: ISODate("2025-10-04T23:43:26Z"), - }, - { - _id: "trk-186e120746f179039c3e5b94", - name: "thirsty_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "pFQF+nyzLCcElM/v9stFnzBiFOZmnAif8VZEf442V+U=", - created_at: ISODate("2025-10-09T19:46:26Z"), - }, - { - _id: "trk-186e120746f191c526e07e26", - name: "cranky_weber", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "GsdkxPFdv3TahWmqM9VkaazJQNxCzhS7PENt8gEoT0s=", - created_at: ISODate("2025-09-24T21:13:26Z"), - }, - { - _id: "trk-186e120746f1b4d87f6a4ab5", - name: "iron_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "W3QvXGjvUvqvTKippTBM1SFuOpMKW8QWnoD0Mme6OYE=", - created_at: ISODate("2025-09-26T05:09:26Z"), - }, - { - _id: "trk-186e120746f1ce4eea4b728b", - name: "relaxed_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "LZR+p/doe7p09bMaY/q8YakuBQGrsGyX74cbpYztN0I=", - created_at: ISODate("2025-09-28T06:39:26Z"), - }, - { - _id: "trk-186e120746f1e7f64d2a0414", - name: "merry_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "pW2aKuxC2muX5hOWr+bk1aySwlsEof16dOwGGVbv0hE=", - created_at: ISODate("2025-10-06T09:51:26Z"), - }, - { - _id: "trk-186e120746f201234290fc20", - name: "youthful_edison", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "p46hK5+FShBIgUZvbfw6Wq3dfrtRYlX9RDMDKAUoE7k=", - created_at: ISODate("2025-09-25T12:29:26Z"), - }, - { - _id: "trk-186e120746f21be0e93185c3", - name: "focused_godel", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "UcYyvLXTyMi7vygZia8WHT6jtc+F7Ee2C01o5xS1Nr4=", - created_at: ISODate("2025-09-26T23:16:26Z"), - }, - { - _id: "trk-186e120746f234b4f6c9f2c7", - name: "dazzling_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "6u6OQXrxzetXHuITD4hRFsWMbJ7MMgaJAGicOFOX19Q=", - created_at: ISODate("2025-09-20T10:30:26Z"), - }, - { - _id: "trk-186e120746f24e76ff131fe3", - name: "upbeat_ohm", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "luzQWGdL+UzgoVO3aaIeSFYdqpx0MOd//U49+sKZBR4=", - created_at: ISODate("2025-09-24T03:21:26Z"), - }, - { - _id: "trk-186e120746f267cbf0b2059a", - name: "furious_hertz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "nsgQCOmszyc8AS0cr/jasr6AqOfBCjGWWqBOEH3JYAQ=", - created_at: ISODate("2025-09-17T10:52:26Z"), - }, - { - _id: "trk-186e120746f2814d7e0754b6", - name: "affectionate_poincare", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "itBD6WM9tftIGfAJilP9de2TJa8Vog2wDz0ipw43Lgc=", - created_at: ISODate("2025-10-11T07:02:26Z"), - }, - { - _id: "trk-186e120746f2a3d87f0eeca4", - name: "frosty_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", - created_at: ISODate("2025-09-13T16:47:26Z"), - }, ]); diff --git a/services/playbooks/roles/mongo/files/init.js b/services/playbooks/roles/mongo/files/init.js index 6e1ec4c1..f1391798 100644 --- a/services/playbooks/roles/mongo/files/init.js +++ b/services/playbooks/roles/mongo/files/init.js @@ -852,804 +852,4 @@ db.devices.insertMany([ private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, - { - _id: "trk-186e120746e18c690d2440c6", - name: "busy_torvalds", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "zlaKfT1zfiGUFjuxVy2BuM9SqDVikurwVXUEmjbeuX0=", - created_at: ISODate("2025-09-26T01:56:26Z"), - }, - { - _id: "trk-186e120746e5100364a0d88c", - name: "kind_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HaEBIVX8wM6DzAJe5H/efqhCLc+y/4Z0tk3qgN5G/KE=", - created_at: ISODate("2025-10-04T02:03:26Z"), - }, - { - _id: "trk-186e120746e53a7f8b9db50a", - name: "vibrant_abel", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "U9zhxIXPRmXASGaAW2rJ/MHIDQAhlc8/kO4bS/9V8wU=", - created_at: ISODate("2025-09-17T17:58:26Z"), - }, - { - _id: "trk-186e120746e5561da2248999", - name: "beautiful_lee", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "PSGrRaqjl2pJybbEnj17F31N/AncTgx7n1A+32GGzgU=", - created_at: ISODate("2025-10-10T15:37:26Z"), - }, - { - _id: "trk-186e120746e571646ff6b00c", - name: "agitated_penrose", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "/jxYt11fVWtx9+OLZcmO0664Lshxu+L9+Er2/DB5j8I=", - created_at: ISODate("2025-09-15T22:14:26Z"), - }, - { - _id: "trk-186e120746e592b6ef437676", - name: "serene_knuth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "TBkHjWmYDA0m2prmSZqqk7wKO3FMAjNfNcwLbamTl14=", - created_at: ISODate("2025-09-18T02:02:26Z"), - }, - { - _id: "trk-186e120746e5b57fe57e549f", - name: "boring_crick", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "r5PJU83UZ0IsuJuMgFEZJy41dymcmoOCTVTGNe+fYp4=", - created_at: ISODate("2025-09-16T16:44:26Z"), - }, - { - _id: "trk-186e120746e5d2cfd3ad47f8", - name: "proud_curie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "rwrEdWc3CovyYsAYXvhIojm2vM7RQf7R4waNRm7rZDQ=", - created_at: ISODate("2025-09-18T01:04:26Z"), - }, - { - _id: "trk-186e120746e5f3b0e0bd40a6", - name: "epic_hopper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "NH0AzwhXWUdFM8m6r6FVT+2C2f9KsD++CHWAqRsrCIg=", - created_at: ISODate("2025-09-25T17:10:26Z"), - }, - { - _id: "trk-186e120746e61249f492cc92", - name: "fervent_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "IpaYNNClPfrs776+wldgliZ/UenF/fN5qlY6R+R99kA=", - created_at: ISODate("2025-09-26T00:33:26Z"), - }, - { - _id: "trk-186e120746e62e8b1e50c009", - name: "optimistic_noether", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "dPgcLmsJh0nU5IyAjyhyCfHij0NkswJC7aLqhGnKdE4=", - created_at: ISODate("2025-10-01T22:39:26Z"), - }, - { - _id: "trk-186e120746e6498c6e55e12f", - name: "keen_ohm", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "6sBH2HqlO06ZS6qpAZ75i/0LOb5FEWXK+bbBfyTDZrU=", - created_at: ISODate("2025-09-23T09:49:26Z"), - }, - { - _id: "trk-186e120746e6a53392e5a1d6", - name: "dreamy_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "AdaUNQ0ddcyYZlMHzoFPFDiM+lQS9akdrF086C5uvnU=", - created_at: ISODate("2025-09-19T01:06:26Z"), - }, - { - _id: "trk-186e120746e6c07ef43e3d13", - name: "outstanding_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "yVvpMOeozwtyH1gS4y8hrDO9hftYbwpzjZeVPwwYwZs=", - created_at: ISODate("2025-09-21T03:27:26Z"), - }, - { - _id: "trk-186e120746e70513852edb0f", - name: "faithful_knuth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "8GbhtHVXcN9Yyi41F2wh/aR5Wdarq9uvYZLMoOyD8NM=", - created_at: ISODate("2025-10-09T08:08:26Z"), - }, - { - _id: "trk-186e120746e7235b73eb8923", - name: "modest_gauss", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "NmFP6t/trYYOSAQLQgdDJhheahC7kO3kDwuwEFLqeCE=", - created_at: ISODate("2025-10-10T04:12:26Z"), - }, - { - _id: "trk-186e120746e74151fb9b3cf6", - name: "clever_volta", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "K4eXVoUnDViQyeemkL77tJ7PLSTA5LB+dLqNtd8OfH4=", - created_at: ISODate("2025-09-17T02:43:26Z"), - }, - { - _id: "trk-186e120746e75e602ef60dd6", - name: "determined_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "T6f5G5JQUuSrCJ9DnXquzN4IXarA+Og67HsRUQU1eHY=", - created_at: ISODate("2025-10-13T13:50:26Z"), - }, - { - _id: "trk-186e120746e77af4a17ef004", - name: "fervent_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "+klSDF5Jvl3Cjkjr/GwKxBwusArwojYmcgURQQT6DPs=", - created_at: ISODate("2025-09-23T21:27:26Z"), - }, - { - _id: "trk-186e120746e798d285808a70", - name: "bold_fourier", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "4zwMIKqs8mtNveECyMvcFt+K7OedZ+MnOS6o42EUEWU=", - created_at: ISODate("2025-09-17T06:50:26Z"), - }, - { - _id: "trk-186e120746e7b4c678103ccf", - name: "boring_hardy", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "9cgnzOXmKaVWCBpvyfEC1rIo2coYrpOPrW2ZcvmHO9E=", - created_at: ISODate("2025-09-24T18:31:26Z"), - }, - { - _id: "trk-186e120746e7d271ec706172", - name: "sleepy_pauling", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "2+j+X2Im01XBzllw/xpq1fq8M2TxlOos/ClmmD0Gzaw=", - created_at: ISODate("2025-10-10T06:17:26Z"), - }, - { - _id: "trk-186e120746e7ef79f6ee0e1b", - name: "exotic_ritchie", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "E+6m5pEZbh0VyR2hmRRe4xJ4HzGBUn3qAVxCu0jeydY=", - created_at: ISODate("2025-10-12T18:18:26Z"), - }, - { - _id: "trk-186e120746e80afd0d8d37e1", - name: "beautiful_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "SMPBDRGLD9aVElnzLvrsHyRgrM4ywaxwQa+ybapdStM=", - created_at: ISODate("2025-09-24T17:20:26Z"), - }, - { - _id: "trk-186e120746e833b3dfa6e5ff", - name: "jovial_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "X9ZHSPIBXi5gsoXM0LO7Lsuv8LbVA8EMv/y/J8jXKMc=", - created_at: ISODate("2025-10-01T03:02:26Z"), - }, - { - _id: "trk-186e120746e851854660544e", - name: "serene_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "L82m2B58IsoddlmF+eoMnwMpmn3VEBQiAjxGlx854CA=", - created_at: ISODate("2025-09-17T21:44:26Z"), - }, - { - _id: "trk-186e120746e86e09d1953e23", - name: "blissful_leibniz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "uW6S9QZqdTN9n8nROsXWugdetpdTwdD/NAgsHfVlKVQ=", - created_at: ISODate("2025-10-11T13:42:26Z"), - }, - { - _id: "trk-186e120746e88add15d6df47", - name: "clever_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "zioq96s+Os5u0wkjaOfUO9dZId7OHr8otFLIdl+4qfc=", - created_at: ISODate("2025-09-17T09:35:26Z"), - }, - { - _id: "trk-186e120746e8b7c338ebf0df", - name: "sweet_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "fDrzR+XXddUMT7sjv1lTdCqCrMxpIuoFhJF/FjORBTM=", - created_at: ISODate("2025-10-13T14:47:26Z"), - }, - { - _id: "trk-186e120746e8ea3b02c4a2e1", - name: "frosty_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "jzW8kxhoYXRGZAEfemost+RLvfyaXeAqCdA6Tvbrx4k=", - created_at: ISODate("2025-09-24T13:14:26Z"), - }, - { - _id: "trk-186e120746e9075df66cb3b3", - name: "strange_wiener", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "uv7ZnF4gR7DRC3GsRjup4ai5zG3Lm/V7rmeUW+MN1jg=", - created_at: ISODate("2025-10-05T16:02:26Z"), - }, - { - _id: "trk-186e120746e924c657e20745", - name: "noble_gates", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HTPI0EkycKDjtalFGyzwQhWo64m8tWlgruPc6ytZnuU=", - created_at: ISODate("2025-09-26T02:08:26Z"), - }, - { - _id: "trk-186e120746e941381aa9726f", - name: "hyper_cauchy", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "BymguFW23joJGerJ6vLEL9MqDeSUD+Gu6nIAY2uLEJw=", - created_at: ISODate("2025-09-17T02:25:26Z"), - }, - { - _id: "trk-186e120746e95d892be20fae", - name: "beautiful_whitehead", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "CWlkHtuXinZ28j9pb59SPhjAJZtMTwnRtrXWe0ztijA=", - created_at: ISODate("2025-10-06T15:58:26Z"), - }, - { - _id: "trk-186e120746e97c1f615d85ec", - name: "original_kleene", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "QJ+QtIFC9ydN3CZEHrhY+TYoM95H9JZ9y9fAwNcMCpw=", - created_at: ISODate("2025-09-14T21:36:26Z"), - }, - { - _id: "trk-186e120746e9f277df403d3d", - name: "jolly_salam", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "HQDyTFoUqsHhVWbmVD148+qm4lQOKBp5bMdtXRwbM1s=", - created_at: ISODate("2025-09-28T18:07:26Z"), - }, - { - _id: "trk-186e120746ea1f2ea4d89687", - name: "exotic_berners", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Y9z4ZdSWN8SPus1VpxPdFwSalBOr0xD60zRJdhCitbg=", - created_at: ISODate("2025-09-21T05:39:26Z"), - }, - { - _id: "trk-186e120746ea41e63919641b", - name: "funny_cooper", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "TYzBRY/HUoh5LpTEAeDcfshVDp7XIxVmsLOmAsFCSU4=", - created_at: ISODate("2025-09-25T17:16:26Z"), - }, - { - _id: "trk-186e120746ea5c4249128d8b", - name: "jaunty_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "Ln6LyXPBc9OF5bxhYJIoBUZ/r9gMHJYJO9b0fyopzaQ=", - created_at: ISODate("2025-09-30T18:22:26Z"), - }, - { - _id: "trk-186e120746ea750cf69b169b", - name: "thirsty_stallman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "QAONLFQmus2CGZZzlKfGjAADNanq00bK8vaVcBhJo7o=", - created_at: ISODate("2025-10-07T16:31:26Z"), - }, - { - _id: "trk-186e120746ea8e7196b3093b", - name: "adoring_newton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "aCIzO3EwhWTHXQpWQP7BYEvr6W5HybnsMSUEX13mL30=", - created_at: ISODate("2025-09-18T22:57:26Z"), - }, - { - _id: "trk-186e120746eaa755561196c8", - name: "hungry_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "VKE7UxvJ2bltuQiytSDm2Nv31Iofy06JUwxP8jagn1M=", - created_at: ISODate("2025-10-12T15:43:26Z"), - }, - { - _id: "trk-186e120746eac0684a411127", - name: "energetic_carmack", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "jBN447T6Cs/2lwJOZsyHmrcYfrsWCMa6L9gGT3sblJA=", - created_at: ISODate("2025-09-21T13:50:26Z"), - }, - { - _id: "trk-186e120746eb21c56b310cda", - name: "admiring_darwin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "s5ryhLp1YeNYA5ac6plvh1XbGAbrSinlGEAfFX+XB/w=", - created_at: ISODate("2025-10-02T21:14:26Z"), - }, - { - _id: "trk-186e120746eb4d6d70cf6733", - name: "pedantic_franklin", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "1YZoUDeyundPrkyl0bFKSQYfSloEJtJCJAcxri42jsc=", - created_at: ISODate("2025-09-24T04:37:26Z"), - }, - { - _id: "trk-186e120746eb649a77fcbe02", - name: "laughing_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "augBE5IFFPq2uubp+cOpB9XSWe6FNzkXRkLZkubX3Es=", - created_at: ISODate("2025-09-24T20:06:26Z"), - }, - { - _id: "trk-186e120746eba54428a46768", - name: "groovy_bohr", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "IkcQJDdUzKZ2WMpIIQwpknP998gOt0F7MP+EQo/T1Lc=", - created_at: ISODate("2025-09-17T20:37:26Z"), - }, - { - _id: "trk-186e120746ebbc9238d17b60", - name: "gracious_weierstrass", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "40PvNz4whHc4hLO/7Q9lMe6YGJO6ZkMvjN1dA30zAA4=", - created_at: ISODate("2025-10-04T07:08:26Z"), - }, - { - _id: "trk-186e120746ebd0fa0f990530", - name: "thoughtful_doppler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "CQqhJ/Qj/x1s9H3Y4QuIo5FSGoMjA+ojGYiXskb0RRw=", - created_at: ISODate("2025-09-17T00:05:26Z"), - }, - { - _id: "trk-186e120746ebe5ac2d343d5f", - name: "zealous_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "y0VUGEVC3cOc4sX1nj7u10m75QasW8LIdwWVs1rf2TY=", - created_at: ISODate("2025-10-04T13:25:26Z"), - }, - { - _id: "trk-186e120746ebf958faa8280e", - name: "busy_jobs", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "OENsQJipdvtlRI+5C8F/phEfSjTHS2F9CWXt+cXGHcI=", - created_at: ISODate("2025-10-01T16:44:26Z"), - }, - { - _id: "trk-186e120746ec4fb0b411045b", - name: "adoring_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "SAd8SIi1BnSt/9YexlOGPNZ7PJJkigxkvdnqZnwftwo=", - created_at: ISODate("2025-09-25T07:06:26Z"), - }, - { - _id: "trk-186e120746ec648c04ccbdc8", - name: "furious_euler", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "dSLgwgAmj27cw9ET0w8acChymnMLe24CxGCKwdLswbo=", - created_at: ISODate("2025-10-05T02:30:26Z"), - }, - { - _id: "trk-186e120746ecbbbe654ce1d4", - name: "fascinated_morse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "bRVy3298YRSHvb3LE1Z6qj07TqEtH0oooPp5HMcGTJc=", - created_at: ISODate("2025-09-19T14:47:26Z"), - }, - { - _id: "trk-186e120746eccff893f335f9", - name: "curious_wozniak", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "pK3c6YRMn7EgtpNs+blSRqgdQL+Ic8drkEx9tX2Dy6c=", - created_at: ISODate("2025-10-11T13:06:26Z"), - }, - { - _id: "trk-186e120746ece530a32af864", - name: "dreamy_jacobi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "Ubp1OPiqYtvjmJCrmp9JrPfCFjtLhiUoB+3oC4BTPFs=", - created_at: ISODate("2025-10-04T04:32:26Z"), - }, - { - _id: "trk-186e120746ed08a67703eabb", - name: "exotic_shockley", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "d2vpnUwGH7ALIWjUKILDnDshEqdD+Roko77fxsHUUqE=", - created_at: ISODate("2025-10-01T23:44:26Z"), - }, - { - _id: "trk-186e120746ed58f183b2985f", - name: "outstanding_weinberg", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "awREvy0yYRVf2XsYf/tNNIdBL55RXR96sGy7jTw5kl8=", - created_at: ISODate("2025-10-03T13:15:26Z"), - }, - { - _id: "trk-186e120746ed868a048f5dab", - name: "dreamy_hilbert", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "/t1Coa70kTMW55Qyu4sFA7+LLafl+vt8LxAoAQ0nDLY=", - created_at: ISODate("2025-10-07T20:10:26Z"), - }, - { - _id: "trk-186e120746edbab38815cdf3", - name: "focused_peano", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "WfNSRmk1sgJsXH/JVHELwriSEAoB5yD4CCyMuGRD/fs=", - created_at: ISODate("2025-09-24T00:54:26Z"), - }, - { - _id: "trk-186e120746edd0917f22f06e", - name: "motivated_compton", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "t4kvEtHD4zNZl6BciX0xcyU8mWDU8YMWEftEQE3eoRY=", - created_at: ISODate("2025-09-29T00:50:26Z"), - }, - { - _id: "trk-186e120746ee2283b18d3081", - name: "groovy_fermi", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "tlIl/BgRMxvE3+uojFxFVzBsUpgqO0DDieAllWAzULA=", - created_at: ISODate("2025-09-14T17:54:26Z"), - }, - { - _id: "trk-186e120746ee4e09aceffd05", - name: "xenodochial_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "SR7J6zXtzZ+MzTCt+PULdrBEVstzj3j8FWbY8lIEn90=", - created_at: ISODate("2025-09-14T14:54:26Z"), - }, - { - _id: "trk-186e120746ee68da26273cf5", - name: "lucid_nyquist", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "iakRwwyTjiD+zM7uC7h/UQm6gz6QIVntEhsL5kChETk=", - created_at: ISODate("2025-09-21T11:01:26Z"), - }, - { - _id: "trk-186e120746ee83e08e9af2ff", - name: "serene_lagrange", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "sZ9jRJt4nahWRjnYbEr8pROMxPW+rMqaEpwcxSbI25k=", - created_at: ISODate("2025-09-24T14:39:26Z"), - }, - { - _id: "trk-186e120746ee9c5f3732c18d", - name: "cranky_glashow", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "0x5c9KZ5LXKSmZZqvoYwIRmfmcI/QdC9pzGSw0iUnhI=", - created_at: ISODate("2025-09-30T09:44:26Z"), - }, - { - _id: "trk-186e120746eebc6662643d28", - name: "nervous_maxwell", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "R5tvEmp6htqC7RHz/hRTUwhZW6v3lVh3qJ+Pttgw9S8=", - created_at: ISODate("2025-09-30T08:21:26Z"), - }, - { - _id: "trk-186e120746eedcee1f256e01", - name: "amazing_westinghouse", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "UX2Qmw3cmXuF/IcgT0gIzavalplncAuB9c1hCDebu0k=", - created_at: ISODate("2025-09-22T15:06:26Z"), - }, - { - _id: "trk-186e120746eef951821b96c3", - name: "bold_born", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "YXD9WH6vDeIHC5YQZqEz7WvkHrcKgIAnfFAGl59htyE=", - created_at: ISODate("2025-09-22T18:36:26Z"), - }, - { - _id: "trk-186e120746ef14ada5d82853", - name: "ecstatic_bohr", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "EyfR76x+gHf56NtxCJrPP2yEbKNAWAytY7GnJ5iD6Dc=", - created_at: ISODate("2025-09-22T14:45:26Z"), - }, - { - _id: "trk-186e120746ef30a453a2681f", - name: "xenodochial_yang", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "KA7GeAJz7HYtBr+quD2ByRsih8xN94nkw82YHCa+ekE=", - created_at: ISODate("2025-09-23T11:28:26Z"), - }, - { - _id: "trk-186e120746ef5962725241a1", - name: "great_pascal", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "wTy5ke2Gu8rGjh90ryR4OO3dvnaveRb2lNO2J+DXM+k=", - created_at: ISODate("2025-09-29T17:03:26Z"), - }, - { - _id: "trk-186e120746ef7561a82b805e", - name: "puzzled_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "U3e0bbtRB/4oFdwAyqaUWdiWc3KBJxCdwL4GnrajrvE=", - created_at: ISODate("2025-09-16T18:55:26Z"), - }, - { - _id: "trk-186e120746ef911e84e6d8e2", - name: "flamboyant_wiener", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "ce/RLrLRYmFt61vSvrKtl+OayIQpjaFJRWJVABDKEWA=", - created_at: ISODate("2025-09-18T14:06:26Z"), - }, - { - _id: "trk-186e120746efabd4ebae5c25", - name: "modest_pascal", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "Pz4Pu+YceuyuUAEswXesnWSPbZL5PPPXefSAO4ueB3M=", - created_at: ISODate("2025-10-02T22:08:26Z"), - }, - { - _id: "trk-186e120746efd20be6218945", - name: "curious_turing", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "O2DSUjc6HIFMf8/a/mm+ONOVsXvJ9UmYdvhIirxW5LQ=", - created_at: ISODate("2025-10-10T00:12:26Z"), - }, - { - _id: "trk-186e120746efef261a621259", - name: "heuristic_galois", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "7xF3Ws3DC15XXi+wN0TLJ/xfOYsl1wthIcg1WDJSPGE=", - created_at: ISODate("2025-09-29T07:18:26Z"), - }, - { - _id: "trk-186e120746f00b07b9f277f3", - name: "charming_wozniak", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "CkNmnFv3gp6MKDfY7BFED1nGJLC5Gvho5M135S/bcSI=", - created_at: ISODate("2025-10-08T19:56:26Z"), - }, - { - _id: "trk-186e120746f0271720162899", - name: "cool_dijkstra", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "EXIB21hXaXxf6awOBsQvJF4YnOGec0JcliipsryVoJM=", - created_at: ISODate("2025-09-23T20:59:26Z"), - }, - { - _id: "trk-186e120746f04a21e1fbceb4", - name: "fabulous_henry", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "pA1fAK3JAJfuPhNF0pJ/AXM2x80lCClPT3YBaFm0aWU=", - created_at: ISODate("2025-09-24T14:03:26Z"), - }, - { - _id: "trk-186e120746f082919f1fb039", - name: "calm_glashow", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "cP03j+3EWXeGlrsFWTKdx+/BUsX+yfBpyqfRsHvNtNo=", - created_at: ISODate("2025-10-02T00:58:26Z"), - }, - { - _id: "trk-186e120746f09d390df56184", - name: "gifted_crick", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "Cd8phmxxYiKZykG4dz12tWjBqldOWLlXS4eHAt+QXuE=", - created_at: ISODate("2025-09-26T09:54:26Z"), - }, - { - _id: "trk-186e120746f0b6c58812e233", - name: "merry_torvalds", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "SfPGmp/POZ0OJ46PfaCF4YWga1fkw9hxx4Uu2Oqc12U=", - created_at: ISODate("2025-10-02T12:53:26Z"), - }, - { - _id: "trk-186e120746f0d2223b340dbc", - name: "calm_cantor", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "6y8OGDDKUegpudM8cpIEJOHa0XFm1kiYGq14k5lGqn8=", - created_at: ISODate("2025-09-25T08:49:26Z"), - }, - { - _id: "trk-186e120746f0f719e93740d8", - name: "gentle_kleene", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "kTOu2VN72K+KIS6dmhjw6gn7EJv8Sgy7Ftf0EVmyUAM=", - created_at: ISODate("2025-09-17T00:20:26Z"), - }, - { - _id: "trk-186e120746f12bb3b3afc7ca", - name: "angry_wirth", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "EaVi9jGo670sloZat37TqG9X6MSt9eYttd+OL9xtNmA=", - created_at: ISODate("2025-09-28T01:00:26Z"), - }, - { - _id: "trk-186e120746f146b5f322b565", - name: "furious_planck", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "YsXCrd24M5R0/N8Zo8NptQSAgfuOKlb/6Mquo9+5f6w=", - created_at: ISODate("2025-10-10T19:53:26Z"), - }, - { - _id: "trk-186e120746f15f4e4ac77e69", - name: "flamboyant_hertz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "GwTCImAqU45wG0/+jxkHCuhKym5mzA7ga9AgmiPxXt8=", - created_at: ISODate("2025-10-04T23:43:26Z"), - }, - { - _id: "trk-186e120746f179039c3e5b94", - name: "thirsty_laplace", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "pFQF+nyzLCcElM/v9stFnzBiFOZmnAif8VZEf442V+U=", - created_at: ISODate("2025-10-09T19:46:26Z"), - }, - { - _id: "trk-186e120746f191c526e07e26", - name: "cranky_weber", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "GsdkxPFdv3TahWmqM9VkaazJQNxCzhS7PENt8gEoT0s=", - created_at: ISODate("2025-09-24T21:13:26Z"), - }, - { - _id: "trk-186e120746f1b4d87f6a4ab5", - name: "iron_galvani", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "W3QvXGjvUvqvTKippTBM1SFuOpMKW8QWnoD0Mme6OYE=", - created_at: ISODate("2025-09-26T05:09:26Z"), - }, - { - _id: "trk-186e120746f1ce4eea4b728b", - name: "relaxed_feynman", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "LZR+p/doe7p09bMaY/q8YakuBQGrsGyX74cbpYztN0I=", - created_at: ISODate("2025-09-28T06:39:26Z"), - }, - { - _id: "trk-186e120746f1e7f64d2a0414", - name: "merry_coulomb", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "pW2aKuxC2muX5hOWr+bk1aySwlsEof16dOwGGVbv0hE=", - created_at: ISODate("2025-10-06T09:51:26Z"), - }, - { - _id: "trk-186e120746f201234290fc20", - name: "youthful_edison", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "private_transport", - private_key: "p46hK5+FShBIgUZvbfw6Wq3dfrtRYlX9RDMDKAUoE7k=", - created_at: ISODate("2025-09-25T12:29:26Z"), - }, - { - _id: "trk-186e120746f21be0e93185c3", - name: "focused_godel", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "UcYyvLXTyMi7vygZia8WHT6jtc+F7Ee2C01o5xS1Nr4=", - created_at: ISODate("2025-09-26T23:16:26Z"), - }, - { - _id: "trk-186e120746f234b4f6c9f2c7", - name: "dazzling_babbage", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "6u6OQXrxzetXHuITD4hRFsWMbJ7MMgaJAGicOFOX19Q=", - created_at: ISODate("2025-09-20T10:30:26Z"), - }, - { - _id: "trk-186e120746f24e76ff131fe3", - name: "upbeat_ohm", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", - private_key: "luzQWGdL+UzgoVO3aaIeSFYdqpx0MOd//U49+sKZBR4=", - created_at: ISODate("2025-09-24T03:21:26Z"), - }, - { - _id: "trk-186e120746f267cbf0b2059a", - name: "furious_hertz", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", - private_key: "nsgQCOmszyc8AS0cr/jasr6AqOfBCjGWWqBOEH3JYAQ=", - created_at: ISODate("2025-09-17T10:52:26Z"), - }, - { - _id: "trk-186e120746f2814d7e0754b6", - name: "affectionate_poincare", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "food", - private_key: "itBD6WM9tftIGfAJilP9de2TJa8Vog2wDz0ipw43Lgc=", - created_at: ISODate("2025-10-11T07:02:26Z"), - }, - { - _id: "trk-186e120746f2a3d87f0eeca4", - name: "frosty_kolmogorov", - status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "valuable", - private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", - created_at: ISODate("2025-09-13T16:47:26Z"), - }, ]); From a9691a604cbe18a2a58ae6578ad8ff8186e7294c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 18 Oct 2025 00:24:01 +0200 Subject: [PATCH 089/242] increasing publish frequency --- tracky/make_compose.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index d82982e9..faf76166 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -71,7 +71,7 @@ def create_compose(credentials: List[Dict]): "REDIS_URI": "redis://redis:6379", "REGIONAL": regional, "URBAN": urban, - "PUBLISH_PERIOD": "2000", + "PUBLISH_PERIOD": "1000", "PIRATE": "true" if random.randint(1, 100) < 10 else "false", }, networks=["tracky"], From d08231d643d307b1993f4abf848114797d4c7747 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 18 Oct 2025 13:40:55 +0200 Subject: [PATCH 090/242] indent --- tracky/make_compose.py | 2 +- tracky/src/firmware.go | 2 +- tracky/src/trackeroo/routes.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index faf76166..93a2c638 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -87,7 +87,7 @@ def create_compose(credentials: List[Dict]): }, ) if i == len(credentials) - 1: - print(f"('{cred['name']}', '{cred['id']}')") + print(f"('{cred['name']}', '{cred['id']}')") else: print(f"('{cred['name']}', '{cred['id']}'),") print(") AS t (__text, __value)") diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 8e61837d..059e4677 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -124,7 +124,7 @@ func Loop() { trackeroo.InitRedisClient() deviceType := creds.DeviceType overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) - streetProvider := trackeroo.NewCachedStreetProvider(os.Getenv("OVERPASS_URL"), overpassClient) + streetProvider := trackeroo.NewCachedStreetProvider(overpassClient) routingService := trackeroo.NewRoutingService( os.Getenv("ROUTING_SERVICE_URL"), ) diff --git a/tracky/src/trackeroo/routes.go b/tracky/src/trackeroo/routes.go index 09c85052..096cbc2a 100644 --- a/tracky/src/trackeroo/routes.go +++ b/tracky/src/trackeroo/routes.go @@ -28,7 +28,7 @@ type CachedStreetProvider struct { cache map[string][]OverpassElement } -func NewCachedStreetProvider(baseURL string, overpassClient *OverpassClient) *CachedStreetProvider { +func NewCachedStreetProvider(overpassClient *OverpassClient) *CachedStreetProvider { return &CachedStreetProvider{ client: overpassClient, cache: make(map[string][]OverpassElement), From a2c7a744df48958817aca92ef54e68edb6dbe238 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 18 Oct 2025 13:41:29 +0200 Subject: [PATCH 091/242] indent --- tracky/make_compose.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index 93a2c638..a2d32fa6 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -53,16 +53,13 @@ def create_compose(credentials: List[Dict]): service_name = cred["id"] - # Ensure dir exists + dump credential file os.makedirs(service_name, exist_ok=True) with open(f"{service_name}/tdevice.json", "w") as f: json.dump(cred, f, indent=2) - # Register secrets tdevice_secret = f"{service_name}_tdevice" compose.secrets[tdevice_secret] = SecretConfig(file=f"./{service_name}/tdevice.json") - # Define service with secrets mounted compose.services[service_name] = ServiceConfig( image="ghcr.io/skiby7/tracky:latest", environment={ @@ -94,8 +91,6 @@ def create_compose(credentials: List[Dict]): # Dump YAML correctly with open("docker-compose.yml", "w") as f: compose_dict = compose.model_dump(exclude_none=True) - - # yaml.safe_dump handles Pydantic dict fine yaml_str = yaml.safe_dump(compose_dict, sort_keys=False) f.write(yaml_str) From c5f4bce0fd62b9bb993e64a32040d6eae67025ba Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 19 Oct 2025 18:38:39 +0200 Subject: [PATCH 092/242] test --- brokeroo/cmd/brokeroo/main.go | 250 ++++++++++++++++++++++------------ brokeroo/go.mod | 1 + brokeroo/go.sum | 2 + 3 files changed, 163 insertions(+), 90 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index ab7ad338..ac317e09 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -12,19 +12,17 @@ import ( "syscall" "time" - mqtt "github.com/eclipse/paho.mqtt.golang" _ "github.com/lib/pq" + amqp "github.com/rabbitmq/amqp091-go" "github.com/segmentio/kafka-go" ) type Config struct { - MQTTBroker string - MQTTClientID string - MQTTUsername string - MQTTPassword string - PostgresURL string - TopicPattern string - KafkaBroker string + RabbitMQURL string + QueueName string + PostgresURL string + KafkaBroker string + PrefetchCount int } type MQTTData struct { @@ -36,10 +34,11 @@ type MQTTData struct { type Service struct { config *Config - mqttClient mqtt.Client + amqpConn *amqp.Connection + amqpChannel *amqp.Channel db *sql.DB kafkaWriter *kafka.Writer - knownTopics map[string]bool /* for caching kafka topics */ + knownTopics map[string]bool } type Envelope struct { @@ -50,6 +49,11 @@ type Envelope struct { PayloadJSON json.RawMessage `json:"payloadJson"` } +type IncomingMessage struct { + Topic string `json:"topic"` + Payload json.RawMessage `json:"payload"` +} + func NewService(config *Config) *Service { return &Service{ config: config, @@ -78,7 +82,7 @@ func (s *Service) connectKafka() error { }) if err := s.ensureTopicExists("health-check"); err != nil { - log.Printf("failed to create first topic for healt-check: %v", err) + log.Printf("failed to create first topic for health-check: %v", err) } err := s.kafkaWriter.WriteMessages(context.Background(), @@ -98,7 +102,6 @@ func (s *Service) connectKafka() error { } func (s *Service) ensureTopicExists(topic string) error { - if s.knownTopics[topic] { return nil } @@ -135,64 +138,101 @@ func (s *Service) ensureTopicExists(topic string) error { return nil } -func (s *Service) connectMQTT() error { - opts := mqtt.NewClientOptions() - opts.AddBroker(s.config.MQTTBroker) - opts.SetClientID(s.config.MQTTClientID) - opts.SetUsername(s.config.MQTTUsername) - opts.SetPassword(s.config.MQTTPassword) - opts.SetCleanSession(false) // Keep unacked messages - opts.SetAutoReconnect(true) - opts.SetKeepAlive(60 * time.Second) - opts.SetPingTimeout(10 * time.Second) - opts.SetConnectTimeout(10 * time.Second) - opts.SetOrderMatters(false) - opts.SetAutoAckDisabled(true) - opts.SetProtocolVersion(4) - - // Set connection lost handler - opts.SetConnectionLostHandler(func(client mqtt.Client, err error) { - log.Printf("MQTT connection lost: %v", err) - }) +func (s *Service) connectRabbitMQ() error { + var err error - // Set reconnect handler - opts.SetOnConnectHandler(func(client mqtt.Client) { - log.Println("MQTT connected/reconnected") - s.subscribeToTopics() - }) + // Connect with retry logic + for i := 0; i < 10; i++ { + s.amqpConn, err = amqp.Dial(s.config.RabbitMQURL) + if err == nil { + break + } + log.Printf("Failed to connect to RabbitMQ (attempt %d/10): %v", i+1, err) + time.Sleep(2 * time.Second) + } + + if err != nil { + return fmt.Errorf("failed to connect to RabbitMQ after retries: %w", err) + } + + s.amqpChannel, err = s.amqpConn.Channel() + if err != nil { + return fmt.Errorf("failed to open channel: %w", err) + } + + // Declare queue (durable, to survive broker restarts) + _, err = s.amqpChannel.QueueDeclare( + s.config.QueueName, // name + true, // durable + false, // delete when unused + false, // exclusive + false, // no-wait + nil, // arguments + ) + if err != nil { + return fmt.Errorf("failed to declare queue: %w", err) + } + + // Set QoS (prefetch count) for load balancing + // This ensures each worker only gets N messages at a time + err = s.amqpChannel.Qos( + s.config.PrefetchCount, // prefetch count + 0, // prefetch size + false, // global + ) + if err != nil { + return fmt.Errorf("failed to set QoS: %w", err) + } + + log.Printf("Successfully connected to RabbitMQ, queue: %s", s.config.QueueName) + return nil +} - s.mqttClient = mqtt.NewClient(opts) +func (s *Service) startConsuming(ctx context.Context) error { + msgs, err := s.amqpChannel.Consume( + s.config.QueueName, // queue + "", // consumer tag (auto-generated) + false, // auto-ack (IMPORTANT: false for load balancing) + false, // exclusive + false, // no-local + false, // no-wait + nil, // args + ) + if err != nil { + return fmt.Errorf("failed to register consumer: %w", err) + } - c := 0 - for { - if token := s.mqttClient.Connect(); token.Wait() && token.Error() != nil { - if c == 10 { - return fmt.Errorf("failed to connect to MQTT broker: %w", token.Error()) + log.Println("Started consuming messages from RabbitMQ") + + go func() { + for { + select { + case <-ctx.Done(): + return + case msg, ok := <-msgs: + if !ok { + log.Println("Message channel closed") + return + } + s.handleMessage(msg) } - c += 1 - log.Println("Connessione fallita, retry tra 2s:", token.Error()) - time.Sleep(2 * time.Second) - continue } - break - } + }() - log.Println("Successfully connected to MQTT broker") return nil } -func (s *Service) subscribeToTopics() { - token := s.mqttClient.Subscribe(s.config.TopicPattern, 1, s.messageHandler) - if token.Wait() && token.Error() != nil { - log.Printf("Failed to subscribe to topics: %v", token.Error()) +func (s *Service) handleMessage(delivery amqp.Delivery) { + // Parse the incoming message + var incoming IncomingMessage + if err := json.Unmarshal(delivery.Body, &incoming); err != nil { + log.Printf("Invalid JSON payload: %v", err) + delivery.Ack(false) return } - log.Printf("Subscribed to topic pattern: %s", s.config.TopicPattern) -} -func (s *Service) messageHandler(client mqtt.Client, msg mqtt.Message) { - topic := msg.Topic() - payload := msg.Payload() + topic := incoming.Topic + payload := incoming.Payload log.Printf("Received message on topic %s", topic) @@ -200,7 +240,7 @@ func (s *Service) messageHandler(client mqtt.Client, msg mqtt.Message) { parts := strings.Split(topic, "/") if len(parts) != 4 || parts[0] != "j" || parts[1] != "data" { log.Printf("Invalid topic format: %s, expected j/data/DEVID/TAG", topic) - msg.Ack() + delivery.Ack(false) return } @@ -211,49 +251,58 @@ func (s *Service) messageHandler(client mqtt.Client, msg mqtt.Message) { var data map[string]any if err := json.Unmarshal(payload, &data); err != nil { log.Printf("Invalid JSON payload for topic %s: %v", topic, err) - msg.Ack() + delivery.Ack(false) return } - tsUnix, ok := data["ts"].(int64) - if !ok { + // Extract timestamp + var tsUnix int64 + if tsFloat, ok := data["ts"].(float64); ok { + tsUnix = int64(tsFloat) + } else { tsUnix = time.Now().Unix() } ts := time.Unix(tsUnix, 0).UTC() + + // Insert into PostgreSQL start := time.Now() - jsonPayload := json.RawMessage(payload) - if err := s.insertData(tsUnix, ts, devID, tag, jsonPayload); err != nil { + if err := s.insertData(tsUnix, ts, devID, tag, payload); err != nil { log.Printf("Failed to insert data: %v", err) + // Negative acknowledgment with requeue + delivery.Nack(false, true) return } log.Printf("Time to write to DB %v", time.Since(start)) - start = time.Now() - /* kafka */ + // Forward to Kafka + start = time.Now() kafkaTopic := sanitizeTopic(topic) if err := s.ensureTopicExists(kafkaTopic); err != nil { log.Printf("Error creating topic %s: %v", kafkaTopic, err) + delivery.Nack(false, true) return } log.Printf("Time to create topic %v", time.Since(start)) start = time.Now() + envelope := Envelope{ TsUnix: tsUnix, - Ts: ts.Format(time.RFC3339), // is this right? + Ts: ts.Format(time.RFC3339), DevID: devID, Tag: tag, - PayloadJSON: payload, // il payload originale come stringa JSON + PayloadJSON: payload, } envelopeBytes, err := json.Marshal(envelope) if err != nil { log.Printf("Failed to marshal envelope: %v", err) + delivery.Nack(false, true) return } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) /* 5 second timeout */ + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() err = s.kafkaWriter.WriteMessages(ctx, kafka.Message{ @@ -263,13 +312,16 @@ func (s *Service) messageHandler(client mqtt.Client, msg mqtt.Message) { if err != nil { log.Printf("Failed to write to Kafka: %v", err) + delivery.Nack(false, true) return } + log.Printf("Message forwarded to Kafka topic: %s", kafkaTopic) log.Printf("Time to write to Kafka %v", time.Since(start)) + log.Printf("Successfully processed data for dev_id: %s, tag: %s", devID, tag) - log.Printf("Successfully inserted data for dev_id: %s, tag: %s", devID, tag) - msg.Ack() + // Acknowledge message only after successful processing + delivery.Ack(false) } func (s *Service) insertData(tsUnix int64, ts time.Time, devID, tag string, payload json.RawMessage) error { @@ -283,31 +335,37 @@ func (s *Service) insertData(tsUnix int64, ts time.Time, devID, tag string, payl return nil } -func (s *Service) Start() error { - // Connect to PostgreSQL +func (s *Service) Start(ctx context.Context) error { if err := s.connectPostgres(); err != nil { return err } - // Connect to MQTT - if err := s.connectMQTT(); err != nil { + if err := s.connectRabbitMQ(); err != nil { return err } - // Connect to Kafka if err := s.connectKafka(); err != nil { return err } + + if err := s.startConsuming(ctx); err != nil { + return err + } + return nil } func (s *Service) Stop() { log.Println("Shutting down service...") - if s.mqttClient != nil && s.mqttClient.IsConnected() { - s.mqttClient.Unsubscribe(s.config.TopicPattern) - s.mqttClient.Disconnect(250) - log.Println("Disconnected from MQTT broker") + if s.amqpChannel != nil { + s.amqpChannel.Close() + log.Println("Closed RabbitMQ channel") + } + + if s.amqpConn != nil { + s.amqpConn.Close() + log.Println("Closed RabbitMQ connection") } if s.db != nil { @@ -323,13 +381,11 @@ func (s *Service) Stop() { func loadConfig() *Config { return &Config{ - MQTTBroker: getEnvOrDefault("MQTT_BROKER", "tcp://localhost:1883"), - MQTTClientID: getEnvOrDefault("MQTT_CLIENT_ID", "brokeroo"), - MQTTUsername: getEnvOrDefault("MQTT_USERNAME", ""), - MQTTPassword: getEnvOrDefault("MQTT_PASSWORD", ""), - PostgresURL: getEnvOrDefault("POSTGRES_URL", "postgres://user:password@localhost/dbname?sslmode=disable"), - TopicPattern: getEnvOrDefault("TOPIC_PATTERN", "j/data/+/+"), - KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), + RabbitMQURL: getEnvOrDefault("RABBITMQ_URL", "amqp://guest:guest@localhost:5672/"), + QueueName: getEnvOrDefault("QUEUE_NAME", "trackeroo_data"), + PostgresURL: getEnvOrDefault("POSTGRES_URL", "postgres://user:password@localhost/dbname?sslmode=disable"), + KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), + PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 1), } } @@ -340,27 +396,41 @@ func getEnvOrDefault(key, defaultValue string) string { return defaultValue } +func getEnvOrDefaultInt(key string, defaultValue int) int { + if value := os.Getenv(key); value != "" { + var intVal int + if _, err := fmt.Sscanf(value, "%d", &intVal); err == nil { + return intVal + } + } + return defaultValue +} + func sanitizeTopic(topic string) string { return strings.ReplaceAll(topic, "/", "-") } func main() { - log.Println("Starting MQTT to Kafka and PostgreSQL service...") + log.Println("Starting RabbitMQ to Kafka and PostgreSQL service...") config := loadConfig() service := NewService(config) - if err := service.Start(); err != nil { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + if err := service.Start(ctx); err != nil { log.Fatalf("Failed to start service: %v", err) } log.Println("Service started successfully") - // Wait for interrupt signal to gracefully shutdown + // Wait for interrupt signal c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) <-c + cancel() service.Stop() log.Println("Service stopped") } diff --git a/brokeroo/go.mod b/brokeroo/go.mod index 9dbc4773..3f3ad5f5 100644 --- a/brokeroo/go.mod +++ b/brokeroo/go.mod @@ -11,6 +11,7 @@ require ( github.com/eclipse/paho.golang v0.23.0 // indirect github.com/klauspost/compress v1.15.9 // indirect github.com/pierrec/lz4/v4 v4.1.15 // indirect + github.com/rabbitmq/amqp091-go v1.10.0 // indirect ) require ( diff --git a/brokeroo/go.sum b/brokeroo/go.sum index f1d2009a..32f5262c 100644 --- a/brokeroo/go.sum +++ b/brokeroo/go.sum @@ -10,6 +10,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= +github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= github.com/segmentio/kafka-go v0.4.49 h1:GJiNX1d/g+kG6ljyJEoi9++PUMdXGAxb7JGPiDCuNmk= github.com/segmentio/kafka-go v0.4.49/go.mod h1:Y1gn60kzLEEaW28YshXyk2+VCUKbJ3Qr6DrnT3i4+9E= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= From 19ba30fe8e8de92f7a57e0742ce8cc2de42f2d5e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 19 Oct 2025 18:50:38 +0200 Subject: [PATCH 093/242] test --- brokeroo/cmd/brokeroo/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index ac317e09..5bdb9ae2 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -382,7 +382,7 @@ func (s *Service) Stop() { func loadConfig() *Config { return &Config{ RabbitMQURL: getEnvOrDefault("RABBITMQ_URL", "amqp://guest:guest@localhost:5672/"), - QueueName: getEnvOrDefault("QUEUE_NAME", "trackeroo_data"), + QueueName: getEnvOrDefault("QUEUE_NAME", "brokeroo"), PostgresURL: getEnvOrDefault("POSTGRES_URL", "postgres://user:password@localhost/dbname?sslmode=disable"), KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 1), From 5822f6240faba634401f2f7b20eecc05ba338fe2 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 19 Oct 2025 19:04:49 +0200 Subject: [PATCH 094/242] test --- brokeroo/cmd/brokeroo/main.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 5bdb9ae2..2bd5e8cc 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -20,6 +20,8 @@ import ( type Config struct { RabbitMQURL string QueueName string + ExchangeName string + RoutingKey string PostgresURL string KafkaBroker string PrefetchCount int @@ -172,6 +174,16 @@ func (s *Service) connectRabbitMQ() error { if err != nil { return fmt.Errorf("failed to declare queue: %w", err) } + err = s.amqpChannel.QueueBind( + s.config.QueueName, // queue name + s.config.RoutingKey, // routing key (j.data.*.*) + s.config.ExchangeName, // exchange (amq.topic) + false, + nil, + ) + if err != nil { + return fmt.Errorf("Failed to bind queue: %v", err) + } // Set QoS (prefetch count) for load balancing // This ensures each worker only gets N messages at a time @@ -383,6 +395,8 @@ func loadConfig() *Config { return &Config{ RabbitMQURL: getEnvOrDefault("RABBITMQ_URL", "amqp://guest:guest@localhost:5672/"), QueueName: getEnvOrDefault("QUEUE_NAME", "brokeroo"), + ExchangeName: getEnvOrDefault("EXCHANGE_NAME", "amq.topic"), + RoutingKey: getEnvOrDefault("ROUTING_KEY", "j.data.*.*"), PostgresURL: getEnvOrDefault("POSTGRES_URL", "postgres://user:password@localhost/dbname?sslmode=disable"), KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 1), From 69ac195ee506644359d09d4b6f82f5179c3c1dd2 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 19 Oct 2025 19:12:55 +0200 Subject: [PATCH 095/242] test --- brokeroo/cmd/brokeroo/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 2bd5e8cc..2122d072 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -242,6 +242,7 @@ func (s *Service) handleMessage(delivery amqp.Delivery) { delivery.Ack(false) return } + log.Printf("%+v\n", delivery) topic := incoming.Topic payload := incoming.Payload From d05a936f637848b0cbbd5e0d23bd73b916b22c54 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 19 Oct 2025 19:17:50 +0200 Subject: [PATCH 096/242] test --- brokeroo/cmd/brokeroo/main.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 2122d072..8e3eaa98 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -236,16 +236,9 @@ func (s *Service) startConsuming(ctx context.Context) error { func (s *Service) handleMessage(delivery amqp.Delivery) { // Parse the incoming message - var incoming IncomingMessage - if err := json.Unmarshal(delivery.Body, &incoming); err != nil { - log.Printf("Invalid JSON payload: %v", err) - delivery.Ack(false) - return - } - log.Printf("%+v\n", delivery) - topic := incoming.Topic - payload := incoming.Payload + topic := strings.ReplaceAll(delivery.RoutingKey, ".", "/") + payload := delivery.Body log.Printf("Received message on topic %s", topic) From 96e3596e9720236a5d1e386c601f19483c8a70e6 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 19 Oct 2025 21:21:07 +0200 Subject: [PATCH 097/242] batch processing --- brokeroo/cmd/brokeroo/main.go | 423 +++++++++++++--------------------- 1 file changed, 159 insertions(+), 264 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 8e3eaa98..b6d815aa 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -25,13 +25,10 @@ type Config struct { PostgresURL string KafkaBroker string PrefetchCount int -} - -type MQTTData struct { - TSUnix int64 `json:"ts_unix"` - DevID string `json:"dev_id"` - Tag string `json:"tag"` - Payload json.RawMessage `json:"payload"` + BatchSize int + BatchTimeout time.Duration + MinPrefetch int + MaxPrefetch int } type Service struct { @@ -41,6 +38,9 @@ type Service struct { db *sql.DB kafkaWriter *kafka.Writer knownTopics map[string]bool + + // metrics + dbLatencies []time.Duration } type Envelope struct { @@ -52,8 +52,12 @@ type Envelope struct { } type IncomingMessage struct { - Topic string `json:"topic"` - Payload json.RawMessage `json:"payload"` + Msg amqp.Delivery + DevID string + Tag string + TS int64 + TSStr string + Body json.RawMessage } func NewService(config *Config) *Service { @@ -69,199 +73,92 @@ func (s *Service) connectPostgres() error { if err != nil { return fmt.Errorf("failed to connect to postgres: %w", err) } - if err = s.db.Ping(); err != nil { return fmt.Errorf("failed to ping postgres: %w", err) } - - return nil -} - -func (s *Service) connectKafka() error { - s.kafkaWriter = kafka.NewWriter(kafka.WriterConfig{ - Brokers: []string{s.config.KafkaBroker}, - Async: true, - }) - - if err := s.ensureTopicExists("health-check"); err != nil { - log.Printf("failed to create first topic for health-check: %v", err) - } - - err := s.kafkaWriter.WriteMessages(context.Background(), - kafka.Message{ - Topic: "health-check", - Value: []byte("ping"), - }, - ) - - if err != nil { - log.Printf("Failed to write test message to Kafka: %v", err) - return err - } - - log.Println("Successfully connected to Kafka at", s.config.KafkaBroker) - return nil -} - -func (s *Service) ensureTopicExists(topic string) error { - if s.knownTopics[topic] { - return nil - } - - conn, err := kafka.Dial("tcp", s.config.KafkaBroker) - if err != nil { - return fmt.Errorf("dial broker: %w", err) - } - defer conn.Close() - - controller, err := conn.Controller() - if err != nil { - return fmt.Errorf("get controller: %w", err) - } - - controllerConn, err := kafka.Dial("tcp", fmt.Sprintf("%s:%d", controller.Host, controller.Port)) - if err != nil { - return fmt.Errorf("dial controller: %w", err) - } - defer controllerConn.Close() - - err = controllerConn.CreateTopics(kafka.TopicConfig{ - Topic: topic, - NumPartitions: 1, - ReplicationFactor: 1, - }) - - if err != nil && !strings.Contains(err.Error(), "Topic with this name already exists") { - return fmt.Errorf("create topic %s: %w", topic, err) - } - - s.knownTopics[topic] = true - log.Printf("Topic pronto: %s", topic) return nil } func (s *Service) connectRabbitMQ() error { var err error - - // Connect with retry logic - for i := 0; i < 10; i++ { - s.amqpConn, err = amqp.Dial(s.config.RabbitMQURL) - if err == nil { - break - } - log.Printf("Failed to connect to RabbitMQ (attempt %d/10): %v", i+1, err) - time.Sleep(2 * time.Second) - } - + s.amqpConn, err = amqp.Dial(s.config.RabbitMQURL) if err != nil { - return fmt.Errorf("failed to connect to RabbitMQ after retries: %w", err) + return fmt.Errorf("failed to connect to RabbitMQ: %w", err) } - s.amqpChannel, err = s.amqpConn.Channel() if err != nil { return fmt.Errorf("failed to open channel: %w", err) } - // Declare queue (durable, to survive broker restarts) - _, err = s.amqpChannel.QueueDeclare( - s.config.QueueName, // name - true, // durable - false, // delete when unused - false, // exclusive - false, // no-wait - nil, // arguments - ) - if err != nil { - return fmt.Errorf("failed to declare queue: %w", err) - } - err = s.amqpChannel.QueueBind( - s.config.QueueName, // queue name - s.config.RoutingKey, // routing key (j.data.*.*) - s.config.ExchangeName, // exchange (amq.topic) - false, - nil, - ) - if err != nil { - return fmt.Errorf("Failed to bind queue: %v", err) - } - - // Set QoS (prefetch count) for load balancing - // This ensures each worker only gets N messages at a time - err = s.amqpChannel.Qos( - s.config.PrefetchCount, // prefetch count - 0, // prefetch size - false, // global - ) - if err != nil { + // QoS: start with configured prefetch + if err := s.amqpChannel.Qos(s.config.PrefetchCount, 0, false); err != nil { return fmt.Errorf("failed to set QoS: %w", err) } - log.Printf("Successfully connected to RabbitMQ, queue: %s", s.config.QueueName) return nil } func (s *Service) startConsuming(ctx context.Context) error { msgs, err := s.amqpChannel.Consume( - s.config.QueueName, // queue - "", // consumer tag (auto-generated) - false, // auto-ack (IMPORTANT: false for load balancing) - false, // exclusive - false, // no-local - false, // no-wait - nil, // args + s.config.QueueName, "", false, false, false, false, nil, ) if err != nil { return fmt.Errorf("failed to register consumer: %w", err) } - log.Println("Started consuming messages from RabbitMQ") + batch := make([]IncomingMessage, 0, s.config.BatchSize) + timer := time.NewTimer(s.config.BatchTimeout) go func() { + defer timer.Stop() for { select { case <-ctx.Done(): return case msg, ok := <-msgs: if !ok { - log.Println("Message channel closed") return } - s.handleMessage(msg) + incoming, valid := s.parseMessage(msg) + if !valid { + msg.Ack(false) + continue + } + batch = append(batch, incoming) + + if len(batch) >= s.config.BatchSize { + s.processBatch(batch) + batch = batch[:0] + if !timer.Stop() { + <-timer.C + } + timer.Reset(s.config.BatchTimeout) + } + case <-timer.C: + if len(batch) > 0 { + s.processBatch(batch) + batch = batch[:0] + } + timer.Reset(s.config.BatchTimeout) } } }() - return nil } -func (s *Service) handleMessage(delivery amqp.Delivery) { - // Parse the incoming message - - topic := strings.ReplaceAll(delivery.RoutingKey, ".", "/") - payload := delivery.Body - - log.Printf("Received message on topic %s", topic) - - // Parse topic: j/data/DEVID/TAG +func (s *Service) parseMessage(msg amqp.Delivery) (IncomingMessage, bool) { + topic := strings.ReplaceAll(msg.RoutingKey, ".", "/") parts := strings.Split(topic, "/") - if len(parts) != 4 || parts[0] != "j" || parts[1] != "data" { - log.Printf("Invalid topic format: %s, expected j/data/DEVID/TAG", topic) - delivery.Ack(false) - return + if len(parts) != 4 { + return IncomingMessage{}, false } - devID := parts[2] - tag := parts[3] - - // Parse JSON payload + devID, tag := parts[2], parts[3] var data map[string]any - if err := json.Unmarshal(payload, &data); err != nil { - log.Printf("Invalid JSON payload for topic %s: %v", topic, err) - delivery.Ack(false) - return + if err := json.Unmarshal(msg.Body, &data); err != nil { + return IncomingMessage{}, false } - // Extract timestamp var tsUnix int64 if tsFloat, ok := data["ts"].(float64); ok { tsUnix = int64(tsFloat) @@ -269,120 +166,113 @@ func (s *Service) handleMessage(delivery amqp.Delivery) { tsUnix = time.Now().Unix() } - ts := time.Unix(tsUnix, 0).UTC() + return IncomingMessage{ + Msg: msg, + DevID: devID, + Tag: tag, + TS: tsUnix, + TSStr: time.Unix(tsUnix, 0).UTC().Format(time.RFC3339), + Body: msg.Body, + }, true +} - // Insert into PostgreSQL +func (s *Service) processBatch(batch []IncomingMessage) { start := time.Now() - if err := s.insertData(tsUnix, ts, devID, tag, payload); err != nil { - log.Printf("Failed to insert data: %v", err) - // Negative acknowledgment with requeue - delivery.Nack(false, true) - return - } - log.Printf("Time to write to DB %v", time.Since(start)) - - // Forward to Kafka - start = time.Now() - kafkaTopic := sanitizeTopic(topic) - if err := s.ensureTopicExists(kafkaTopic); err != nil { - log.Printf("Error creating topic %s: %v", kafkaTopic, err) - delivery.Nack(false, true) - return - } - - log.Printf("Time to create topic %v", time.Since(start)) - start = time.Now() - - envelope := Envelope{ - TsUnix: tsUnix, - Ts: ts.Format(time.RFC3339), - DevID: devID, - Tag: tag, - PayloadJSON: payload, - } - - envelopeBytes, err := json.Marshal(envelope) + tx, err := s.db.Begin() if err != nil { - log.Printf("Failed to marshal envelope: %v", err) - delivery.Nack(false, true) + s.nackAll(batch) return } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - err = s.kafkaWriter.WriteMessages(ctx, kafka.Message{ - Topic: kafkaTopic, - Value: envelopeBytes, - }) + // Build multi-values INSERT + valueStrings := make([]string, 0, len(batch)) + valueArgs := make([]interface{}, 0, len(batch)*5) - if err != nil { - log.Printf("Failed to write to Kafka: %v", err) - delivery.Nack(false, true) - return + for i, m := range batch { + valueStrings = append(valueStrings, + fmt.Sprintf("($%d,$%d,$%d,$%d,$%d)", i*5+1, i*5+2, i*5+3, i*5+4, i*5+5)) + valueArgs = append(valueArgs, m.TS, m.TSStr, m.DevID, m.Tag, m.Body) } - log.Printf("Message forwarded to Kafka topic: %s", kafkaTopic) - log.Printf("Time to write to Kafka %v", time.Since(start)) - log.Printf("Successfully processed data for dev_id: %s, tag: %s", devID, tag) + stmt := fmt.Sprintf(`INSERT INTO trackeroo.data (ts_unix, ts, dev_id, tag, payload) + VALUES %s ON CONFLICT (ts, dev_id) DO NOTHING`, strings.Join(valueStrings, ",")) - // Acknowledge message only after successful processing - delivery.Ack(false) -} - -func (s *Service) insertData(tsUnix int64, ts time.Time, devID, tag string, payload json.RawMessage) error { - query := `INSERT INTO trackeroo.data (ts_unix, ts, dev_id, tag, payload) - VALUES ($1, $2, $3, $4, $5) - ON CONFLICT (ts, dev_id) DO NOTHING` - _, err := s.db.Exec(query, tsUnix, ts, devID, tag, payload) + _, err = tx.Exec(stmt, valueArgs...) if err != nil { - return fmt.Errorf("failed to insert into database: %w", err) + _ = tx.Rollback() + log.Println("Batch insert error:", err) + s.nackAll(batch) + return } - return nil -} -func (s *Service) Start(ctx context.Context) error { - if err := s.connectPostgres(); err != nil { - return err + if err := tx.Commit(); err != nil { + s.nackAll(batch) + return } - if err := s.connectRabbitMQ(); err != nil { - return err + // Kafka forward + ack + for _, m := range batch { + kafkaTopic := strings.ReplaceAll(m.Msg.RoutingKey, ".", "-") + _ = s.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ + Topic: kafkaTopic, + Value: m.Body, + }) + m.Msg.Ack(false) } - if err := s.connectKafka(); err != nil { - return err + latency := time.Since(start) + s.dbLatencies = append(s.dbLatencies, latency) + if len(s.dbLatencies) > 100 { + s.dbLatencies = s.dbLatencies[1:] } + log.Printf("✅ batch of %d inserted in %v", len(batch), latency) +} - if err := s.startConsuming(ctx); err != nil { - return err +func (s *Service) nackAll(batch []IncomingMessage) { + for _, m := range batch { + m.Msg.Nack(false, true) } - - return nil } -func (s *Service) Stop() { - log.Println("Shutting down service...") - - if s.amqpChannel != nil { - s.amqpChannel.Close() - log.Println("Closed RabbitMQ channel") - } +// Auto prefetch adjuster +func (s *Service) startPrefetchTuner(ctx context.Context) { + go func() { + current := s.config.PrefetchCount + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() - if s.amqpConn != nil { - s.amqpConn.Close() - log.Println("Closed RabbitMQ connection") - } + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + avgLatency := s.avgDbLatency() + q, err := s.amqpChannel.QueueInspect(s.config.QueueName) + if err != nil { + continue + } + if q.Messages > 1000 && avgLatency < 5*time.Millisecond && current < s.config.MaxPrefetch { + current += 5 + } else if q.Messages < 100 && avgLatency > 20*time.Millisecond && current > s.config.MinPrefetch { + current -= 5 + } + if err := s.amqpChannel.Qos(current, 0, false); err == nil { + log.Printf("Adjusted prefetch=%d (queue=%d, avgDB=%v)", current, q.Messages, avgLatency) + } + } + } + }() +} - if s.db != nil { - s.db.Close() - log.Println("Closed PostgreSQL connection") +func (s *Service) avgDbLatency() time.Duration { + if len(s.dbLatencies) == 0 { + return 0 } - - if s.kafkaWriter != nil { - s.kafkaWriter.Close() - log.Println("Closed Kafka writer") + var sum time.Duration + for _, l := range s.dbLatencies { + sum += l } + return sum / time.Duration(len(s.dbLatencies)) } func loadConfig() *Config { @@ -393,52 +283,57 @@ func loadConfig() *Config { RoutingKey: getEnvOrDefault("ROUTING_KEY", "j.data.*.*"), PostgresURL: getEnvOrDefault("POSTGRES_URL", "postgres://user:password@localhost/dbname?sslmode=disable"), KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), - PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 1), + PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 10), + BatchSize: getEnvOrDefaultInt("BATCH_SIZE", 50), + BatchTimeout: 500 * time.Millisecond, + MinPrefetch: 5, + MaxPrefetch: 100, } } -func getEnvOrDefault(key, defaultValue string) string { - if value := os.Getenv(key); value != "" { - return value +func getEnvOrDefault(key, def string) string { + if v := os.Getenv(key); v != "" { + return v } - return defaultValue + return def } -func getEnvOrDefaultInt(key string, defaultValue int) int { - if value := os.Getenv(key); value != "" { - var intVal int - if _, err := fmt.Sscanf(value, "%d", &intVal); err == nil { - return intVal +func getEnvOrDefaultInt(key string, def int) int { + if v := os.Getenv(key); v != "" { + var iv int + if _, err := fmt.Sscanf(v, "%d", &iv); err == nil { + return iv } } - return defaultValue -} - -func sanitizeTopic(topic string) string { - return strings.ReplaceAll(topic, "/", "-") + return def } func main() { - log.Println("Starting RabbitMQ to Kafka and PostgreSQL service...") - config := loadConfig() service := NewService(config) ctx, cancel := context.WithCancel(context.Background()) defer cancel() - if err := service.Start(ctx); err != nil { - log.Fatalf("Failed to start service: %v", err) + if err := service.connectPostgres(); err != nil { + log.Fatal(err) + } + if err := service.connectRabbitMQ(); err != nil { + log.Fatal(err) } + service.kafkaWriter = kafka.NewWriter(kafka.WriterConfig{ + Brokers: []string{config.KafkaBroker}, + Async: true, + }) - log.Println("Service started successfully") + if err := service.startConsuming(ctx); err != nil { + log.Fatal(err) + } + service.startPrefetchTuner(ctx) - // Wait for interrupt signal + log.Println("Service running...") c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) - <-c cancel() - service.Stop() - log.Println("Service stopped") } From b2cd10e194c74cd4b4c56f3d5f30f4edef55665d Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 10:51:49 +0200 Subject: [PATCH 098/242] changed to deployment and set autoscaling --- brokeroo/cmd/brokeroo/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index b6d815aa..7f4e203d 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -238,6 +238,7 @@ func (s *Service) nackAll(batch []IncomingMessage) { func (s *Service) startPrefetchTuner(ctx context.Context) { go func() { current := s.config.PrefetchCount + last := s.config.PrefetchCount ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() @@ -256,8 +257,12 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { } else if q.Messages < 100 && avgLatency > 20*time.Millisecond && current > s.config.MinPrefetch { current -= 5 } + if last == current { + continue + } if err := s.amqpChannel.Qos(current, 0, false); err == nil { log.Printf("Adjusted prefetch=%d (queue=%d, avgDB=%v)", current, q.Messages, avgLatency) + last = current } } } From e7705da198b39facf3aed77e4d1bf8cc1bf0a66a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 10:55:06 +0200 Subject: [PATCH 099/242] added autoscaling to trackeroo --- .../roles/brokeroo/defaults/main.yml | 2 +- .../playbooks/roles/brokeroo/tasks/main.yml | 1 + .../brokeroo/templates/01-deployment.yml.j2 | 24 ++++++++----------- .../roles/brokeroo/templates/03-hpa.yml.j2 | 20 ++++++++++++++++ .../roles/trackeroo/defaults/main.yml | 2 +- .../playbooks/roles/trackeroo/tasks/main.yml | 1 + .../trackeroo/templates/01-deployment.yml.j2 | 7 ++++++ .../roles/trackeroo/templates/03-hpa.yml.j2 | 20 ++++++++++++++++ 8 files changed, 61 insertions(+), 16 deletions(-) create mode 100644 services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 create mode 100644 services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 diff --git a/services/playbooks/roles/brokeroo/defaults/main.yml b/services/playbooks/roles/brokeroo/defaults/main.yml index 45b73a25..a659e662 100644 --- a/services/playbooks/roles/brokeroo/defaults/main.yml +++ b/services/playbooks/roles/brokeroo/defaults/main.yml @@ -3,5 +3,5 @@ brokeroo_app_name: brokeroo brokeroo_image: ghcr.io/skiby7/brokeroo:latest -brokeroo_replicas: 3 +brokeroo_replicas: 1 brokeroo_port: 8080 diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index b4bb75ef..8816125f 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -15,3 +15,4 @@ loop: - "01-deployment.yml.j2" - "02-service.yml.j2" + - "03-hpa.yml.j2" diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index cc1ae1e9..0fa09770 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -1,5 +1,5 @@ apiVersion: apps/v1 -kind: StatefulSet +kind: Deployment metadata: name: {{ brokeroo_app_name }} labels: @@ -25,25 +25,21 @@ spec: ports: - containerPort: {{ brokeroo_port }} env: - - name: MQTT_BROKER - value: "mqtt://rabbitmq:1883" - - name: MQTT_CLIENT_ID - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: MQTT_USERNAME - value: "apps" - - name: MQTT_PASSWORD - value: "apps" + - name: RABBITMQ_URL + value: "amqp://apps:apps@rabbitmq:5672/" + - name: PREFETCH_COUNT + value: "20" - name: POSTGRES_URL value: "postgres://apps:apps@tsdb-rw.data.svc.cluster.local:5432/tracker_db?sslmode=disable" - - name: TOPIC_PATTERN - value: "j/data/+/+" + - name: ROUTING_KEY + value: "j.data.*.*" - name: KAFKA_BROKER value: "kafka.data.svc.cluster.local:9092" + - name: BATCH_SIZE + value: "100" resources: requests: - cpu: "250m" + cpu: "100m" memory: "256Mi" limits: cpu: "1" diff --git a/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 b/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 new file mode 100644 index 00000000..d0598aef --- /dev/null +++ b/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 @@ -0,0 +1,20 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ brokeroo_app_name }}-hpa + labels: + app: {{ brokeroo_app_name }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ brokeroo_app_name }} + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 diff --git a/services/playbooks/roles/trackeroo/defaults/main.yml b/services/playbooks/roles/trackeroo/defaults/main.yml index 9967edaf..e05711e4 100644 --- a/services/playbooks/roles/trackeroo/defaults/main.yml +++ b/services/playbooks/roles/trackeroo/defaults/main.yml @@ -3,7 +3,7 @@ trackeroo_namespace: "trackeroo" trackeroo_app_name: "trackeroo-backend" trackeroo_image: "ghcr.io/skiby7/trackeroo-backend:latest" -trackeroo_replicas: 2 +trackeroo_replicas: 1 trackeroo_users_key: "{{ trackeroo_users_key_secret }}" trackeroo_service_ip: "10.20.30.55" diff --git a/services/playbooks/roles/trackeroo/tasks/main.yml b/services/playbooks/roles/trackeroo/tasks/main.yml index 93c96e38..8006cf4f 100644 --- a/services/playbooks/roles/trackeroo/tasks/main.yml +++ b/services/playbooks/roles/trackeroo/tasks/main.yml @@ -33,3 +33,4 @@ loop: - "01-deployment.yml.j2" - "02-service.yml.j2" + - "03-hpa.yml.j2" diff --git a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 index f40cc672..71fc78c3 100644 --- a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 @@ -91,3 +91,10 @@ spec: - name: certs-volume secret: secretName: rabbitmq-certs + resources: + requests: + cpu: "100m" + memory: "256Mi" + limits: + cpu: "1" + memory: "512Mi" diff --git a/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 b/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 new file mode 100644 index 00000000..4bd59be8 --- /dev/null +++ b/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 @@ -0,0 +1,20 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ trackeroo_app_name }}-hpa + labels: + app: {{ trackeroo_app_name }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ trackeroo_app_name }} + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 From 1deb3fc45758474419334e5bea62df11af43d4e3 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 10:59:55 +0200 Subject: [PATCH 100/242] added more devices --- services/playbooks/roles/mongo/files/init.js | 1802 +++++++++++++++++- 1 file changed, 1702 insertions(+), 100 deletions(-) diff --git a/services/playbooks/roles/mongo/files/init.js b/services/playbooks/roles/mongo/files/init.js index cc60bb57..83a7b36b 100644 --- a/services/playbooks/roles/mongo/files/init.js +++ b/services/playbooks/roles/mongo/files/init.js @@ -55,7 +55,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8414acfcb9165b1", name: "wonderful_wirth", - status: { connected: true, last_message: "2025-08-02T16:40:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "m9mFoEWSL+GwWtoyPZsF2q4HpwLddf7JfsxmedN8h+Y=", created_at: ISODate("2025-08-18T03:36:46Z"), @@ -63,7 +63,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c843cfc86452c8bc", name: "xenodochial_carmack", - status: { connected: false, last_message: "2025-08-18T20:34:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "QNiUX1DdBq9hNGToa8ynDbXZRF9aDbO4LWvm7QspLo8=", created_at: ISODate("2025-08-08T07:04:46Z"), @@ -71,7 +71,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8443834a667d6c2", name: "merry_schwinger", - status: { connected: false, last_message: "2025-08-10T14:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "mS+C+G6Ut4mrbmz6v3EA5Fm7OvtcwrcRzvLOoIyIRDw=", created_at: ISODate("2025-08-08T17:05:46Z"), @@ -79,7 +79,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8445101b3d3a3b8", name: "thirsty_henry", - status: { connected: false, last_message: "2025-08-22T18:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "4kKuUQSMJE9RckmbCFReQy5gtbRpY3sCgDjcTnxBxwI=", created_at: ISODate("2025-08-04T05:03:46Z"), @@ -87,7 +87,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8446943ffbf2df9", name: "admiring_bohr", - status: { connected: true, last_message: "2025-08-06T01:33:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "5mp9W9wUVd50eqGqC/JpW/0/pG6wBrAsivSPg0bcC2M=", created_at: ISODate("2025-08-25T16:35:46Z"), @@ -95,7 +95,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84480bd0ad4656f", name: "keen_bohr", - status: { connected: true, last_message: "2025-08-16T05:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "/3tiwn6woUzwRGe/TUqOZQNGvYWHYSHj4d/Fpq9eTS8=", created_at: ISODate("2025-08-01T14:09:46Z"), @@ -103,7 +103,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8449838a8eb28eb", name: "clever_fermi", - status: { connected: true, last_message: "2025-08-08T23:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "pveqq6guV0EAQANRpMOQq5Yd8iSaZSH6QUMynO0ke6g=", created_at: ISODate("2025-08-05T16:46:46Z"), @@ -111,7 +111,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844b01d0d668fce", name: "brave_schrodinger", - status: { connected: false, last_message: "2025-08-04T16:28:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "+NrhtHayxZYPZnqA+C1C6uth3bORje/ka5uxXZ3E2zQ=", created_at: ISODate("2025-08-04T20:21:46Z"), @@ -119,7 +119,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844cb262515236b", name: "youthful_stallman", - status: { connected: false, last_message: "2025-08-22T21:24:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "dkvOCYpkWXr3WZs62jH9LfjOAbhm0TapSNQvcIzijLA=", created_at: ISODate("2025-08-04T10:00:46Z"), @@ -127,7 +127,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844e58e640b9ea1", name: "friendly_curie", - status: { connected: true, last_message: "2025-08-21T03:51:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "1l0SNynykdBFZVNfGlkTYiniGlmk5KVgyW3bp8HI6xg=", created_at: ISODate("2025-08-05T23:57:46Z"), @@ -135,7 +135,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c844fccd26144714", name: "charming_dirac", - status: { connected: false, last_message: "2025-07-31T23:08:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "/Vi9D/RMiWilNw0jHA/fv4DbGwAEbqRAgQJulPl4DTQ=", created_at: ISODate("2025-08-08T18:10:46Z"), @@ -143,7 +143,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8451452004ec96d", name: "iron_franklin", - status: { connected: true, last_message: "2025-08-02T12:47:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "V0exZwne86ptOGifjuWX7QmGjpN1W62szV6+WxX9m5s=", created_at: ISODate("2025-08-07T12:55:46Z"), @@ -151,7 +151,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8456a397013ce6b", name: "gentle_church", - status: { connected: false, last_message: "2025-08-11T23:09:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "KH+3BS3QnEec8vME0ToemUn3mK9i0bwCg1ZlvgnRfkU=", created_at: ISODate("2025-08-15T20:23:46Z"), @@ -159,7 +159,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84581a0b80ca1c5", name: "practical_michelson", - status: { connected: false, last_message: "2025-08-11T11:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "ab3Wu7Glx9xhfSFUNRKzi1CZPfPeiCI7ujc/iJmYWpI=", created_at: ISODate("2025-08-04T21:37:46Z"), @@ -167,7 +167,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845ad105b9a60db", name: "phenomenal_born", - status: { connected: false, last_message: "2025-08-23T09:48:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "h3dT1JuyA/MhH1/o/n/IiPRFEyyEvXlMl3ZNtrCHZwY=", created_at: ISODate("2025-08-06T01:48:46Z"), @@ -175,7 +175,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845c8050d2973c1", name: "agitated_planck", - status: { connected: false, last_message: "2025-08-20T06:43:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "l/TRQN08IpMfwVHCWHpcNQ/SBuRWLeNcuJZDf28697c=", created_at: ISODate("2025-08-12T01:20:46Z"), @@ -183,7 +183,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845df659619c7e6", name: "determined_kelvin", - status: { connected: true, last_message: "2025-08-16T14:01:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "MlxmbBIfcGNpReS6GUgLDmTRrDDQQ6rlLxj4Eggrfjo=", created_at: ISODate("2025-08-10T07:50:46Z"), @@ -191,7 +191,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c845f5d103e908ad", name: "thoughtful_weber", - status: { connected: false, last_message: "2025-08-18T05:54:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "WGmlcdPBvesFWds8BZ4UR4k7ze/25P1GpWhXaSmgNDQ=", created_at: ISODate("2025-08-04T22:08:46Z"), @@ -199,7 +199,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8460bf33167dbdc", name: "hyper_shockley", - status: { connected: false, last_message: "2025-08-17T20:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "BzHUYgawXJvf458ZW6fLaKxbTEoOXBI1pgI4Z5ebMuM=", created_at: ISODate("2025-08-17T07:01:46Z"), @@ -207,7 +207,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8462309d5e746cc", name: "pious_planck", - status: { connected: true, last_message: "2025-08-12T19:59:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "DMAF8lJbDW/hdBvKttHueeokLXgQ9nlcTQBDMfypO4w=", created_at: ISODate("2025-08-15T02:45:46Z"), @@ -215,7 +215,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84640a54b9bd528", name: "heuristic_fermi", - status: { connected: true, last_message: "2025-08-02T15:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "+crZGHsZ6r5ZN0UMsB0JFK/hveE6E267uzcAGdkQAZQ=", created_at: ISODate("2025-08-09T02:32:46Z"), @@ -223,7 +223,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846577d4ec97cfb", name: "sharp_edison", - status: { connected: true, last_message: "2025-08-14T03:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "eW16LWeR4CcKm0mRqkBnv9lU6WYKXyzS8csOmoTwt+c=", created_at: ISODate("2025-08-21T01:54:46Z"), @@ -231,7 +231,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8466e529b599dc4", name: "romantic_hertz", - status: { connected: true, last_message: "2025-08-30T03:20:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "kbRJ702ADyEPki+ko7MbOZ7AGvhKPSql5A7fK6MGFGI=", created_at: ISODate("2025-08-17T20:13:46Z"), @@ -239,7 +239,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84685251cdaf35c", name: "gallant_whitehead", - status: { connected: true, last_message: "2025-08-05T15:55:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "ZeGHStsNcbp56gDEk+nasq/BaaLklfzXfuG8BcX+lrs=", created_at: ISODate("2025-08-28T00:41:46Z"), @@ -247,7 +247,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8469c00840cc49b", name: "laughing_rutherford", - status: { connected: false, last_message: "2025-08-13T10:56:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "n0LNbNhaIaW42aBkqCwDM0cJSwcwL8McL8im5CP91v4=", created_at: ISODate("2025-08-29T17:24:46Z"), @@ -255,7 +255,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846b3600123a417", name: "sad_marconi", - status: { connected: true, last_message: "2025-08-05T23:52:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "g2D4mb6ezOrfK/ft41lACByyeU4IQVF6RWlB/0P7zhc=", created_at: ISODate("2025-08-15T07:38:46Z"), @@ -263,7 +263,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846ca7bab489e30", name: "clever_newton", - status: { connected: true, last_message: "2025-08-18T06:39:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "hGz/4/osEsLT/5Q53TTlID+wA54Xb2p8Cxpj05jZsik=", created_at: ISODate("2025-08-18T00:25:46Z"), @@ -271,7 +271,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c846e0a3e38974e5", name: "dazzling_maxwell", - status: { connected: false, last_message: "2025-08-10T04:46:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "KSG9WiZ6pWINfm9FH9vS/GSo3t1TmLf+eE5eGhU+Hik=", created_at: ISODate("2025-08-05T06:51:46Z"), @@ -279,7 +279,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c847064ce1bdf7ee", name: "elegant_lagrange", - status: { connected: true, last_message: "2025-08-28T18:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "tlrnwpslaBwOChP+dAFPQ2sfItsoKERU+MR33NHk9yQ=", created_at: ISODate("2025-08-19T09:04:46Z"), @@ -287,7 +287,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8472b9f0905b3ad", name: "ecstatic_riemann", - status: { connected: true, last_message: "2025-08-05T19:27:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "5v94oQP8pNQZrOZrYNTTl5c67qyrPDUJE4eZTfuBjVU=", created_at: ISODate("2025-08-08T11:59:46Z"), @@ -295,7 +295,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84742df27b88f6b", name: "cranky_ampere", - status: { connected: false, last_message: "2025-08-19T19:18:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "cS34G/an+Z+MM1M5P5dh48B+y4kjyy0eI/8cw4ClkT4=", created_at: ISODate("2025-08-08T18:36:46Z"), @@ -303,7 +303,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84759c8a9ef04f8", name: "energetic_hilbert", - status: { connected: true, last_message: "2025-08-25T05:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "EInJWD1jh2t06pz3D5WZjspYvxzqs57NRKAxVhe9uIk=", created_at: ISODate("2025-08-28T01:57:46Z"), @@ -311,7 +311,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84770f5153b97ef", name: "amazing_turing", - status: { connected: false, last_message: "2025-08-10T10:51:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "X9Lx6+KllLFtNDyvj/466CrOQmF6UewS+3xs9j18ILA=", created_at: ISODate("2025-08-03T11:49:46Z"), @@ -319,7 +319,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84786f21e4edc5e", name: "happy_einstein", - status: { connected: true, last_message: "2025-08-21T12:01:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "wzTOvpERsSN6QO4jgUD3XuRtcdqQLItdjSxSgrKmcoo=", created_at: ISODate("2025-08-17T21:31:46Z"), @@ -327,7 +327,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8479d828433ff9a", name: "funny_peano", - status: { connected: true, last_message: "2025-08-11T05:13:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "cqseF4l1F5lAgCe7bD6EP+rEE+L1wFhc+10MQV48UJo=", created_at: ISODate("2025-08-24T04:47:46Z"), @@ -335,7 +335,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c847b3e74258eb03", name: "vibrant_thompson", - status: { connected: false, last_message: "2025-08-15T07:02:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "O0XXGhe7rp/EsEYyXNAGIKjJk5T+FXCAdebGqh/dluo=", created_at: ISODate("2025-08-16T09:54:46Z"), @@ -343,7 +343,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8480b18fe88b4af", name: "patient_wu", - status: { connected: false, last_message: "2025-08-21T22:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "bHzGkyOqJLG9GAnkC25B2OLoXhQhIUu3bPVIE9sBlzU=", created_at: ISODate("2025-08-24T18:56:46Z"), @@ -351,7 +351,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84823aa3e06b7da", name: "epic_cantor", - status: { connected: true, last_message: "2025-08-07T10:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "G7MRIMBP24R0xdEXZRIV3me9dDDFRdxtTXuLXe28494=", created_at: ISODate("2025-08-02T10:17:46Z"), @@ -359,7 +359,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8483aeb4dce2724", name: "hopeful_bardeen", - status: { connected: true, last_message: "2025-08-30T06:16:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "Xd5a7XzvWCVjDtduORbuAH1sykFtGHcvAhK/4BadcaI=", created_at: ISODate("2025-08-06T23:01:46Z"), @@ -367,7 +367,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8486259917b5535", name: "frosty_dedekind", - status: { connected: false, last_message: "2025-08-07T10:35:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "I0ahyNHzwY2ax1RTIwkdAW1+4eErU6s1WISzCED2ImI=", created_at: ISODate("2025-08-05T02:16:46Z"), @@ -375,7 +375,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8487a58b5c5651d", name: "heartwarming_bose", - status: { connected: true, last_message: "2025-08-15T11:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "LsgbCoMQG+opSUt9JrsiDIL4Z1k5VU+WnTGajUsfRMU=", created_at: ISODate("2025-08-04T01:01:46Z"), @@ -383,7 +383,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848919ae0a5ac8f", name: "kind_torvalds", - status: { connected: false, last_message: "2025-08-02T19:55:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "ij0mk0VXVo7nsb0cqpGJX0V5oChhDa830+CJ72ZW8xk=", created_at: ISODate("2025-08-20T23:21:46Z"), @@ -391,7 +391,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848b620cb14aa25", name: "fascinated_noether", - status: { connected: false, last_message: "2025-08-20T21:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "XJVLbd6UO12QkuIGo3EbZGXjG4xPKSvliiOLRLnMZmI=", created_at: ISODate("2025-08-09T07:11:46Z"), @@ -399,7 +399,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848d48480a5d5b6", name: "puzzled_fizeau", - status: { connected: true, last_message: "2025-08-22T09:43:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "ceSr36+tty8/YgIQuT7V66kMAXhi+K2JPN7EqEF7r3Y=", created_at: ISODate("2025-08-02T11:41:46Z"), @@ -407,7 +407,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c848eb34f8760e19", name: "competent_rutherford", - status: { connected: true, last_message: "2025-08-04T03:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "e8kkc8+QotgP718tO8zL2+ukDwUiNfSmRl3UQFKnEwc=", created_at: ISODate("2025-08-02T23:24:46Z"), @@ -415,7 +415,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8490334a6303366", name: "pedantic_pauli", - status: { connected: true, last_message: "2025-08-30T09:45:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "kXVOIOGZGLfPzYCPK55aVbR15kbwTZr9ezA6zSxHEig=", created_at: ISODate("2025-08-05T01:38:46Z"), @@ -423,7 +423,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8491a91b1f888a9", name: "magical_dirac", - status: { connected: false, last_message: "2025-08-08T15:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "C9biy8JKSu1nQCKQxGTjuxkjHr4W46086h3KwjVBr/I=", created_at: ISODate("2025-08-05T22:46:46Z"), @@ -431,7 +431,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84931d6fa2d6232", name: "serene_tesla", - status: { connected: false, last_message: "2025-08-03T19:17:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "xPGoSwT+dTYd6ZX1++0+CJC8iEwVscx3VoDDI+LXWw8=", created_at: ISODate("2025-08-05T07:06:46Z"), @@ -439,7 +439,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8494897112ba78e", name: "peaceful_pascal", - status: { connected: true, last_message: "2025-08-05T08:37:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "WAVVSnHd8206VRwJOtgHDuUGDf0orqqYBIqodJA9L1I=", created_at: ISODate("2025-08-15T05:44:46Z"), @@ -447,7 +447,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8495fd71857ce3f", name: "stoic_ohm", - status: { connected: false, last_message: "2025-08-22T12:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "vzDwSMp/L6oyVEyYj3RKTY9UKyBj3V7LvhCD6cqe/nI=", created_at: ISODate("2025-08-22T20:43:46Z"), @@ -455,7 +455,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84976fefd57d1ff", name: "fearless_galois", - status: { connected: false, last_message: "2025-08-10T16:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "PoHtJ2l8pTjJPJctSMrIII20agqTIk4LpVoiIdNLzgo=", created_at: ISODate("2025-08-03T14:47:46Z"), @@ -463,7 +463,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c8498d777941e066", name: "distracted_planck", - status: { connected: true, last_message: "2025-08-24T07:49:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "W8F6g6HmjQAP3lwJjRqAfdQOIOsSq1vzEVbHMS8ZUAo=", created_at: ISODate("2025-08-21T20:41:46Z"), @@ -471,7 +471,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849a50c845c25a9", name: "optimistic_babbage", - status: { connected: true, last_message: "2025-08-12T09:06:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "zpX14uHmth5/ZzzNaL68qeoHLJRZjT3huaYns0LmnWU=", created_at: ISODate("2025-08-06T17:19:46Z"), @@ -479,7 +479,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849bd6d485879c1", name: "tender_faraday", - status: { connected: true, last_message: "2025-08-10T12:57:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "O8XxluA24EC4bsgPrBHWCwS8q8GmBK7mv0byordbYc8=", created_at: ISODate("2025-08-13T13:09:46Z"), @@ -487,7 +487,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c849d409351613c2", name: "jaunty_pauling", - status: { connected: true, last_message: "2025-08-27T07:44:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "OLbAlVzxkhzr2wlaO/WV8fCB/m4jJQ5AIfrJ0tUgF0A=", created_at: ISODate("2025-08-20T22:21:46Z"), @@ -495,7 +495,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a2e54a6ffdd76", name: "suspicious_volta", - status: { connected: true, last_message: "2025-08-03T18:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "S30Z2mlkvsUR6yH8nULY8RqPhmUcxEHEcEVuP7ePmSM=", created_at: ISODate("2025-08-10T10:53:46Z"), @@ -503,7 +503,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a5f766256c9e2", name: "serene_hopper", - status: { connected: true, last_message: "2025-08-13T10:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "DTOj/Y2DiO0Ju5vwxOUgBtwXB5579pz30EEMYun7z00=", created_at: ISODate("2025-08-18T16:45:46Z"), @@ -511,7 +511,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84a892c3aad3955", name: "eager_gauss", - status: { connected: false, last_message: "2025-08-06T19:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "Dl4fLpzCBXqNHjtrgm+5jrj+tSXPZRxttltQPvr/JcY=", created_at: ISODate("2025-08-29T10:30:46Z"), @@ -519,7 +519,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84aa049b09a2169", name: "eager_darwin", - status: { connected: true, last_message: "2025-08-10T19:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "EC7AoSY05EyPbRVEl/eGTSfESGXZZ4OWF5FsPcaKdTU=", created_at: ISODate("2025-08-24T18:39:46Z"), @@ -527,7 +527,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ab6d05b8082ad", name: "hardcore_bell", - status: { connected: true, last_message: "2025-08-25T03:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "Ar3WbxWHU8l2uyOZPnqJffGQ9vJpXAovM/ZoNRYd9RA=", created_at: ISODate("2025-08-20T22:33:46Z"), @@ -535,7 +535,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84acd0d1c7fc74a", name: "enchanting_poincare", - status: { connected: false, last_message: "2025-08-12T07:20:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "0HbmI0I5esubDm4b6XvzgLgHJtXVxGTeIt4EiHJAKc0=", created_at: ISODate("2025-08-08T23:41:46Z"), @@ -543,7 +543,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ae3dffff2e52d", name: "proud_morley", - status: { connected: true, last_message: "2025-08-17T10:23:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "NYrTqrlsGqPo9r6nKF2+bVd+QshvHb00Z676LpK3R00=", created_at: ISODate("2025-08-30T11:59:46Z"), @@ -551,7 +551,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84afa2c10aa6c55", name: "inspiring_bardeen", - status: { connected: false, last_message: "2025-08-15T18:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "6dU2H5RdD5VaZyXi5ZWaj5rkydlEV5f2PS1l9+fvL+c=", created_at: ISODate("2025-08-07T16:21:46Z"), @@ -559,7 +559,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b11c367999861", name: "objective_glashow", - status: { connected: true, last_message: "2025-08-26T14:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "uW2kufM6EeR+tpJHDYRmd/5CPGLMn84jMBsu6mhWtRU=", created_at: ISODate("2025-08-19T03:27:46Z"), @@ -567,7 +567,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b2feca3792861", name: "modest_dyson", - status: { connected: false, last_message: "2025-08-25T10:25:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "5XYG/w/clJolar2hAO3n4D9+fJdckv7i0ZO0S2m2KRo=", created_at: ISODate("2025-08-02T00:09:46Z"), @@ -575,7 +575,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b469627a640d9", name: "boring_heisenberg", - status: { connected: false, last_message: "2025-08-25T03:19:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "EHPvNh8KnmQNbD8Kef2UZh+07Y6DiHKpNwTuuIcyemo=", created_at: ISODate("2025-08-10T16:52:46Z"), @@ -583,7 +583,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b5cae4cff3133", name: "strange_ampere", - status: { connected: true, last_message: "2025-08-28T04:31:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "fUqc7PB2fR3likQIUigerur96bUzz7dQZE/lMUiMJHY=", created_at: ISODate("2025-08-08T07:02:46Z"), @@ -591,7 +591,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b74702fe3e85c", name: "faithful_hardy", - status: { connected: false, last_message: "2025-08-27T20:37:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "etflzQEpsxaJqAlO2o/G45T+s80cWWaSV0KPobuWWFE=", created_at: ISODate("2025-08-02T15:50:46Z"), @@ -599,7 +599,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84b8b83746dbc8b", name: "eloquent_leibniz", - status: { connected: true, last_message: "2025-08-14T14:03:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "nwdfO4d3o5nmJsO/i8xQrgcjsa2KNSQQ9PQzgMNbEc8=", created_at: ISODate("2025-08-13T23:17:46Z"), @@ -607,7 +607,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ba2911c4a675e", name: "cool_ohm", - status: { connected: false, last_message: "2025-08-12T06:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "7TXa0utsnnJXx7tHWYt5KC8nwv1xThn8iy12KI2zOvE=", created_at: ISODate("2025-08-12T01:49:46Z"), @@ -615,7 +615,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84bde9e8b791f18", name: "fervent_abel", - status: { connected: true, last_message: "2025-08-03T23:36:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "1doRBvIJsrXQIG1Ui9albOMUHxMjtrjU6VvNLZTZQak=", created_at: ISODate("2025-08-29T22:05:46Z"), @@ -623,7 +623,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84bf63dcc1fb3e7", name: "groovy_shannon", - status: { connected: true, last_message: "2025-08-10T16:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "4NnTHCSG64xQf807OjIJlzc+MdgrOv9/a83gDgRzUwQ=", created_at: ISODate("2025-08-16T23:38:46Z"), @@ -631,7 +631,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c23101fa0a8b6", name: "grieving_wiener", - status: { connected: true, last_message: "2025-08-14T09:38:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "BpChhURWcEyErTfXhnx6J9gg4L+Qy4FyWzdeL6e27u4=", created_at: ISODate("2025-08-14T21:20:46Z"), @@ -639,7 +639,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c3ae0fd8aad7e", name: "optimized_higgs", - status: { connected: false, last_message: "2025-08-21T14:05:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "csXqVuqw2AXm2A46aCt97ytsUzs5pA6t5Jnit25JFkI=", created_at: ISODate("2025-08-15T19:27:46Z"), @@ -647,7 +647,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c5151bb792931", name: "boring_wozniak", - status: { connected: true, last_message: "2025-08-08T02:27:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "X3CHEXehWzXvRfQAJ6GGCoeEbVPcdX95JCzT3uEBYSs=", created_at: ISODate("2025-08-02T10:22:46Z"), @@ -655,7 +655,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c678173241105", name: "curious_feynman", - status: { connected: false, last_message: "2025-08-21T18:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "XxN0HpCbfzUE2AMRPcteDPSRLT5YgnAy4ILOxwIzm/g=", created_at: ISODate("2025-08-26T19:07:46Z"), @@ -663,7 +663,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c7e6385d059d6", name: "noble_weinberg", - status: { connected: true, last_message: "2025-08-07T01:06:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "SZzpdjeGSaaWEBBa8apWtQJdwscbjyJ4jC/nXgnxJu4=", created_at: ISODate("2025-08-21T16:34:46Z"), @@ -671,7 +671,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84c9470140d32f6", name: "upbeat_ritchie", - status: { connected: false, last_message: "2025-08-10T09:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "65mhzIpZvOx51yE6nPxQgjgy3rwlv13lMSM5X7vEFeQ=", created_at: ISODate("2025-08-01T12:55:46Z"), @@ -679,7 +679,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84caba1375500b4", name: "quizzical_doppler", - status: { connected: true, last_message: "2025-08-11T14:42:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "t/9N9FYcN12suJ/nZl5q6jC7OAWv0h2Pow6vJBSr4dA=", created_at: ISODate("2025-08-29T00:09:46Z"), @@ -687,7 +687,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cc3de436f7bde", name: "silly_westinghouse", - status: { connected: true, last_message: "2025-08-28T04:22:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "Ba4MVIb1YQL6dm2eYRiJOX0CljrdeuFtAI2HZ3nBtsE=", created_at: ISODate("2025-08-02T07:07:46Z"), @@ -695,7 +695,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cdbbc4c9327d2", name: "dreamy_tesla", - status: { connected: true, last_message: "2025-08-12T22:50:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "/kDru3xkiT7oAfKFD4Mp6nVl5IIFEMXponchC0ojKlo=", created_at: ISODate("2025-08-01T00:21:46Z"), @@ -703,7 +703,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84cf3df4741680f", name: "jovial_mendeleev", - status: { connected: true, last_message: "2025-08-06T08:10:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "voqhD27X8L+VW4e/Op93AyazBBx/a7mqhTbAsvn6tnc=", created_at: ISODate("2025-08-26T23:38:46Z"), @@ -711,7 +711,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d0b5fc332f041", name: "great_kolmogorov", - status: { connected: false, last_message: "2025-08-14T09:59:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "TH/tO2mmlgP3dnH6h+ickwu8IaEajnm+DpvDLcAZDC8=", created_at: ISODate("2025-08-29T11:27:46Z"), @@ -719,7 +719,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d2247a477b6ff", name: "interesting_watson", - status: { connected: true, last_message: "2025-08-20T09:29:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "other", private_key: "ZBNn287pTaxPwGShBOOICVcZDmQbcdr2vtmLYbelgoU=", created_at: ISODate("2025-08-19T19:46:46Z"), @@ -727,7 +727,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d385e1d5c7bbc", name: "zealous_berners", - status: { connected: true, last_message: "2025-08-04T11:23:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "5Wx/7819jHalM4yOsTrhtswnTS8ItR5/n0BEaYFotQM=", created_at: ISODate("2025-08-18T18:58:46Z"), @@ -735,7 +735,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d62f4adb3c923", name: "condescending_volta", - status: { connected: true, last_message: "2025-08-15T00:32:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "CKwOOv0LRsGpDURy9iXE9tnUFdjtI6ZqtAFoJkal360=", created_at: ISODate("2025-08-26T02:07:46Z"), @@ -743,7 +743,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84d9ce75be19956", name: "adoring_morse", - status: { connected: false, last_message: "2025-08-28T04:09:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "iL0T7kaXpwPrO6Z0mA7Kk2Gs+tHEBl6fNSbFV3rSgVM=", created_at: ISODate("2025-08-04T14:20:46Z"), @@ -751,7 +751,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84db5aa45ada38e", name: "elastic_fourier", - status: { connected: true, last_message: "2025-08-22T06:00:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "8loHVYewF31YJGSlkcOrMZpfc5eQ2DFhuvpne8M68Xc=", created_at: ISODate("2025-08-09T06:44:46Z"), @@ -759,7 +759,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84dccaa3ac843bd", name: "thrilled_gauss", - status: { connected: false, last_message: "2025-08-14T07:07:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "jhESuO3AwXCtX0TcH5E9l91DDRUUx3SIErqpjt+SpUk=", created_at: ISODate("2025-08-25T19:51:46Z"), @@ -767,7 +767,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84de3a8df5efbcc", name: "goofy_markov", - status: { connected: false, last_message: "2025-08-20T02:12:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "1bmj0Qvq4D9EsyHZJpITpEqEBBrOcD9KsiUhDX4X7R4=", created_at: ISODate("2025-08-27T19:33:46Z"), @@ -775,7 +775,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84dfa6590d8fbda", name: "relaxed_turing", - status: { connected: true, last_message: "2025-08-29T02:47:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "bMvQyF6Lu/h5zYPEn4TBAOAxjVj67QTXl3ifZYf3S7s=", created_at: ISODate("2025-08-09T23:16:46Z"), @@ -783,7 +783,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e12b161fb52f1", name: "exciting_godel", - status: { connected: true, last_message: "2025-08-19T23:11:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "L+ZecOMBWt0L7Ix8sPW8MZpDskk30MZydLOV1av++fk=", created_at: ISODate("2025-08-30T12:59:46Z"), @@ -791,7 +791,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e2a4a52da79d9", name: "sweet_galvani", - status: { connected: false, last_message: "2025-08-29T21:21:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "dDVOk5b+i7+npM3o7icJocZSNFaed64RKX6HuxK5TTk=", created_at: ISODate("2025-08-22T08:08:46Z"), @@ -799,7 +799,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e473a6d897698", name: "fabulous_ramanujan", - status: { connected: false, last_message: "2025-08-18T06:15:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "n/7uqrA1Xh7uzYaX4BouodyLFlU/HWXMF3Gjd5gRN6g=", created_at: ISODate("2025-08-19T16:05:46Z"), @@ -807,7 +807,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e67b817e2a8fd", name: "trusting_knuth", - status: { connected: true, last_message: "2025-08-28T09:04:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "private_transport", private_key: "frrz+vzXLVQV4HHhZf7MFMPo4iGIJQWsgSPIkHKJ8OE=", created_at: ISODate("2025-08-01T15:20:46Z"), @@ -815,7 +815,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e7f725b9dd529", name: "quirky_shannon", - status: { connected: false, last_message: "2025-08-16T17:49:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "443NJMtr5p+i0QIA8th2B9QTsh3aKhI1p51G0uwN1iQ=", created_at: ISODate("2025-08-09T21:36:46Z"), @@ -823,7 +823,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84e95effa9dc925", name: "nervous_hawking", - status: { connected: true, last_message: "2025-08-15T23:40:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "food", private_key: "XTAux5J/tThXxN+5AoXR61Pxm0nfvJ92SOpCVo9HVpk=", created_at: ISODate("2025-08-18T09:24:46Z"), @@ -831,7 +831,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84eaef489342f7e", name: "exotic_turing", - status: { connected: true, last_message: "2025-08-03T15:10:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "public_transport", private_key: "rrNb0cdFEBeDwGfwZXv8U1VqHz4QfxT6Re+o+HR8vGA=", created_at: ISODate("2025-08-16T03:12:46Z"), @@ -839,7 +839,7 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ec5eea3a8dae1", name: "gifted_kleene", - status: { connected: true, last_message: "2025-08-12T00:58:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "EaBPc3d6Edkfi3YYxsqc+sAMILGwn2RbsIkB4zmnSU0=", created_at: ISODate("2025-08-24T06:35:46Z"), @@ -847,9 +847,1611 @@ db.devices.insertMany([ { _id: "trk-18608d12c84ee5a2e49c6f83", name: "lucid_heisenberg", - status: { connected: true, last_message: "2025-08-08T11:32:46Z" }, + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, device_type: "valuable", private_key: "Rb/XilBAyjcoGfgM4JkwZbZNEZsdf5pNWUXtF9/NqR8=", created_at: ISODate("2025-08-19T05:39:46Z"), }, + + { + _id: "trk-186e120746e18c690d2440c6", + name: "busy_torvalds", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "zlaKfT1zfiGUFjuxVy2BuM9SqDVikurwVXUEmjbeuX0=", + created_at: ISODate("2025-09-26T01:56:26Z"), + }, + { + _id: "trk-186e120746e5100364a0d88c", + name: "kind_galvani", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "HaEBIVX8wM6DzAJe5H/efqhCLc+y/4Z0tk3qgN5G/KE=", + created_at: ISODate("2025-10-04T02:03:26Z"), + }, + { + _id: "trk-186e120746e53a7f8b9db50a", + name: "vibrant_abel", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "U9zhxIXPRmXASGaAW2rJ/MHIDQAhlc8/kO4bS/9V8wU=", + created_at: ISODate("2025-09-17T17:58:26Z"), + }, + { + _id: "trk-186e120746e5561da2248999", + name: "beautiful_lee", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "PSGrRaqjl2pJybbEnj17F31N/AncTgx7n1A+32GGzgU=", + created_at: ISODate("2025-10-10T15:37:26Z"), + }, + { + _id: "trk-186e120746e571646ff6b00c", + name: "agitated_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "/jxYt11fVWtx9+OLZcmO0664Lshxu+L9+Er2/DB5j8I=", + created_at: ISODate("2025-09-15T22:14:26Z"), + }, + { + _id: "trk-186e120746e592b6ef437676", + name: "serene_knuth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "TBkHjWmYDA0m2prmSZqqk7wKO3FMAjNfNcwLbamTl14=", + created_at: ISODate("2025-09-18T02:02:26Z"), + }, + { + _id: "trk-186e120746e5b57fe57e549f", + name: "boring_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "r5PJU83UZ0IsuJuMgFEZJy41dymcmoOCTVTGNe+fYp4=", + created_at: ISODate("2025-09-16T16:44:26Z"), + }, + { + _id: "trk-186e120746e5d2cfd3ad47f8", + name: "proud_curie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "rwrEdWc3CovyYsAYXvhIojm2vM7RQf7R4waNRm7rZDQ=", + created_at: ISODate("2025-09-18T01:04:26Z"), + }, + { + _id: "trk-186e120746e5f3b0e0bd40a6", + name: "epic_hopper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "NH0AzwhXWUdFM8m6r6FVT+2C2f9KsD++CHWAqRsrCIg=", + created_at: ISODate("2025-09-25T17:10:26Z"), + }, + { + _id: "trk-186e120746e61249f492cc92", + name: "fervent_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "IpaYNNClPfrs776+wldgliZ/UenF/fN5qlY6R+R99kA=", + created_at: ISODate("2025-09-26T00:33:26Z"), + }, + { + _id: "trk-186e120746e62e8b1e50c009", + name: "optimistic_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "dPgcLmsJh0nU5IyAjyhyCfHij0NkswJC7aLqhGnKdE4=", + created_at: ISODate("2025-10-01T22:39:26Z"), + }, + { + _id: "trk-186e120746e6498c6e55e12f", + name: "keen_ohm", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "6sBH2HqlO06ZS6qpAZ75i/0LOb5FEWXK+bbBfyTDZrU=", + created_at: ISODate("2025-09-23T09:49:26Z"), + }, + { + _id: "trk-186e120746e6a53392e5a1d6", + name: "dreamy_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "AdaUNQ0ddcyYZlMHzoFPFDiM+lQS9akdrF086C5uvnU=", + created_at: ISODate("2025-09-19T01:06:26Z"), + }, + { + _id: "trk-186e120746e6c07ef43e3d13", + name: "outstanding_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "yVvpMOeozwtyH1gS4y8hrDO9hftYbwpzjZeVPwwYwZs=", + created_at: ISODate("2025-09-21T03:27:26Z"), + }, + { + _id: "trk-186e120746e70513852edb0f", + name: "faithful_knuth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "8GbhtHVXcN9Yyi41F2wh/aR5Wdarq9uvYZLMoOyD8NM=", + created_at: ISODate("2025-10-09T08:08:26Z"), + }, + { + _id: "trk-186e120746e7235b73eb8923", + name: "modest_gauss", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "NmFP6t/trYYOSAQLQgdDJhheahC7kO3kDwuwEFLqeCE=", + created_at: ISODate("2025-10-10T04:12:26Z"), + }, + { + _id: "trk-186e120746e74151fb9b3cf6", + name: "clever_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "K4eXVoUnDViQyeemkL77tJ7PLSTA5LB+dLqNtd8OfH4=", + created_at: ISODate("2025-09-17T02:43:26Z"), + }, + { + _id: "trk-186e120746e75e602ef60dd6", + name: "determined_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "T6f5G5JQUuSrCJ9DnXquzN4IXarA+Og67HsRUQU1eHY=", + created_at: ISODate("2025-10-13T13:50:26Z"), + }, + { + _id: "trk-186e120746e77af4a17ef004", + name: "fervent_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "+klSDF5Jvl3Cjkjr/GwKxBwusArwojYmcgURQQT6DPs=", + created_at: ISODate("2025-09-23T21:27:26Z"), + }, + { + _id: "trk-186e120746e798d285808a70", + name: "bold_fourier", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "4zwMIKqs8mtNveECyMvcFt+K7OedZ+MnOS6o42EUEWU=", + created_at: ISODate("2025-09-17T06:50:26Z"), + }, + { + _id: "trk-186e120746e7b4c678103ccf", + name: "boring_hardy", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "9cgnzOXmKaVWCBpvyfEC1rIo2coYrpOPrW2ZcvmHO9E=", + created_at: ISODate("2025-09-24T18:31:26Z"), + }, + { + _id: "trk-186e120746e7d271ec706172", + name: "sleepy_pauling", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "2+j+X2Im01XBzllw/xpq1fq8M2TxlOos/ClmmD0Gzaw=", + created_at: ISODate("2025-10-10T06:17:26Z"), + }, + { + _id: "trk-186e120746e7ef79f6ee0e1b", + name: "exotic_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "E+6m5pEZbh0VyR2hmRRe4xJ4HzGBUn3qAVxCu0jeydY=", + created_at: ISODate("2025-10-12T18:18:26Z"), + }, + { + _id: "trk-186e120746e80afd0d8d37e1", + name: "beautiful_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "SMPBDRGLD9aVElnzLvrsHyRgrM4ywaxwQa+ybapdStM=", + created_at: ISODate("2025-09-24T17:20:26Z"), + }, + { + _id: "trk-186e120746e833b3dfa6e5ff", + name: "jovial_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "X9ZHSPIBXi5gsoXM0LO7Lsuv8LbVA8EMv/y/J8jXKMc=", + created_at: ISODate("2025-10-01T03:02:26Z"), + }, + { + _id: "trk-186e120746e851854660544e", + name: "serene_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "L82m2B58IsoddlmF+eoMnwMpmn3VEBQiAjxGlx854CA=", + created_at: ISODate("2025-09-17T21:44:26Z"), + }, + { + _id: "trk-186e120746e86e09d1953e23", + name: "blissful_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "uW6S9QZqdTN9n8nROsXWugdetpdTwdD/NAgsHfVlKVQ=", + created_at: ISODate("2025-10-11T13:42:26Z"), + }, + { + _id: "trk-186e120746e88add15d6df47", + name: "clever_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "zioq96s+Os5u0wkjaOfUO9dZId7OHr8otFLIdl+4qfc=", + created_at: ISODate("2025-09-17T09:35:26Z"), + }, + { + _id: "trk-186e120746e8b7c338ebf0df", + name: "sweet_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "fDrzR+XXddUMT7sjv1lTdCqCrMxpIuoFhJF/FjORBTM=", + created_at: ISODate("2025-10-13T14:47:26Z"), + }, + { + _id: "trk-186e120746e8ea3b02c4a2e1", + name: "frosty_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "jzW8kxhoYXRGZAEfemost+RLvfyaXeAqCdA6Tvbrx4k=", + created_at: ISODate("2025-09-24T13:14:26Z"), + }, + { + _id: "trk-186e120746e9075df66cb3b3", + name: "strange_wiener", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "uv7ZnF4gR7DRC3GsRjup4ai5zG3Lm/V7rmeUW+MN1jg=", + created_at: ISODate("2025-10-05T16:02:26Z"), + }, + { + _id: "trk-186e120746e924c657e20745", + name: "noble_gates", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "HTPI0EkycKDjtalFGyzwQhWo64m8tWlgruPc6ytZnuU=", + created_at: ISODate("2025-09-26T02:08:26Z"), + }, + { + _id: "trk-186e120746e941381aa9726f", + name: "hyper_cauchy", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "BymguFW23joJGerJ6vLEL9MqDeSUD+Gu6nIAY2uLEJw=", + created_at: ISODate("2025-09-17T02:25:26Z"), + }, + { + _id: "trk-186e120746e95d892be20fae", + name: "beautiful_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "CWlkHtuXinZ28j9pb59SPhjAJZtMTwnRtrXWe0ztijA=", + created_at: ISODate("2025-10-06T15:58:26Z"), + }, + { + _id: "trk-186e120746e97c1f615d85ec", + name: "original_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "QJ+QtIFC9ydN3CZEHrhY+TYoM95H9JZ9y9fAwNcMCpw=", + created_at: ISODate("2025-09-14T21:36:26Z"), + }, + { + _id: "trk-186e120746e9f277df403d3d", + name: "jolly_salam", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "HQDyTFoUqsHhVWbmVD148+qm4lQOKBp5bMdtXRwbM1s=", + created_at: ISODate("2025-09-28T18:07:26Z"), + }, + { + _id: "trk-186e120746ea1f2ea4d89687", + name: "exotic_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Y9z4ZdSWN8SPus1VpxPdFwSalBOr0xD60zRJdhCitbg=", + created_at: ISODate("2025-09-21T05:39:26Z"), + }, + { + _id: "trk-186e120746ea41e63919641b", + name: "funny_cooper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "TYzBRY/HUoh5LpTEAeDcfshVDp7XIxVmsLOmAsFCSU4=", + created_at: ISODate("2025-09-25T17:16:26Z"), + }, + { + _id: "trk-186e120746ea5c4249128d8b", + name: "jaunty_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Ln6LyXPBc9OF5bxhYJIoBUZ/r9gMHJYJO9b0fyopzaQ=", + created_at: ISODate("2025-09-30T18:22:26Z"), + }, + { + _id: "trk-186e120746ea750cf69b169b", + name: "thirsty_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "QAONLFQmus2CGZZzlKfGjAADNanq00bK8vaVcBhJo7o=", + created_at: ISODate("2025-10-07T16:31:26Z"), + }, + { + _id: "trk-186e120746ea8e7196b3093b", + name: "adoring_newton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "aCIzO3EwhWTHXQpWQP7BYEvr6W5HybnsMSUEX13mL30=", + created_at: ISODate("2025-09-18T22:57:26Z"), + }, + { + _id: "trk-186e120746eaa755561196c8", + name: "hungry_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "VKE7UxvJ2bltuQiytSDm2Nv31Iofy06JUwxP8jagn1M=", + created_at: ISODate("2025-10-12T15:43:26Z"), + }, + { + _id: "trk-186e120746eac0684a411127", + name: "energetic_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "jBN447T6Cs/2lwJOZsyHmrcYfrsWCMa6L9gGT3sblJA=", + created_at: ISODate("2025-09-21T13:50:26Z"), + }, + { + _id: "trk-186e120746eb21c56b310cda", + name: "admiring_darwin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "s5ryhLp1YeNYA5ac6plvh1XbGAbrSinlGEAfFX+XB/w=", + created_at: ISODate("2025-10-02T21:14:26Z"), + }, + { + _id: "trk-186e120746eb4d6d70cf6733", + name: "pedantic_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "1YZoUDeyundPrkyl0bFKSQYfSloEJtJCJAcxri42jsc=", + created_at: ISODate("2025-09-24T04:37:26Z"), + }, + { + _id: "trk-186e120746eb649a77fcbe02", + name: "laughing_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "augBE5IFFPq2uubp+cOpB9XSWe6FNzkXRkLZkubX3Es=", + created_at: ISODate("2025-09-24T20:06:26Z"), + }, + { + _id: "trk-186e120746eba54428a46768", + name: "groovy_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "IkcQJDdUzKZ2WMpIIQwpknP998gOt0F7MP+EQo/T1Lc=", + created_at: ISODate("2025-09-17T20:37:26Z"), + }, + { + _id: "trk-186e120746ebbc9238d17b60", + name: "gracious_weierstrass", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "40PvNz4whHc4hLO/7Q9lMe6YGJO6ZkMvjN1dA30zAA4=", + created_at: ISODate("2025-10-04T07:08:26Z"), + }, + { + _id: "trk-186e120746ebd0fa0f990530", + name: "thoughtful_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "CQqhJ/Qj/x1s9H3Y4QuIo5FSGoMjA+ojGYiXskb0RRw=", + created_at: ISODate("2025-09-17T00:05:26Z"), + }, + { + _id: "trk-186e120746ebe5ac2d343d5f", + name: "zealous_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "y0VUGEVC3cOc4sX1nj7u10m75QasW8LIdwWVs1rf2TY=", + created_at: ISODate("2025-10-04T13:25:26Z"), + }, + { + _id: "trk-186e120746ebf958faa8280e", + name: "busy_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "OENsQJipdvtlRI+5C8F/phEfSjTHS2F9CWXt+cXGHcI=", + created_at: ISODate("2025-10-01T16:44:26Z"), + }, + { + _id: "trk-186e120746ec4fb0b411045b", + name: "adoring_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "SAd8SIi1BnSt/9YexlOGPNZ7PJJkigxkvdnqZnwftwo=", + created_at: ISODate("2025-09-25T07:06:26Z"), + }, + { + _id: "trk-186e120746ec648c04ccbdc8", + name: "furious_euler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "dSLgwgAmj27cw9ET0w8acChymnMLe24CxGCKwdLswbo=", + created_at: ISODate("2025-10-05T02:30:26Z"), + }, + { + _id: "trk-186e120746ecbbbe654ce1d4", + name: "fascinated_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "bRVy3298YRSHvb3LE1Z6qj07TqEtH0oooPp5HMcGTJc=", + created_at: ISODate("2025-09-19T14:47:26Z"), + }, + { + _id: "trk-186e120746eccff893f335f9", + name: "curious_wozniak", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "pK3c6YRMn7EgtpNs+blSRqgdQL+Ic8drkEx9tX2Dy6c=", + created_at: ISODate("2025-10-11T13:06:26Z"), + }, + { + _id: "trk-186e120746ece530a32af864", + name: "dreamy_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Ubp1OPiqYtvjmJCrmp9JrPfCFjtLhiUoB+3oC4BTPFs=", + created_at: ISODate("2025-10-04T04:32:26Z"), + }, + { + _id: "trk-186e120746ed08a67703eabb", + name: "exotic_shockley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "d2vpnUwGH7ALIWjUKILDnDshEqdD+Roko77fxsHUUqE=", + created_at: ISODate("2025-10-01T23:44:26Z"), + }, + { + _id: "trk-186e120746ed58f183b2985f", + name: "outstanding_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "awREvy0yYRVf2XsYf/tNNIdBL55RXR96sGy7jTw5kl8=", + created_at: ISODate("2025-10-03T13:15:26Z"), + }, + { + _id: "trk-186e120746ed868a048f5dab", + name: "dreamy_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "/t1Coa70kTMW55Qyu4sFA7+LLafl+vt8LxAoAQ0nDLY=", + created_at: ISODate("2025-10-07T20:10:26Z"), + }, + { + _id: "trk-186e120746edbab38815cdf3", + name: "focused_peano", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "WfNSRmk1sgJsXH/JVHELwriSEAoB5yD4CCyMuGRD/fs=", + created_at: ISODate("2025-09-24T00:54:26Z"), + }, + { + _id: "trk-186e120746edd0917f22f06e", + name: "motivated_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "t4kvEtHD4zNZl6BciX0xcyU8mWDU8YMWEftEQE3eoRY=", + created_at: ISODate("2025-09-29T00:50:26Z"), + }, + { + _id: "trk-186e120746ee2283b18d3081", + name: "groovy_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "tlIl/BgRMxvE3+uojFxFVzBsUpgqO0DDieAllWAzULA=", + created_at: ISODate("2025-09-14T17:54:26Z"), + }, + { + _id: "trk-186e120746ee4e09aceffd05", + name: "xenodochial_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "SR7J6zXtzZ+MzTCt+PULdrBEVstzj3j8FWbY8lIEn90=", + created_at: ISODate("2025-09-14T14:54:26Z"), + }, + { + _id: "trk-186e120746ee68da26273cf5", + name: "lucid_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "iakRwwyTjiD+zM7uC7h/UQm6gz6QIVntEhsL5kChETk=", + created_at: ISODate("2025-09-21T11:01:26Z"), + }, + { + _id: "trk-186e120746ee83e08e9af2ff", + name: "serene_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "sZ9jRJt4nahWRjnYbEr8pROMxPW+rMqaEpwcxSbI25k=", + created_at: ISODate("2025-09-24T14:39:26Z"), + }, + { + _id: "trk-186e120746ee9c5f3732c18d", + name: "cranky_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "0x5c9KZ5LXKSmZZqvoYwIRmfmcI/QdC9pzGSw0iUnhI=", + created_at: ISODate("2025-09-30T09:44:26Z"), + }, + { + _id: "trk-186e120746eebc6662643d28", + name: "nervous_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "R5tvEmp6htqC7RHz/hRTUwhZW6v3lVh3qJ+Pttgw9S8=", + created_at: ISODate("2025-09-30T08:21:26Z"), + }, + { + _id: "trk-186e120746eedcee1f256e01", + name: "amazing_westinghouse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "UX2Qmw3cmXuF/IcgT0gIzavalplncAuB9c1hCDebu0k=", + created_at: ISODate("2025-09-22T15:06:26Z"), + }, + { + _id: "trk-186e120746eef951821b96c3", + name: "bold_born", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "YXD9WH6vDeIHC5YQZqEz7WvkHrcKgIAnfFAGl59htyE=", + created_at: ISODate("2025-09-22T18:36:26Z"), + }, + { + _id: "trk-186e120746ef14ada5d82853", + name: "ecstatic_bohr", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "EyfR76x+gHf56NtxCJrPP2yEbKNAWAytY7GnJ5iD6Dc=", + created_at: ISODate("2025-09-22T14:45:26Z"), + }, + { + _id: "trk-186e120746ef30a453a2681f", + name: "xenodochial_yang", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "KA7GeAJz7HYtBr+quD2ByRsih8xN94nkw82YHCa+ekE=", + created_at: ISODate("2025-09-23T11:28:26Z"), + }, + { + _id: "trk-186e120746ef5962725241a1", + name: "great_pascal", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wTy5ke2Gu8rGjh90ryR4OO3dvnaveRb2lNO2J+DXM+k=", + created_at: ISODate("2025-09-29T17:03:26Z"), + }, + { + _id: "trk-186e120746ef7561a82b805e", + name: "puzzled_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "U3e0bbtRB/4oFdwAyqaUWdiWc3KBJxCdwL4GnrajrvE=", + created_at: ISODate("2025-09-16T18:55:26Z"), + }, + { + _id: "trk-186e120746ef911e84e6d8e2", + name: "flamboyant_wiener", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ce/RLrLRYmFt61vSvrKtl+OayIQpjaFJRWJVABDKEWA=", + created_at: ISODate("2025-09-18T14:06:26Z"), + }, + { + _id: "trk-186e120746efabd4ebae5c25", + name: "modest_pascal", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "Pz4Pu+YceuyuUAEswXesnWSPbZL5PPPXefSAO4ueB3M=", + created_at: ISODate("2025-10-02T22:08:26Z"), + }, + { + _id: "trk-186e120746efd20be6218945", + name: "curious_turing", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "O2DSUjc6HIFMf8/a/mm+ONOVsXvJ9UmYdvhIirxW5LQ=", + created_at: ISODate("2025-10-10T00:12:26Z"), + }, + { + _id: "trk-186e120746efef261a621259", + name: "heuristic_galois", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "7xF3Ws3DC15XXi+wN0TLJ/xfOYsl1wthIcg1WDJSPGE=", + created_at: ISODate("2025-09-29T07:18:26Z"), + }, + { + _id: "trk-186e120746f00b07b9f277f3", + name: "charming_wozniak", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "CkNmnFv3gp6MKDfY7BFED1nGJLC5Gvho5M135S/bcSI=", + created_at: ISODate("2025-10-08T19:56:26Z"), + }, + { + _id: "trk-186e120746f0271720162899", + name: "cool_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "EXIB21hXaXxf6awOBsQvJF4YnOGec0JcliipsryVoJM=", + created_at: ISODate("2025-09-23T20:59:26Z"), + }, + { + _id: "trk-186e120746f04a21e1fbceb4", + name: "fabulous_henry", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "pA1fAK3JAJfuPhNF0pJ/AXM2x80lCClPT3YBaFm0aWU=", + created_at: ISODate("2025-09-24T14:03:26Z"), + }, + { + _id: "trk-186e120746f082919f1fb039", + name: "calm_glashow", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "cP03j+3EWXeGlrsFWTKdx+/BUsX+yfBpyqfRsHvNtNo=", + created_at: ISODate("2025-10-02T00:58:26Z"), + }, + { + _id: "trk-186e120746f09d390df56184", + name: "gifted_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Cd8phmxxYiKZykG4dz12tWjBqldOWLlXS4eHAt+QXuE=", + created_at: ISODate("2025-09-26T09:54:26Z"), + }, + { + _id: "trk-186e120746f0b6c58812e233", + name: "merry_torvalds", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "SfPGmp/POZ0OJ46PfaCF4YWga1fkw9hxx4Uu2Oqc12U=", + created_at: ISODate("2025-10-02T12:53:26Z"), + }, + { + _id: "trk-186e120746f0d2223b340dbc", + name: "calm_cantor", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "6y8OGDDKUegpudM8cpIEJOHa0XFm1kiYGq14k5lGqn8=", + created_at: ISODate("2025-09-25T08:49:26Z"), + }, + { + _id: "trk-186e120746f0f719e93740d8", + name: "gentle_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "kTOu2VN72K+KIS6dmhjw6gn7EJv8Sgy7Ftf0EVmyUAM=", + created_at: ISODate("2025-09-17T00:20:26Z"), + }, + { + _id: "trk-186e120746f12bb3b3afc7ca", + name: "angry_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "EaVi9jGo670sloZat37TqG9X6MSt9eYttd+OL9xtNmA=", + created_at: ISODate("2025-09-28T01:00:26Z"), + }, + { + _id: "trk-186e120746f146b5f322b565", + name: "furious_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "YsXCrd24M5R0/N8Zo8NptQSAgfuOKlb/6Mquo9+5f6w=", + created_at: ISODate("2025-10-10T19:53:26Z"), + }, + { + _id: "trk-186e120746f15f4e4ac77e69", + name: "flamboyant_hertz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "GwTCImAqU45wG0/+jxkHCuhKym5mzA7ga9AgmiPxXt8=", + created_at: ISODate("2025-10-04T23:43:26Z"), + }, + { + _id: "trk-186e120746f179039c3e5b94", + name: "thirsty_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "pFQF+nyzLCcElM/v9stFnzBiFOZmnAif8VZEf442V+U=", + created_at: ISODate("2025-10-09T19:46:26Z"), + }, + { + _id: "trk-186e120746f191c526e07e26", + name: "cranky_weber", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "GsdkxPFdv3TahWmqM9VkaazJQNxCzhS7PENt8gEoT0s=", + created_at: ISODate("2025-09-24T21:13:26Z"), + }, + { + _id: "trk-186e120746f1b4d87f6a4ab5", + name: "iron_galvani", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "W3QvXGjvUvqvTKippTBM1SFuOpMKW8QWnoD0Mme6OYE=", + created_at: ISODate("2025-09-26T05:09:26Z"), + }, + { + _id: "trk-186e120746f1ce4eea4b728b", + name: "relaxed_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "LZR+p/doe7p09bMaY/q8YakuBQGrsGyX74cbpYztN0I=", + created_at: ISODate("2025-09-28T06:39:26Z"), + }, + { + _id: "trk-186e120746f1e7f64d2a0414", + name: "merry_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "pW2aKuxC2muX5hOWr+bk1aySwlsEof16dOwGGVbv0hE=", + created_at: ISODate("2025-10-06T09:51:26Z"), + }, + { + _id: "trk-186e120746f201234290fc20", + name: "youthful_edison", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "p46hK5+FShBIgUZvbfw6Wq3dfrtRYlX9RDMDKAUoE7k=", + created_at: ISODate("2025-09-25T12:29:26Z"), + }, + { + _id: "trk-186e120746f21be0e93185c3", + name: "focused_godel", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "UcYyvLXTyMi7vygZia8WHT6jtc+F7Ee2C01o5xS1Nr4=", + created_at: ISODate("2025-09-26T23:16:26Z"), + }, + { + _id: "trk-186e120746f234b4f6c9f2c7", + name: "dazzling_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "6u6OQXrxzetXHuITD4hRFsWMbJ7MMgaJAGicOFOX19Q=", + created_at: ISODate("2025-09-20T10:30:26Z"), + }, + { + _id: "trk-186e120746f24e76ff131fe3", + name: "upbeat_ohm", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "luzQWGdL+UzgoVO3aaIeSFYdqpx0MOd//U49+sKZBR4=", + created_at: ISODate("2025-09-24T03:21:26Z"), + }, + { + _id: "trk-186e120746f267cbf0b2059a", + name: "furious_hertz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "nsgQCOmszyc8AS0cr/jasr6AqOfBCjGWWqBOEH3JYAQ=", + created_at: ISODate("2025-09-17T10:52:26Z"), + }, + { + _id: "trk-186e120746f2814d7e0754b6", + name: "affectionate_poincare", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "itBD6WM9tftIGfAJilP9de2TJa8Vog2wDz0ipw43Lgc=", + created_at: ISODate("2025-10-11T07:02:26Z"), + }, + { + _id: "trk-186e120746f2a3d87f0eeca4", + name: "frosty_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "HR8uYTr8E1/UdfaOLnfZ3CP0JwPdg4LIkoPy4Yjg0O0=", + created_at: ISODate("2025-09-13T16:47:26Z"), + }, + { + _id: "trk-186e1309839bbd54be8f785e", + name: "gifted_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "ZCw5gk1MaebMg2IsOivMuSZgCAJQxYPZ8o3KMTn0oSY=", + created_at: ISODate("2025-10-02T18:57:55Z"), + }, + { + _id: "trk-186e1309839e1ffe329ebf18", + name: "zealous_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "LOjfvsoJj7zNBoByyrJqgnfbVuvg2oqSWSo23k5szrw=", + created_at: ISODate("2025-10-05T07:08:55Z"), + }, + { + _id: "trk-186e1309839e3cc066512dbd", + name: "elastic_morley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "k7fQ1A277mZYtLp4yZwgQv5SAHg+CQykl65IYmBOcLw=", + created_at: ISODate("2025-10-13T05:51:55Z"), + }, + { + _id: "trk-186e1309839e5c57c7e9af1b", + name: "energetic_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "cTlwhna05v7wqUSh4A6t7V59z5nfZPwlmu5phCNjhzs=", + created_at: ISODate("2025-09-15T01:26:55Z"), + }, + { + _id: "trk-186e1309839e7274fbb77443", + name: "noble_schwinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "zWDBZnVqBcN60DwbxryQ+eLp/b+dr/xlpafTcWfFs1c=", + created_at: ISODate("2025-09-23T19:53:55Z"), + }, + { + _id: "trk-186e1309839e85fe0ba301ac", + name: "puzzled_heisenberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "EE/TZ0jS3mEwbZx/YqElSKS2qxTLiADL3wTZc7UtTR4=", + created_at: ISODate("2025-09-15T11:31:55Z"), + }, + { + _id: "trk-186e1309839e99c2655eb597", + name: "magical_laplace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "zaDTN2SiXFRcxdsnSyeZST0eJO2ymNrnWVh9KSiBjmQ=", + created_at: ISODate("2025-09-19T07:21:55Z"), + }, + { + _id: "trk-186e1309839eae938abbb06e", + name: "polite_franklin", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "3E5qvFq6m7TZW5scw/ZYc39zAnhourZwtQbte1KRFcg=", + created_at: ISODate("2025-09-22T23:00:55Z"), + }, + { + _id: "trk-186e1309839ec6a5f176f269", + name: "suspicious_weber", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "vPKKppUdZeMiXY5HYgFgHETpYx3jtWRHuMeNPNX+gIo=", + created_at: ISODate("2025-09-24T20:49:55Z"), + }, + { + _id: "trk-186e1309839edcbc0e9ccdee", + name: "hyper_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "m6ltZvHHeKGnbg/7OCLoDwz5JuXP2lr1pcY4Vj+iY6Y=", + created_at: ISODate("2025-09-15T11:08:55Z"), + }, + { + _id: "trk-186e1309839ef37e250b2ac1", + name: "flamboyant_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "IZrX9Tvi8DNKS7uFTtf/HLwYxivfO6gnriULc081BW4=", + created_at: ISODate("2025-09-27T03:18:55Z"), + }, + { + _id: "trk-186e1309839f7ba1a81d392e", + name: "laughing_oppenheimer", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "sTqUXGZmpiGZHGxXEFElISIe3iJz9VW5h7LrKbdbT5Q=", + created_at: ISODate("2025-09-21T19:38:55Z"), + }, + { + _id: "trk-186e1309839fda077e230f18", + name: "sleepy_noether", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "K/fnViP3HJeORW02MDQiODA2KJIIOklTQ95dp8KR1Aw=", + created_at: ISODate("2025-10-08T09:06:55Z"), + }, + { + _id: "trk-186e1309839fef6604700630", + name: "cranky_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "LhU6aqY/E9DHusg8AbbavTuikkHRVaOKAceEX4erXb8=", + created_at: ISODate("2025-10-13T10:22:55Z"), + }, + { + _id: "trk-186e130983a01ae99c930d78", + name: "brave_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "DdkJUpGmJY7ZMiMKeyTIUh+NOId0DzLi7dp6alJhQ88=", + created_at: ISODate("2025-09-18T08:13:55Z"), + }, + { + _id: "trk-186e130983a034f970090b84", + name: "keen_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "bb/3zD4PlygRSNYJ2JfXWtQOGXRlw4iqjv0nESpWnnw=", + created_at: ISODate("2025-10-12T15:58:55Z"), + }, + { + _id: "trk-186e130983a059f6f1438b3e", + name: "awesome_fermi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "KGd+GfOfvoG61VkVQFjTJR0Yq/znautGUH+9WAnDLoQ=", + created_at: ISODate("2025-09-24T09:31:55Z"), + }, + { + _id: "trk-186e130983a07ae5a7263ec1", + name: "crazy_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hbTWXcPaFt/C79Q3ljLio7j7GkYT4DT6UKavFR/7tOg=", + created_at: ISODate("2025-10-04T02:54:55Z"), + }, + { + _id: "trk-186e130983a09704293604ee", + name: "calm_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "OU1L1O+EUhwPhwmKJ8OtajzN5xPrV4wyWeLsTaoY1I8=", + created_at: ISODate("2025-10-01T22:19:55Z"), + }, + { + _id: "trk-186e130983a0b6016eeb4331", + name: "proud_jobs", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "Je7MWPdNzzyVBGdsKH0ZrdkDCkkk52S0sa9OOaloRQM=", + created_at: ISODate("2025-09-24T22:52:55Z"), + }, + { + _id: "trk-186e130983a0db3e0cc11f28", + name: "furious_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "rINraJ2KTESEfAph/IFXaUIsFf2DwvcV46lED/a+XZQ=", + created_at: ISODate("2025-09-30T07:18:55Z"), + }, + { + _id: "trk-186e130983a14583c71a2172", + name: "faithful_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "oaNmemljb/RTXF5lwD+aYiyJduErvUitnjU9P6O3Qcc=", + created_at: ISODate("2025-10-06T15:35:55Z"), + }, + { + _id: "trk-186e130983a159e2bbb9f5f8", + name: "upbeat_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "FlfO21D9qS/voZQhw7ALRXcQpl+4P0+bcsAVx+HqTys=", + created_at: ISODate("2025-10-10T03:06:55Z"), + }, + { + _id: "trk-186e130983a1c1a1f3cb2f24", + name: "hungry_gauss", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "MP/K9fmbN8gjGL2dlUgPwvfkmH1AUPDCjdAiUqu944g=", + created_at: ISODate("2025-10-11T22:35:55Z"), + }, + { + _id: "trk-186e130983a1d5c90eeb7be5", + name: "motivated_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "yKTjLolSSeYIykBPgT5XtvoUQdKALNFkkNu44kNoGP4=", + created_at: ISODate("2025-10-05T00:01:55Z"), + }, + { + _id: "trk-186e130983a1ea63e8dbee65", + name: "laughing_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gqr+1LMynMxT9/LCZi34YT7w7kNetDPAIM5vgxuJ62E=", + created_at: ISODate("2025-09-26T16:11:55Z"), + }, + { + _id: "trk-186e130983a1fd7e0e4791cc", + name: "blissful_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "46eu29Cek7uXQbQIikPXWXXtb5Mj4uF8qiNAjlAhHAg=", + created_at: ISODate("2025-09-20T07:34:55Z"), + }, + { + _id: "trk-186e130983a2109dd0df3463", + name: "modest_lagrange", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "wDLjDpT2iWWujj+LVSJmdJiiJvgBj4cZ+79LZdPwQ9s=", + created_at: ISODate("2025-09-23T15:00:55Z"), + }, + { + _id: "trk-186e130983a234a9618f898e", + name: "confident_peano", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "v6fr9Q4/AQTAwGGrEszqok6AU/RlCO7EmsWoaHPR1Wg=", + created_at: ISODate("2025-09-27T05:29:55Z"), + }, + { + _id: "trk-186e130983a2560f98ea7e47", + name: "jovial_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "KcMeDL6RVjQrEE3xf+j2tcYleM26p60oLqaVvRhQFDM=", + created_at: ISODate("2025-09-25T14:14:55Z"), + }, + { + _id: "trk-186e130983a26a15f661928b", + name: "eloquent_dedekind", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "X8atklQ+PoJ0GuKFPwfSs49w1C1tjiwstgnvu+3Uaq8=", + created_at: ISODate("2025-09-29T19:35:55Z"), + }, + { + _id: "trk-186e130983a27e5bc05251b9", + name: "frosty_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "1kASDQP73a3z2SN8IkuNtI3cYmX3jjvmO+/bU1sQwHY=", + created_at: ISODate("2025-09-21T07:50:55Z"), + }, + { + _id: "trk-186e130983a291f1e443cd5a", + name: "proud_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "UzmsA89/TC3Y9HXzAj/FFajvNUheAN9dGb/0axlXtb8=", + created_at: ISODate("2025-10-01T10:25:55Z"), + }, + { + _id: "trk-186e130983a2a576491ef9af", + name: "angry_hilbert", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "sKpBt81A5fAZFsm4npMR5KEv3eJY9csJ0lU2dV09slw=", + created_at: ISODate("2025-10-08T07:07:55Z"), + }, + { + _id: "trk-186e130983a2d186e5d486fb", + name: "hungry_volta", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "fH0z5owaDwYFtDAHOTndNz6bZboOOrfJS7G0FcLWwSc=", + created_at: ISODate("2025-09-26T13:34:55Z"), + }, + { + _id: "trk-186e130983a2e58a9f17fdc3", + name: "distracted_mendeleev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "T9pkDWyxASF5yTI/tPUa0oYGkbS7kEJw658mWEYmXuw=", + created_at: ISODate("2025-09-15T03:42:55Z"), + }, + { + _id: "trk-186e130983a2fe87872f4f49", + name: "thoughtful_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "hcUkyXC/+F/nxBV8iOeTaXlbPlVbefYzFfrbXkGV8Sg=", + created_at: ISODate("2025-10-05T01:51:55Z"), + }, + { + _id: "trk-186e130983a322c165ec9526", + name: "sad_stallman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "vNNucwhglkB7Y1aVZrx8AmdKQH0T8NQ/nDA6WvAmHYA=", + created_at: ISODate("2025-09-28T01:45:55Z"), + }, + { + _id: "trk-186e130983a340ddf0bf05e4", + name: "vibrant_erdos", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "JD9CEeoyzLC/HXULUtZRds3Zt3W73rlEK9SaMNABxX4=", + created_at: ISODate("2025-10-13T14:53:55Z"), + }, + { + _id: "trk-186e130983a35bf2a8e986cb", + name: "original_doppler", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "B7fsNi61OSIwh7sOPijfiaXcO35j4b8D4RzaOO9AI9o=", + created_at: ISODate("2025-09-13T22:37:55Z"), + }, + { + _id: "trk-186e130983a37e04ea2b2ff2", + name: "fabulous_schrodinger", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "BgA+RZUSOglE9OOaC64uOPYBH2Q3FXKTh92P7kevJmo=", + created_at: ISODate("2025-09-26T15:11:55Z"), + }, + { + _id: "trk-186e130983a39b9455bdeedf", + name: "awesome_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ttzL9AQTJ9RKMTlAF7il5xpv84u4wPLSCxzJ7QgAK2o=", + created_at: ISODate("2025-10-07T23:48:55Z"), + }, + { + _id: "trk-186e130983a3c77bb7a4f5d7", + name: "heartwarming_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "HXOc5oU5YLvbceVhUGdpPTmDfF3FROJAPjZ2XkjjTvo=", + created_at: ISODate("2025-10-02T15:09:55Z"), + }, + { + _id: "trk-186e130983a42d5fb53a30e9", + name: "sweet_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "Cogel1ZaSvbfbwjKN9kzoFdMkNmRVyjLhdVO1TIXRX8=", + created_at: ISODate("2025-09-21T15:57:55Z"), + }, + { + _id: "trk-186e130983a45e7421d17024", + name: "heuristic_wirth", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XO/6YycdUYkH63d460y/NTW0dxLBPiAygeMjHuRmag8=", + created_at: ISODate("2025-10-05T02:06:55Z"), + }, + { + _id: "trk-186e130983a47ab26312a621", + name: "serene_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "ZEey/z8mahhYZ6P2370knAdpoBRxrl+rUc8IRGe7X+s=", + created_at: ISODate("2025-10-11T19:15:55Z"), + }, + { + _id: "trk-186e130983a49cc1a4ead31d", + name: "admiring_markov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "z1UanROYzQtod+7GLLbw9qYdIvet+pQQEc85sdmE1tI=", + created_at: ISODate("2025-10-10T21:17:55Z"), + }, + { + _id: "trk-186e130983a4af6de88c809f", + name: "practical_cantor", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "n7DXivw4BcVLW2WE3NGNZGADmQgpJuAqcDxd/3ys6oo=", + created_at: ISODate("2025-09-14T14:27:55Z"), + }, + { + _id: "trk-186e130983a4c1a2c1717cf8", + name: "keen_berners", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "QzRG4fj6Ieu/CEDn4y6+Bu1gBFqY4ISF+tHNhDtlNOU=", + created_at: ISODate("2025-10-11T10:09:55Z"), + }, + { + _id: "trk-186e130983a4d36ac7ba8b7a", + name: "proud_tesla", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "EX3KV2PKMP/B3ZQ2W/lWny+J+Ph56ZZvPU5Ee4JyKN4=", + created_at: ISODate("2025-09-25T21:44:55Z"), + }, + { + _id: "trk-186e130983a4e47156945059", + name: "goofy_crick", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "vazs6yunKp5x6D8iixRFQWIPPtuhKeHi8k+cnv/oP10=", + created_at: ISODate("2025-09-19T10:10:55Z"), + }, + { + _id: "trk-186e130983a4f6d211f892ab", + name: "phenomenal_chebyshev", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "F5ynV08uXxR+VAwDWviUzRt5DJSK4tZkuw76KO8gICI=", + created_at: ISODate("2025-09-25T04:49:55Z"), + }, + { + _id: "trk-186e130983a508c15816b9c0", + name: "nervous_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "wcyoP8iDI3UU5H1r/qqVYLR1tsMuB0fwqilajOO4+vc=", + created_at: ISODate("2025-09-19T21:06:55Z"), + }, + { + _id: "trk-186e130983a519b7a38da4ea", + name: "polite_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1tk9YjVrNKneUDY1Osjo/Dwi4i10Gso/pN46e3GvYYY=", + created_at: ISODate("2025-09-14T23:19:55Z"), + }, + { + _id: "trk-186e130983a52afe9fa16029", + name: "proud_weinberg", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1f2wPh9Ox2inN18mT1YuK4jRHKvVGoKG8SpgAzQkHSY=", + created_at: ISODate("2025-09-23T19:32:55Z"), + }, + { + _id: "trk-186e130983a53d672348d95f", + name: "wonderful_morse", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "wTtqmRD/kVPjzkiGiJwEi6Ki7iSk/zTlmXS+hp4yNSo=", + created_at: ISODate("2025-10-04T21:25:55Z"), + }, + { + _id: "trk-186e130983a565faaf6e26d7", + name: "enchanting_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZVUDm/FzS/zzVL4cCFnt3GhgJWabExYb4opnpTH0EF0=", + created_at: ISODate("2025-09-19T07:10:55Z"), + }, + { + _id: "trk-186e130983a5847b2c0e34c5", + name: "compassionate_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "fc20Hdx9vXJ178vB52/ZIhUUQdM5xEC06cYBsFH6qFQ=", + created_at: ISODate("2025-10-05T12:11:55Z"), + }, + { + _id: "trk-186e130983a5965d6dada7f4", + name: "quirky_nyquist", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "baCodUXLbJPBkTX0SYlNZoiS+wCQNxSCOQVl11U/nlw=", + created_at: ISODate("2025-09-26T23:13:55Z"), + }, + { + _id: "trk-186e130983a5c49aeba044f5", + name: "original_maxwell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "8Fc0JUIo5wNsW9YpeJgMyIWoMB6efwN8TNO1wREwMn4=", + created_at: ISODate("2025-09-16T16:39:55Z"), + }, + { + _id: "trk-186e130983a5d7349ac354d7", + name: "epic_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "1Dw3ZR9Thr0Hcy4/nSnpDXiBfPsctFt9l+vlsNJ0IPk=", + created_at: ISODate("2025-10-05T23:44:55Z"), + }, + { + _id: "trk-186e130983a5e91f31ee5429", + name: "clever_planck", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "T1XjWjDNQy1lBxDSvVgKpThI1K4POhliXJOFvtZFo/k=", + created_at: ISODate("2025-10-09T21:17:55Z"), + }, + { + _id: "trk-186e130983a5fa39a2a976c0", + name: "gifted_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "fr61QFVGUvqpBS8uWwQ49iudcMYGxgi9PW8RZcVg6so=", + created_at: ISODate("2025-09-19T08:34:55Z"), + }, + { + _id: "trk-186e130983a61fe1c2dd259e", + name: "jaunty_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "DpeFAN8wyPtjf1rGLO7JbAwB0VqowdXasLZOs8d0VXw=", + created_at: ISODate("2025-09-30T06:29:55Z"), + }, + { + _id: "trk-186e130983a6336076acfe23", + name: "nostalgic_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "+8M4KNmUM9/n0mPsZJZdTKUCXZILPHMNfmPPNNkcTXc=", + created_at: ISODate("2025-09-19T23:53:55Z"), + }, + { + _id: "trk-186e130983a644b5f71646b8", + name: "fancy_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "Pf5p7rwp5Kz6sm9i5tkjoCze/i2Fg5YuTzJHBLSpNPs=", + created_at: ISODate("2025-09-27T10:30:55Z"), + }, + { + _id: "trk-186e130983a655ddcb922063", + name: "great_henry", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "ZhajzgyxcVnZi0u9Hm6C58119AdBDZyXhtMSF76y/G4=", + created_at: ISODate("2025-09-30T21:42:55Z"), + }, + { + _id: "trk-186e130983a667a828ff844f", + name: "grieving_shannon", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "iKFwj7MKj0zd5ON6UBQyqlhZlEUqHuSd6jmKr905gq4=", + created_at: ISODate("2025-10-04T07:32:55Z"), + }, + { + _id: "trk-186e130983a6794fd7167c67", + name: "dreamy_yang", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "RKml+qYAdgRUFEbo7NYC6v6L5x9iH1WAyZkg3ywu/Mc=", + created_at: ISODate("2025-09-29T12:13:55Z"), + }, + { + _id: "trk-186e130983a68a6c4e789068", + name: "xenodochial_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "5jEOTEisy9PAHGo2cUxTLjcS7U/j1z+iDVu4AmPAQB4=", + created_at: ISODate("2025-10-09T09:38:55Z"), + }, + { + _id: "trk-186e130983a6a42c3aa15795", + name: "eloquent_coulomb", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "fktsbKDjJeccJCECW3jEVln0OHXFMvTFa/JQb2T7zX4=", + created_at: ISODate("2025-09-27T11:41:55Z"), + }, + { + _id: "trk-186e130983a6b654add2ea90", + name: "optimized_feynman", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "kQeoHG8z2ONEFoa3e/6dviH2WAgRiAScU9R3czQHhiA=", + created_at: ISODate("2025-09-17T00:43:55Z"), + }, + { + _id: "trk-186e130983a6c82b57b03fe5", + name: "outstanding_ritchie", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "cmzsUIvVt8wibHWzZd9Ej5CaoTDDDN325i7lsSTNfnk=", + created_at: ISODate("2025-09-24T14:47:55Z"), + }, + { + _id: "trk-186e130983a6da34cfc550e0", + name: "quizzical_lovelace", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "pax2Gn8effRWcUhmxW/9Uc/KvWrfv6+IejTdzMlA7bk=", + created_at: ISODate("2025-09-15T21:11:55Z"), + }, + { + _id: "trk-186e130983a6ebaaea0d4795", + name: "competent_leibniz", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "P6dDQCF6Fgjub8xGk93uxOQKX/KYcyB6e5bVrDrmHZ0=", + created_at: ISODate("2025-09-25T07:45:55Z"), + }, + { + _id: "trk-186e130983a6fd0db9d5a841", + name: "keen_jacobi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "wW1zdnRBu/V+TTrdSPjtT/enxkpbwHgcngL/n5oKQGI=", + created_at: ISODate("2025-09-22T07:56:55Z"), + }, + { + _id: "trk-186e130983a70f40a79fedae", + name: "fabulous_rutherford", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "2Rg2uMXrpuF9EtKsOXnqxokMWKCDy6Qtgy/92Vq6WHI=", + created_at: ISODate("2025-09-21T20:54:55Z"), + }, + { + _id: "trk-186e130983a720eff34ba9c8", + name: "interesting_thompson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "38OdyJBYXtEDLQ1W6Ay98X7QXHbs/rvV1Slbn+DVDIQ=", + created_at: ISODate("2025-09-20T08:01:55Z"), + }, + { + _id: "trk-186e130983a739bb2f817dda", + name: "adoring_dyson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "XNp46numS1q+uFS4mLsd3ixSmP98hQFwZpxJQvefmOA=", + created_at: ISODate("2025-09-27T23:47:55Z"), + }, + { + _id: "trk-186e130983a74c17ec7515dd", + name: "agitated_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "egIN2RS4kylE+AN+PL4GUXYr1L1D23aOOWHaFMua8dA=", + created_at: ISODate("2025-10-11T05:41:55Z"), + }, + { + _id: "trk-186e130983a75eb0efc4d28f", + name: "merry_kleene", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "nELHiKhUE7Y7U8Zni+levsFKjHkUj8L7nlmXeKV5upA=", + created_at: ISODate("2025-09-14T02:49:55Z"), + }, + { + _id: "trk-186e130983a770bd6a437b45", + name: "inspiring_kolmogorov", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "GJRtvBmPmKbU2LIEG1J4qP5kjhin6FjzjpxcfdgmYHg=", + created_at: ISODate("2025-09-15T04:05:55Z"), + }, + { + _id: "trk-186e130983a782e44f0bccee", + name: "epic_wu", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "6WFt4fLWdRwbKb56kxs3UG7gbEmSRZJcWrs0Witu60I=", + created_at: ISODate("2025-09-25T11:46:55Z"), + }, + { + _id: "trk-186e130983a79453f87f853d", + name: "funny_hardy", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "DdlS8ZewVy8MnaPEyQ6ExhyVzZ+Ym6pmplr2OdFyVu8=", + created_at: ISODate("2025-10-09T09:21:55Z"), + }, + { + _id: "trk-186e130983a7abf10c38fab8", + name: "iron_hopper", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "jxb07WpM4h93Gdp+I+RcoQKmvhFapFRDedoY3KTRuAk=", + created_at: ISODate("2025-10-11T16:29:55Z"), + }, + { + _id: "trk-186e130983a7c5a7c28ded10", + name: "lucid_shockley", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "lQmhvYl/A6RCnqgQkuKmAgeI8w8+3XKoosilNbF3ls8=", + created_at: ISODate("2025-09-19T02:32:55Z"), + }, + { + _id: "trk-186e130983a7f22eb4ae7f9f", + name: "relaxed_hawking", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "KOf+6+kC7nFU7uRBYQG1Kn8fB0AWQnEs+JzKSVpmt60=", + created_at: ISODate("2025-09-17T22:44:55Z"), + }, + { + _id: "trk-186e130983a8041d25549f0e", + name: "pedantic_pauli", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "XjirKNQ0apJVVa03WWRHnhQU3/ucgTKHRo+ydtYvQf4=", + created_at: ISODate("2025-09-17T17:43:55Z"), + }, + { + _id: "trk-186e130983a8165b1981350b", + name: "nervous_michelson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "public_transport", + private_key: "u8kNHC3Cm0xRQYyNVAY4RCsBpacPE8gOG6yupuQehsY=", + created_at: ISODate("2025-10-01T09:36:55Z"), + }, + { + _id: "trk-186e130983a827f007a9b2b3", + name: "thoughtful_penrose", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "rWTp82vUW/6XjsvgtDfREFW5crHPAtI6fhHQMUalNTQ=", + created_at: ISODate("2025-09-16T19:10:55Z"), + }, + { + _id: "trk-186e130983a839a432f99c62", + name: "fearless_galvani", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "VPh59T5lqElB/rv7YVdSvF8jVC/MUKYPZe7AQrjP8Oo=", + created_at: ISODate("2025-09-28T04:08:55Z"), + }, + { + _id: "trk-186e130983a84c6c80d3a12d", + name: "merry_watson", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "ZdoTuYQHaObGbs+3cL1Snf2Z81VdKSm9+rpK88YgFHg=", + created_at: ISODate("2025-10-04T09:58:55Z"), + }, + { + _id: "trk-186e130983a85f66521883b1", + name: "awesome_russell", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "+mc3lyjvdmOs9fvgfehZmJD2ayxnCim9ejoV2M6+aYc=", + created_at: ISODate("2025-09-24T06:51:55Z"), + }, + { + _id: "trk-186e130983a870935e563e9f", + name: "sad_compton", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "food", + private_key: "70AYubA/PkCQBM54UEFGUK2FQyqpOYdonEt4/qVgEOE=", + created_at: ISODate("2025-10-02T14:01:55Z"), + }, + { + _id: "trk-186e130983a88346a0103419", + name: "trusting_whitehead", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "V2Gm/mIE2Uxwcrplrf/glr7A8e/VQFK/iBqjTdXarxw=", + created_at: ISODate("2025-09-22T03:30:55Z"), + }, + { + _id: "trk-186e130983a8948dd91d5777", + name: "enchanting_babbage", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "valuable", + private_key: "GpAgMGQ/TifcNTlfVC5jyOC4riwOaJZ7YGyiycZ3hfc=", + created_at: ISODate("2025-09-18T07:52:55Z"), + }, + { + _id: "trk-186e130983a8a62ec36b8234", + name: "noble_dijkstra", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "TWKFkqd+aAj+YNskjVxR6ftBy6AnldQ+UvzUXYr27kE=", + created_at: ISODate("2025-09-24T08:20:55Z"), + }, + { + _id: "trk-186e130983a8b81ed167fa68", + name: "relaxed_fourier", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "vShTmZ1PkdComu1SSjKsqbsJALZIcFpIQCP6e7m+mTE=", + created_at: ISODate("2025-09-15T07:10:55Z"), + }, + { + _id: "trk-186e130983a8cae50b739184", + name: "adoring_marconi", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "private_transport", + private_key: "tKns/mbBJ1Vj+M2XMvIg2t4a5clE8LKNcU4REn7kYb0=", + created_at: ISODate("2025-10-06T13:19:55Z"), + }, + { + _id: "trk-186e130983a8e3cfea83018f", + name: "blissful_carmack", + status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, + device_type: "other", + private_key: "gzu43V5D0h7gjzYWkhV8eGecgWY97ULsA+GAFp0votU=", + created_at: ISODate("2025-09-26T15:42:55Z"), + }, ]); + From 7b69251af8f62fb820906963a0fe262e8150935d Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:02:28 +0200 Subject: [PATCH 101/242] typo --- .../roles/trackeroo/templates/01-deployment.yml.j2 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 index 71fc78c3..261d94d9 100644 --- a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 @@ -92,9 +92,9 @@ spec: secret: secretName: rabbitmq-certs resources: - requests: - cpu: "100m" - memory: "256Mi" - limits: - cpu: "1" - memory: "512Mi" + requests: + cpu: "100m" + memory: "256Mi" + limits: + cpu: "1" + memory: "512Mi" From 60c9dbf4b2af7dfb94eeb019d7c92f4942abdb37 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:04:37 +0200 Subject: [PATCH 102/242] typo --- .../roles/trackeroo/templates/01-deployment.yml.j2 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 index 261d94d9..cd463468 100644 --- a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 @@ -27,6 +27,13 @@ spec: ports: - containerPort: 8080 name: http + resources: + requests: + cpu: "100m" + memory: "256Mi" + limits: + cpu: "1" + memory: "512Mi" env: - name: POD_NAME valueFrom: @@ -91,10 +98,3 @@ spec: - name: certs-volume secret: secretName: rabbitmq-certs - resources: - requests: - cpu: "100m" - memory: "256Mi" - limits: - cpu: "1" - memory: "512Mi" From 8f53d714e68ff1e766a3d3c6d1c4d4385a03bc78 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:18:56 +0200 Subject: [PATCH 103/242] rabbit longnames --- services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 index 4e10d4cd..3587d7a2 100644 --- a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 @@ -17,6 +17,7 @@ data: cluster_formation.node_cleanup.only_log_warning = true cluster_partition_handling = autoheal queue_master_locator = min-masters + use_longnames = true # TCP Listeners listeners.tcp.default = 5672 From c6b0b31a2171e9a9ea5e1e6656aa7db48615d588 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:24:06 +0200 Subject: [PATCH 104/242] rabbit longnames --- services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 | 1 - .../playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 index 3587d7a2..4e10d4cd 100644 --- a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 @@ -17,7 +17,6 @@ data: cluster_formation.node_cleanup.only_log_warning = true cluster_partition_handling = autoheal queue_master_locator = min-masters - use_longnames = true # TCP Listeners listeners.tcp.default = 5672 diff --git a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 index d0d1a685..14e37902 100644 --- a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 @@ -35,6 +35,8 @@ spec: secretKeyRef: name: "{{ rabbitmq_app_name }}-secrets" key: rabbitmq_erlang_cookie + - name: RABBITMQ_USE_LONGNAME + value: "true" volumeMounts: - name: config-volume mountPath: /etc/rabbitmq/ From 6fcb7c570fc6fc87e8e43127cdb43be796557d88 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:28:22 +0200 Subject: [PATCH 105/242] rabbit longnames --- .../roles/rabbitmq/templates/02-statefulset.yml.j2 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 index 14e37902..23772260 100644 --- a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 @@ -37,6 +37,12 @@ spec: key: rabbitmq_erlang_cookie - name: RABBITMQ_USE_LONGNAME value: "true" + - name: RABBITMQ_NODENAME + value: "rabbit@$(POD_NAME).rabbitmq-headless.trackeroo.svc.cluster.local" + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name volumeMounts: - name: config-volume mountPath: /etc/rabbitmq/ From 84287a9890133dc8714f105d24f256131a1b906a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:30:56 +0200 Subject: [PATCH 106/242] rabbit longnames --- .../playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 index 23772260..4b58965a 100644 --- a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 @@ -38,7 +38,7 @@ spec: - name: RABBITMQ_USE_LONGNAME value: "true" - name: RABBITMQ_NODENAME - value: "rabbit@$(POD_NAME).rabbitmq-headless.trackeroo.svc.cluster.local" + value: "rabbit@$POD_NAME.rabbitmq-headless.trackeroo.svc.cluster.local" - name: POD_NAME valueFrom: fieldRef: From 95389d839dd0696d53730ae9f776a621ba69b838 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:32:58 +0200 Subject: [PATCH 107/242] rabbit longnames --- .../roles/rabbitmq/templates/02-statefulset.yml.j2 | 6 ------ 1 file changed, 6 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 index 4b58965a..14e37902 100644 --- a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 @@ -37,12 +37,6 @@ spec: key: rabbitmq_erlang_cookie - name: RABBITMQ_USE_LONGNAME value: "true" - - name: RABBITMQ_NODENAME - value: "rabbit@$POD_NAME.rabbitmq-headless.trackeroo.svc.cluster.local" - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name volumeMounts: - name: config-volume mountPath: /etc/rabbitmq/ From d35886e3e7b68cf571b2592ac115b36455120f54 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:36:59 +0200 Subject: [PATCH 108/242] rabbit longnames --- .../playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index bcaca787..8de42e46 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -16,7 +16,7 @@ spec: - -c - | echo "Waiting for RabbitMQ service to be ready..." - while ! rabbitmqctl -q -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local ping; do + while ! rabbitmqctl -q --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local ping; do sleep 5 done echo "RabbitMQ is up. Applying HA policy..." From 413033d7850767384da7032cc6ef2fdd9a810c5b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:46:20 +0200 Subject: [PATCH 109/242] rabbitmqadmin auth --- .../roles/rabbitmq/defaults/main.yml | 2 + .../playbooks/roles/rabbitmq/tasks/main.yml | 4 +- .../rabbitmq/templates/05-policy-job.yml.j2 | 13 + services/playbooks/secrets.yml | 606 +++++++++--------- 4 files changed, 323 insertions(+), 302 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/defaults/main.yml b/services/playbooks/roles/rabbitmq/defaults/main.yml index 6dd538ef..af771d93 100644 --- a/services/playbooks/roles/rabbitmq/defaults/main.yml +++ b/services/playbooks/roles/rabbitmq/defaults/main.yml @@ -4,6 +4,8 @@ rabbitmq_namespace: "trackeroo" rabbitmq_app_name: "rabbitmq" rabbitmq_replicas: 3 rabbitmq_erlang_cookie: "{{ rabbitmq_erlang_cookie_secret }}" +rabbitmq_admin_user: "{{ rabbitmq_admin_user_secret }}" +rabbitmq_admin_password: "{{ rabbitmq_admin_password_secret }}" # Docker image settings rabbitmq_image: "rabbitmq:3-management" diff --git a/services/playbooks/roles/rabbitmq/tasks/main.yml b/services/playbooks/roles/rabbitmq/tasks/main.yml index 077d8364..33e42a1f 100644 --- a/services/playbooks/roles/rabbitmq/tasks/main.yml +++ b/services/playbooks/roles/rabbitmq/tasks/main.yml @@ -14,7 +14,7 @@ namespace: "{{ rabbitmq_namespace }}" definition: "{{ lookup('template', '01-configmap.yml.j2') | from_yaml }}" -- name: "Create RabbitMQ Secrets (Erlang Cookie)" +- name: "Create RabbitMQ Secrets (Erlang Cookie and admin credentials)" kubernetes.core.k8s: kubeconfig: /etc/rancher/k3s/k3s.yaml state: present @@ -26,6 +26,8 @@ name: "{{ rabbitmq_app_name }}-secrets" stringData: rabbitmq_erlang_cookie: "{{ rabbitmq_erlang_cookie }}" + rabbitmq_admin_user: "{{ rabbitmq_admin_user }}" + rabbitmq_admin_password: "{{ rabbitmq_admin_password }}" - name: "Create RabbitMQ TLS certificates Secret" kubernetes.core.k8s: diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index 8de42e46..bfec0fe3 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -11,6 +11,17 @@ spec: containers: - name: rabbitmq-policy-setter image: "{{ rabbitmq_image }}" + env: + - name: RABBITMQ_USER + valueFrom: + secretKeyRef: + name: "{{ rabbitmq_app_name }}-secrets" + key: rabbitmq_admin_user + - name: RABBITMQ_PASSWORD + valueFrom: + secretKeyRef: + name: "{{ rabbitmq_app_name }}-secrets" + key: rabbitmq_admin_password command: - /bin/sh - -c @@ -22,6 +33,8 @@ spec: echo "RabbitMQ is up. Applying HA policy..." rabbitmqadmin \ -H rabbitmq-service.{{ rabbitmq_namespace }}.svc.cluster.local \ + -u "$RABBITMQ_USER" \ + -p "$RABBITMQ_PASSWORD" \ declare policy \ name={{ rabbitmq_ha_policy_name }} \ pattern="{{ rabbitmq_ha_policy_pattern }}" \ diff --git a/services/playbooks/secrets.yml b/services/playbooks/secrets.yml index 0f48f4ba..123d4f9f 100644 --- a/services/playbooks/secrets.yml +++ b/services/playbooks/secrets.yml @@ -1,302 +1,306 @@ $ANSIBLE_VAULT;1.1;AES256 -33323239366637313934376464393335376563373063653666333739633366373335353664306535 -6565316230316662623861326433383933623831393831310a353139316562396539386464336130 -66333038653062616664613330366138616361383465313537316231633763373432353534363565 -3633363336343638330a303166356136653337626366353464346531393165383164353464363231 -34323039366162383861303337333337366636336565373765396662343935336238303063366436 -30383231383737373566376365343931336634613534633031386234396435656365363434383439 -38626665343836323562633339663664393161623861343236313834613136386165336364623034 -31323534643330323235653336633439623764383365303664653435393434373234313866623266 -64633435343234616135623734373435383932393935356235613163633265313339313238336534 -30663232636338303230626462636330306631633837333263636530303762303932373230313762 -63303936313432653432653032363836316264396634306536376635353965656532616138313538 -64666134313064636434386335333162666266383562366561393135393032623436373434373231 -34646266373066616436303761306638653236303938323664333765393462333161633537613736 -34626231343663313131363339643939313861323063643538616364373363323465346638633838 -30336134643362313536346138386464653232343534386335313238656630626134653639623064 -33666262393361393065313330656363633665383039303033303331326663356464316336666266 -33633562323061633436373836613338323363373361373562633065313734663937323538376434 -66636238646262626339666430323434313932343335333363306531633636326337393364333735 -30616436313835323434666431646636333230376165616332383366303664336130653966393162 -33323339313838333761613966323034653665373466396137633032313031616230373065353035 -36393665373430646365636535343163336539393736366661646661643739386636363464616137 -63316434626639383232636466646330653462643333666131643764383230306332393533383865 -38623964623831386639333630333062333061653035396466326461633432616364306335316633 -66326138333638306131663566313737316164663831316238656330646165313465616233326537 -35373462333038373662326638363634323634643034636665356661356264303466306237643336 -39623665613333383765626265653735313163343437616430613036306436613563363339623065 -33623861353462323230373064623630626261356262666466393063633564393335646264303038 -64383837313237376664346631656463393636393937303165373138386165616438663634306634 -64393035326331376135316565313133393337326230333661643533656231386461326632336234 -32636230396437366165333939313365373266326433663030323362373866383433323035316364 -65376366356564303530623936663963633337633063643733643534653164346531326163333433 -33636633303336616233663065643334303431303730383938663136363161333534363036353562 -37383663383335326636313636323266313961343632613263616339656333653931316563393935 -65656461363363663365613834326531633764333465663764306530333739303733303361333033 -62366233646562313464646262613936653137663535333736633035396163366132343637323833 -37363132386436656131303633313239386236346239666261643732663366316233353836613966 -65383138616437373330333766306266363564336338636538326361643734636561303435366561 -31653830656631346636346332353430353264613134636535383330626237353434396433356462 -31653365613831656135343462646538343235396264623837376334616632383730636639636166 -36303436363634373430373763333166326561643163366262666435363338343362316161656630 -64633233346565666161343539336231396334336465643263383866326639646435313731336336 -37666138333564663161396431356134663365616263306662663763336161663436376565323563 -39363261356162663763393864613062373833303832613631393735393865336162366430623766 -64376434356664356662316134373766643631646163376430643532393835663533616332663235 -36333661656434316633376561633763653163663131353339353164373361326463666330343836 -61363663346265336361663864303235303636333662366164353663336363356633333432656438 -30613138313962356136323839323639303266636133633366633531326234643364653730626564 -61613064363864326436636464393138376366336366656237356232316439316330383163323166 -34346138636233336363363834623761323635373938323166313962396233313562353232343330 -66343261343833643963396134346130613062633436633332633936323336653331616637393562 -32636566333564336538363865303239393032633139633766356535326336623333336234376165 -38663835636466313234663934366164396363626261336166373165313739313064396662336564 -36323631623734663837646437636264353232393366666532386665393563396336346666623739 -30623965663532633766636132623632343230336235633761323937373861363262653332643832 -30313966333031356165646333316331613137346334626335663831383863646563346464623063 -62643836353332383130666138383364653332623661633061343461646639393439646435613362 -30336532663563656334613337326361613437383331393739323966633635663937663233343431 -32323435306133363835333031343763303832353432313364646439626265353430666537613066 -31393134653638386166336139393034313863356231333131656437656233666339626334623136 -66623762663433303864616430393962643732393631373230616562653833373563306265356237 -39343734336130663734636431373539393731363835626434633961393439663534613931313463 -62633436303336316131313531643634613465343931356634653163303538333837643932336339 -38313563343639356538626639623033633735636135326434313839616164643562333262383431 -30633135306233623534333131376563346135623066353962333663623137643565333364396164 -63356331353332316165306431356462313833636462373661333436363638666133316166656537 -39323663626564303634333264346530373339616136333836653037393930316666343739663533 -31363637343437383030323833376361373465373539363061326164336638613364663966313439 -62663862663635333737393365346438363832353436323132636536353330353430303333343533 -62333039383366366633653263663365343933633034326132363730313134353836373936343532 -30343966353964643134613264313064613130666464393837323363653336393135363034643231 -66366665663964623665353039643230303362323666616534363561653837623935386331636461 -62306365656139386630303662323938323662633134386266383537376134343035376534613435 -61356536313933346537333261343334633161336262313634613463326437633538656632396630 -38346434646233663131373162353462313336366636653734373466323565363430306463313431 -64633761343131383762356535353037333666633337393835363463333161313534643335366664 -35373966653137393262383366663863366531333332623166386666653263646632616461633138 -62333039633734396339643362643931386434613662303263333838623039636663646464326134 -36303261353637653033633035653464363364366438353561306664646338363463356266663562 -64363932363065613130323561366432643734356538366538303566633862303161363332666261 -64373065663330653463646431353834643762373430626636366536613634303830656531663763 -30313565636662303735343635646135393866626535336439643366306263336334333066313335 -61333265343635623066363531363637613665613035396135393435363831313433383638643337 -33323530646139353339356335396162383530613062363833373731343036356234666332343534 -63633330613331323363643862656438613564613330363864616262313936656461356239636136 -38323865383563616665383737343832313630383432643839313666333538376531626236313863 -32323566343764386534323664393561323761626139393633646133393964373861666139336434 -31326135396663313132633135353633613161643962643765363839313932376232343864613334 -33316230636266373635366665646433303138333436396333363939643335643230366232376563 -36623466393564663562376366643864363661613964663539623366386261653339653933326165 -38663334363361323231393138383466333863336438643561656432303739623437323562333863 -30373666316334626433643931303535333161343064656264646536663766386332643263643731 -37333131306233356538613035336338356662383532343562666439346438393534633361303939 -37653239353233663430373163666663373164663138356164396534313835333534636131636266 -62306235363332626136623832316365626562383465396235376161383564666338633632396532 -66326536663931656164383635613035613731373830333166636330636637643461306338383139 -31326435356534373866376131343031373533653735326637636334343566336137663165313030 -30323833376562326639343234666362393466623464396563393838306561373939313237356166 -38386633393137336135356662366436633265653530666138373935323665383334306633346533 -32376566616164646363623131346662393265653661353139343437373838666230323364346464 -36373036373631326632376631383362356366376634623063396461306162393165663937323830 -39623738313764343938323664353262616261333362323934343864366232336563383265303238 -61336437326136656531383030633764343331653463363832663833663765646462313564303038 -65316530616263636231656334623039633839333230303538383637626362643636306162643464 -30666633336237386231613037313064306163316139663038383935346235306536373262373064 -66303636383733626331373435613632666438636366396266613532373066613164653261396565 -35623737356266643731623262333332666331383536356634363230636430323761613962306138 -66373765356231353333666133653263616338373431636336366462613762343533333065303835 -61326637613731386333356563643737656135663438343639653231323636363764316439353763 -35663632636535303338636532353835623661396338366534333630616538393231633862323831 -35343832303866353361306233643762653831373239643565386132653539633837396131373562 -31383135626131326133323466356465323431376264613462376133383464666237336438623138 -63313862643865356331633532646638326637333035646361343263333538356331356338666435 -33656638653763396535323832333765646531616366323361373436383261646536376338386233 -66663039653566666133613535383132376537333962303665633136613161303062376138316133 -30613134383332626538626265656461386633396430646132613430666165306637323433653634 -36333639356334636562353739383566386365356664663034326637613362356532643066326535 -38643136303066623130326137373331626438353366616264326339656636616232336130663463 -30666461313038333337613635656166353530323866353030363736336365333062376139366632 -66656333363664326637376132663933343133343462356137363639303363633534643131383561 -32663834393363366232336432353761353538373734643730336433333239363965656262303737 -63346137636438316139623732306236316465613863653532663535363139613566323838303336 -61336138343365393439313536616234313733346531313237373563613862613431373731643465 -38643663303762353364313238613336383139646335623365616463393033363834373865353931 -65353433306338333561333961646662356431376131626638303265636136363665333863383639 -32363730613761626633613136636139323130303434643439336134633136646630333266643432 -33346430633435313365306331393133646164336166393233663339633465616532663035383261 -65663065643637643963373934613865643832316434363131363431396564356462663866663437 -31653166386561363932346531633666326136363732326233356665383636623334306431326532 -37653534383533346432663636373730646164623763363565663832366530636163306365303161 -37393534373831623931633938326639333861346233333833363938346565616436333734323835 -61356566396439636130663037383733313234643665666538643863613165366431333964373963 -65383336366535373663356137366234623466333937303230343637396639666238393136303431 -34313038663939656232313862623263663734613334363430663063376136336333316164653931 -65636639343232656332623835663234336362333131316531356534383135363238366431653237 -66666261353137623362613966613762343633396636623163336635323039303132613165353337 -36306238636635353431363634336562613239613162323764383838663361366132383937666535 -36323637376539393030613437386166396161396532633865366663613263396366303735646233 -32646338393136323361363332323030656162346338663436613365666362323733633862383231 -36383733616138613932386236353264303532386566326662646335383838376430363164646164 -31306338356133363434613334373339343839336161313330323431386330666330386361353832 -61313636653837656630353035306336646434616265383635333130383939613939303965316366 -62656632316536613964343864636430306132636137386663386431346139656635323238313433 -32623761363433333265333538643533353862633534306435663132626431386461303964333337 -62633132636431326331653336373936346533393964663737643733656635353161633463336432 -31313331613334346562633264353035643661366362316235653539306433623039663932633533 -63383639653864336134323331343037373362363632663566363063373763356636373033623661 -37353530613462303936343435336130306465656330353430336664376166323464303734316538 -39666262363232353832396663376139386335653734653739333539376237656365393033656634 -37363462356465646432326666313438316638646437363439303862666137356465303237666332 -34313263356165333065643533306139386634333432333930623230633433373261343032326265 -39323138356239383530373934633034656430383631323238366635353939626135373737376530 -62643835663539303433613931613838636537336437396131393465633631663637316532346462 -37613862313534333066333563343333613931613433373362326335373734316638653933363765 -34626638373232656231396165613364333061373830303132383439303330643764396564656131 -63653766356663333138656161313831373537646166326232636338363564366438643764343339 -66386335313237616266343033663332383432386132336566663430393636653239636563373934 -38636564643261646235666133383263323838326635366164353531613238666363363633346463 -65343231656231646431643666376639666638653836396234393034656666346163616464663136 -31313234383363383437396333623338666163326336366663643265656631396138636662303562 -36623434613666613663386366383335383237626433663164643564323064346436666131363936 -33303637663035353632393633303635333764633837313432323863333937336435653630636331 -30303664386666346665623265343434366364326636623762363936316330316132666231303230 -30643461653938396230653566336132613832656237643535306335366435383930306430306233 -63656465666333363430336664376133316135353431623739393261366139376636663866626266 -38666665303538616437613232626134303764643163653132393036373033343239316665616331 -62313261373137346531386434626535373665393432343763663562353232383534613266346166 -38386231666239326464323636393338303563626135353864663236313938316663613136656132 -33366331646563333862616438613137396662643838303034356430326631646430303633653033 -35613833336639363532353865303063356465383735633365636465653138656561626434363565 -31663139623663663634643266316633346237623961666534303338323839303432316333313333 -34313533373162373164396635363230356661376237643838353733336630323833353066646234 -64353938323437306264653063346465653562326262393330343661373533323033363861646538 -30323365616533633330356532666631656433313066613632316162386561333234666366613632 -30326431363932643238353263303532303635653365353633623532313938326436373762646138 -66313032303937383065343336633130646136363933386437343734396664663265323030376431 -66666630326262396332386565323235316335386462323961376362613162336333313838656533 -32643137616531613433643764376232616166353130326463636233333262636136336436393134 -64656465303139643738376266366165666661636631386362646338383836363563373633313362 -32653539613139653532376462303538663134313639366663643531653639393633396462633230 -61353533396337396534623139346638376237653235626564643231366136663330363061396231 -36613532373833313136336630613038626163336330633930313434333137343932646133633635 -33663834643866333562643263653532333931383162353531383432313332643363646438633338 -33663336363031333166346436613939346466343236326336613837313737656265383136613262 -39616430383232643635313061333861343034363261373431653038636432373233333539343530 -66633333623563336134396335393638396539306466313161663562636531396365636266666433 -35323435623536316463326538376136333334353163626164353232343364616139663764646266 -36323139363232326434323764616333653962373562613336383161633439316164393462393834 -31346330396638303938636536333036306636363233656539613438623331343939313863613566 -33346262333361376535303031356337383235643262616137393236363764623462373464393363 -64626334356236323336633965326437326465393265613233663033346666346561373231633062 -64636563656539393730626239313261313136353734656432336332386532363338626137616562 -36353937343239666266363162393766663435393631356166396566626463343563363964346561 -65633962616362643734373237633934383261623063396662343664313737616239353034346462 -34346334633830636330666366663638663335376639323539646339323166386535636361346236 -37393638316132643131396237616433346236373036393530316133326639623638313966666335 -38653336396233653834363562373663316535396539356365633430633966613938373738303330 -63666637393164373063653663363665393232313532346162356666623839396534383638393564 -32393162646430346364313131656237353934646135346363386265626433633834333537366466 -34646136323964366665353033656663383632636633376432383765623730643933623839623335 -62633036643232643830626138303737343464303464313066383431616265633466393364346561 -34653534626365333533653434643733383861393464353635313738393735303163666536613930 -32376266613563363931373262343363633433303534353966336632616261643263396239316238 -32616336373034313339336133656462636637326238643733343831393962383066373764373732 -36376665306236663732656533613363336162373363616262373962643866323132653938386139 -38626461376261633637613334333337643565376636323737313232323365393864303137323730 -35333566393835386564363438653531343730623964306435663232383164346238663038366365 -30636263343533353138656339383633633338663630636461656130616335623836346337333535 -36343964653664393833353833373864613364353432333933623139323639353432343630313764 -39663835343338333130643365613134356361663631633138623263363735303764636265643665 -31313663646536663533303033633832373934323131333832303336376237623137646531333231 -34326632303134653033663931633664376537303366613630643963326136623461636166663464 -35393334666631643431656339313334363831366431623937303131626238633732383539373631 -63623033396461333632623463633738386639323930643366663530623961623465633466353331 -30373231333632356464623737393234623666363466313032653639396662646436623933646530 -34383938656534646261666333643864616138393533393266616161356633356332643431353637 -62366335663332353066303761643061306435663437656162316665366233336639356530653931 -66393566613765303937613939646361343163663066313631366133653739333436333033306337 -31313862636239306664393538333361303833646630383331623765306137313236373132326466 -31363162393232656538303966343038313631323765636332316339346436626136386336376366 -30353063303433353665613861386265333765336463643064333339626566666363633864616265 -39393836303530663064663562356537643765346233623038333432333162393539303934376530 -39636161643431653163663662373032363265373861323730373530666334626433346235363439 -36633663336239623566393232363761363237666263616531666438396461326536613036363366 -38613265653137306237396134633238633138336463383132333162393830303866323365626330 -62316633316262613638623935346232313530656132326133653133613662336137323463366630 -35313766653962653062646134313937646533326436366364376132326661613131353033323662 -37386365323834323366373263393636383566303261653138323833313331643035623234656462 -64363236373831636434313631663739396363393433336230626635396633346532643461326461 -35306439666131383762616463653765373438613636653934656630623133333961653565306465 -33666139336464336535363835643664303862393161386466373235346237636134386463323232 -33643830643133303732613738666635393864323936653739376233393831326136623764306335 -63386562656332353333616239333831383335616439396266326139646361643262313736626237 -61366439616264353266313462636539323764626362346337343435646462306564646463346438 -37313133373430616635356334623136373639656331306561376131383036346231623730663465 -38396666356665633039636334613632653231393765643639626437393337613237636361393563 -63346234383033353861383134366462643461393535616465316434346664306134366635623162 -64306436636631306136653134326237323236656364386362346632383730663032343035363532 -63353531303061353532386639646164313465633866383839626438333866323337336165353766 -33376530656133333261633737383731333031396365356530343433663863383736643733376464 -31653164663537393934656432393830623563623163326334333664363838326566616265373266 -31626237343537383930613563363832383139336130393434376632643762376433336633356337 -37333665333435623030306435656339636234616331633961313739316238323563383065623734 -64373635383137626565346432383633376337653134646232616435663439343439666363646431 -63623536383065396165613839613631363635666535386336396433623261303234393666653064 -36326637373563323932636231656466306663313934613238333162636639643337313662313139 -35623735646532306331373664396133666262326333613635313739653363376464616139643061 -39643434343163666130393633666637356232626131623332626661323036616338633237393239 -62353033333637323336663264373138313931323531623632333136353564623239653533356235 -62663366333036316165373831636637636166663062383738333164396465323336323938303733 -38373732303736663365633065636564323732623732346665643430616532653438383363653436 -36393637323263313233616536646662613861306135376130396534363538643361336662343262 -38616536666436663635373661653362343562633164313662373666616161393266316436646664 -31373762343062636461636163633266353564313362646539303365303630333035323136393062 -31373738613536383661313133643065373138623166373032313765336138353233613236366630 -37366630666430313464623234303135356536393438636138653731663938666532663834373665 -37666464386136323838623263633335636338353433643834323533316636303833306539373965 -30316462643264656433323431643263373934363062326662306164633238333933663934383362 -34343730353836323834376438333431366536376539613235373634316261356665366235643163 -34383239643936383238646430313237376363386639373035376165646164316332373233363235 -30356630393330303764613736333235646266396537653330396131303434643138616665616166 -63316138633534633961336437353539613664613931663234623839653963343539646462373731 -34353238623232346161376232333434663033303433353164356637303531663832663563646536 -34333336316665656233303438383836313637623866336639323539323962316434666235616264 -34306165653938626461326233343338613465666339326336333838346438653433363930616438 -64316437333337626431326562643734623834393263396139653362313937353737383033376638 -66336664303238323566356565333565343736366137633236666230313965383062326661376232 -34323264316663333332316433313835383765376438623436393161623465363863346537336636 -38613638343934336562303431386135643934656336383633386665616534323630346331393565 -64643336346335656330366566656231353862626364386638303137633535663339396262623339 -64643964313561323632613631393534653833343638646630333832303436336536363833386362 -38333836646336346536333632653762316463383032633566376436313866396361396262623331 -64646137383635636336643136373436636166376136643236633431343530663439323434663164 -66323566613664653630616630626334326438313132653535616165383931653262386539626361 -37346364326538643737396439643435316130666164363835666137653861633139383235316334 -61653632343363613832316461323838366466303837353762333034663335306561366338626131 -63376533303236316163303063316362643939353037376434353366323461396561393666613461 -30303264666365373265393033653536313630326539633563393239663264356232386437363131 -32376130616162393261363136666130303235393664343466343235343065313432386631383265 -63343563383234353332636436633066306431333465336136663036356465396461393064316663 -36353632343064343361343261643832376431333837343038653837346437383339356662333234 -32343763633862623434336566633332643365353939373039326139643239353133376133313630 -35666531626364353537346633356536303433356639306536633264346562646665346363633531 -32396130613762623336396563303762643937353032313836366331623237323234646333353333 -62623365366236366164343038336661343466373664616366663037323339373635656664663236 -33343037376365323638653561356261376635376438616437386365626236353232646335383530 -62353936666263346630623037636164353438643030316432386139356136313133666638306438 -63613864316135373733343832346531656362636265663462366133636563356566386662343036 -33653462326633613861346431623033343432623139386165363961376164616534303536623631 -35303536643336613265386637613866373732383132613931613039656139633365373434613363 -65373132653661376333373138303766343838373833623131366330663734393762656138333832 -32376436373433306562316333663035343262363538303834333138306436653430633035633866 -64353531383461633962336132326566356662386361346134346532333238643432653034326465 -62396134326332636534666433626336653663313963313034356332656265653731326566393463 -32353062303438643563363466373836643835616263393964323631333564396138336637636637 -62333933333538656130646362386366656233633039613132633466363239613933343639333465 -63313338306662313866346263363034666534616236613866663935316238356235643938393364 -32663664366333356463313232376631303035653638616533633063336131363933616261633836 -35313966336434373430393832313136393835383236643430646533363533613734343464323530 -31666466653531333465383864643138643265663033333230306566303964643463316463373532 -33353138396164306334373435306636623138653532313437613461303839623131623130633065 -66646365306635306665376238353663383839643434643566653237373032656361 +63626263623735616261656533303461653866643861616630383333393239396562353833386362 +3237636530333966656635663432313332393735306164640a323836366536386437633566323637 +35383962323866396366383730366337363632653562343864646237336438313761623536303263 +3233626238353235360a313237353365303431653836316435353337356134303535663038326461 +33663132663162616361383561663632373163643936353236633439343130393966643266366161 +31326561383165346366353364653035393464616536356439323037393065353862363136316662 +38396438393663613162393431303435373363663934363334306531636363653562326366343464 +61303534313337356164333630356337663632353639393637633537623633636262303830366534 +38633164366232383130356231316336653363666232613530636431376231396462333864343338 +39363961633939383436656638633838383766383964666535383964636334343864323737383965 +34396232323634323130313232363432393437616334626465653530653039386435323661653038 +65626231633739303565353830333433613463643534393839393731333665316562643961626530 +63336232306330626338313335666533363034643566306363636333326137343730633766616639 +36623432333464306132656664613134343935623264316436643531633061393632363465313237 +63326461383336636230373461356437626264313661396339646663316361393664303163333265 +62323164616534376131616637663833656533306137663439383038613133393635343961356331 +62313734616562343162323865323033663430323533366662376562386233386532373361633666 +30393334336666306633653965653966353037353436633162353965303866353364616262396262 +32326635616266383166653039336636663430343263323164653863396430303535346233343439 +37623461633734353465613533316631643530363332373466646363323533633962353234376361 +62303764626163383838623832343731653336306338326163663231356366386633353933306233 +65326236313136343966376437316263346563663338616534373861643135656666386165616364 +39373335623836633632363538303932626366383761323530613632336137633630353064646436 +63666237663332386164306136623737663966373734613535626533356231656137636432343863 +30386636373931643332393038653731356136396236393339653239653732343164313764323039 +33633533356633326433643263616135366465663032376538303533393934376334316137333933 +38343264313034666438633539313761613934303264313861396237313865613465653636383030 +30386262363964306537366566323536623933336135663431326332663334343266353165613231 +30343831366537326431386530323065376263306437646665366139623839303961646337323735 +39646461353039303933303464376234363530313561376532366433636562373339666538333334 +31306362663235376131326264356530353163326338633065613736663661636365636337333735 +34343662663439353336333866663066313336626531336438383730623932353039383766303365 +63333532306661346362313863656364393763613530333765373464633435646338626137333339 +31316339326637316238363163346130646536663330346130396335303562366166326537306266 +33653737303638383936653737363232643132383363383264626234376262303738646631343930 +34393164373063343938363961336139386233633134306230663037633262366137643033356435 +37353939363733636261383233616231653235333439333230376435366431373030656234333239 +36396635643062373930663866303265653538366664303761306432356165633537316535326330 +36623933346464396638363664336236656632313034326565666365613830303761326466323333 +36353135383831393132306130653233363364306437306533303439626361396632656130363337 +65313562623435323463393132626661396630366264336165326134663131653133306136323163 +38393433646231656436613866303436656264366337373433313933373937363631306162663463 +34303566366665393064373463343262303163666432373537336234613336393730356164353931 +31363962653666343730613063616665323330326334396133393537663336616637643733356261 +33636537336236646339313664633932643263333636313738303433313939393930303936363537 +65353936666233633861653539383035616432666639613737663935663539313138316339623366 +61306364613862616637666663653436366338646164393164306530613064323135303138383065 +33646139336663396264373938316631303963633332656230326438313065383164663138383236 +35616137373536633965346166303436333461613961366635636432333663666438303939326638 +32336331363935303830333935353339363561373735326466613663303533386535646131636134 +38313866633636386330323430383166306266393231363639306636306239363334336434656466 +63646465303963636663653833363763626464613763343931616666656238366262626365373464 +38613061303236346165653461323439643939613133646462623365353132646538643963326562 +64643531313831636636326664366331343861656162366265316262363733636463626262343939 +64663739346136303161303664326538336666663034323730326333386431323436653130393664 +38396133663164373463616630316532383466313865353038323564313637636133653733366462 +36633262363536383439373136356565656666653065646566333031346461376465363034643532 +64343931356630623236653632633935616430333163663936666638343338306261613662373265 +34373764383865663432343863323035366438343938313634613135326132633230316565376539 +31363133653466323063363464366639643365643834336536303636323962643035393932656366 +36313534353730303737353333656665373039616630326430343631656266373135376635663061 +32393962623535326134633335353364356137363666373639343935313538333564653232373239 +62363536356565323930343835393561396632306230623362353936633937643263383733363536 +66386634323730666130323630326231653132393166353166613665366136323332656361343962 +37316466396530623932663832383063613236656438373338303264383361396562303364616136 +63646539626234663030383038663431346466313034316364616664323430383563326233333431 +62663862393539613038616138386532663133363133376135303836363266623938663738366361 +35393132383766373932396431353265356466643039623536396235616233333435363336313130 +38633362623532656334663833393636363762613639353534666165316239366337313262386134 +32636561316363633933306234623964623266386533313463656132616137323834393366633432 +32376465666632376564656136633133346138376536343338373931346333393266316264356365 +61636662633532366139363764346463363966343633323233636464363239636435373564626666 +65363133356239366162393065303235653465656163366633633039623138633736346233653764 +39343565333462346130633738663432626231643866343431636665643263366333313064663865 +62366265313161353831616339646364303236336538383066333332363034666332393265336633 +63643935343566636635326537336130336562643433613431643933616635323363646536303831 +66616263343933303365323762303133623164376233363339306535333335323064336166663638 +30626435306435363762323537353264363439373835366637623262383662336364646333396230 +61616333633662616165353465383932363935653338313266636161356332383562616536313932 +30323930323862623538663835616364323935366261373065366132383030333232653635633332 +30376233316530306464613235373363393632383163643931383230303665393039343138326433 +36363732356332303438643831343464353566643835376562646237343839363232396363666536 +61633561303936386131663034653764626465346464616462323564333366393162386565666565 +34323261323066353861633662646239613766336432333761313034653035326138633139386635 +62393337343637623632306665356365663637613030613534383562333230643639623063333662 +62346665326139383935326434613866653865663935656565616162623864646334326539306366 +36363634666161303630653238303331333632353263393035623066366532343639363130636630 +33353061306238613133313163623933383930646334356561393661313031356237646364323465 +66653734343631643931373436663565303633646331333965653438303262316230383034623236 +37353133373634613164303835666437323736336433613964616332343264636639663463613261 +63323335626232303932346439316565373632396538376138356464303336323133623039636563 +36383535633734393830316264626338356330336364306633303666343961643237313261313764 +37643131613461663333336461323931393961636235323437663363373335303336333031303133 +63353764653262323163323939643265336435613637626366623930323432313732303039623936 +37653639393834333463326664656466333664643930363338383130326139666538363039616164 +66366263373962323863383261366338336365636431616434343732393263343735656131353566 +65336466323332393832646536643833613232646631623361626432313663656137316230346233 +64373439373834393638653438303731336662353035303835323436313366366264386634663662 +66636331633561393438396533353439616134363334313363383436323762366230336131643837 +32396565636331616261383431383039346462636464633232373531666436653430653461643935 +32343230316361383635373934653831316265663634323334336530316236633635666636336235 +37323465326462313636643762343333376336313436326439373661343638636230313139653738 +64616130623634376139366630323739313734643064303036383234396663646663643837653362 +31353632336431383536353464303631366336613964656135663239613432386135373435653630 +38656634376133343234646263396631663331333437343166323031643138346361653739343738 +31366330646436323831346462326233363938323434643734623234323065323561353765343766 +62313235393739393932373333666234366135333664613737353231363564306135356161323033 +63646233663131383539653038313164316366643736366463373665353364636161623532343939 +37616630393037343234646534323732383662643639316130363132636337323838653935653934 +36356262623436393130623333333363303036313230663865643234333939363866336332663434 +63373631643532663966653536303934323034626238653463326332303135653163353332656538 +30306665336534613439313236613064373239636163393236646335383238313862633133613636 +32613866613232323461303036326433333233306431356535666165623530396534626232343632 +63373133323033333234303431313264346535353532663936613830333738393966373635663463 +61323864313235373236653239613738643734376233313834373165626263623564653362303737 +63663032353265376165663631353232316238343033313837303666363862303662383938313863 +36376335303437616261313462306439313562363064376137333531653366373466663065643234 +35383331363736323363333233326636613939363331346263643963333064333139336330616531 +30303765306565313130663437353230383134366461316566396439366462326664353466323232 +61633162633234643864363765636630313765363732643834323330616265666266626534393532 +33316238343965666234356439383837613033363661373165363235323539383333306636666438 +62326231373362613030616533626664303536663566663635626637376165613636366537363038 +30623939653436353833303733666132613831383465383630333565643934323061633836653633 +62373037366434343330323433633632623034616234666431633234306134383231363665653839 +36353261613134636439306530353066333233383333353036633831323138386265343337336436 +64346231656466383131366433313330356530346433393634393332366434376534323566636564 +38393932363964646337376234353538386361323135643333313763343264653365333164663137 +61383130303333323031346562336630366639396166396564623934626535343433623630383539 +65626666383338303862616165613230613066623132386134343837323139663731633535303537 +32653663616664376537373863363366353731306130636530393864613937303133613730303336 +62376435313566366535353930633763636537383433616661343437376361346238393661376136 +34613665363832303163306265623964646639663736306432376263633035353437613439333130 +65623562373564373039303961623433303133656230613337346239323734616133656462636563 +66653236303764313333303166336639653138323935306365616664376230336335653866363633 +37306431633461313534383132336631373036653036663436353439313534366635363463376661 +66613737626663616635663738653363326332363066373631623063373563626665363062383730 +63303761343332333864313736396265323237643938386135656465626338643066353436663563 +36316263613261386161396536316163653230616230343338323239356439353061386230333761 +33303238613665393564333365363535663963653965323836366462656563613161626431333839 +66616331393731333435333439643664306632616438616634396239383930643864353564383136 +38326131363134363434396338623836313932653962333665303061346233643731346666663031 +36346163643461376137616665316662653734656234376666623037316462336162633663363936 +33316535643134633731626366316533343639376237376338356431323034616330663166363430 +66323139323764613962366335326430366133316536306235373732333233663539643166643564 +65643134613931626365356562343463646366613636656666623031356630633833613236326364 +39656364656137366661343530353232646336616336326233643035363866323834623064333062 +64616661323161313563636535663138666536633536623865633462623634616631306335333962 +39663137306564396561623133323666316233663230333034633436613561646334353034663663 +62313939336131303163396363306632376466353839643333613963316139643364373332613064 +61326265653634393533353434343831643935663435623134393963393463363063306233663263 +62623732386366626664393861316130393463616463623834373336616561323435633231343937 +32623639643137613561633939653038323232356432333137333738393638653836616466613733 +31386239336430363064393537383839303763653037376665346434353364636561646533666136 +66633739343962333262613137363763313565363966656634376132346131323866346234393036 +31663034666165323562313437313034333563326136396639333664373936636264343962313438 +39653264376661303432346464646634356231633662623835333464313737363965326639393265 +32333939333866366631303239643663303133666662333862373133376565336361343561633135 +32613661383464303739336136353135626335616663376135363766633235666261646233383532 +39313637393363323163363634613438633163666133343035643138633030373131306261656134 +36306235343730356265656430633837623965633839386463646262396462373366303635373965 +66313537376639613865616630366335376533343538633431656535616634636638316266353439 +65333038633465343432346562343664303431346363656264663638613937643463313836616166 +35353034343062626162623431396465653962376637653566373564633032616261613362383862 +37313334646536613766386636353037313336313563393536393835373063366362366664306137 +38626363396264303661346238376531666233653933653966333335383236643162653064343735 +33333733303865646139383465393232356432393834353939666434316238383237396664323638 +30343133616136396636366333343737386538663863616234356637646238663233356435663863 +36373037643364303262323563376165306434313235303066643164653966323138383730643333 +30313233396664646462343762373336336239383838653030623232326564386239333331323133 +32383736363962356630333830366536306139613364383231336137343665323435313738663738 +36313364396635346164666164386431636634376237646438646538303862323437366538306136 +63643661313038653037363330633066393337646337373339333737366165356663633234623461 +38333434633766623861306231363363326236653630373334363963663361393038633234633763 +62373563656437313931616231396166316538636332663762656633623863316639346464396439 +31373030636662346237316334383434623234613761313964653239616236626166336137326261 +39636330616265626430663136373632643161636161666437633162363936343662373362313530 +32633361653037313733623536326435383038653565333438336231303239633732653039313663 +38343236373364666438653836656532643961666436386665323835636439653762633565356533 +32363061656633656137363433646662633461373736643835333635313338363561643264313734 +38616139343030626634613838393761623238303431616234646531383362643339663931346563 +37376538383934313733336231386432663261616533626262353838666338653735313938323731 +30366563653934383837666335653630353333333736663434633935333939313233646564663961 +61613265636438333932626363663063616462373761373939383931666363346335323864653662 +31626631316235313636373164343837343030633638356566336437633231653561323163623761 +64343464346530383938633438383830616530383364376638633032323466636431376530386133 +33353662643434306461386133346434306263336663393263336436316638343039633664653630 +34363361303635376162313961356334616663343962343761616638386433333337353863613661 +39643163633861316164646131343161396664346230376166316334356138333737653066653166 +62313861666630633933313666636538376536326362633038383235313634303937646234653333 +35633363663738613132363935343637373731346131623733613135653630313730386266353132 +64383566623638623637656538326230636135393739616535653262366537393434646636653135 +31643730346636383064373538323031373965343363623939363732633661376538393764313131 +34653932363734656462386531313931613062643564656139656465313463363737316263346435 +35663132353765383934613264303466343535333038343531306631363636613265663734613063 +35333239303230386239663930663833633234393638656530386633313965353432626666303835 +39646537336139303631613561306362363762353332396262323135323661653536393331623034 +64663263616563313738396236363830636534653462633665643063626631376434633137633461 +38343831353764313930396336336132646436633133366363393462346163303338663730653432 +39363937383865393961353032626234333638613435396564313739313431303835336336383332 +39386461333631386361333435663063363636343633633533386239313337303239336536396563 +63383933333737373333616432356430343939323030623664343332383939376433386131343135 +66363531663264643361356362633430646164656564623931643730663462353836313139633932 +35366465346337393139383736383730346364393162323332653837623335343065383333626639 +37393537613365353134666366633631646335396634303961326262666363313162653934386264 +62656661613935366237393430626236326261303666323363363531343631666530653931316132 +64353965373432373264343961646564346538633035656130303263336137383963613839333461 +65333865613134333962306335343837326664383737313165386361633065353339373836616536 +64313233386261653135396163613033353337623833383465656166346362303634663063343338 +37623237373236326662326563656236666363633061663835313035323133633030383433663731 +34363339393265653534653930353032656265373238666230363832626432343861646361393337 +32383161343565323265366630363936623534613661623865306534623834393632333765376531 +34643562366134343932303435653133333936643432633034643263303562363461373937613238 +34383363663565366332396233393339653465303162633731616639616662396365626635633132 +63373662343734616437323638376133373137333266343361626166623961326238323766323539 +32613934666534313062333135363563323632373834396664356265303334373937323632316664 +65626563386535363766666362353633653265613561336263613631373934633933336233623163 +65356431303161666266333662386632316138623065613036366430643634393463383739343962 +30326634393732613236353239396534363232373365346264343833363339623366623266303435 +63646336303866653864323031653730636235353839323165343664393435613930336539353334 +61386137316333393066376632393736633564663830316665386264376633313935646164326439 +64623364356633376431633765326461343637306432366366366530396133663630633438653535 +61663133613666633562366164383638386363373461646437313532363365623538636636396530 +38656532346566303465663138643937333138323833376233383539623530666662343932343764 +36356330373039666166353334373331626334633639373739616137613430376636393635636133 +31313966323565326531393337323931366661363135613533373637313563306562626466323531 +33386263626636343862373536633036393634393761393866653532623439393865643431353464 +31306164363065353634313832616234383363346238646336653832613534393165376466666435 +66373131623162346236343939396439643636313830373263356164646133643065643437353636 +65386630623366313065653037333530656336393665396130656362373131323762616166633531 +31636131333463373461326665376337346436303836653633663237343062653666666164356364 +65363833323565363465636636633237636662323533623462383564343237623563373138626661 +65383934363339663561346434333732343538633565363839343061383339633330303038306131 +34646331643532666664656630383734656139636334623533653437646330316336613034373935 +35616365326461333430316531363132303039343331323437393737623536393539336631346531 +37323536623339656431616434323031623636303462343635653862613938616362336635303363 +33393639316333303466316330356266333135343535373665616136646236336534623937336334 +61306533303031636434366234653562653731653631326461376265343635326366316430323463 +64636434626563386466613438643764383431633032343666623238366266633036386564396463 +31653062616134626431373466353266383464363631376663646664313965666232396234373361 +63396361313034303065663334633839623032353761633164383361333933643864323034303831 +66306466333463356633336130333236313830393263333466376330356330643335346239623237 +66313233646130633632633436303666636636393565643432363765313330313239623364363431 +30366563636630643333353030623539656162666433303961306235393231363939303131373335 +36353163393964393335323666326662646432303638643133646466616230393964656534643161 +39353439303038383732383962653039643662633931323563333433386135333862353230653432 +66623963623236623236633838656233353533616331353536316333396537656636323236623937 +61396465393066643138616333636665333632306265623638363838333464633837396137383239 +39623661343935613932323134643533353139666636323538643938613530303830383766656164 +39313663383966633565613831306466633030663261643064326131366135653365373465316331 +30306439666531303336616331383535653034383330316231376335363636663839313533643837 +66313539353163613563656238323462383633346532353938386532373765373734356337363137 +63626532356132636461333263333962303831613930376564636135623332336334366637383637 +65633139333437343666383066623831666263363566316630326533303936633638656263333166 +32313363393539383364626538646231326363643266333231353266346364373436333835323933 +66616163633235386238313063663461356132623039613461376262313165663039396365393339 +63653639646363653439353061306363643963613366393431303661373430613735386537636331 +30336365303066326663656233363762616462666532353265343062626162636139343137666431 +37346330653739353661666630393530656264383063353933626461613861653035363565356130 +36653366323930306366663630386433346165383665366364333963646632336332333431396662 +34373430336262616339393861386264303839353237646462326238623934336430653733663334 +63306335386465376361666330663336356637383836663266346236613962343931393335333363 +64313137393764633736333038666636396361336538623238373639353566363565333063636238 +31643962333964336366613161616332663332343963323465666165363035656331306331356664 +64646163643733623233346263616462646164393765653239386231376162666162633637663633 +64356666353835346537346232313565323635376434383833343337396266356332376539383365 +31633434333535633764346263363434393730396638326331316132343663306264316232353563 +65326636643166393736633431663761653236316632613534656330353665316166643730353161 +61623061336131303735326364346562663362366435353563373163343664323963653338306436 +30343033623530376431393733366561323066333761346139656233393430633663616632313934 +37356361636238643438333361306238646166336463386362323230383232626635316331393966 +61643566643062313965343135396336666664346138623532633037306339393334646639333930 +64376139633264383264323063666632336665303933393639613831336139646232656663366239 +34353136616663376438343134323839313234336330616565333830663533333431396631663062 +63616330616536346636633130363437326665313131316631393663356664343565373634636530 +61346330666638656664316434333961363566376163316634663433343763623761346166623034 +38616135353566316165356336366535633365636264373637373734383638653437633633656533 +33363635666330646537393637396461323834366338643432323939663435306338613733623564 +34363336373530346238386131393930313732306264626538363239346336633962616332346130 +62346532626439323265343935323632393532396534633139633163383066346633336639313730 +65343333346563353761376432386334323539316534313635363130636230356462616535373062 +66626263343464393038363762613333376265336232626634306265323832666566383930643263 +64646363663736383466373264363333626133313333666138666361343139613062653137366666 +64653234303930336631316337316332313532636439633733653535333865616333363935633230 +39616330323136346637643265633266353532646232333966663131383763323961393163633664 +30393036636335313963313635303933353965303266646561623965303730333432343236346332 +36633265343865623137323437333464396562623332363535323934626666623038666435616335 +30613866633066303964313432306665343538313632326365303864666365663033383632363036 +35666464316536386266316233343638326465656636393034343966313036396533326430353763 +66333435613939626265623761326336313066363536626632303730663234633563306439646335 +38396534623666643265313133336239313665353631643935626266666264653636343638313438 +35643436653161306165623631313530363430313864643630666439646633613731303662636162 +63643231376338343230316166633161346563656533393263356139363537326538666431633665 +61343061616637353066323033666462363430656262393164316430363035323436393231336664 +64383030396630336162326136653938616663383137313730323637636564663339643934333635 +39336137333864316265366635333465356164646464313135396665313130626132613734613164 +37613439303939376666393363616263653932623963616136633862306636306563633337306531 +30343964353533366364363637643064316661666131306332363331363764646436373637333230 +38613336396136633232303930326666623761646432373166316162626136323033643935653365 +34666431646430396363643232623039346336653536323763373330393631643037636638633065 +37663135303866346132303933653530353539386365613366393536626464353663643630623830 +64613737386531656434346338653938356363643330316139323030353162353131356163353234 +64356362343439613138366538363661386638366531653233613765366630646238396566643732 +30633435396666333966396134326566663865323339343061346334396465653965663339623566 +38303766316639396361346331333530343234383666616566383037653635383365316664333664 +37353865643561373863643032326332353537613337386632613838373032396136 From cd369a9cb932500cbd4b7534f4a53c45e20540dc Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:50:47 +0200 Subject: [PATCH 110/242] rabbitmqadmin auth --- .../playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index bfec0fe3..c7d16498 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -30,7 +30,7 @@ spec: while ! rabbitmqctl -q --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local ping; do sleep 5 done - echo "RabbitMQ is up. Applying HA policy..." + echo "RabbitMQ is up. Applying HA policy... (user=$RABBITMQ_USER, pass=$RABBITMQ_USER)" rabbitmqadmin \ -H rabbitmq-service.{{ rabbitmq_namespace }}.svc.cluster.local \ -u "$RABBITMQ_USER" \ From 7fb5001eee67bd24373dd462161beb83d95695e8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:58:04 +0200 Subject: [PATCH 111/242] rabbitmqadmin auth --- .../playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index c7d16498..7f9a75b9 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -26,11 +26,11 @@ spec: - /bin/sh - -c - | - echo "Waiting for RabbitMQ service to be ready..." + echo "Waiting for RabbitMQ service to be ready...(user=$RABBITMQ_USER, pass=$RABBITMQ_USER)" while ! rabbitmqctl -q --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local ping; do sleep 5 done - echo "RabbitMQ is up. Applying HA policy... (user=$RABBITMQ_USER, pass=$RABBITMQ_USER)" + echo "RabbitMQ is up. Applying HA policy..." rabbitmqadmin \ -H rabbitmq-service.{{ rabbitmq_namespace }}.svc.cluster.local \ -u "$RABBITMQ_USER" \ From eb128157f3b5f266e3a9ab57ef018438ae89ed9f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 11:59:40 +0200 Subject: [PATCH 112/242] rabbitmqadmin auth --- .../roles/rabbitmq/templates/05-policy-job.yml.j2 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index 7f9a75b9..7131bd23 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -12,6 +12,11 @@ spec: - name: rabbitmq-policy-setter image: "{{ rabbitmq_image }}" env: + - name: RABBITMQ_ERLANG_COOKIE + valueFrom: + secretKeyRef: + name: "{{ rabbitmq_app_name }}-secrets" + key: rabbitmq_erlang_cookie - name: RABBITMQ_USER valueFrom: secretKeyRef: @@ -26,7 +31,7 @@ spec: - /bin/sh - -c - | - echo "Waiting for RabbitMQ service to be ready...(user=$RABBITMQ_USER, pass=$RABBITMQ_USER)" + echo "Waiting for RabbitMQ service to be ready..." while ! rabbitmqctl -q --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local ping; do sleep 5 done From 2b2f33a6812d97ac13bf2f5594b357c1cf8ad690 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:03:54 +0200 Subject: [PATCH 113/242] rabbitmqadmin auth --- .../playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index 7131bd23..638d0fa7 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -37,7 +37,7 @@ spec: done echo "RabbitMQ is up. Applying HA policy..." rabbitmqadmin \ - -H rabbitmq-service.{{ rabbitmq_namespace }}.svc.cluster.local \ + -H rabbitmq.{{ rabbitmq_namespace }}.svc.cluster.local \ -u "$RABBITMQ_USER" \ -p "$RABBITMQ_PASSWORD" \ declare policy \ From 0b4c6f8659bdc8c054f5974d4b98036644733632 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:06:05 +0200 Subject: [PATCH 114/242] rabbitmqadmin auth --- services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index 638d0fa7..ed197f86 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -38,6 +38,7 @@ spec: echo "RabbitMQ is up. Applying HA policy..." rabbitmqadmin \ -H rabbitmq.{{ rabbitmq_namespace }}.svc.cluster.local \ + -P 15672 \ -u "$RABBITMQ_USER" \ -p "$RABBITMQ_PASSWORD" \ declare policy \ From 0833862ce4c27ff9a2e10f174970d5d6b0031293 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:11:20 +0200 Subject: [PATCH 115/242] changed policy due to deprecation --- services/playbooks/roles/rabbitmq/defaults/main.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/defaults/main.yml b/services/playbooks/roles/rabbitmq/defaults/main.yml index af771d93..2900c2b4 100644 --- a/services/playbooks/roles/rabbitmq/defaults/main.yml +++ b/services/playbooks/roles/rabbitmq/defaults/main.yml @@ -18,6 +18,8 @@ rabbitmq_pvc_storage_class: "longhorn" rabbitmq_pvc_storage_size: "5Gi" # HA settings -rabbitmq_ha_policy_name: "ha-all" +rabbitmq_ha_policy_name: "quorum-all" +# rabbitmq_ha_policy_name: "ha-all" rabbitmq_ha_policy_pattern: ".*" -rabbitmq_ha_policy_definition: '{"ha-mode":"all", "ha-sync-mode":"automatic"}' +rabbitmq_ha_policy_definition: '{"queue-type":"quorum","queue-leader-locator":"balanced"}' +# rabbitmq_ha_policy_definition: '{"ha-mode":"all", "ha-sync-mode":"automatic"}' From ef057012954b2b5c4893e0a2b8dd0bc6687986c5 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:15:45 +0200 Subject: [PATCH 116/242] changed policy due to deprecation --- .../rabbitmq/templates/05-policy-job.yml.j2 | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index ed197f86..fff27bae 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -31,17 +31,13 @@ spec: - /bin/sh - -c - | - echo "Waiting for RabbitMQ service to be ready..." - while ! rabbitmqctl -q --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local ping; do - sleep 5 - done - echo "RabbitMQ is up. Applying HA policy..." - rabbitmqadmin \ - -H rabbitmq.{{ rabbitmq_namespace }}.svc.cluster.local \ - -P 15672 \ - -u "$RABBITMQ_USER" \ - -p "$RABBITMQ_PASSWORD" \ - declare policy \ - name={{ rabbitmq_ha_policy_name }} \ - pattern="{{ rabbitmq_ha_policy_pattern }}" \ - definition='{{ rabbitmq_ha_policy_definition }}' + echo "RabbitMQ is up. Applying quorum queue policy..." + rabbitmqctl --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local \ + set_policy {{ rabbitmq_ha_policy_name }} \ + "{{ rabbitmq_ha_policy_pattern }}" \ + '{{ rabbitmq_ha_policy_definition }}' \ + --apply-to queues + + echo "Policy applied successfully!" + rabbitmqctl --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local \ + list_policies From ae9cb04dd35afabda7f4da8405b2ecba447b879f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:19:49 +0200 Subject: [PATCH 117/242] changed policy due to deprecation --- .../playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index fff27bae..93243304 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -33,10 +33,10 @@ spec: - | echo "RabbitMQ is up. Applying quorum queue policy..." rabbitmqctl --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local \ + --apply-to queues \ set_policy {{ rabbitmq_ha_policy_name }} \ "{{ rabbitmq_ha_policy_pattern }}" \ - '{{ rabbitmq_ha_policy_definition }}' \ - --apply-to queues + '{{ rabbitmq_ha_policy_definition }}' echo "Policy applied successfully!" rabbitmqctl --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local \ From 98786b56287fa38b990e3c01f1ec95eee581692f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:28:46 +0200 Subject: [PATCH 118/242] changed policy due to deprecation --- services/playbooks/roles/rabbitmq/defaults/main.yml | 2 +- .../roles/rabbitmq/templates/05-policy-job.yml.j2 | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/defaults/main.yml b/services/playbooks/roles/rabbitmq/defaults/main.yml index 2900c2b4..23857f5c 100644 --- a/services/playbooks/roles/rabbitmq/defaults/main.yml +++ b/services/playbooks/roles/rabbitmq/defaults/main.yml @@ -18,7 +18,7 @@ rabbitmq_pvc_storage_class: "longhorn" rabbitmq_pvc_storage_size: "5Gi" # HA settings -rabbitmq_ha_policy_name: "quorum-all" +rabbitmq_ha_policy_name: "quorum" # rabbitmq_ha_policy_name: "ha-all" rabbitmq_ha_policy_pattern: ".*" rabbitmq_ha_policy_definition: '{"queue-type":"quorum","queue-leader-locator":"balanced"}' diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index 93243304..717c734c 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -33,11 +33,14 @@ spec: - | echo "RabbitMQ is up. Applying quorum queue policy..." rabbitmqctl --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local \ - --apply-to queues \ set_policy {{ rabbitmq_ha_policy_name }} \ "{{ rabbitmq_ha_policy_pattern }}" \ - '{{ rabbitmq_ha_policy_definition }}' - - echo "Policy applied successfully!" + '{{ rabbitmq_ha_policy_definition }}' \ + --apply-to queues + if [[ "$?" == "0" ]]; then + echo "Policy applied successfully!" + else + echo "Error applying policies!" + fi rabbitmqctl --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local \ list_policies From 7ba2d4f2b1b97bcd3d67c4eb101e2389c5280a8f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:31:39 +0200 Subject: [PATCH 119/242] changed policy due to deprecation --- .../rabbitmq/templates/05-policy-job.yml.j2 | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index 717c734c..31ef22c8 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -31,12 +31,21 @@ spec: - /bin/sh - -c - | + echo "Waiting for RabbitMQ service to be ready..." + while ! rabbitmqctl -q --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local ping; do + sleep 5 + done echo "RabbitMQ is up. Applying quorum queue policy..." - rabbitmqctl --longnames -n rabbit@rabbitmq-0.rabbitmq-headless.{{ rabbitmq_namespace }}.svc.cluster.local \ - set_policy {{ rabbitmq_ha_policy_name }} \ - "{{ rabbitmq_ha_policy_pattern }}" \ - '{{ rabbitmq_ha_policy_definition }}' \ - --apply-to queues + rabbitmqadmin \ + -H rabbitmq.{{ rabbitmq_namespace }}.svc.cluster.local \ + -P 15672 \ + -u "$RABBITMQ_USER" \ + -p "$RABBITMQ_PASSWORD" \ + declare policy \ + name={{ rabbitmq_ha_policy_name }} \ + pattern="{{ rabbitmq_ha_policy_pattern }}" \ + definition='{{ rabbitmq_ha_policy_definition }}' + if [[ "$?" == "0" ]]; then echo "Policy applied successfully!" else From ea7aac714dccf2312cd547e811613ae33863c41a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 12:35:38 +0200 Subject: [PATCH 120/242] changed policy due to deprecation --- .../playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 index 31ef22c8..f9fdbc3a 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 @@ -46,7 +46,7 @@ spec: pattern="{{ rabbitmq_ha_policy_pattern }}" \ definition='{{ rabbitmq_ha_policy_definition }}' - if [[ "$?" == "0" ]]; then + if [ $? -eq 0 ]; then echo "Policy applied successfully!" else echo "Error applying policies!" From 3c12e9f7df4f2de6a652578fd49b6eba3aee71a7 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 13:09:38 +0200 Subject: [PATCH 121/242] changed policy due to deprecation --- brokeroo/cmd/brokeroo/main.go | 44 ++++++++++++++++++- .../src/internal/service/rabbit.go | 5 ++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 7f4e203d..7857c565 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -85,6 +85,7 @@ func (s *Service) connectRabbitMQ() error { if err != nil { return fmt.Errorf("failed to connect to RabbitMQ: %w", err) } + s.amqpChannel, err = s.amqpConn.Channel() if err != nil { return fmt.Errorf("failed to open channel: %w", err) @@ -94,6 +95,35 @@ func (s *Service) connectRabbitMQ() error { if err := s.amqpChannel.Qos(s.config.PrefetchCount, 0, false); err != nil { return fmt.Errorf("failed to set QoS: %w", err) } + args := amqp.Table{ + "x-queue-type": "quorum", + } + q, err := s.amqpChannel.QueueDeclarePassive( + s.config.QueueName, + true, // durable + false, // auto-delete + false, // exclusive + false, // no-wait + args, + ) + if err != nil { + _ = s.amqpChannel.Close() + _ = s.amqpConn.Close() + time.Sleep(5 * time.Second) + return fmt.Errorf("Queue declare failed: %v", err) + } + err = s.amqpChannel.QueueBind( + q.Name, // queue name + s.config.RoutingKey, // routing key (use "" for fanout exchanges) + s.config.ExchangeName, // exchange name + false, // no-wait + nil, // arguments + ) + if err != nil { + _ = s.amqpChannel.Close() + _ = s.amqpConn.Close() + return fmt.Errorf("failed to bind queue: %w", err) + } return nil } @@ -239,7 +269,7 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { go func() { current := s.config.PrefetchCount last := s.config.PrefetchCount - ticker := time.NewTicker(5 * time.Second) + ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for { @@ -248,7 +278,17 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { return case <-ticker.C: avgLatency := s.avgDbLatency() - q, err := s.amqpChannel.QueueInspect(s.config.QueueName) + args := amqp.Table{ + "x-queue-type": "quorum", + } + q, err := s.amqpChannel.QueueDeclarePassive( + s.config.QueueName, + true, // durable + false, // auto-delete + false, // exclusive + false, // no-wait + args, + ) if err != nil { continue } diff --git a/trackeroo-backend/src/internal/service/rabbit.go b/trackeroo-backend/src/internal/service/rabbit.go index 7b271c39..48a2513c 100644 --- a/trackeroo-backend/src/internal/service/rabbit.go +++ b/trackeroo-backend/src/internal/service/rabbit.go @@ -63,13 +63,16 @@ func runRabbitWatcher(ctx context.Context) { } // Declare queue + args := amqp.Table{ + "x-queue-type": "quorum", + } q, err := ch.QueueDeclare( "device_conn_events", true, // durable false, // auto-delete false, // exclusive false, // no-wait - nil, + args, ) if err != nil { logger.Error("Queue declare failed: %v", err) From a841cdd3433d61882d93021c11fc6821e1cd6488 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 13:16:41 +0200 Subject: [PATCH 122/242] changed policy due to deprecation --- brokeroo/cmd/brokeroo/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 7857c565..faa15bb7 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -98,7 +98,7 @@ func (s *Service) connectRabbitMQ() error { args := amqp.Table{ "x-queue-type": "quorum", } - q, err := s.amqpChannel.QueueDeclarePassive( + q, err := s.amqpChannel.QueueDeclare( s.config.QueueName, true, // durable false, // auto-delete From 517c3b05b8c1474fbc77b593c0ee7fc84bf2300a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 13:40:50 +0200 Subject: [PATCH 123/242] removed set policy job --- .../playbooks/roles/rabbitmq/tasks/main.yml | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/tasks/main.yml b/services/playbooks/roles/rabbitmq/tasks/main.yml index 33e42a1f..3d2b50a5 100644 --- a/services/playbooks/roles/rabbitmq/tasks/main.yml +++ b/services/playbooks/roles/rabbitmq/tasks/main.yml @@ -67,19 +67,18 @@ state: present namespace: "{{ rabbitmq_namespace }}" definition: "{{ lookup('template', '04-service.yml.j2') | from_yaml }}" +# - name: "Ensure previous HA Policy Job is removed" +# kubernetes.core.k8s: +# kubeconfig: /etc/rancher/k3s/k3s.yaml +# state: absent +# namespace: "{{ rabbitmq_namespace }}" +# kind: Job +# # The name must match the metadata.name in your J2 template +# name: "{{ rabbitmq_app_name }}-set-ha-policy" -- name: "Ensure previous HA Policy Job is removed" - kubernetes.core.k8s: - kubeconfig: /etc/rancher/k3s/k3s.yaml - state: absent - namespace: "{{ rabbitmq_namespace }}" - kind: Job - # The name must match the metadata.name in your J2 template - name: "{{ rabbitmq_app_name }}-set-ha-policy" - -- name: "Create Job to apply RabbitMQ HA Policy" - kubernetes.core.k8s: - kubeconfig: /etc/rancher/k3s/k3s.yaml - state: present - namespace: "{{ rabbitmq_namespace }}" - definition: "{{ lookup('template', '05-policy-job.yml.j2') | from_yaml }}" +# - name: "Create Job to apply RabbitMQ HA Policy" +# kubernetes.core.k8s: +# kubeconfig: /etc/rancher/k3s/k3s.yaml +# state: present +# namespace: "{{ rabbitmq_namespace }}" +# definition: "{{ lookup('template', '05-policy-job.yml.j2') | from_yaml }}" From 8d348db9c6e5f9ba15f5e8c62ddcf12867679628 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:04:17 +0200 Subject: [PATCH 124/242] adjusting latency metrics --- brokeroo/cmd/brokeroo/main.go | 88 ++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 18 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index faa15bb7..4a5ecaea 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -9,6 +9,8 @@ import ( "os" "os/signal" "strings" + "sync" + "sync/atomic" "syscall" "time" @@ -38,9 +40,13 @@ type Service struct { db *sql.DB kafkaWriter *kafka.Writer knownTopics map[string]bool + mu sync.RWMutex // metrics - dbLatencies []time.Duration + dbLatencies []time.Duration + saturatedBatches int64 + timeoutBatches int64 + totalBatches int64 } type Envelope struct { @@ -207,6 +213,12 @@ func (s *Service) parseMessage(msg amqp.Delivery) (IncomingMessage, bool) { } func (s *Service) processBatch(batch []IncomingMessage) { + if len(batch) >= s.config.BatchSize { + atomic.AddInt64(&s.saturatedBatches, 1) + } else { + atomic.AddInt64(&s.timeoutBatches, 1) + } + atomic.AddInt64(&s.totalBatches, 1) start := time.Now() tx, err := s.db.Begin() if err != nil { @@ -251,6 +263,8 @@ func (s *Service) processBatch(batch []IncomingMessage) { } latency := time.Since(start) + s.mu.Lock() + defer s.mu.Unlock() s.dbLatencies = append(s.dbLatencies, latency) if len(s.dbLatencies) > 100 { s.dbLatencies = s.dbLatencies[1:] @@ -278,30 +292,31 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { return case <-ticker.C: avgLatency := s.avgDbLatency() - args := amqp.Table{ - "x-queue-type": "quorum", - } + batchFillRate := s.getBatchFillRate() // New metric + + args := amqp.Table{"x-queue-type": "quorum"} q, err := s.amqpChannel.QueueDeclarePassive( - s.config.QueueName, - true, // durable - false, // auto-delete - false, // exclusive - false, // no-wait - args, + s.config.QueueName, true, false, false, false, args, ) if err != nil { continue } - if q.Messages > 1000 && avgLatency < 5*time.Millisecond && current < s.config.MaxPrefetch { - current += 5 - } else if q.Messages < 100 && avgLatency > 20*time.Millisecond && current > s.config.MinPrefetch { - current -= 5 - } + + // Calculate optimal prefetch + current = s.calculateOptimalPrefetch( + q.Messages, + avgLatency, + batchFillRate, + current, + ) + if last == current { continue } + if err := s.amqpChannel.Qos(current, 0, false); err == nil { - log.Printf("Adjusted prefetch=%d (queue=%d, avgDB=%v)", current, q.Messages, avgLatency) + log.Printf("Adjusted prefetch=%d (queue=%d, avgDB=%v, batchFill=%.2f%%)", + current, q.Messages, avgLatency, batchFillRate*100) last = current } } @@ -309,6 +324,43 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { }() } +func (s *Service) calculateOptimalPrefetch( + queueDepth int, + avgLatency time.Duration, + batchFillRate float64, + current int, +) int { + // If batches are saturating too quickly (>95%), reduce prefetch + // to allow batch timeout to trigger more often + if batchFillRate > 0.95 && current > s.config.MinPrefetch { + return max(current-5, s.config.MinPrefetch) + } + + // If batches rarely fill (<50%) and latency is low, increase prefetch + if batchFillRate < 0.5 && avgLatency < 5*time.Millisecond && + queueDepth > 1000 && current < s.config.MaxPrefetch { + return min(current+5, s.config.MaxPrefetch) + } + + // If latency is high, reduce prefetch to avoid overwhelming DB + if avgLatency > 20*time.Millisecond && current > s.config.MinPrefetch { + return max(current-5, s.config.MinPrefetch) + } + + return current +} + +func (s *Service) getBatchFillRate() float64 { + s.mu.RLock() + defer s.mu.RUnlock() + + if s.totalBatches == 0 { + return 0 + } + // Return ratio of batches that reached maxBatchSize vs timeout + return float64(s.saturatedBatches) / float64(s.totalBatches) +} + func (s *Service) avgDbLatency() time.Duration { if len(s.dbLatencies) == 0 { return 0 @@ -331,8 +383,8 @@ func loadConfig() *Config { PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 10), BatchSize: getEnvOrDefaultInt("BATCH_SIZE", 50), BatchTimeout: 500 * time.Millisecond, - MinPrefetch: 5, - MaxPrefetch: 100, + MinPrefetch: 20, + MaxPrefetch: 200, } } From 5ae4f5e933f0c34c161b89f7fd256527e5db72d8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:11:11 +0200 Subject: [PATCH 125/242] adjusting latency metrics --- services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 b/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 index d0598aef..fb5a6b4f 100644 --- a/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 @@ -17,4 +17,4 @@ spec: name: cpu target: type: Utilization - averageUtilization: 70 + averageUtilization: 50 From 877f47e236cf230fe1f8802be4813d7b92cc18bd Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:14:08 +0200 Subject: [PATCH 126/242] adjusting latency metrics --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index 0fa09770..1a498e16 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -36,7 +36,7 @@ spec: - name: KAFKA_BROKER value: "kafka.data.svc.cluster.local:9092" - name: BATCH_SIZE - value: "100" + value: "20" resources: requests: cpu: "100m" From ff48636b568f30f3b356323060c00eef0a10bc8b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:18:35 +0200 Subject: [PATCH 127/242] adjusting latency metrics --- brokeroo/cmd/brokeroo/main.go | 6 ++++-- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 4a5ecaea..ed609264 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -373,7 +373,7 @@ func (s *Service) avgDbLatency() time.Duration { } func loadConfig() *Config { - return &Config{ + config := &Config{ RabbitMQURL: getEnvOrDefault("RABBITMQ_URL", "amqp://guest:guest@localhost:5672/"), QueueName: getEnvOrDefault("QUEUE_NAME", "brokeroo"), ExchangeName: getEnvOrDefault("EXCHANGE_NAME", "amq.topic"), @@ -383,9 +383,11 @@ func loadConfig() *Config { PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 10), BatchSize: getEnvOrDefaultInt("BATCH_SIZE", 50), BatchTimeout: 500 * time.Millisecond, - MinPrefetch: 20, + MinPrefetch: 1, MaxPrefetch: 200, } + log.Printf("(queue_name=%s, exchange_name=%s, routing_key=%s, prefetch_count=%d, batch_size=%d)", config.QueueName, config.ExchangeName, config.RoutingKey, config.PrefetchCount, config.BatchSize) + return config } func getEnvOrDefault(key, def string) string { diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index 1a498e16..060417a3 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -28,7 +28,7 @@ spec: - name: RABBITMQ_URL value: "amqp://apps:apps@rabbitmq:5672/" - name: PREFETCH_COUNT - value: "20" + value: "10" - name: POSTGRES_URL value: "postgres://apps:apps@tsdb-rw.data.svc.cluster.local:5432/tracker_db?sslmode=disable" - name: ROUTING_KEY From 0d308ac309162f9543d2a3aa84e6e78bec77e006 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:18:50 +0200 Subject: [PATCH 128/242] adjusting latency metrics --- brokeroo/cmd/brokeroo/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index ed609264..cd851105 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -386,7 +386,7 @@ func loadConfig() *Config { MinPrefetch: 1, MaxPrefetch: 200, } - log.Printf("(queue_name=%s, exchange_name=%s, routing_key=%s, prefetch_count=%d, batch_size=%d)", config.QueueName, config.ExchangeName, config.RoutingKey, config.PrefetchCount, config.BatchSize) + log.Printf("config -> (queue_name=%s, exchange_name=%s, routing_key=%s, prefetch_count=%d, batch_size=%d)", config.QueueName, config.ExchangeName, config.RoutingKey, config.PrefetchCount, config.BatchSize) return config } From 4769204a131f83764a057b1d32a2336020541130 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:22:34 +0200 Subject: [PATCH 129/242] adjusting latency metrics --- brokeroo/cmd/brokeroo/main.go | 2 +- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index cd851105..e4e80f39 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -382,7 +382,7 @@ func loadConfig() *Config { KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 10), BatchSize: getEnvOrDefaultInt("BATCH_SIZE", 50), - BatchTimeout: 500 * time.Millisecond, + BatchTimeout: time.Duration(getEnvOrDefaultInt("BATCH_TIMEOUT_MS", 100)) * time.Millisecond, MinPrefetch: 1, MaxPrefetch: 200, } diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index 060417a3..bd7c2d40 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -37,6 +37,8 @@ spec: value: "kafka.data.svc.cluster.local:9092" - name: BATCH_SIZE value: "20" + - name: BATCH_TIMEOUT_MS + value: "50" resources: requests: cpu: "100m" From 5f774a8b6d6dbf1f8977b89296e1e23e532da298 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:42:15 +0200 Subject: [PATCH 130/242] adjusting latency metrics --- brokeroo/cmd/brokeroo/main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index e4e80f39..bcc55eed 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -373,6 +373,7 @@ func (s *Service) avgDbLatency() time.Duration { } func loadConfig() *Config { + batchSize := getEnvOrDefaultInt("BATCH_SIZE", 50) config := &Config{ RabbitMQURL: getEnvOrDefault("RABBITMQ_URL", "amqp://guest:guest@localhost:5672/"), QueueName: getEnvOrDefault("QUEUE_NAME", "brokeroo"), @@ -381,10 +382,10 @@ func loadConfig() *Config { PostgresURL: getEnvOrDefault("POSTGRES_URL", "postgres://user:password@localhost/dbname?sslmode=disable"), KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 10), - BatchSize: getEnvOrDefaultInt("BATCH_SIZE", 50), + BatchSize: batchSize, BatchTimeout: time.Duration(getEnvOrDefaultInt("BATCH_TIMEOUT_MS", 100)) * time.Millisecond, - MinPrefetch: 1, - MaxPrefetch: 200, + MinPrefetch: batchSize * 2, + MaxPrefetch: batchSize * 4, } log.Printf("config -> (queue_name=%s, exchange_name=%s, routing_key=%s, prefetch_count=%d, batch_size=%d)", config.QueueName, config.ExchangeName, config.RoutingKey, config.PrefetchCount, config.BatchSize) return config From e68c94fb91b7d3778aa196bd9178b893cb421b66 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:42:50 +0200 Subject: [PATCH 131/242] adjusting latency metrics --- brokeroo/cmd/brokeroo/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index bcc55eed..cda95d0f 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -381,7 +381,7 @@ func loadConfig() *Config { RoutingKey: getEnvOrDefault("ROUTING_KEY", "j.data.*.*"), PostgresURL: getEnvOrDefault("POSTGRES_URL", "postgres://user:password@localhost/dbname?sslmode=disable"), KafkaBroker: getEnvOrDefault("KAFKA_BROKER", "kafka:9092"), - PrefetchCount: getEnvOrDefaultInt("PREFETCH_COUNT", 10), + PrefetchCount: batchSize * 3, BatchSize: batchSize, BatchTimeout: time.Duration(getEnvOrDefaultInt("BATCH_TIMEOUT_MS", 100)) * time.Millisecond, MinPrefetch: batchSize * 2, From b71d015b8476120a13b8ed00841365ac0bf68724 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 14:50:15 +0200 Subject: [PATCH 132/242] trigger --- brokeroo/cmd/brokeroo/main.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index cda95d0f..d9f4287b 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -330,19 +330,15 @@ func (s *Service) calculateOptimalPrefetch( batchFillRate float64, current int, ) int { - // If batches are saturating too quickly (>95%), reduce prefetch - // to allow batch timeout to trigger more often if batchFillRate > 0.95 && current > s.config.MinPrefetch { return max(current-5, s.config.MinPrefetch) } - // If batches rarely fill (<50%) and latency is low, increase prefetch if batchFillRate < 0.5 && avgLatency < 5*time.Millisecond && queueDepth > 1000 && current < s.config.MaxPrefetch { return min(current+5, s.config.MaxPrefetch) } - // If latency is high, reduce prefetch to avoid overwhelming DB if avgLatency > 20*time.Millisecond && current > s.config.MinPrefetch { return max(current-5, s.config.MinPrefetch) } From c514fc8fbed6c941abfc215b14f8ff9517e9c528 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 17:07:21 +0200 Subject: [PATCH 133/242] dedicated grafana db --- bootstrap/cloud-init/specs.yaml | 6 +- .../playbooks/roles/grafana/defaults/main.yml | 8 +- .../playbooks/roles/grafana/tasks/main.yml | 100 ++++++++++++++++++ 3 files changed, 107 insertions(+), 7 deletions(-) diff --git a/bootstrap/cloud-init/specs.yaml b/bootstrap/cloud-init/specs.yaml index b6a204e8..2b2824fe 100644 --- a/bootstrap/cloud-init/specs.yaml +++ b/bootstrap/cloud-init/specs.yaml @@ -48,7 +48,7 @@ cpu: 8 ram: 6144 os_storage: 20 - longhorn_storage: 100 + longhorn_storage: 150 networks: - net_type: direct source: vlan.k3s @@ -63,7 +63,7 @@ cpu: 8 ram: 6144 os_storage: 20 - longhorn_storage: 100 + longhorn_storage: 150 networks: - net_type: direct source: vlan.k3s @@ -78,7 +78,7 @@ cpu: 8 ram: 6144 os_storage: 20 - longhorn_storage: 100 + longhorn_storage: 150 networks: - net_type: direct source: vlan.k3s diff --git a/services/playbooks/roles/grafana/defaults/main.yml b/services/playbooks/roles/grafana/defaults/main.yml index 7453eeff..5f08e69d 100644 --- a/services/playbooks/roles/grafana/defaults/main.yml +++ b/services/playbooks/roles/grafana/defaults/main.yml @@ -7,10 +7,10 @@ grafana_admin_user: admin grafana_admin_password: admin123 grafana_db_type: postgres -grafana_db_host: tsdb-rw.data.svc.cluster.local:5432 -grafana_db_name: tracker_db -grafana_db_user: admin -grafana_db_password: administrator +grafana_db_host: grafana-postgres:5432 +grafana_db_name: grafana +grafana_db_user: grafana +grafana_db_password: grafana grafana_port: 3000 grafana_service_ip: 10.20.30.56 diff --git a/services/playbooks/roles/grafana/tasks/main.yml b/services/playbooks/roles/grafana/tasks/main.yml index 45d9183f..d649a696 100644 --- a/services/playbooks/roles/grafana/tasks/main.yml +++ b/services/playbooks/roles/grafana/tasks/main.yml @@ -6,6 +6,106 @@ kind: Namespace state: present +- name: "Create Postgres Secret" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + namespace: "{{ grafana_namespace }}" + state: present + definition: + apiVersion: v1 + kind: Secret + metadata: + name: grafana-postgres-secret + type: Opaque + data: + postgres-user: "{{ 'grafana' | b64encode }}" + postgres-password: "{{ 'grafana' | b64encode }}" + postgres-db: "{{ 'grafana' | b64encode }}" + +- name: "Create Postgres PVC" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + namespace: "{{ grafana_namespace }}" + state: present + definition: + apiVersion: v1 + kind: "{{ grafana_storage_class }}" + metadata: + name: grafana-postgres-pvc + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + +- name: "Deploy Postgres Deployment" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + namespace: "{{ grafana_namespace }}" + state: present + definition: + apiVersion: apps/v1 + kind: Deployment + metadata: + name: grafana-postgres + spec: + replicas: 1 + selector: + matchLabels: + app: grafana-postgres + template: + metadata: + labels: + app: grafana-postgres + spec: + containers: + - name: postgres + image: postgres:17 + env: + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: grafana-postgres-secret + key: postgres-user + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: grafana-postgres-secret + key: postgres-password + - name: POSTGRES_DB + valueFrom: + secretKeyRef: + name: grafana-postgres-secret + key: postgres-db + ports: + - containerPort: 5432 + volumeMounts: + - name: postgres-storage + mountPath: /var/lib/postgresql/data + volumes: + - name: postgres-storage + persistentVolumeClaim: + claimName: grafana-postgres-pvc + +- name: "Create Postgres Service" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + namespace: "{{ grafana_namespace }}" + state: present + definition: + apiVersion: v1 + kind: Service + metadata: + name: grafana-postgres + spec: + type: ClusterIP + selector: + app: grafana-postgres + ports: + - port: 5432 + targetPort: 5432 + - name: "Create Grafana Persistent Volume Claim" kubernetes.core.k8s: kubeconfig: /etc/rancher/k3s/k3s.yaml From b937c64b7bec6377a6a36c4f9a4e9ac0272ab142 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 17:11:43 +0200 Subject: [PATCH 134/242] dedicated grafana db --- services/playbooks/roles/grafana/tasks/main.yml | 4 +++- services/playbooks/roles/tsdb/defaults/main.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/grafana/tasks/main.yml b/services/playbooks/roles/grafana/tasks/main.yml index d649a696..27919a89 100644 --- a/services/playbooks/roles/grafana/tasks/main.yml +++ b/services/playbooks/roles/grafana/tasks/main.yml @@ -29,12 +29,14 @@ state: present definition: apiVersion: v1 - kind: "{{ grafana_storage_class }}" + kind: "PersistentVolumeClaim" metadata: name: grafana-postgres-pvc spec: accessModes: - ReadWriteOnce + + storageClassName: "{{ grafana_storage_class }}" resources: requests: storage: 5Gi diff --git a/services/playbooks/roles/tsdb/defaults/main.yml b/services/playbooks/roles/tsdb/defaults/main.yml index d2ca51c5..2bbde7e7 100644 --- a/services/playbooks/roles/tsdb/defaults/main.yml +++ b/services/playbooks/roles/tsdb/defaults/main.yml @@ -5,7 +5,7 @@ tsdb_namespace: "data" cluster_name: tsdb instances: 3 image: ghcr.io/skiby7/tsdb:17 -storage_size: 12Gi +storage_size: 20Gi storage_class: longhorn database_name: tracker_db database_user: postgres From 80fa6f6817422771c611b015cb275ef753702f95 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 17:26:01 +0200 Subject: [PATCH 135/242] dedicated grafana db --- services/playbooks/roles/grafana/tasks/main.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/tasks/main.yml b/services/playbooks/roles/grafana/tasks/main.yml index 27919a89..ff2200a9 100644 --- a/services/playbooks/roles/grafana/tasks/main.yml +++ b/services/playbooks/roles/grafana/tasks/main.yml @@ -80,11 +80,13 @@ secretKeyRef: name: grafana-postgres-secret key: postgres-db + - name: PGDATA + value: /var/lib/postgresql/data/pgdata ports: - containerPort: 5432 volumeMounts: - name: postgres-storage - mountPath: /var/lib/postgresql/data + mountPath: /var/lib/postgresql/data/pgdata volumes: - name: postgres-storage persistentVolumeClaim: From df33389efc7fefe0c36c600a0c3ec12d6c1b3440 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 17:31:19 +0200 Subject: [PATCH 136/242] dedicated grafana db --- services/playbooks/roles/grafana/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/tasks/main.yml b/services/playbooks/roles/grafana/tasks/main.yml index ff2200a9..40d2cdf7 100644 --- a/services/playbooks/roles/grafana/tasks/main.yml +++ b/services/playbooks/roles/grafana/tasks/main.yml @@ -86,7 +86,7 @@ - containerPort: 5432 volumeMounts: - name: postgres-storage - mountPath: /var/lib/postgresql/data/pgdata + mountPath: /var/lib/postgresql/data volumes: - name: postgres-storage persistentVolumeClaim: From 55ecbf90c5b12dc295d308c9ce006574bbbc824f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 18:10:11 +0200 Subject: [PATCH 137/242] maledetta ai --- brokeroo/cmd/brokeroo/main.go | 75 ++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index d9f4287b..3584a633 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -85,6 +85,70 @@ func (s *Service) connectPostgres() error { return nil } +func (s *Service) ensureTopicExists(topic string) error { + + if s.knownTopics[topic] { + return nil + } + + conn, err := kafka.Dial("tcp", s.config.KafkaBroker) + if err != nil { + return fmt.Errorf("dial broker: %w", err) + } + defer conn.Close() + + controller, err := conn.Controller() + if err != nil { + return fmt.Errorf("get controller: %w", err) + } + + controllerConn, err := kafka.Dial("tcp", fmt.Sprintf("%s:%d", controller.Host, controller.Port)) + if err != nil { + return fmt.Errorf("dial controller: %w", err) + } + defer controllerConn.Close() + + err = controllerConn.CreateTopics(kafka.TopicConfig{ + Topic: topic, + NumPartitions: 1, + ReplicationFactor: 1, + }) + + if err != nil && !strings.Contains(err.Error(), "Topic with this name already exists") { + return fmt.Errorf("create topic %s: %w", topic, err) + } + + s.knownTopics[topic] = true + log.Printf("Topic pronto: %s", topic) + return nil +} + +func (s *Service) connectKafka() error { + s.kafkaWriter = kafka.NewWriter(kafka.WriterConfig{ + Brokers: []string{s.config.KafkaBroker}, + Async: true, + }) + + if err := s.ensureTopicExists("health-check"); err != nil { + log.Printf("failed to create first topic for healt-check: %v", err) + } + + err := s.kafkaWriter.WriteMessages(context.Background(), + kafka.Message{ + Topic: "health-check", + Value: []byte("ping"), + }, + ) + + if err != nil { + log.Printf("Failed to write test message to Kafka: %v", err) + return err + } + + log.Println("Successfully connected to Kafka at", s.config.KafkaBroker) + return nil +} + func (s *Service) connectRabbitMQ() error { var err error s.amqpConn, err = amqp.Dial(s.config.RabbitMQURL) @@ -254,7 +318,12 @@ func (s *Service) processBatch(batch []IncomingMessage) { // Kafka forward + ack for _, m := range batch { - kafkaTopic := strings.ReplaceAll(m.Msg.RoutingKey, ".", "-") + kafkaTopic := sanitizeTopic(m.Msg.RoutingKey) + if err := s.ensureTopicExists(kafkaTopic); err != nil { + log.Printf("Error creating topic %s: %v", kafkaTopic, err) + s.nackAll(batch) + return + } _ = s.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ Topic: kafkaTopic, Value: m.Body, @@ -368,6 +437,10 @@ func (s *Service) avgDbLatency() time.Duration { return sum / time.Duration(len(s.dbLatencies)) } +func sanitizeTopic(topic string) string { + return strings.ReplaceAll(topic, ".", "-") +} + func loadConfig() *Config { batchSize := getEnvOrDefaultInt("BATCH_SIZE", 50) config := &Config{ From 170d8b0004904d70bc5c8cb2b1cf81b6580f542a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 18:22:26 +0200 Subject: [PATCH 138/242] maledetta ai 2 --- brokeroo/cmd/brokeroo/main.go | 53 ++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 3584a633..e74cfdd8 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -50,6 +50,7 @@ type Service struct { } type Envelope struct { + Msg amqp.Delivery `json:"-"` TsUnix int64 `json:"ts_unix"` Ts string `json:"ts"` DevID string `json:"dev_id"` @@ -57,14 +58,14 @@ type Envelope struct { PayloadJSON json.RawMessage `json:"payloadJson"` } -type IncomingMessage struct { - Msg amqp.Delivery - DevID string - Tag string - TS int64 - TSStr string - Body json.RawMessage -} +// type Envelope struct { +// Msg amqp.Delivery +// DevID string +// Tag string +// TS int64 +// TSStr string +// Body json.RawMessage +// } func NewService(config *Config) *Service { return &Service{ @@ -246,17 +247,17 @@ func (s *Service) startConsuming(ctx context.Context) error { return nil } -func (s *Service) parseMessage(msg amqp.Delivery) (IncomingMessage, bool) { +func (s *Service) parseMessage(msg amqp.Delivery) (Envelope, bool) { topic := strings.ReplaceAll(msg.RoutingKey, ".", "/") parts := strings.Split(topic, "/") if len(parts) != 4 { - return IncomingMessage{}, false + return Envelope{}, false } devID, tag := parts[2], parts[3] var data map[string]any if err := json.Unmarshal(msg.Body, &data); err != nil { - return IncomingMessage{}, false + return Envelope{}, false } var tsUnix int64 @@ -265,18 +266,19 @@ func (s *Service) parseMessage(msg amqp.Delivery) (IncomingMessage, bool) { } else { tsUnix = time.Now().Unix() } + ts := time.Unix(tsUnix, 0).UTC() - return IncomingMessage{ - Msg: msg, - DevID: devID, - Tag: tag, - TS: tsUnix, - TSStr: time.Unix(tsUnix, 0).UTC().Format(time.RFC3339), - Body: msg.Body, + return Envelope{ + Msg: msg, + DevID: devID, + TsUnix: tsUnix, + Tag: tag, + Ts: ts.Format(time.RFC3339), + PayloadJSON: msg.Body, }, true } -func (s *Service) processBatch(batch []IncomingMessage) { +func (s *Service) processBatch(batch []Envelope) { if len(batch) >= s.config.BatchSize { atomic.AddInt64(&s.saturatedBatches, 1) } else { @@ -297,7 +299,7 @@ func (s *Service) processBatch(batch []IncomingMessage) { for i, m := range batch { valueStrings = append(valueStrings, fmt.Sprintf("($%d,$%d,$%d,$%d,$%d)", i*5+1, i*5+2, i*5+3, i*5+4, i*5+5)) - valueArgs = append(valueArgs, m.TS, m.TSStr, m.DevID, m.Tag, m.Body) + valueArgs = append(valueArgs, m.TsUnix, m.Ts, m.DevID, m.Tag, m.PayloadJSON) } stmt := fmt.Sprintf(`INSERT INTO trackeroo.data (ts_unix, ts, dev_id, tag, payload) @@ -324,9 +326,14 @@ func (s *Service) processBatch(batch []IncomingMessage) { s.nackAll(batch) return } + envelopeBytes, err := json.Marshal(m) + if err != nil { + log.Printf("Failed to marshal envelope: %v", err) + return + } _ = s.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ Topic: kafkaTopic, - Value: m.Body, + Value: envelopeBytes, }) m.Msg.Ack(false) } @@ -338,10 +345,10 @@ func (s *Service) processBatch(batch []IncomingMessage) { if len(s.dbLatencies) > 100 { s.dbLatencies = s.dbLatencies[1:] } - log.Printf("✅ batch of %d inserted in %v", len(batch), latency) + log.Printf("batch of %d inserted in %v", len(batch), latency) } -func (s *Service) nackAll(batch []IncomingMessage) { +func (s *Service) nackAll(batch []Envelope) { for _, m := range batch { m.Msg.Nack(false, true) } From 48762a3257e041046ccbba498d2560dcebc426ab Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 18:22:39 +0200 Subject: [PATCH 139/242] maledetta ai 2 --- brokeroo/cmd/brokeroo/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index e74cfdd8..2807a6de 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -207,7 +207,7 @@ func (s *Service) startConsuming(ctx context.Context) error { return fmt.Errorf("failed to register consumer: %w", err) } - batch := make([]IncomingMessage, 0, s.config.BatchSize) + batch := make([]Envelope, 0, s.config.BatchSize) timer := time.NewTimer(s.config.BatchTimeout) go func() { From ce6f13cf3eafd041675ee48ae6341634fabd943b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 18:29:49 +0200 Subject: [PATCH 140/242] changing metrics --- brokeroo/cmd/brokeroo/main.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 2807a6de..f2eff9c6 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -120,7 +120,7 @@ func (s *Service) ensureTopicExists(topic string) error { } s.knownTopics[topic] = true - log.Printf("Topic pronto: %s", topic) + log.Printf("topic ready: %s", topic) return nil } @@ -142,7 +142,7 @@ func (s *Service) connectKafka() error { ) if err != nil { - log.Printf("Failed to write test message to Kafka: %v", err) + log.Printf("failed to write test message to Kafka: %v", err) return err } @@ -322,13 +322,14 @@ func (s *Service) processBatch(batch []Envelope) { for _, m := range batch { kafkaTopic := sanitizeTopic(m.Msg.RoutingKey) if err := s.ensureTopicExists(kafkaTopic); err != nil { - log.Printf("Error creating topic %s: %v", kafkaTopic, err) + log.Printf("error creating topic %s: %v", kafkaTopic, err) s.nackAll(batch) return } envelopeBytes, err := json.Marshal(m) if err != nil { - log.Printf("Failed to marshal envelope: %v", err) + log.Printf("failed to marshal envelope: %v", err) + s.nackAll(batch) return } _ = s.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ @@ -391,8 +392,7 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { } if err := s.amqpChannel.Qos(current, 0, false); err == nil { - log.Printf("Adjusted prefetch=%d (queue=%d, avgDB=%v, batchFill=%.2f%%)", - current, q.Messages, avgLatency, batchFillRate*100) + log.Printf(">>> adjusted prefetch=%d (queue=%d, avgDB=%v, batchFill=%.2f%%)", current, q.Messages, avgLatency, batchFillRate*100) last = current } } @@ -410,12 +410,12 @@ func (s *Service) calculateOptimalPrefetch( return max(current-5, s.config.MinPrefetch) } - if batchFillRate < 0.5 && avgLatency < 5*time.Millisecond && + if batchFillRate < 0.5 && avgLatency < 10*time.Millisecond && queueDepth > 1000 && current < s.config.MaxPrefetch { return min(current+5, s.config.MaxPrefetch) } - if avgLatency > 20*time.Millisecond && current > s.config.MinPrefetch { + if avgLatency > 25*time.Millisecond && current > s.config.MinPrefetch { return max(current-5, s.config.MinPrefetch) } From 6b6dee32e65fab0c2e4fa456d20dec1753e3242f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 18:40:34 +0200 Subject: [PATCH 141/242] trackeroo hpa --- services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 b/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 index 4bd59be8..dc6593d3 100644 --- a/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 +++ b/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 @@ -10,7 +10,7 @@ spec: kind: Deployment name: {{ trackeroo_app_name }} minReplicas: 1 - maxReplicas: 3 + maxReplicas: 6 metrics: - type: Resource resource: From e9fddfce77ac113fdc1af432198aa08abf1055a3 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 18:47:53 +0200 Subject: [PATCH 142/242] changing metrics --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index bd7c2d40..5d03f6a7 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -38,7 +38,7 @@ spec: - name: BATCH_SIZE value: "20" - name: BATCH_TIMEOUT_MS - value: "50" + value: "20" resources: requests: cpu: "100m" From cf83eeeef543f46835034bffcd660a27a4f0ac4a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Mon, 20 Oct 2025 19:13:29 +0200 Subject: [PATCH 143/242] changing metrics --- brokeroo/cmd/brokeroo/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index f2eff9c6..3df79486 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -411,7 +411,7 @@ func (s *Service) calculateOptimalPrefetch( } if batchFillRate < 0.5 && avgLatency < 10*time.Millisecond && - queueDepth > 1000 && current < s.config.MaxPrefetch { + current < s.config.MaxPrefetch { return min(current+5, s.config.MaxPrefetch) } From 8d0db4c2febd75fb89164b0effd1307cf686b3d7 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Tue, 21 Oct 2025 23:11:09 +0200 Subject: [PATCH 144/242] changing metrics --- brokeroo/cmd/brokeroo/main.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 3df79486..05e11f07 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -44,9 +44,9 @@ type Service struct { // metrics dbLatencies []time.Duration - saturatedBatches int64 - timeoutBatches int64 - totalBatches int64 + saturatedBatches atomic.Int64 + timeoutBatches atomic.Int64 + totalBatches atomic.Int64 } type Envelope struct { @@ -280,11 +280,11 @@ func (s *Service) parseMessage(msg amqp.Delivery) (Envelope, bool) { func (s *Service) processBatch(batch []Envelope) { if len(batch) >= s.config.BatchSize { - atomic.AddInt64(&s.saturatedBatches, 1) + s.saturatedBatches.Add(1) } else { - atomic.AddInt64(&s.timeoutBatches, 1) + s.timeoutBatches.Add(1) } - atomic.AddInt64(&s.totalBatches, 1) + s.totalBatches.Add(1) start := time.Now() tx, err := s.db.Begin() if err != nil { @@ -379,7 +379,6 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { continue } - // Calculate optimal prefetch current = s.calculateOptimalPrefetch( q.Messages, avgLatency, @@ -426,11 +425,10 @@ func (s *Service) getBatchFillRate() float64 { s.mu.RLock() defer s.mu.RUnlock() - if s.totalBatches == 0 { + if s.totalBatches.Load() == 0 { return 0 } - // Return ratio of batches that reached maxBatchSize vs timeout - return float64(s.saturatedBatches) / float64(s.totalBatches) + return float64(s.saturatedBatches.Load()) / float64(s.totalBatches.Load()) } func (s *Service) avgDbLatency() time.Duration { From 05677b6fcf4758df720826037bf7c112f41f708a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 12:37:05 +0200 Subject: [PATCH 145/242] stronger auth for mqtt --- .../src/internal/handler/mqttauth.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/trackeroo-backend/src/internal/handler/mqttauth.go b/trackeroo-backend/src/internal/handler/mqttauth.go index fdf7bdd3..3cc4ccf6 100644 --- a/trackeroo-backend/src/internal/handler/mqttauth.go +++ b/trackeroo-backend/src/internal/handler/mqttauth.go @@ -3,6 +3,7 @@ package handler import ( "fmt" "net/http" + "slices" "strings" "trackeroo-backend/internal/logger" "trackeroo-backend/internal/model" @@ -65,6 +66,7 @@ func UserAuth(w http.ResponseWriter, r *http.Request) { func TopicAuth(w http.ResponseWriter, r *http.Request) { /* Every response should be 200 */ + allowedTopics := []string{"data", "up", "dn"} ctx := r.Context() w.WriteHeader(http.StatusOK) if err := r.ParseForm(); err != nil { @@ -104,7 +106,22 @@ func TopicAuth(w http.ResponseWriter, r *http.Request) { return } logger.Debug("Authenticating device %s for topic %s vhost %s resource %s permission %s", form.Username, form.Topic, form.Vhost, form.Resource, form.Permission) - if strings.Contains(form.Topic, form.Username) { + parts := strings.Split(form.Topic, "/") + if len(parts) != 4 { + logger.Debug("Device %s not authenticated for topic %s", form.Username, form.Topic) + fmt.Fprint(w, "deny") + return + } + + topic := parts[1] + if !slices.Contains(allowedTopics, topic) { + logger.Debug("Device %s not authenticated for topic %s", form.Username, form.Topic) + fmt.Fprint(w, "deny") + return + } + + devID := parts[2] + if devID == form.Username { logger.Debug("Device %s authenticated for topic %s", form.Username, form.Topic) fmt.Fprint(w, "allow") return From 391f07787a14901a47a95df03af98ddde0b8cc8c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 12:44:16 +0200 Subject: [PATCH 146/242] stronger auth for mqtt --- trackeroo-backend/src/internal/handler/mqttauth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trackeroo-backend/src/internal/handler/mqttauth.go b/trackeroo-backend/src/internal/handler/mqttauth.go index 3cc4ccf6..b7367a56 100644 --- a/trackeroo-backend/src/internal/handler/mqttauth.go +++ b/trackeroo-backend/src/internal/handler/mqttauth.go @@ -106,7 +106,7 @@ func TopicAuth(w http.ResponseWriter, r *http.Request) { return } logger.Debug("Authenticating device %s for topic %s vhost %s resource %s permission %s", form.Username, form.Topic, form.Vhost, form.Resource, form.Permission) - parts := strings.Split(form.Topic, "/") + parts := strings.Split(form.Topic, ".") if len(parts) != 4 { logger.Debug("Device %s not authenticated for topic %s", form.Username, form.Topic) fmt.Fprint(w, "deny") From f7ad0da8fad11f4fcc19e6f1ba01cbe25cb66e47 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 13:00:02 +0200 Subject: [PATCH 147/242] grafana totp --- .../playbooks/roles/grafana/templates/01-deployment.yml.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index 5ca30ed0..6a8fe3e1 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -41,6 +41,10 @@ spec: value: "{{ grafana_db_user }}" - name: GF_DATABASE_PASSWORD value: "{{ grafana_db_password }}" + - name: GF_AUTH_TOTP_ENABLED + value: "true" + - name: GF_AUTH_TOTP_ISSUER + value: "Grafana" volumeMounts: - name: grafana-storage mountPath: /var/lib/grafana From d765e8fe1b4da8f1435ecdd02ddea2a89d898085 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 13:06:24 +0200 Subject: [PATCH 148/242] grafana --- services/playbooks/roles/grafana/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index 6a8fe3e1..8d76050e 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -23,7 +23,7 @@ spec: containers: - name: {{ grafana_app_name }} image: {{ grafana_image }} - imagePullPolicy: Always + imagePullPolicy: IfNotPresent ports: - containerPort: {{ grafana_port }} env: From d7df481a9bce113fb4b6fbbac2e490895cbf58ea Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 13:09:03 +0200 Subject: [PATCH 149/242] grafana --- .../playbooks/roles/grafana/templates/01-deployment.yml.j2 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index 8d76050e..d6559bfc 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -41,10 +41,6 @@ spec: value: "{{ grafana_db_user }}" - name: GF_DATABASE_PASSWORD value: "{{ grafana_db_password }}" - - name: GF_AUTH_TOTP_ENABLED - value: "true" - - name: GF_AUTH_TOTP_ISSUER - value: "Grafana" volumeMounts: - name: grafana-storage mountPath: /var/lib/grafana From 06f64c1d627ba9301625d8f885312941e8ea5ffb Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 14:53:05 +0200 Subject: [PATCH 150/242] nginx --- .../playbooks/roles/nignx/defaults/main.yml | 6 ++ services/playbooks/roles/nignx/tasks/main.yml | 18 ++++ .../roles/nignx/templates/01-configmap.yml.j2 | 0 .../nignx/templates/02-deployment.yml.j2 | 85 +++++++++++++++++++ .../roles/nignx/templates/03-service.yml.j2 | 13 +++ services/playbooks/site.yml | 6 ++ 6 files changed, 128 insertions(+) create mode 100644 services/playbooks/roles/nignx/defaults/main.yml create mode 100644 services/playbooks/roles/nignx/tasks/main.yml create mode 100644 services/playbooks/roles/nignx/templates/01-configmap.yml.j2 create mode 100644 services/playbooks/roles/nignx/templates/02-deployment.yml.j2 create mode 100644 services/playbooks/roles/nignx/templates/03-service.yml.j2 diff --git a/services/playbooks/roles/nignx/defaults/main.yml b/services/playbooks/roles/nignx/defaults/main.yml new file mode 100644 index 00000000..039ed83d --- /dev/null +++ b/services/playbooks/roles/nignx/defaults/main.yml @@ -0,0 +1,6 @@ +--- +nginx_namespace: nginx +nginx_app_name: nginx +nginx_image: nginx:1.29 +nginx_port: 80 +nginx_service_ip: 10.20.30.55 diff --git a/services/playbooks/roles/nignx/tasks/main.yml b/services/playbooks/roles/nignx/tasks/main.yml new file mode 100644 index 00000000..e8880d20 --- /dev/null +++ b/services/playbooks/roles/nignx/tasks/main.yml @@ -0,0 +1,18 @@ +- name: "Create nginx Kubernetes namespace" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + name: "{{ nginx_namespace }}" + api_version: v1 + kind: Namespace + state: present + +- name: "Deploy nginx Deployment and Service" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + state: present + namespace: "{{ nginx_namespace }}" + definition: "{{ lookup('template', item) | from_yaml }}" + loop: + - "01-configmap.yml.j2" + - "02-deployment.yml.j2" + - "03-service.yml.j2" diff --git a/services/playbooks/roles/nignx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nignx/templates/01-configmap.yml.j2 new file mode 100644 index 00000000..e69de29b diff --git a/services/playbooks/roles/nignx/templates/02-deployment.yml.j2 b/services/playbooks/roles/nignx/templates/02-deployment.yml.j2 new file mode 100644 index 00000000..bf454ec8 --- /dev/null +++ b/services/playbooks/roles/nignx/templates/02-deployment.yml.j2 @@ -0,0 +1,85 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ nginx_app_name }} + labels: + app: {{ nginx_app_name }} +spec: + nodeSelector: + workload-type: apps + replicas: 1 + selector: + matchLabels: + app: {{ nginx_app_name }} + template: + metadata: + labels: + app: {{ nginx_app_name }} + spec: + securityContext: + fsGroup: 472 + nodeSelector: + workload-type: apps + containers: + - name: {{ nginx_app_name }} + image: {{ nginx_image }} + imagePullPolicy: IfNotPresent + ports: + - containerPort: {{ nginx_port }} + env: + - name: GF_SECURITY_ADMIN_USER + value: "{{ nginx_admin_user }}" + - name: GF_SECURITY_ADMIN_PASSWORD + value: "{{ nginx_admin_password }}" + - name: GF_DATABASE_TYPE + value: "{{ nginx_db_type }}" + - name: GF_DATABASE_HOST + value: "{{ nginx_db_host }}" + - name: GF_DATABASE_NAME + value: "{{ nginx_db_name }}" + - name: GF_DATABASE_USER + value: "{{ nginx_db_user }}" + - name: GF_DATABASE_PASSWORD + value: "{{ nginx_db_password }}" + volumeMounts: + - name: nginx-storage + mountPath: /var/lib/nginx + volumes: + - name: nginx-storage + persistentVolumeClaim: + claimName: nginx-pvc +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ nginx_app_name }} + labels: + app: {{ nginx_app_name }} +spec: + nodeSelector: + workload-type: apps + replicas: 1 + selector: + matchLabels: + app: {{ nginx_app_name }} + template: + metadata: + labels: + app: {{ nginx_app_name }} + spec: + nodeSelector: + workload-type: apps + containers: + - name: nginx-proxy + image: nginx:1.25 # Using a recent stable nginx image + imagePullPolicy: IfNotPresent + ports: + - containerPort: 80 # Nginx listens on port 80 by default + volumeMounts: + - name: nginx-config-volume + mountPath: /etc/nginx/nginx.conf + subPath: nginx.conf # Mount only the nginx.conf file + volumes: + - name: nginx-config-volume + configMap: + name: nginx-conf # This must match the metadata.name of your ConfigMap diff --git a/services/playbooks/roles/nignx/templates/03-service.yml.j2 b/services/playbooks/roles/nignx/templates/03-service.yml.j2 new file mode 100644 index 00000000..6e2e876f --- /dev/null +++ b/services/playbooks/roles/nignx/templates/03-service.yml.j2 @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ grafana_app_name }} +spec: + selector: + app: {{ grafana_app_name }} + ports: + - name: http + port: {{ grafana_port }} + targetPort: {{ grafana_port }} + type: LoadBalancer + loadBalancerIP: {{ grafana_service_ip }} diff --git a/services/playbooks/site.yml b/services/playbooks/site.yml index 4591949c..0dc962fe 100644 --- a/services/playbooks/site.yml +++ b/services/playbooks/site.yml @@ -79,6 +79,12 @@ roles: - grafana +- name: Deploy Nginx + hosts: servers + tags: nginx + roles: + - nginx + - name: Deploy Kafka and Zookeeper hosts: servers tags: From 090d9b9a3f4a442fd3fb49377f1523b50998ac5f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 14:53:58 +0200 Subject: [PATCH 151/242] nginx --- services/playbooks/roles/{nignx => nginx}/defaults/main.yml | 0 services/playbooks/roles/{nignx => nginx}/tasks/main.yml | 0 .../roles/{nignx => nginx}/templates/01-configmap.yml.j2 | 0 .../roles/{nignx => nginx}/templates/02-deployment.yml.j2 | 0 .../playbooks/roles/{nignx => nginx}/templates/03-service.yml.j2 | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename services/playbooks/roles/{nignx => nginx}/defaults/main.yml (100%) rename services/playbooks/roles/{nignx => nginx}/tasks/main.yml (100%) rename services/playbooks/roles/{nignx => nginx}/templates/01-configmap.yml.j2 (100%) rename services/playbooks/roles/{nignx => nginx}/templates/02-deployment.yml.j2 (100%) rename services/playbooks/roles/{nignx => nginx}/templates/03-service.yml.j2 (100%) diff --git a/services/playbooks/roles/nignx/defaults/main.yml b/services/playbooks/roles/nginx/defaults/main.yml similarity index 100% rename from services/playbooks/roles/nignx/defaults/main.yml rename to services/playbooks/roles/nginx/defaults/main.yml diff --git a/services/playbooks/roles/nignx/tasks/main.yml b/services/playbooks/roles/nginx/tasks/main.yml similarity index 100% rename from services/playbooks/roles/nignx/tasks/main.yml rename to services/playbooks/roles/nginx/tasks/main.yml diff --git a/services/playbooks/roles/nignx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 similarity index 100% rename from services/playbooks/roles/nignx/templates/01-configmap.yml.j2 rename to services/playbooks/roles/nginx/templates/01-configmap.yml.j2 diff --git a/services/playbooks/roles/nignx/templates/02-deployment.yml.j2 b/services/playbooks/roles/nginx/templates/02-deployment.yml.j2 similarity index 100% rename from services/playbooks/roles/nignx/templates/02-deployment.yml.j2 rename to services/playbooks/roles/nginx/templates/02-deployment.yml.j2 diff --git a/services/playbooks/roles/nignx/templates/03-service.yml.j2 b/services/playbooks/roles/nginx/templates/03-service.yml.j2 similarity index 100% rename from services/playbooks/roles/nignx/templates/03-service.yml.j2 rename to services/playbooks/roles/nginx/templates/03-service.yml.j2 From 4bf193937584c7d03e906acaa76148bdb22e6ed0 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 14:55:03 +0200 Subject: [PATCH 152/242] nginx --- .../roles/nginx/templates/01-configmap.yml.j2 | 37 ++++++++++++ .../nginx/templates/02-deployment.yml.j2 | 57 +------------------ .../roles/nginx/templates/03-service.yml.j2 | 10 ++-- 3 files changed, 45 insertions(+), 59 deletions(-) diff --git a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 index e69de29b..ee2d371f 100644 --- a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-conf +data: + nginx.conf: | + events {} + http { + server { + listen 80; + server_name _; + + location /dashboards/ { + # Strip the /dashboards prefix before proxying + rewrite ^/dashboards/(.*)$ /$1 break; + + # Proxy to the Grafana service + proxy_pass http://grafana.grafana.svc.cluster.local:3000; + + # Set headers for proxying + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # Required for Grafana Live (WebSockets) + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location / { + # Default handling for other paths (e.g., return 404 or a default page) + return 404; + } + } + } diff --git a/services/playbooks/roles/nginx/templates/02-deployment.yml.j2 b/services/playbooks/roles/nginx/templates/02-deployment.yml.j2 index bf454ec8..f9f76a77 100644 --- a/services/playbooks/roles/nginx/templates/02-deployment.yml.j2 +++ b/services/playbooks/roles/nginx/templates/02-deployment.yml.j2 @@ -16,8 +16,6 @@ spec: labels: app: {{ nginx_app_name }} spec: - securityContext: - fsGroup: 472 nodeSelector: workload-type: apps containers: @@ -25,61 +23,12 @@ spec: image: {{ nginx_image }} imagePullPolicy: IfNotPresent ports: - - containerPort: {{ nginx_port }} - env: - - name: GF_SECURITY_ADMIN_USER - value: "{{ nginx_admin_user }}" - - name: GF_SECURITY_ADMIN_PASSWORD - value: "{{ nginx_admin_password }}" - - name: GF_DATABASE_TYPE - value: "{{ nginx_db_type }}" - - name: GF_DATABASE_HOST - value: "{{ nginx_db_host }}" - - name: GF_DATABASE_NAME - value: "{{ nginx_db_name }}" - - name: GF_DATABASE_USER - value: "{{ nginx_db_user }}" - - name: GF_DATABASE_PASSWORD - value: "{{ nginx_db_password }}" - volumeMounts: - - name: nginx-storage - mountPath: /var/lib/nginx - volumes: - - name: nginx-storage - persistentVolumeClaim: - claimName: nginx-pvc ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ nginx_app_name }} - labels: - app: {{ nginx_app_name }} -spec: - nodeSelector: - workload-type: apps - replicas: 1 - selector: - matchLabels: - app: {{ nginx_app_name }} - template: - metadata: - labels: - app: {{ nginx_app_name }} - spec: - nodeSelector: - workload-type: apps - containers: - - name: nginx-proxy - image: nginx:1.25 # Using a recent stable nginx image - imagePullPolicy: IfNotPresent - ports: - - containerPort: 80 # Nginx listens on port 80 by default + - containerPort: {{ nginx_port }} # Nginx listens on port 80 by default volumeMounts: - name: nginx-config-volume mountPath: /etc/nginx/nginx.conf - subPath: nginx.conf # Mount only the nginx.conf file + subPath: nginx.conf volumes: - name: nginx-config-volume configMap: - name: nginx-conf # This must match the metadata.name of your ConfigMap + name: nginx-conf diff --git a/services/playbooks/roles/nginx/templates/03-service.yml.j2 b/services/playbooks/roles/nginx/templates/03-service.yml.j2 index 6e2e876f..55343ad1 100644 --- a/services/playbooks/roles/nginx/templates/03-service.yml.j2 +++ b/services/playbooks/roles/nginx/templates/03-service.yml.j2 @@ -1,13 +1,13 @@ apiVersion: v1 kind: Service metadata: - name: {{ grafana_app_name }} + name: {{ nginx_app_name }} spec: selector: - app: {{ grafana_app_name }} + app: {{ nginx_app_name }} ports: - name: http - port: {{ grafana_port }} - targetPort: {{ grafana_port }} + port: {{ nginx_port }} + targetPort: {{ nginx_port }} type: LoadBalancer - loadBalancerIP: {{ grafana_service_ip }} + loadBalancerIP: {{ nginx_service_ip }} From 2a6b739afc793ad8304d630468c5526e104f10d6 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 15:00:36 +0200 Subject: [PATCH 153/242] nginx --- services/playbooks/roles/nginx/defaults/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/nginx/defaults/main.yml b/services/playbooks/roles/nginx/defaults/main.yml index 039ed83d..9684eb0b 100644 --- a/services/playbooks/roles/nginx/defaults/main.yml +++ b/services/playbooks/roles/nginx/defaults/main.yml @@ -3,4 +3,4 @@ nginx_namespace: nginx nginx_app_name: nginx nginx_image: nginx:1.29 nginx_port: 80 -nginx_service_ip: 10.20.30.55 +nginx_service_ip: 10.20.30.60 From 493b442c89a9890df3f52cbd2b66a6306b44572e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 15:09:24 +0200 Subject: [PATCH 154/242] nginx --- services/playbooks/roles/nginx/templates/01-configmap.yml.j2 | 4 ---- 1 file changed, 4 deletions(-) diff --git a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 index ee2d371f..948915d8 100644 --- a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 @@ -11,10 +11,6 @@ data: server_name _; location /dashboards/ { - # Strip the /dashboards prefix before proxying - rewrite ^/dashboards/(.*)$ /$1 break; - - # Proxy to the Grafana service proxy_pass http://grafana.grafana.svc.cluster.local:3000; # Set headers for proxying From 866a8aa897cb21ff80e5bb4778351a9a08245f79 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 15:57:26 +0200 Subject: [PATCH 155/242] grafana --- .../playbooks/roles/grafana/templates/01-deployment.yml.j2 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index d6559bfc..8f359f8e 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -41,6 +41,12 @@ spec: value: "{{ grafana_db_user }}" - name: GF_DATABASE_PASSWORD value: "{{ grafana_db_password }}" + - name: GF_SERVER_DOMAIN + value: "trackeroo.rblabs.net" + - name: GF_SERVER_ROOT_UR + value: "%(protocol)s://%(domain)s/dashboards/" + - name: GF_SERVER_SERVE_FROM_SUB_PATH + value: "true" volumeMounts: - name: grafana-storage mountPath: /var/lib/grafana From af26ed3ac7189598be5c1233004f9b74d30288cf Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 15:59:28 +0200 Subject: [PATCH 156/242] grafana --- .../roles/nginx/templates/01-configmap.yml.j2 | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 index 948915d8..60461d71 100644 --- a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 @@ -11,23 +11,17 @@ data: server_name _; location /dashboards/ { - proxy_pass http://grafana.grafana.svc.cluster.local:3000; + proxy_pass http://grafana.grafana.svc.cluster.local:3000/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; - # Set headers for proxying - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # Required for Grafana Live (WebSockets) - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } - - location / { - # Default handling for other paths (e.g., return 404 or a default page) - return 404; + # WebSocket support for live updates + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; } } } From ac984d0831fdcdbe7e40d41ce5f64ac2aabcb036 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 16:07:40 +0200 Subject: [PATCH 157/242] grafana --- services/playbooks/roles/grafana/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index 8f359f8e..859fd32a 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -43,7 +43,7 @@ spec: value: "{{ grafana_db_password }}" - name: GF_SERVER_DOMAIN value: "trackeroo.rblabs.net" - - name: GF_SERVER_ROOT_UR + - name: GF_SERVER_ROOT_URL value: "%(protocol)s://%(domain)s/dashboards/" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" From a26ac6374f9593846a084315e72a8f0c438d7f5d Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 16:13:07 +0200 Subject: [PATCH 158/242] grafana --- services/playbooks/roles/nginx/templates/01-configmap.yml.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 index 60461d71..72f08d57 100644 --- a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 @@ -22,6 +22,7 @@ data: proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; + proxy_redirect off; } } } From ba0dea5cec6e56920db6dd791ea3fb681a180531 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 16:13:12 +0200 Subject: [PATCH 159/242] grafana --- services/playbooks/roles/grafana/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index 859fd32a..a0839b11 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -44,7 +44,7 @@ spec: - name: GF_SERVER_DOMAIN value: "trackeroo.rblabs.net" - name: GF_SERVER_ROOT_URL - value: "%(protocol)s://%(domain)s/dashboards/" + value: "https://trackeroo.rblabs.net/dashboards/" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" volumeMounts: From cc3909b693085f72500e0788c0f7310b73150bd6 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 16:19:53 +0200 Subject: [PATCH 160/242] grafana --- services/playbooks/roles/grafana/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index a0839b11..20601635 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -44,7 +44,7 @@ spec: - name: GF_SERVER_DOMAIN value: "trackeroo.rblabs.net" - name: GF_SERVER_ROOT_URL - value: "https://trackeroo.rblabs.net/dashboards/" + value: "http://trackeroo.rblabs.net/dashboards/" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" volumeMounts: From 2ed48335a88176dda1e21e2ad4debba1c114629e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 16:23:04 +0200 Subject: [PATCH 161/242] grafana --- .../playbooks/roles/grafana/templates/01-deployment.yml.j2 | 2 +- services/playbooks/roles/nginx/templates/01-configmap.yml.j2 | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index 20601635..a0839b11 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -44,7 +44,7 @@ spec: - name: GF_SERVER_DOMAIN value: "trackeroo.rblabs.net" - name: GF_SERVER_ROOT_URL - value: "http://trackeroo.rblabs.net/dashboards/" + value: "https://trackeroo.rblabs.net/dashboards/" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" volumeMounts: diff --git a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 index 72f08d57..ff715b6b 100644 --- a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 @@ -11,14 +11,13 @@ data: server_name _; location /dashboards/ { - proxy_pass http://grafana.grafana.svc.cluster.local:3000/; + proxy_pass http://grafana.grafana.svc.cluster.local:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; - - # WebSocket support for live updates + # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; From 7bbd9869f8a646ba3096e591eef636f145cf5d50 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 18:42:19 +0200 Subject: [PATCH 162/242] tuning --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index 5d03f6a7..c6fb5eca 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -36,9 +36,9 @@ spec: - name: KAFKA_BROKER value: "kafka.data.svc.cluster.local:9092" - name: BATCH_SIZE - value: "20" + value: "10" - name: BATCH_TIMEOUT_MS - value: "20" + value: "50" resources: requests: cpu: "100m" From e413db5e6bbef8105866b3164cedf9d616f41dff Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 18:45:37 +0200 Subject: [PATCH 163/242] tuning --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index c6fb5eca..e3bfcef1 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -41,7 +41,7 @@ spec: value: "50" resources: requests: - cpu: "100m" + cpu: "250m" memory: "256Mi" limits: cpu: "1" From 3d10df69e101db71ff2d0627814a1c0ee5b3db44 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 18:48:17 +0200 Subject: [PATCH 164/242] tuning --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index e3bfcef1..d7eee910 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -38,7 +38,7 @@ spec: - name: BATCH_SIZE value: "10" - name: BATCH_TIMEOUT_MS - value: "50" + value: "100" resources: requests: cpu: "250m" From 016fc06df186e1e4067283402a71b81f2c7adcd9 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 18:57:25 +0200 Subject: [PATCH 165/242] tuning --- brokeroo/cmd/brokeroo/main.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 05e11f07..055dd103 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -346,7 +346,7 @@ func (s *Service) processBatch(batch []Envelope) { if len(s.dbLatencies) > 100 { s.dbLatencies = s.dbLatencies[1:] } - log.Printf("batch of %d inserted in %v", len(batch), latency) + // log.Printf("batch of %d inserted in %v", len(batch), latency) } func (s *Service) nackAll(batch []Envelope) { @@ -380,7 +380,6 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { } current = s.calculateOptimalPrefetch( - q.Messages, avgLatency, batchFillRate, current, @@ -391,7 +390,7 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { } if err := s.amqpChannel.Qos(current, 0, false); err == nil { - log.Printf(">>> adjusted prefetch=%d (queue=%d, avgDB=%v, batchFill=%.2f%%)", current, q.Messages, avgLatency, batchFillRate*100) + log.Printf(">>> adjusted prefetch=%d (queue=%d, db_latency=%v, batch_fill=%.2f%%)", current, q.Messages, avgLatency, batchFillRate*100) last = current } } @@ -400,11 +399,11 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { } func (s *Service) calculateOptimalPrefetch( - queueDepth int, avgLatency time.Duration, batchFillRate float64, current int, ) int { + if batchFillRate > 0.95 && current > s.config.MinPrefetch { return max(current-5, s.config.MinPrefetch) } From 134e6c5c3e0947b573af83f699339ce777751bd5 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 18:58:36 +0200 Subject: [PATCH 166/242] tuning --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index d7eee910..66aa9122 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -36,7 +36,7 @@ spec: - name: KAFKA_BROKER value: "kafka.data.svc.cluster.local:9092" - name: BATCH_SIZE - value: "10" + value: "50" - name: BATCH_TIMEOUT_MS value: "100" resources: From 75117d3fc1800d5ea326f8ac322af870186384da Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 18:58:42 +0200 Subject: [PATCH 167/242] tuning --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index 66aa9122..e126b41b 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -27,8 +27,6 @@ spec: env: - name: RABBITMQ_URL value: "amqp://apps:apps@rabbitmq:5672/" - - name: PREFETCH_COUNT - value: "10" - name: POSTGRES_URL value: "postgres://apps:apps@tsdb-rw.data.svc.cluster.local:5432/tracker_db?sslmode=disable" - name: ROUTING_KEY From d2b0858bb1d17eb29938f3ffcc8ff46e95ac210e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 19:03:43 +0200 Subject: [PATCH 168/242] tuning --- brokeroo/cmd/brokeroo/main.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 055dd103..8d7f812c 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -360,7 +360,8 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { go func() { current := s.config.PrefetchCount last := s.config.PrefetchCount - ticker := time.NewTicker(30 * time.Second) + ticker := time.NewTicker(10 * time.Second) + lastLog := time.Now() defer ticker.Stop() for { @@ -371,26 +372,21 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { avgLatency := s.avgDbLatency() batchFillRate := s.getBatchFillRate() // New metric - args := amqp.Table{"x-queue-type": "quorum"} - q, err := s.amqpChannel.QueueDeclarePassive( - s.config.QueueName, true, false, false, false, args, - ) - if err != nil { - continue - } - current = s.calculateOptimalPrefetch( avgLatency, batchFillRate, current, ) + if time.Since(lastLog) > 30*time.Second { + log.Printf("prefetch=%d, db_latency=%v, batch_fill=%.2f%%", current, avgLatency, batchFillRate*100) + } if last == current { continue } if err := s.amqpChannel.Qos(current, 0, false); err == nil { - log.Printf(">>> adjusted prefetch=%d (queue=%d, db_latency=%v, batch_fill=%.2f%%)", current, q.Messages, avgLatency, batchFillRate*100) + log.Printf(">>> adjusted prefetch=%d (db_latency=%v, batch_fill=%.2f%%)", current, avgLatency, batchFillRate*100) last = current } } From 24d5b6afd843652eedd06f9becbc40fc27312b1a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 19:07:30 +0200 Subject: [PATCH 169/242] typo --- brokeroo/cmd/brokeroo/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/brokeroo/cmd/brokeroo/main.go b/brokeroo/cmd/brokeroo/main.go index 8d7f812c..310ffd17 100644 --- a/brokeroo/cmd/brokeroo/main.go +++ b/brokeroo/cmd/brokeroo/main.go @@ -379,6 +379,7 @@ func (s *Service) startPrefetchTuner(ctx context.Context) { ) if time.Since(lastLog) > 30*time.Second { log.Printf("prefetch=%d, db_latency=%v, batch_fill=%.2f%%", current, avgLatency, batchFillRate*100) + lastLog = time.Now() } if last == current { From c6fd425b91c14bb83bbe6e2ca0b04eda4ef45895 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:04:35 +0200 Subject: [PATCH 170/242] trying keda --- .../roles/brokeroo/defaults/main.yml | 6 +- .../playbooks/roles/brokeroo/tasks/main.yml | 19 +- .../brokeroo/templates/01-deployment.yml.j2 | 20 +- .../{03-hpa.yml.j2 => 03-hpa.yml.j2.old} | 0 .../templates/03-triggerauthentication.yml.j2 | 10 + .../brokeroo/templates/04-scaledobject.yml.j2 | 49 ++ .../templates/05-poddistruptionbudget.yml.j2 | 10 + .../playbooks/roles/keda/defaults/main.yml | 2 + services/playbooks/roles/keda/tasks/main.yml | 32 + services/playbooks/secrets.yml | 620 +++++++++--------- services/playbooks/site.yml | 24 +- 11 files changed, 469 insertions(+), 323 deletions(-) rename services/playbooks/roles/brokeroo/templates/{03-hpa.yml.j2 => 03-hpa.yml.j2.old} (100%) create mode 100644 services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 create mode 100644 services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 create mode 100644 services/playbooks/roles/brokeroo/templates/05-poddistruptionbudget.yml.j2 create mode 100644 services/playbooks/roles/keda/defaults/main.yml create mode 100644 services/playbooks/roles/keda/tasks/main.yml diff --git a/services/playbooks/roles/brokeroo/defaults/main.yml b/services/playbooks/roles/brokeroo/defaults/main.yml index a659e662..8d0f4e3f 100644 --- a/services/playbooks/roles/brokeroo/defaults/main.yml +++ b/services/playbooks/roles/brokeroo/defaults/main.yml @@ -1,7 +1,9 @@ brokeroo_namespace: trackeroo brokeroo_app_name: brokeroo - +brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string_secret }}" +brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string_secret }}" +brokeroo_kafka_broker: kafka.data.svc.cluster.local:9092 brokeroo_image: ghcr.io/skiby7/brokeroo:latest - +brokeroo_amqp_queue_name: brokeroo brokeroo_replicas: 1 brokeroo_port: 8080 diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index 8816125f..d1d30925 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -6,6 +6,20 @@ kind: Namespace state: present +- name: "Create Brokeroo Secrets (RabbitMQ and TSDB connection strings)" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + state: present + namespace: "{{ brokeroo_namespace }}" + definition: + apiVersion: v1 + kind: Secret + metadata: + name: "{{ brokeroo_app_name }}-secrets" + stringData: + brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string }}" + brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string }}" + - name: "Deploy Brokeroo Deployment and Service" kubernetes.core.k8s: kubeconfig: /etc/rancher/k3s/k3s.yaml @@ -15,4 +29,7 @@ loop: - "01-deployment.yml.j2" - "02-service.yml.j2" - - "03-hpa.yml.j2" + # - "03-hpa.yml.j2" + - "03-triggerauthentication.yml.j2" + - "04-scaledobject.yml.j2" + - "05-poddistruptionbudget.yml.j2" diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index e126b41b..f2ab9b38 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -26,21 +26,27 @@ spec: - containerPort: {{ brokeroo_port }} env: - name: RABBITMQ_URL - value: "amqp://apps:apps@rabbitmq:5672/" + valueFrom: + secretKeyRef: + name: "{{ brokeroo_app_name }}-secrets" + key: brokeroo_rabbitmq_connection_string - name: POSTGRES_URL - value: "postgres://apps:apps@tsdb-rw.data.svc.cluster.local:5432/tracker_db?sslmode=disable" + valueFrom: + secretKeyRef: + name: "{{ brokeroo_app_name }}-secrets" + key: brokeroo_tsdb_connection_string - name: ROUTING_KEY value: "j.data.*.*" - name: KAFKA_BROKER - value: "kafka.data.svc.cluster.local:9092" + value: "{{ brokeroo_kafka_broker }}" - name: BATCH_SIZE value: "50" - name: BATCH_TIMEOUT_MS value: "100" resources: requests: - cpu: "250m" - memory: "256Mi" + cpu: 500m + memory: 512Mi limits: - cpu: "1" - memory: "512Mi" + cpu: 2000m + memory: 2Gi diff --git a/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 b/services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2.old similarity index 100% rename from services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2 rename to services/playbooks/roles/brokeroo/templates/03-hpa.yml.j2.old diff --git a/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 new file mode 100644 index 00000000..f932c2f0 --- /dev/null +++ b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 @@ -0,0 +1,10 @@ +apiVersion: keda.sh/v1alpha1 +kind: TriggerAuthentication +metadata: + name: rabbitmq-auth + namespace: "{{ brokeroo_namespace }}" +spec: + secretTargetRef: + - parameter: connectionString + name: "{{ brokeroo_app_name }}-secrets" + key: brokeroo_rabbitmq_connection_string diff --git a/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 new file mode 100644 index 00000000..4689f0df --- /dev/null +++ b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 @@ -0,0 +1,49 @@ +apiVersion: keda.sh/v1alpha1 +kind: ScaledObject +metadata: + name: "{{ brokeroo_app_name }}-scaler" + namespace: "{{ brokeroo_namespace }}" +spec: + scaleTargetRef: + name: brokeroo + minReplicaCount: 2 + maxReplicaCount: 20 + pollingInterval: 10 + cooldownPeriod: 60 + advanced: + horizontalPodAutoscalerConfig: + behavior: + scaleDown: + stabilizationWindowSeconds: 300 + policies: + - type: Percent + value: 10 + periodSeconds: 60 + - type: Pods + value: 2 + periodSeconds: 60 + selectPolicy: Min + scaleUp: + stabilizationWindowSeconds: 0 + policies: + - type: Percent + value: 100 + periodSeconds: 15 + - type: Pods + value: 4 + periodSeconds: 15 + selectPolicy: Max + triggers: + - type: rabbitmq + metadata: + protocol: auto + mode: QueueLength + value: "500" + queueName: "{{ brokeroo_amqp_queue_name: }}" + activationValue: "10" + authenticationRef: + name: rabbitmq-auth + - type: cpu + metricType: Utilization + metadata: + value: "70" diff --git a/services/playbooks/roles/brokeroo/templates/05-poddistruptionbudget.yml.j2 b/services/playbooks/roles/brokeroo/templates/05-poddistruptionbudget.yml.j2 new file mode 100644 index 00000000..b698dcda --- /dev/null +++ b/services/playbooks/roles/brokeroo/templates/05-poddistruptionbudget.yml.j2 @@ -0,0 +1,10 @@ +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: "{{ brokeroo_app_name }}-pdb" + namespace: "{{ brokeroo_namespace }}" +spec: + minAvailable: 1 + selector: + matchLabels: + app: "{{ brokeroo_app_name }}" diff --git a/services/playbooks/roles/keda/defaults/main.yml b/services/playbooks/roles/keda/defaults/main.yml new file mode 100644 index 00000000..90696495 --- /dev/null +++ b/services/playbooks/roles/keda/defaults/main.yml @@ -0,0 +1,2 @@ +keda_namespace: keda +keda_version: v2.18.0 diff --git a/services/playbooks/roles/keda/tasks/main.yml b/services/playbooks/roles/keda/tasks/main.yml new file mode 100644 index 00000000..8a8c44eb --- /dev/null +++ b/services/playbooks/roles/keda/tasks/main.yml @@ -0,0 +1,32 @@ +- name: Install KEDA to autoscale brokeroo + kubernetes.core.k8s: + state: present + src: "https://github.com/kedacore/keda/releases/download/v{{ keda_version }}/keda-{{ keda_version }}.yaml" + +- name: Wait for KEDA operator to be ready + kubernetes.core.k8s_info: + api_version: v1 + kind: Pod + namespace: "{{ keda_namespace }}" + label_selectors: + - app=keda-operator + register: keda_pods + until: + - keda_pods.resources | length > 0 + - keda_pods.resources[0].status.phase == "Running" + retries: 30 + delay: 10 + +- name: Wait for KEDA metrics server to be ready + kubernetes.core.k8s_info: + api_version: v1 + kind: Pod + namespace: "{{ keda_namespace }}" + label_selectors: + - app=keda-metrics-apiserver + register: keda_metrics_pods + until: + - keda_metrics_pods.resources | length > 0 + - keda_metrics_pods.resources[0].status.phase == "Running" + retries: 30 + delay: 10 diff --git a/services/playbooks/secrets.yml b/services/playbooks/secrets.yml index 123d4f9f..65af1c4d 100644 --- a/services/playbooks/secrets.yml +++ b/services/playbooks/secrets.yml @@ -1,306 +1,316 @@ $ANSIBLE_VAULT;1.1;AES256 -63626263623735616261656533303461653866643861616630383333393239396562353833386362 -3237636530333966656635663432313332393735306164640a323836366536386437633566323637 -35383962323866396366383730366337363632653562343864646237336438313761623536303263 -3233626238353235360a313237353365303431653836316435353337356134303535663038326461 -33663132663162616361383561663632373163643936353236633439343130393966643266366161 -31326561383165346366353364653035393464616536356439323037393065353862363136316662 -38396438393663613162393431303435373363663934363334306531636363653562326366343464 -61303534313337356164333630356337663632353639393637633537623633636262303830366534 -38633164366232383130356231316336653363666232613530636431376231396462333864343338 -39363961633939383436656638633838383766383964666535383964636334343864323737383965 -34396232323634323130313232363432393437616334626465653530653039386435323661653038 -65626231633739303565353830333433613463643534393839393731333665316562643961626530 -63336232306330626338313335666533363034643566306363636333326137343730633766616639 -36623432333464306132656664613134343935623264316436643531633061393632363465313237 -63326461383336636230373461356437626264313661396339646663316361393664303163333265 -62323164616534376131616637663833656533306137663439383038613133393635343961356331 -62313734616562343162323865323033663430323533366662376562386233386532373361633666 -30393334336666306633653965653966353037353436633162353965303866353364616262396262 -32326635616266383166653039336636663430343263323164653863396430303535346233343439 -37623461633734353465613533316631643530363332373466646363323533633962353234376361 -62303764626163383838623832343731653336306338326163663231356366386633353933306233 -65326236313136343966376437316263346563663338616534373861643135656666386165616364 -39373335623836633632363538303932626366383761323530613632336137633630353064646436 -63666237663332386164306136623737663966373734613535626533356231656137636432343863 -30386636373931643332393038653731356136396236393339653239653732343164313764323039 -33633533356633326433643263616135366465663032376538303533393934376334316137333933 -38343264313034666438633539313761613934303264313861396237313865613465653636383030 -30386262363964306537366566323536623933336135663431326332663334343266353165613231 -30343831366537326431386530323065376263306437646665366139623839303961646337323735 -39646461353039303933303464376234363530313561376532366433636562373339666538333334 -31306362663235376131326264356530353163326338633065613736663661636365636337333735 -34343662663439353336333866663066313336626531336438383730623932353039383766303365 -63333532306661346362313863656364393763613530333765373464633435646338626137333339 -31316339326637316238363163346130646536663330346130396335303562366166326537306266 -33653737303638383936653737363232643132383363383264626234376262303738646631343930 -34393164373063343938363961336139386233633134306230663037633262366137643033356435 -37353939363733636261383233616231653235333439333230376435366431373030656234333239 -36396635643062373930663866303265653538366664303761306432356165633537316535326330 -36623933346464396638363664336236656632313034326565666365613830303761326466323333 -36353135383831393132306130653233363364306437306533303439626361396632656130363337 -65313562623435323463393132626661396630366264336165326134663131653133306136323163 -38393433646231656436613866303436656264366337373433313933373937363631306162663463 -34303566366665393064373463343262303163666432373537336234613336393730356164353931 -31363962653666343730613063616665323330326334396133393537663336616637643733356261 -33636537336236646339313664633932643263333636313738303433313939393930303936363537 -65353936666233633861653539383035616432666639613737663935663539313138316339623366 -61306364613862616637666663653436366338646164393164306530613064323135303138383065 -33646139336663396264373938316631303963633332656230326438313065383164663138383236 -35616137373536633965346166303436333461613961366635636432333663666438303939326638 -32336331363935303830333935353339363561373735326466613663303533386535646131636134 -38313866633636386330323430383166306266393231363639306636306239363334336434656466 -63646465303963636663653833363763626464613763343931616666656238366262626365373464 -38613061303236346165653461323439643939613133646462623365353132646538643963326562 -64643531313831636636326664366331343861656162366265316262363733636463626262343939 -64663739346136303161303664326538336666663034323730326333386431323436653130393664 -38396133663164373463616630316532383466313865353038323564313637636133653733366462 -36633262363536383439373136356565656666653065646566333031346461376465363034643532 -64343931356630623236653632633935616430333163663936666638343338306261613662373265 -34373764383865663432343863323035366438343938313634613135326132633230316565376539 -31363133653466323063363464366639643365643834336536303636323962643035393932656366 -36313534353730303737353333656665373039616630326430343631656266373135376635663061 -32393962623535326134633335353364356137363666373639343935313538333564653232373239 -62363536356565323930343835393561396632306230623362353936633937643263383733363536 -66386634323730666130323630326231653132393166353166613665366136323332656361343962 -37316466396530623932663832383063613236656438373338303264383361396562303364616136 -63646539626234663030383038663431346466313034316364616664323430383563326233333431 -62663862393539613038616138386532663133363133376135303836363266623938663738366361 -35393132383766373932396431353265356466643039623536396235616233333435363336313130 -38633362623532656334663833393636363762613639353534666165316239366337313262386134 -32636561316363633933306234623964623266386533313463656132616137323834393366633432 -32376465666632376564656136633133346138376536343338373931346333393266316264356365 -61636662633532366139363764346463363966343633323233636464363239636435373564626666 -65363133356239366162393065303235653465656163366633633039623138633736346233653764 -39343565333462346130633738663432626231643866343431636665643263366333313064663865 -62366265313161353831616339646364303236336538383066333332363034666332393265336633 -63643935343566636635326537336130336562643433613431643933616635323363646536303831 -66616263343933303365323762303133623164376233363339306535333335323064336166663638 -30626435306435363762323537353264363439373835366637623262383662336364646333396230 -61616333633662616165353465383932363935653338313266636161356332383562616536313932 -30323930323862623538663835616364323935366261373065366132383030333232653635633332 -30376233316530306464613235373363393632383163643931383230303665393039343138326433 -36363732356332303438643831343464353566643835376562646237343839363232396363666536 -61633561303936386131663034653764626465346464616462323564333366393162386565666565 -34323261323066353861633662646239613766336432333761313034653035326138633139386635 -62393337343637623632306665356365663637613030613534383562333230643639623063333662 -62346665326139383935326434613866653865663935656565616162623864646334326539306366 -36363634666161303630653238303331333632353263393035623066366532343639363130636630 -33353061306238613133313163623933383930646334356561393661313031356237646364323465 -66653734343631643931373436663565303633646331333965653438303262316230383034623236 -37353133373634613164303835666437323736336433613964616332343264636639663463613261 -63323335626232303932346439316565373632396538376138356464303336323133623039636563 -36383535633734393830316264626338356330336364306633303666343961643237313261313764 -37643131613461663333336461323931393961636235323437663363373335303336333031303133 -63353764653262323163323939643265336435613637626366623930323432313732303039623936 -37653639393834333463326664656466333664643930363338383130326139666538363039616164 -66366263373962323863383261366338336365636431616434343732393263343735656131353566 -65336466323332393832646536643833613232646631623361626432313663656137316230346233 -64373439373834393638653438303731336662353035303835323436313366366264386634663662 -66636331633561393438396533353439616134363334313363383436323762366230336131643837 -32396565636331616261383431383039346462636464633232373531666436653430653461643935 -32343230316361383635373934653831316265663634323334336530316236633635666636336235 -37323465326462313636643762343333376336313436326439373661343638636230313139653738 -64616130623634376139366630323739313734643064303036383234396663646663643837653362 -31353632336431383536353464303631366336613964656135663239613432386135373435653630 -38656634376133343234646263396631663331333437343166323031643138346361653739343738 -31366330646436323831346462326233363938323434643734623234323065323561353765343766 -62313235393739393932373333666234366135333664613737353231363564306135356161323033 -63646233663131383539653038313164316366643736366463373665353364636161623532343939 -37616630393037343234646534323732383662643639316130363132636337323838653935653934 -36356262623436393130623333333363303036313230663865643234333939363866336332663434 -63373631643532663966653536303934323034626238653463326332303135653163353332656538 -30306665336534613439313236613064373239636163393236646335383238313862633133613636 -32613866613232323461303036326433333233306431356535666165623530396534626232343632 -63373133323033333234303431313264346535353532663936613830333738393966373635663463 -61323864313235373236653239613738643734376233313834373165626263623564653362303737 -63663032353265376165663631353232316238343033313837303666363862303662383938313863 -36376335303437616261313462306439313562363064376137333531653366373466663065643234 -35383331363736323363333233326636613939363331346263643963333064333139336330616531 -30303765306565313130663437353230383134366461316566396439366462326664353466323232 -61633162633234643864363765636630313765363732643834323330616265666266626534393532 -33316238343965666234356439383837613033363661373165363235323539383333306636666438 -62326231373362613030616533626664303536663566663635626637376165613636366537363038 -30623939653436353833303733666132613831383465383630333565643934323061633836653633 -62373037366434343330323433633632623034616234666431633234306134383231363665653839 -36353261613134636439306530353066333233383333353036633831323138386265343337336436 -64346231656466383131366433313330356530346433393634393332366434376534323566636564 -38393932363964646337376234353538386361323135643333313763343264653365333164663137 -61383130303333323031346562336630366639396166396564623934626535343433623630383539 -65626666383338303862616165613230613066623132386134343837323139663731633535303537 -32653663616664376537373863363366353731306130636530393864613937303133613730303336 -62376435313566366535353930633763636537383433616661343437376361346238393661376136 -34613665363832303163306265623964646639663736306432376263633035353437613439333130 -65623562373564373039303961623433303133656230613337346239323734616133656462636563 -66653236303764313333303166336639653138323935306365616664376230336335653866363633 -37306431633461313534383132336631373036653036663436353439313534366635363463376661 -66613737626663616635663738653363326332363066373631623063373563626665363062383730 -63303761343332333864313736396265323237643938386135656465626338643066353436663563 -36316263613261386161396536316163653230616230343338323239356439353061386230333761 -33303238613665393564333365363535663963653965323836366462656563613161626431333839 -66616331393731333435333439643664306632616438616634396239383930643864353564383136 -38326131363134363434396338623836313932653962333665303061346233643731346666663031 -36346163643461376137616665316662653734656234376666623037316462336162633663363936 -33316535643134633731626366316533343639376237376338356431323034616330663166363430 -66323139323764613962366335326430366133316536306235373732333233663539643166643564 -65643134613931626365356562343463646366613636656666623031356630633833613236326364 -39656364656137366661343530353232646336616336326233643035363866323834623064333062 -64616661323161313563636535663138666536633536623865633462623634616631306335333962 -39663137306564396561623133323666316233663230333034633436613561646334353034663663 -62313939336131303163396363306632376466353839643333613963316139643364373332613064 -61326265653634393533353434343831643935663435623134393963393463363063306233663263 -62623732386366626664393861316130393463616463623834373336616561323435633231343937 -32623639643137613561633939653038323232356432333137333738393638653836616466613733 -31386239336430363064393537383839303763653037376665346434353364636561646533666136 -66633739343962333262613137363763313565363966656634376132346131323866346234393036 -31663034666165323562313437313034333563326136396639333664373936636264343962313438 -39653264376661303432346464646634356231633662623835333464313737363965326639393265 -32333939333866366631303239643663303133666662333862373133376565336361343561633135 -32613661383464303739336136353135626335616663376135363766633235666261646233383532 -39313637393363323163363634613438633163666133343035643138633030373131306261656134 -36306235343730356265656430633837623965633839386463646262396462373366303635373965 -66313537376639613865616630366335376533343538633431656535616634636638316266353439 -65333038633465343432346562343664303431346363656264663638613937643463313836616166 -35353034343062626162623431396465653962376637653566373564633032616261613362383862 -37313334646536613766386636353037313336313563393536393835373063366362366664306137 -38626363396264303661346238376531666233653933653966333335383236643162653064343735 -33333733303865646139383465393232356432393834353939666434316238383237396664323638 -30343133616136396636366333343737386538663863616234356637646238663233356435663863 -36373037643364303262323563376165306434313235303066643164653966323138383730643333 -30313233396664646462343762373336336239383838653030623232326564386239333331323133 -32383736363962356630333830366536306139613364383231336137343665323435313738663738 -36313364396635346164666164386431636634376237646438646538303862323437366538306136 -63643661313038653037363330633066393337646337373339333737366165356663633234623461 -38333434633766623861306231363363326236653630373334363963663361393038633234633763 -62373563656437313931616231396166316538636332663762656633623863316639346464396439 -31373030636662346237316334383434623234613761313964653239616236626166336137326261 -39636330616265626430663136373632643161636161666437633162363936343662373362313530 -32633361653037313733623536326435383038653565333438336231303239633732653039313663 -38343236373364666438653836656532643961666436386665323835636439653762633565356533 -32363061656633656137363433646662633461373736643835333635313338363561643264313734 -38616139343030626634613838393761623238303431616234646531383362643339663931346563 -37376538383934313733336231386432663261616533626262353838666338653735313938323731 -30366563653934383837666335653630353333333736663434633935333939313233646564663961 -61613265636438333932626363663063616462373761373939383931666363346335323864653662 -31626631316235313636373164343837343030633638356566336437633231653561323163623761 -64343464346530383938633438383830616530383364376638633032323466636431376530386133 -33353662643434306461386133346434306263336663393263336436316638343039633664653630 -34363361303635376162313961356334616663343962343761616638386433333337353863613661 -39643163633861316164646131343161396664346230376166316334356138333737653066653166 -62313861666630633933313666636538376536326362633038383235313634303937646234653333 -35633363663738613132363935343637373731346131623733613135653630313730386266353132 -64383566623638623637656538326230636135393739616535653262366537393434646636653135 -31643730346636383064373538323031373965343363623939363732633661376538393764313131 -34653932363734656462386531313931613062643564656139656465313463363737316263346435 -35663132353765383934613264303466343535333038343531306631363636613265663734613063 -35333239303230386239663930663833633234393638656530386633313965353432626666303835 -39646537336139303631613561306362363762353332396262323135323661653536393331623034 -64663263616563313738396236363830636534653462633665643063626631376434633137633461 -38343831353764313930396336336132646436633133366363393462346163303338663730653432 -39363937383865393961353032626234333638613435396564313739313431303835336336383332 -39386461333631386361333435663063363636343633633533386239313337303239336536396563 -63383933333737373333616432356430343939323030623664343332383939376433386131343135 -66363531663264643361356362633430646164656564623931643730663462353836313139633932 -35366465346337393139383736383730346364393162323332653837623335343065383333626639 -37393537613365353134666366633631646335396634303961326262666363313162653934386264 -62656661613935366237393430626236326261303666323363363531343631666530653931316132 -64353965373432373264343961646564346538633035656130303263336137383963613839333461 -65333865613134333962306335343837326664383737313165386361633065353339373836616536 -64313233386261653135396163613033353337623833383465656166346362303634663063343338 -37623237373236326662326563656236666363633061663835313035323133633030383433663731 -34363339393265653534653930353032656265373238666230363832626432343861646361393337 -32383161343565323265366630363936623534613661623865306534623834393632333765376531 -34643562366134343932303435653133333936643432633034643263303562363461373937613238 -34383363663565366332396233393339653465303162633731616639616662396365626635633132 -63373662343734616437323638376133373137333266343361626166623961326238323766323539 -32613934666534313062333135363563323632373834396664356265303334373937323632316664 -65626563386535363766666362353633653265613561336263613631373934633933336233623163 -65356431303161666266333662386632316138623065613036366430643634393463383739343962 -30326634393732613236353239396534363232373365346264343833363339623366623266303435 -63646336303866653864323031653730636235353839323165343664393435613930336539353334 -61386137316333393066376632393736633564663830316665386264376633313935646164326439 -64623364356633376431633765326461343637306432366366366530396133663630633438653535 -61663133613666633562366164383638386363373461646437313532363365623538636636396530 -38656532346566303465663138643937333138323833376233383539623530666662343932343764 -36356330373039666166353334373331626334633639373739616137613430376636393635636133 -31313966323565326531393337323931366661363135613533373637313563306562626466323531 -33386263626636343862373536633036393634393761393866653532623439393865643431353464 -31306164363065353634313832616234383363346238646336653832613534393165376466666435 -66373131623162346236343939396439643636313830373263356164646133643065643437353636 -65386630623366313065653037333530656336393665396130656362373131323762616166633531 -31636131333463373461326665376337346436303836653633663237343062653666666164356364 -65363833323565363465636636633237636662323533623462383564343237623563373138626661 -65383934363339663561346434333732343538633565363839343061383339633330303038306131 -34646331643532666664656630383734656139636334623533653437646330316336613034373935 -35616365326461333430316531363132303039343331323437393737623536393539336631346531 -37323536623339656431616434323031623636303462343635653862613938616362336635303363 -33393639316333303466316330356266333135343535373665616136646236336534623937336334 -61306533303031636434366234653562653731653631326461376265343635326366316430323463 -64636434626563386466613438643764383431633032343666623238366266633036386564396463 -31653062616134626431373466353266383464363631376663646664313965666232396234373361 -63396361313034303065663334633839623032353761633164383361333933643864323034303831 -66306466333463356633336130333236313830393263333466376330356330643335346239623237 -66313233646130633632633436303666636636393565643432363765313330313239623364363431 -30366563636630643333353030623539656162666433303961306235393231363939303131373335 -36353163393964393335323666326662646432303638643133646466616230393964656534643161 -39353439303038383732383962653039643662633931323563333433386135333862353230653432 -66623963623236623236633838656233353533616331353536316333396537656636323236623937 -61396465393066643138616333636665333632306265623638363838333464633837396137383239 -39623661343935613932323134643533353139666636323538643938613530303830383766656164 -39313663383966633565613831306466633030663261643064326131366135653365373465316331 -30306439666531303336616331383535653034383330316231376335363636663839313533643837 -66313539353163613563656238323462383633346532353938386532373765373734356337363137 -63626532356132636461333263333962303831613930376564636135623332336334366637383637 -65633139333437343666383066623831666263363566316630326533303936633638656263333166 -32313363393539383364626538646231326363643266333231353266346364373436333835323933 -66616163633235386238313063663461356132623039613461376262313165663039396365393339 -63653639646363653439353061306363643963613366393431303661373430613735386537636331 -30336365303066326663656233363762616462666532353265343062626162636139343137666431 -37346330653739353661666630393530656264383063353933626461613861653035363565356130 -36653366323930306366663630386433346165383665366364333963646632336332333431396662 -34373430336262616339393861386264303839353237646462326238623934336430653733663334 -63306335386465376361666330663336356637383836663266346236613962343931393335333363 -64313137393764633736333038666636396361336538623238373639353566363565333063636238 -31643962333964336366613161616332663332343963323465666165363035656331306331356664 -64646163643733623233346263616462646164393765653239386231376162666162633637663633 -64356666353835346537346232313565323635376434383833343337396266356332376539383365 -31633434333535633764346263363434393730396638326331316132343663306264316232353563 -65326636643166393736633431663761653236316632613534656330353665316166643730353161 -61623061336131303735326364346562663362366435353563373163343664323963653338306436 -30343033623530376431393733366561323066333761346139656233393430633663616632313934 -37356361636238643438333361306238646166336463386362323230383232626635316331393966 -61643566643062313965343135396336666664346138623532633037306339393334646639333930 -64376139633264383264323063666632336665303933393639613831336139646232656663366239 -34353136616663376438343134323839313234336330616565333830663533333431396631663062 -63616330616536346636633130363437326665313131316631393663356664343565373634636530 -61346330666638656664316434333961363566376163316634663433343763623761346166623034 -38616135353566316165356336366535633365636264373637373734383638653437633633656533 -33363635666330646537393637396461323834366338643432323939663435306338613733623564 -34363336373530346238386131393930313732306264626538363239346336633962616332346130 -62346532626439323265343935323632393532396534633139633163383066346633336639313730 -65343333346563353761376432386334323539316534313635363130636230356462616535373062 -66626263343464393038363762613333376265336232626634306265323832666566383930643263 -64646363663736383466373264363333626133313333666138666361343139613062653137366666 -64653234303930336631316337316332313532636439633733653535333865616333363935633230 -39616330323136346637643265633266353532646232333966663131383763323961393163633664 -30393036636335313963313635303933353965303266646561623965303730333432343236346332 -36633265343865623137323437333464396562623332363535323934626666623038666435616335 -30613866633066303964313432306665343538313632326365303864666365663033383632363036 -35666464316536386266316233343638326465656636393034343966313036396533326430353763 -66333435613939626265623761326336313066363536626632303730663234633563306439646335 -38396534623666643265313133336239313665353631643935626266666264653636343638313438 -35643436653161306165623631313530363430313864643630666439646633613731303662636162 -63643231376338343230316166633161346563656533393263356139363537326538666431633665 -61343061616637353066323033666462363430656262393164316430363035323436393231336664 -64383030396630336162326136653938616663383137313730323637636564663339643934333635 -39336137333864316265366635333465356164646464313135396665313130626132613734613164 -37613439303939376666393363616263653932623963616136633862306636306563633337306531 -30343964353533366364363637643064316661666131306332363331363764646436373637333230 -38613336396136633232303930326666623761646432373166316162626136323033643935653365 -34666431646430396363643232623039346336653536323763373330393631643037636638633065 -37663135303866346132303933653530353539386365613366393536626464353663643630623830 -64613737386531656434346338653938356363643330316139323030353162353131356163353234 -64356362343439613138366538363661386638366531653233613765366630646238396566643732 -30633435396666333966396134326566663865323339343061346334396465653965663339623566 -38303766316639396361346331333530343234383666616566383037653635383365316664333664 -37353865643561373863643032326332353537613337386632613838373032396136 +35353437386331633635383335363839313863326665636364323135643866336435306562306234 +3863346630393330353365323731376665346532653737360a366664666336356264656233656633 +38356237343764643366333730633330376636633234363637346438393037663164323964663362 +3532663036396139350a323565613764343133373036366335366634363434323164333430626235 +39613934336439363531663736613631343035333030303966636331656534653966323965363461 +31666433353530623066303832663633626633376165393563663365366463306132616238636531 +66633263383662306364386331333233383662353736663964353463343233306161333938623632 +36643233333134643434396435333665363235633837323030303937383630396434356264303736 +66656436353237353833613032396132386163363433313565636534616363623664303331363734 +65373763656566343764393862356561373761666636386162373765623262666236616436306233 +39616337316165323966656235343338393062363436363438383330343031373065366563363739 +64623833333934656137326333396530653434623433313739383236363462326136643531343066 +61356430343364343137643231653734353864313537623864626132366231613730346230346231 +31373530383030303263643432393634646163333263623330363662343434306561386631376561 +34326463373564353938656435383536623139343336373832306235396135393361313239353139 +33353035613337613633666537396632373166366565663537316335326463383363376433666239 +62313462316437373436393661623365663966633037623530306334333137646261356632613034 +39636136373766333336666163656338343934646336363739613032383038313334613634323239 +62373138623638303736303233373263313637623765303666336663373034646266613331313662 +63323564353730666230353032316665343637663066346339313632313039613936383263353139 +39393964616633373138323731326462306261643232646437623335306532343731366362316134 +63616464633665376266343738653232316236313264653138353935646334613438373537633362 +34303930346338346634356165356234613532343832653236326262386266343464643936383066 +65363663346237643761373338636532393130653238396631353332613432353435326637363664 +61636638393661383466376535636464366665393963363861306665393630393765636365663035 +33306338653234353830616233343366623864373139386137383166393532323864316233613038 +37353064303466326632303539313264343639326666626238643836393034633839343538353666 +65323638623333616535356538323066316238663364373662653236393063393231323637316463 +64363931643466343837303866643563353264613636643563353130626633643364346431323130 +33643263306634303463316630653263613363383939636531633961613630656430633831663032 +38653665393162356231393065653331393931363462313837303434616232376532343936386263 +32343032316463383466646164623138303234313531616636313165613136333130636431383833 +36636461333166356337303061373338663235323731623935323434376136636536396534363635 +62303962393632663065396232643039343235366462383139653265303938666633636163396631 +37346435303630646463383164383630326265636339313866646435646335353338626265383537 +63343061363831373966346139353732623138313235306263643965643937356233343135333138 +34616532303939313934613430623762613762313064346438633739356636313562616232346563 +38616162316430396639646665356231303561366635643265653062373838336666643531356330 +33373865333766373435633930356161353432336637663461373464383666633036653336333132 +33323330323636333762663630626630363863356232613261313938356530393532386364323664 +31306366393233393233396130653232306164663736666535326631343661623065666332633765 +32646663333536316230616464613936613063386333653063343131333435353038323031356534 +63616434653431303733343339666237633432303630663861656563623965633431346339613264 +31373537336164336130616231623662663336623832303832313366646431343630313035623436 +39663063353139616234646362336336643237396139373032643934363236313834663334383366 +32323161306364363463666339363734316236373234636163613336666562343332323230366632 +36666534333732373937343839626262313638616134643863316364306533333930386638646133 +36393233376635353532353938663532313332316133643732353536653139653438636236613361 +61306235373237643562346465393339393539346138353630613539643965636635666563306266 +31343264353638323035613839343233623939626332393064316437666238613764643861336230 +66313537313237633239353465353965653162373831333963646662323830663130306433623964 +35316161373430396364623761343835656435666334333538653132303663396639336539626462 +33656234663034336130356364353339623938356130386430626233346430663332323439353235 +31343061303431343563303037316161353161343066616437653938306230613339306535333839 +33363461343462653961383231316639333038643136636238393633616533623734333533616634 +32313636613537313766653966383636393364393134353366656331333734626463653935393334 +63313364333736353630323034663265656462626561663030323639353737346334643633613036 +66613835663963636565613466333333656566336134363931643264643939336433386534353736 +33633839343131666633303335333630393435643266303239343262633339313534656336343038 +31666565323038656633636638663163353735313066373138663761653131336337393436343930 +33353862313165393662313334383561316234663461643332333637376161326630373064613230 +65333665343833656532626330343534393735386162396230303731313339326163363832396664 +31343537333533623031646439323035373762653035303134653333353436303038303638356263 +31333133623863333765393133666230623661613830353234353832613366656661333738643165 +61333438623534313161326232663636393033313239663134366463326538316366336433643762 +30653634323730623431326531356434363832333435333734323064376365323338363733333462 +32343037383363633237376163363833376461363661353333356363353763396232396634336263 +37383930333438666232643362386662653736666565653835663231656230393461373464353565 +64393438323831343561343463613163323938626239346430656338336336663633653065656463 +39633532333339656533323261643465363031613039643966643233326338613630343661343162 +31313466633562666166633063666438363263383631633337666539386330306437373031386563 +30626561386530356230326564326436663130303962373064653931646462346131646336303961 +32653864613630333336666338356464363331633865633931666663636366363933616638626163 +65363233313437353164666265303931353863383637616536353839323135366361633531656637 +34306639326163363735353333633538356339663962636433373836653431643565363162653133 +33643134326136383366363964613335383531373738663965373162383362383164323561643366 +63333632306564373163326363313931333730393363323637303434313436346134623563326366 +63343533393237316133616134666661323835653638613735363938343838386638383134633235 +31356235316538393862346362326339616565383239326164323635363565316438623334623933 +65616439303165376361303033643261376664633965373632346335333033396531333530663736 +63666566623365316563636464343333623033616265343661353335303231383062373736353761 +31303766616235356366373330643839373962396432313338383430333562663831643839383339 +66343164656165393936326135313062646634326531636563626335386264663433663338343237 +35343465373564373238383038323266326563613838323130636365356137643730376165376330 +37643231383432633234333238663733376131636334326634383238653565386230303165616237 +36333530326364366533316138383939366364613235666333376165653766666338383930666138 +62336265373935333363623731666138376633363232663837363963366536316430393037393134 +35616635613665316461366632363866613161633332653666616334333564626432373239363063 +62663563346137653761633766633139303731656235333961643864306436313132316530633035 +65343036373131363063373364663935333235383164616237303162386262353437613761363864 +65646361353331626264636266343933353466306135663832386138393638353734383432396132 +38356162363064303539656265653231323835613163383136393435663165306261373861343762 +36383835646561303939333765303838336266663234373739366465633663356438323361393364 +37396534336233383864653966306532336265303065633638306139363662303663313939333064 +62323130623038383831626239326365396130656638663764643231616237363631313762643465 +32636231386333613035643465376638356333346266336436643561393631393162663430616136 +61656566323539643438646664633136613966613566623630393732343032316565663931393634 +65643536363164653939616266643830613132353139643462643131313938313961623063656662 +63633637393331373265343761643237366438393364363262623130326336383935303132393930 +65393637383538383638383238646530666162663865623164653437303266326134346130626334 +39373337663161653533643031336166666466633631323735303435346262636337343666363365 +32643462303232396238646461633365393163656566333931653235323739616337313863336435 +64326562323833666161633465363030666539343661366131356239613938363761633939653062 +39376364373566393936666634616630376433373962306266306339326161393566643434366630 +38343339656233363136303230313037626230363538616364656230316139646662633334323161 +66313365356365323937383766303835663034643961666433356337613262363034613239316434 +31393265326339346133623930636232363732333833323835636165386237646234383937626465 +35656138386631663164643937613731346163333037323932653766653338366532313664616130 +39636361343765623139306631383336613631303565363762313132653736383138343131326137 +30396163616238636266383432343461363239346364323930663764323835373832326338646139 +36313031353234633664353635653865323637633932303134343330303461336161393961633938 +65383962616434333334356164363032303830343232633332383738656339383636663464396364 +64343361623034333136633265366331303337343163643934306430323339306238353530663065 +32393635386264643964303732343734623863376664666635626637663934333334306439356663 +66646363383830633030623338303738663737376164636239373234663932353964333561306661 +32343837373665366430366136333236313535393662646139393434303564346431316138356130 +64623037373537303237363233376332383435633638343937373830353236663164306161613835 +36356665666362353565366465303137396631393031303665353065376235616636346364656464 +35393838393766633432303665376531633632643334323531333634386638353234646231303663 +38353233653138383830653961333834623938363835313235643433363163643039303932366161 +65393736653462326234353933353732323837306631313363343736646538326437333837333363 +61386439393536393530326638316333653638313139386362653532336661636238633465343430 +35306232613830303332303263643063656339336135393134323432306237383732306332313730 +39383563613666343238666664343035383835303138353739626266373663623235303163353435 +35383964656235383834636630356165393361633066343663333333643333613565313234396135 +37653134376465363630316133613363613331386261366562666463613136366437383832643934 +63646364323566373837313565373130393230363334623037386462383539393862313765663733 +31373364376232356133376632363837363862643233663463313165373936666463623638336366 +64663464356135636336623437633561323261373039633334336634303130376636306637613664 +61633165376530313563336136613963306439353664623832393365646563373439613764316136 +37373933666433666533613538616135626161373166386330383136336230623861643666616431 +66343234626238626663323362313133356639333865396631623764393332366665363032343066 +38313937313937613534363434383861626136316366356432353037396564633761643035353830 +34353437353132383935666632333561633833623731653336643865363239336563343764613939 +33346535316364306231326130643035373264333166346530306164343233643861373833306439 +32653263326161623766333836326463363439303762316564353565633664663630616663393733 +36326136396531643037393566346461393033366531303634333861373363333536633438333261 +34653263396266366431383333626566663334393935303839323830656333376362623733363465 +34376661626163336266353432626361373461646130316165313233343832356435393962626462 +66323432633639303739623266396566663032643461383935323238386362373839393261656463 +62363133396436313635643430373733393163316636353663663963653637623338643666336538 +63346436626461646362636232386633313137323737393734666434656539323738376364653032 +65626433623838653534393238656539666366633561353235396132626337613538623339373964 +39303466316434656135383331383638653365333335383239653634356461633863303538313132 +35623231303432633135383432386131613030623830326666333964313839356335643866306565 +63363462316538373236643331386636326237316265633332383561373939363938326166343030 +62346232323062393964346431353231666562326438393165626565623663373630323761646131 +30626232376562386539653464366662386438633564383235626234376333396130306530316137 +64353134353932613464356435313232626637373963363437613233376465336663303963363561 +38363261623834393166373965653066626364326166346330633931363063396663386236343539 +61346332396164313232663235623837663534623638633162346431323435666437366332383539 +62316234633630363463666137623131623537313734343133346665376662386631306133623332 +32336565313563343331623138653030343662383061636133626437616665343039393766383135 +61396638363935373265613332383935656131323964383963626366623738313266336261306466 +64633665306134633066393532633661353462323137653163313034333730333138373531383339 +34323463383462616438623262343233353835666235373161653935373934363262363330343435 +30353065656230373563663133356162626636623237653133383934633466636538643262643662 +38646332366133623932333531353638376564653335666161623633356537376231656263373435 +36623634646233346565333663396239636632353130333364376338393162346439356430643865 +62623939663436363836346437636337353533393761373639316631636366353064383033643937 +36326165653463303130646235353535393735616437303532636535613231363737393131346166 +62396262626337306230333266616636366134326562613938626266316132666233376162313237 +38396262383137656263643266653037353232646166303965623233316561333365346538303263 +37653334323863363838346538363464353837323234626233376630323934653333363332336231 +35636332646563346433653530326239643139353962376630373639616263313136326538366163 +34376337376133386435383863303062333863643033636537363138326436336562633938666266 +65376537393435626663616335653661383833656563316364653730323731633238643433323230 +64363433376361663665323265386131636435346230386563653633626435656364316435363238 +31353762613563646431326136313635323265383962373636363435366362306330356166653266 +38323032306366373535353062353433326461646234353337636239646332343536346562326239 +32353165663063363764643132616233383432636261373866373937333563626432376661336136 +63656464643464633936363833326531383035333432316231386564613230626466393363666231 +35303537393630363265623731663261313132393239663061313764373566636536346666656534 +64343934656232363961363932613331616266373665386632343663373363653761306338613336 +61626338643030343032656431633034643334313564616233353063613862313262373231656538 +64393134633839623236326461313961656530316238663264653666633062316164323736353430 +32393332343132646437333165323438663031346438396239373866663662313333313735626161 +38626336393334313835353661393263316137383363323262326533366462376535383132393739 +31346436393065363735333739373463626364613065386663633965316466356464373932353830 +63393737343832623034663863653739383563323130346439363464353538313030373766646137 +37386164653364313338366663656634616631303737333332353833316238643763373239326262 +39353262613038623865623036653732636632376436626139653236346630343733623834313634 +39643039323639613831623662303461616339633666653039366462386637303331653637636231 +32363261326665353932613832663661613961326638643362393563383162313938303236623462 +33643038316139346531616530323931623638366135623139643363306130313334353164643164 +35666162343339666665366431363333653866663236306262633238303064646132336237303934 +38666434313130356336383034333937393161623930313162356162333063373938656263373332 +36643032346264343465333531653138386137653335656330373533653739353632366435363131 +33363239643833356239376637373835383935663763356463343331626166306665336261323335 +32353365353862633162356134346364353566343564326336643234643062656263353130613934 +31383262663535383935636438663034363464346466616437346563306234306232636330616433 +65333035646561646238353032666138663934323930306639376265373534333764636161323161 +64343862656432643534383864636461623066393935346139616338323537643234313964393462 +31346364666532386663363535316365363164366364306262333239663866373437623932633133 +64313363313136356332333937376665616361316464616165663763646636313963303931653130 +63326435613032383963613565386332393161393736613035323664653638313963323465623961 +30383836663565356466393038323837326565386463316262393765336662653133616365646666 +30386239306266666133323439376630643630626137323665646334633932313730653362353363 +62643534393437663737623438303664643834393238356261306636643534353838363163376233 +31353962336132623562323333313531613164303531373737626164363738336431356239663434 +36323332366461363336633031373536646364356562313738663462656237313766356266653264 +39643661643030313163346537646663306234653561393065383935373234363866646635643566 +66316239653238343730613930353863663261383330353861656163323465633633663239356437 +64666138303862643464386234313332343836326135656135656636303838653964326664343662 +34336161623563666332343565326237616133653236656332356335623837396538366664383039 +35643963646131643033303937626530356161393436326132343130356334613763393338636532 +63336230363333386433636230373336353436316435326630363931323038626639336264636333 +36633534373462353932343736376163626336613931633063616262356165326130343333323930 +66323234636262313336313536353031653832656663393430666464363230616365373063643563 +39343335313862313435646463313336333739376332623631353464373536303235326630336465 +65336462356639643133643765363639313739643634343935613637323634363131356365376137 +38376363643766376261663037323037393061303431613562363663636434306233653339316261 +35643637373863633264313361386235393534623339326265393965353635323636313232386439 +32313232656436386163396238613232663037616631396366313137343062336334363566343361 +31306539306565666239363166626131393532323533626366656136386533666238613161643066 +64316637323966323066626437623038333936646231376435613063383936313962386636373166 +30623163663737376633303534396231356532646439643834303930383339386161373766396639 +33363635316330353163633761323361303830653036616138646430303037363962303732373432 +32653436343163373430356134363235656664653035666166653135346533306339663032653638 +61326430393261613535613566653439303030353563303435393366363265326261383831386333 +39666230373662663166306638306633393064363330376162326334393864626163383963356638 +64393663336234383138653563613538306663313962376462366231366565373437616262653361 +31646466663631323635316534363235663661646335386334663330636636383836346637613836 +37303438643534643461663866616162323362306338633238663231366665383535363565366262 +63653164333532393731616230303230363965646632333739636536316339636263323139363139 +64303639626335633333626634326663383139303835333464343237303366643635363566376634 +34613065666465346230313763636632643638636264646266386335386337666238653839623361 +62323934643835663530646234386432366435353132623066656163653034343533643765323336 +37306635383563353033666636333334306132656661313064313336653435333738643738343033 +65313066383330306539316131663936356561653233666636393537313832623936306165303939 +63653464623663666263366434313535653835616466303263643966373336626632366563613233 +31633734353664653464633033633834333538633732396238383134353534356662336630393035 +35373861396239313730336537663033646233633166613733663565626662613363653262303537 +36646634663838366363306335343632326162396139376266346332636137303364393066313063 +62653565343930653663356565363962643137646236636532613766363333306634386134623238 +63623462636235356263393862386362393463366438366632393833643137626438376266343130 +35313866656132613233343338643236663663343866653835643263643931653566666663363933 +37343363336533346365366335343131636466313334656463333963306330646165373932383831 +39616637313837616339313434653437386535666666323537623734636463393236386235636332 +30663966626637636465323030313364373138653736363561636561306133623661346234646533 +62653761353937366364623765396236376163303534633038616162353439353339666436646438 +37633363326438616433393133373436333566343934363933616236613738353361356432656630 +65396532336531373630623137303432656464396533633337396132623166373836633135646461 +66313637636662353139353637633365646466373730656330333737626334656435663666636339 +65353366383265303237316166363430376338643538613032376539353536376133663830353231 +36653335633038393230326466356261646461663263643036396430656165383136396631336435 +64373338343362336130313333623863313734633863353436616539333038666530623435373839 +32663737623137626566646166396665663435666338306334393964333933663936346630656638 +37386539653932303138303133306264613031336364323432353234346562363632326363323763 +35666263393230633034643361303537303939393837383038373138313730613230303738663465 +65363332306365323335666264653832333263366561383339623663323335626637663434666338 +31343837386236666330396530393736666637353436393633333664633333653135383766666536 +32623338313234323934326334323339643665633131656134333365663132616366353733613463 +30393335383435653536626465333232643066653930303630653239333765353339316138353132 +62663366366431653065653931343832616463313332353039393938383832303433326531373433 +32633136383731353261356433383663643063363763653232643065333865643136356134646464 +62646336663261636436326138346131353064306566393535653932656366613832326539393362 +39653133626238653463393333626265363163663030643530313563663037356431616235333561 +61393934656139653265393338646339393066366362373662643064353633633234316565396230 +36613439363865323534373762616662316463346164643832363866356439303937613537656638 +35666434363632663966313634353565346232363837346239613037613365386132626563383333 +30333365313932346564633830363732363534356364646534643731353530663065376165306635 +34333236643433633363616533333135323163313439653961616262663136656163356433383863 +31353832363733656139396335346332303737383939633364386631653838333761623436303365 +33656135313434326264343434316662323835363834346336326139386335343234323435613666 +39343465646334303364323034333039333433363232313963646132616631326331306565373362 +37613138343231343137666238383966396234383138303533376533626561643335386532636330 +35343339653266323539303366623232393938316565326466366435663432323835376336316166 +63366663303364383261323666383532366439613866353838323164313264623861366466363135 +30346332646334656637643266623835366535363633363035653564383361366435666465323965 +33353464316666376531663534613334343133396331383966333232386562356562646662303631 +33336562663239306539343236613462366532376637313832346638626561663031376430333134 +62313762303934393666616134386661363731333161373662623061386132303934633839383031 +39656431613764363632653034323638323430666335326331616530623137326237393531326666 +32623862376561393335373864616565313362623835633637636532353737343766633835616466 +65653561643366616234376365636134353135323165616563656361613132353363316236623039 +64636663326339366535313032366166383930613838376231326335646439323065633534333636 +39623033366361393635663266643739313964376534383466386438636263383062326531376632 +31326333383764373766666661663963643062393534646137613063303764356237373761323731 +33363662326338353635356430386233646436633938633366326639383635353035633634343363 +39383261353439333764643066326562666436656334396137633434363563326436373562656230 +36386536373762363664633533306462353936663730616666393364623434646135393735373034 +66356334366364613863323533313335393731363037306239333532346662363933646539383431 +30623432663935356262386437643335366662373539353762616330323834383938306638363638 +65346531343264393431386636343334376132303466636431353861326362323939393633396433 +63346636326532333863653330346462323239373339336139653631643661643930396632373539 +63313537623938336338323261386534303931313761643135326365613566363361376262613664 +63373061353465623731376631303663623266653263666665653262343661616234303063383265 +32383939633065316365313038333738336438386165626238303764316130383031316333623265 +64313666623538633434333261613564383661643437646434393266656131643633353632343435 +30353035326439623038626535333538656364646439316238626139373137373664303164323564 +31346534613833383233623434373738333039336630363865626432303466383732306639646231 +36643666323635346533303763323133303661326436626366373733666436646635646265336430 +36396664383831313665313566326165333533376337663162346639643063376462356537316531 +33373666383432326661613433383564323666333436396664636338383038663534646166323532 +65363039646665616461623362353131363638666232393365656566386138393330343732646639 +64643865376530336439393839656165303431313732636664326134666431346133643935643033 +31623838373031383438393435636439333438313231306537346131303135353066373538613730 +32306535653839396633313735316134353061376237326236343763386266363239353731323231 +31363465653565616263633837396564393761383431616566353765666663633739386231633431 +61376361616164303635396139336237373635333737646431656231646239396362343562353863 +62343565313137343461656332623765653761646338636261613839633830613661613565356537 +62363465373439396564363662666438386432366537373233613933303936323663653165316664 +33636439383961313236383036626439363039383336386463343537663433383431326561306530 +34383231376535366436636631326637323837363664653338363039306639616566663230353134 +61616363323133333033646334323264656431356337313932343937396337656464363663643937 +65383432386163363730326536616433336132653938393364326339343931386233383564653937 +63393830393332633564643666353031386337306535663132313734353635343338623230343036 +37373239313963303031656534356261316166333531396135356533623437303562343834613137 +39646461613538653932313365396231613933386630383538306434353638396361386665616439 +64356334663035386161666632616466656435643731623265613461386264653664643534633433 +64366439653735386364646133663666316563356664643365666431303863666635653761343163 +64323536666237333863373839313336626133386430393761386364633333623739333435366134 +36363638653834343862666435356437393564633237303664303466636664386537393431386633 +393238633965366361656264303232373639 diff --git a/services/playbooks/site.yml b/services/playbooks/site.yml index 0dc962fe..0912fd5e 100644 --- a/services/playbooks/site.yml +++ b/services/playbooks/site.yml @@ -22,6 +22,14 @@ roles: - mongo-express +- name: Deploy keda + hosts: servers + tags: + - trackeroo + - keda + roles: + - keda + - name: Deploy rabbitmq hosts: servers tags: @@ -57,6 +65,14 @@ roles: - trackeroo +- name: Deploy Kafka and Zookeeper + hosts: servers + tags: + - kafka + - data + roles: + - kafka + - name: Deploy Flink hosts: servers tags: @@ -84,11 +100,3 @@ tags: nginx roles: - nginx - -- name: Deploy Kafka and Zookeeper - hosts: servers - tags: - - kafka - - data - roles: - - kafka From 032f792586b75a3ec1d4791d9845186f6731f53f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:06:32 +0200 Subject: [PATCH 171/242] trying keda --- services/playbooks/roles/keda/tasks/main.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/keda/tasks/main.yml b/services/playbooks/roles/keda/tasks/main.yml index 8a8c44eb..21023d92 100644 --- a/services/playbooks/roles/keda/tasks/main.yml +++ b/services/playbooks/roles/keda/tasks/main.yml @@ -1,10 +1,12 @@ -- name: Install KEDA to autoscale brokeroo +- name: Install KEDA to autoscale kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml state: present src: "https://github.com/kedacore/keda/releases/download/v{{ keda_version }}/keda-{{ keda_version }}.yaml" - name: Wait for KEDA operator to be ready kubernetes.core.k8s_info: + kubeconfig: /etc/rancher/k3s/k3s.yaml api_version: v1 kind: Pod namespace: "{{ keda_namespace }}" @@ -19,6 +21,7 @@ - name: Wait for KEDA metrics server to be ready kubernetes.core.k8s_info: + kubeconfig: /etc/rancher/k3s/k3s.yaml api_version: v1 kind: Pod namespace: "{{ keda_namespace }}" From e6330464aa20e063a01f7d00a6b62dbcc3f8a309 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:07:23 +0200 Subject: [PATCH 172/242] trying keda --- services/playbooks/roles/keda/defaults/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/keda/defaults/main.yml b/services/playbooks/roles/keda/defaults/main.yml index 90696495..d24d2bb0 100644 --- a/services/playbooks/roles/keda/defaults/main.yml +++ b/services/playbooks/roles/keda/defaults/main.yml @@ -1,2 +1,2 @@ keda_namespace: keda -keda_version: v2.18.0 +keda_version: 2.18.0 From 9fb69502d13f990ab626e97eb62104a4a02b15d7 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:14:57 +0200 Subject: [PATCH 173/242] trying keda --- services/playbooks/roles/brokeroo/defaults/main.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/playbooks/roles/brokeroo/defaults/main.yml b/services/playbooks/roles/brokeroo/defaults/main.yml index 8d0f4e3f..08dfcd43 100644 --- a/services/playbooks/roles/brokeroo/defaults/main.yml +++ b/services/playbooks/roles/brokeroo/defaults/main.yml @@ -1,7 +1,5 @@ brokeroo_namespace: trackeroo brokeroo_app_name: brokeroo -brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string_secret }}" -brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string_secret }}" brokeroo_kafka_broker: kafka.data.svc.cluster.local:9092 brokeroo_image: ghcr.io/skiby7/brokeroo:latest brokeroo_amqp_queue_name: brokeroo From 56870fc1081fc88c3a6ab150f01a47a214de447f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:16:00 +0200 Subject: [PATCH 174/242] trying keda --- services/playbooks/roles/brokeroo/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index d1d30925..06d40c7b 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -17,8 +17,8 @@ metadata: name: "{{ brokeroo_app_name }}-secrets" stringData: - brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string }}" - brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string }}" + brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string_secret }}" + brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string_secret }}" - name: "Deploy Brokeroo Deployment and Service" kubernetes.core.k8s: From 4221d178e326a041920242e581c7d05306f92c8c Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:20:00 +0200 Subject: [PATCH 175/242] trying keda --- services/playbooks/roles/brokeroo/defaults/main.yml | 2 ++ services/playbooks/roles/brokeroo/tasks/main.yml | 4 ++-- services/playbooks/site.yml | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/brokeroo/defaults/main.yml b/services/playbooks/roles/brokeroo/defaults/main.yml index 08dfcd43..8d0f4e3f 100644 --- a/services/playbooks/roles/brokeroo/defaults/main.yml +++ b/services/playbooks/roles/brokeroo/defaults/main.yml @@ -1,5 +1,7 @@ brokeroo_namespace: trackeroo brokeroo_app_name: brokeroo +brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string_secret }}" +brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string_secret }}" brokeroo_kafka_broker: kafka.data.svc.cluster.local:9092 brokeroo_image: ghcr.io/skiby7/brokeroo:latest brokeroo_amqp_queue_name: brokeroo diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index 06d40c7b..d1d30925 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -17,8 +17,8 @@ metadata: name: "{{ brokeroo_app_name }}-secrets" stringData: - brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string_secret }}" - brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string_secret }}" + brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string }}" + brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string }}" - name: "Deploy Brokeroo Deployment and Service" kubernetes.core.k8s: diff --git a/services/playbooks/site.yml b/services/playbooks/site.yml index 0912fd5e..26a6298a 100644 --- a/services/playbooks/site.yml +++ b/services/playbooks/site.yml @@ -86,6 +86,8 @@ tags: - brokeroo - trackeroo + vars_files: + - secrets.yml roles: - brokeroo From f76f00eb5600f1900e2d6e7aa4f715408101811a Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:26:57 +0200 Subject: [PATCH 176/242] trying keda --- .../playbooks/roles/brokeroo/tasks/main.yml | 3 +- services/playbooks/secrets.yml | 632 +++++++++--------- services/playbooks/site.yml | 3 +- 3 files changed, 321 insertions(+), 317 deletions(-) diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index d1d30925..df059f33 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -29,7 +29,8 @@ loop: - "01-deployment.yml.j2" - "02-service.yml.j2" - # - "03-hpa.yml.j2" - "03-triggerauthentication.yml.j2" - "04-scaledobject.yml.j2" - "05-poddistruptionbudget.yml.j2" + + # - "03-hpa.yml.j2" diff --git a/services/playbooks/secrets.yml b/services/playbooks/secrets.yml index 65af1c4d..bc70b93e 100644 --- a/services/playbooks/secrets.yml +++ b/services/playbooks/secrets.yml @@ -1,316 +1,318 @@ $ANSIBLE_VAULT;1.1;AES256 -35353437386331633635383335363839313863326665636364323135643866336435306562306234 -3863346630393330353365323731376665346532653737360a366664666336356264656233656633 -38356237343764643366333730633330376636633234363637346438393037663164323964663362 -3532663036396139350a323565613764343133373036366335366634363434323164333430626235 -39613934336439363531663736613631343035333030303966636331656534653966323965363461 -31666433353530623066303832663633626633376165393563663365366463306132616238636531 -66633263383662306364386331333233383662353736663964353463343233306161333938623632 -36643233333134643434396435333665363235633837323030303937383630396434356264303736 -66656436353237353833613032396132386163363433313565636534616363623664303331363734 -65373763656566343764393862356561373761666636386162373765623262666236616436306233 -39616337316165323966656235343338393062363436363438383330343031373065366563363739 -64623833333934656137326333396530653434623433313739383236363462326136643531343066 -61356430343364343137643231653734353864313537623864626132366231613730346230346231 -31373530383030303263643432393634646163333263623330363662343434306561386631376561 -34326463373564353938656435383536623139343336373832306235396135393361313239353139 -33353035613337613633666537396632373166366565663537316335326463383363376433666239 -62313462316437373436393661623365663966633037623530306334333137646261356632613034 -39636136373766333336666163656338343934646336363739613032383038313334613634323239 -62373138623638303736303233373263313637623765303666336663373034646266613331313662 -63323564353730666230353032316665343637663066346339313632313039613936383263353139 -39393964616633373138323731326462306261643232646437623335306532343731366362316134 -63616464633665376266343738653232316236313264653138353935646334613438373537633362 -34303930346338346634356165356234613532343832653236326262386266343464643936383066 -65363663346237643761373338636532393130653238396631353332613432353435326637363664 -61636638393661383466376535636464366665393963363861306665393630393765636365663035 -33306338653234353830616233343366623864373139386137383166393532323864316233613038 -37353064303466326632303539313264343639326666626238643836393034633839343538353666 -65323638623333616535356538323066316238663364373662653236393063393231323637316463 -64363931643466343837303866643563353264613636643563353130626633643364346431323130 -33643263306634303463316630653263613363383939636531633961613630656430633831663032 -38653665393162356231393065653331393931363462313837303434616232376532343936386263 -32343032316463383466646164623138303234313531616636313165613136333130636431383833 -36636461333166356337303061373338663235323731623935323434376136636536396534363635 -62303962393632663065396232643039343235366462383139653265303938666633636163396631 -37346435303630646463383164383630326265636339313866646435646335353338626265383537 -63343061363831373966346139353732623138313235306263643965643937356233343135333138 -34616532303939313934613430623762613762313064346438633739356636313562616232346563 -38616162316430396639646665356231303561366635643265653062373838336666643531356330 -33373865333766373435633930356161353432336637663461373464383666633036653336333132 -33323330323636333762663630626630363863356232613261313938356530393532386364323664 -31306366393233393233396130653232306164663736666535326631343661623065666332633765 -32646663333536316230616464613936613063386333653063343131333435353038323031356534 -63616434653431303733343339666237633432303630663861656563623965633431346339613264 -31373537336164336130616231623662663336623832303832313366646431343630313035623436 -39663063353139616234646362336336643237396139373032643934363236313834663334383366 -32323161306364363463666339363734316236373234636163613336666562343332323230366632 -36666534333732373937343839626262313638616134643863316364306533333930386638646133 -36393233376635353532353938663532313332316133643732353536653139653438636236613361 -61306235373237643562346465393339393539346138353630613539643965636635666563306266 -31343264353638323035613839343233623939626332393064316437666238613764643861336230 -66313537313237633239353465353965653162373831333963646662323830663130306433623964 -35316161373430396364623761343835656435666334333538653132303663396639336539626462 -33656234663034336130356364353339623938356130386430626233346430663332323439353235 -31343061303431343563303037316161353161343066616437653938306230613339306535333839 -33363461343462653961383231316639333038643136636238393633616533623734333533616634 -32313636613537313766653966383636393364393134353366656331333734626463653935393334 -63313364333736353630323034663265656462626561663030323639353737346334643633613036 -66613835663963636565613466333333656566336134363931643264643939336433386534353736 -33633839343131666633303335333630393435643266303239343262633339313534656336343038 -31666565323038656633636638663163353735313066373138663761653131336337393436343930 -33353862313165393662313334383561316234663461643332333637376161326630373064613230 -65333665343833656532626330343534393735386162396230303731313339326163363832396664 -31343537333533623031646439323035373762653035303134653333353436303038303638356263 -31333133623863333765393133666230623661613830353234353832613366656661333738643165 -61333438623534313161326232663636393033313239663134366463326538316366336433643762 -30653634323730623431326531356434363832333435333734323064376365323338363733333462 -32343037383363633237376163363833376461363661353333356363353763396232396634336263 -37383930333438666232643362386662653736666565653835663231656230393461373464353565 -64393438323831343561343463613163323938626239346430656338336336663633653065656463 -39633532333339656533323261643465363031613039643966643233326338613630343661343162 -31313466633562666166633063666438363263383631633337666539386330306437373031386563 -30626561386530356230326564326436663130303962373064653931646462346131646336303961 -32653864613630333336666338356464363331633865633931666663636366363933616638626163 -65363233313437353164666265303931353863383637616536353839323135366361633531656637 -34306639326163363735353333633538356339663962636433373836653431643565363162653133 -33643134326136383366363964613335383531373738663965373162383362383164323561643366 -63333632306564373163326363313931333730393363323637303434313436346134623563326366 -63343533393237316133616134666661323835653638613735363938343838386638383134633235 -31356235316538393862346362326339616565383239326164323635363565316438623334623933 -65616439303165376361303033643261376664633965373632346335333033396531333530663736 -63666566623365316563636464343333623033616265343661353335303231383062373736353761 -31303766616235356366373330643839373962396432313338383430333562663831643839383339 -66343164656165393936326135313062646634326531636563626335386264663433663338343237 -35343465373564373238383038323266326563613838323130636365356137643730376165376330 -37643231383432633234333238663733376131636334326634383238653565386230303165616237 -36333530326364366533316138383939366364613235666333376165653766666338383930666138 -62336265373935333363623731666138376633363232663837363963366536316430393037393134 -35616635613665316461366632363866613161633332653666616334333564626432373239363063 -62663563346137653761633766633139303731656235333961643864306436313132316530633035 -65343036373131363063373364663935333235383164616237303162386262353437613761363864 -65646361353331626264636266343933353466306135663832386138393638353734383432396132 -38356162363064303539656265653231323835613163383136393435663165306261373861343762 -36383835646561303939333765303838336266663234373739366465633663356438323361393364 -37396534336233383864653966306532336265303065633638306139363662303663313939333064 -62323130623038383831626239326365396130656638663764643231616237363631313762643465 -32636231386333613035643465376638356333346266336436643561393631393162663430616136 -61656566323539643438646664633136613966613566623630393732343032316565663931393634 -65643536363164653939616266643830613132353139643462643131313938313961623063656662 -63633637393331373265343761643237366438393364363262623130326336383935303132393930 -65393637383538383638383238646530666162663865623164653437303266326134346130626334 -39373337663161653533643031336166666466633631323735303435346262636337343666363365 -32643462303232396238646461633365393163656566333931653235323739616337313863336435 -64326562323833666161633465363030666539343661366131356239613938363761633939653062 -39376364373566393936666634616630376433373962306266306339326161393566643434366630 -38343339656233363136303230313037626230363538616364656230316139646662633334323161 -66313365356365323937383766303835663034643961666433356337613262363034613239316434 -31393265326339346133623930636232363732333833323835636165386237646234383937626465 -35656138386631663164643937613731346163333037323932653766653338366532313664616130 -39636361343765623139306631383336613631303565363762313132653736383138343131326137 -30396163616238636266383432343461363239346364323930663764323835373832326338646139 -36313031353234633664353635653865323637633932303134343330303461336161393961633938 -65383962616434333334356164363032303830343232633332383738656339383636663464396364 -64343361623034333136633265366331303337343163643934306430323339306238353530663065 -32393635386264643964303732343734623863376664666635626637663934333334306439356663 -66646363383830633030623338303738663737376164636239373234663932353964333561306661 -32343837373665366430366136333236313535393662646139393434303564346431316138356130 -64623037373537303237363233376332383435633638343937373830353236663164306161613835 -36356665666362353565366465303137396631393031303665353065376235616636346364656464 -35393838393766633432303665376531633632643334323531333634386638353234646231303663 -38353233653138383830653961333834623938363835313235643433363163643039303932366161 -65393736653462326234353933353732323837306631313363343736646538326437333837333363 -61386439393536393530326638316333653638313139386362653532336661636238633465343430 -35306232613830303332303263643063656339336135393134323432306237383732306332313730 -39383563613666343238666664343035383835303138353739626266373663623235303163353435 -35383964656235383834636630356165393361633066343663333333643333613565313234396135 -37653134376465363630316133613363613331386261366562666463613136366437383832643934 -63646364323566373837313565373130393230363334623037386462383539393862313765663733 -31373364376232356133376632363837363862643233663463313165373936666463623638336366 -64663464356135636336623437633561323261373039633334336634303130376636306637613664 -61633165376530313563336136613963306439353664623832393365646563373439613764316136 -37373933666433666533613538616135626161373166386330383136336230623861643666616431 -66343234626238626663323362313133356639333865396631623764393332366665363032343066 -38313937313937613534363434383861626136316366356432353037396564633761643035353830 -34353437353132383935666632333561633833623731653336643865363239336563343764613939 -33346535316364306231326130643035373264333166346530306164343233643861373833306439 -32653263326161623766333836326463363439303762316564353565633664663630616663393733 -36326136396531643037393566346461393033366531303634333861373363333536633438333261 -34653263396266366431383333626566663334393935303839323830656333376362623733363465 -34376661626163336266353432626361373461646130316165313233343832356435393962626462 -66323432633639303739623266396566663032643461383935323238386362373839393261656463 -62363133396436313635643430373733393163316636353663663963653637623338643666336538 -63346436626461646362636232386633313137323737393734666434656539323738376364653032 -65626433623838653534393238656539666366633561353235396132626337613538623339373964 -39303466316434656135383331383638653365333335383239653634356461633863303538313132 -35623231303432633135383432386131613030623830326666333964313839356335643866306565 -63363462316538373236643331386636326237316265633332383561373939363938326166343030 -62346232323062393964346431353231666562326438393165626565623663373630323761646131 -30626232376562386539653464366662386438633564383235626234376333396130306530316137 -64353134353932613464356435313232626637373963363437613233376465336663303963363561 -38363261623834393166373965653066626364326166346330633931363063396663386236343539 -61346332396164313232663235623837663534623638633162346431323435666437366332383539 -62316234633630363463666137623131623537313734343133346665376662386631306133623332 -32336565313563343331623138653030343662383061636133626437616665343039393766383135 -61396638363935373265613332383935656131323964383963626366623738313266336261306466 -64633665306134633066393532633661353462323137653163313034333730333138373531383339 -34323463383462616438623262343233353835666235373161653935373934363262363330343435 -30353065656230373563663133356162626636623237653133383934633466636538643262643662 -38646332366133623932333531353638376564653335666161623633356537376231656263373435 -36623634646233346565333663396239636632353130333364376338393162346439356430643865 -62623939663436363836346437636337353533393761373639316631636366353064383033643937 -36326165653463303130646235353535393735616437303532636535613231363737393131346166 -62396262626337306230333266616636366134326562613938626266316132666233376162313237 -38396262383137656263643266653037353232646166303965623233316561333365346538303263 -37653334323863363838346538363464353837323234626233376630323934653333363332336231 -35636332646563346433653530326239643139353962376630373639616263313136326538366163 -34376337376133386435383863303062333863643033636537363138326436336562633938666266 -65376537393435626663616335653661383833656563316364653730323731633238643433323230 -64363433376361663665323265386131636435346230386563653633626435656364316435363238 -31353762613563646431326136313635323265383962373636363435366362306330356166653266 -38323032306366373535353062353433326461646234353337636239646332343536346562326239 -32353165663063363764643132616233383432636261373866373937333563626432376661336136 -63656464643464633936363833326531383035333432316231386564613230626466393363666231 -35303537393630363265623731663261313132393239663061313764373566636536346666656534 -64343934656232363961363932613331616266373665386632343663373363653761306338613336 -61626338643030343032656431633034643334313564616233353063613862313262373231656538 -64393134633839623236326461313961656530316238663264653666633062316164323736353430 -32393332343132646437333165323438663031346438396239373866663662313333313735626161 -38626336393334313835353661393263316137383363323262326533366462376535383132393739 -31346436393065363735333739373463626364613065386663633965316466356464373932353830 -63393737343832623034663863653739383563323130346439363464353538313030373766646137 -37386164653364313338366663656634616631303737333332353833316238643763373239326262 -39353262613038623865623036653732636632376436626139653236346630343733623834313634 -39643039323639613831623662303461616339633666653039366462386637303331653637636231 -32363261326665353932613832663661613961326638643362393563383162313938303236623462 -33643038316139346531616530323931623638366135623139643363306130313334353164643164 -35666162343339666665366431363333653866663236306262633238303064646132336237303934 -38666434313130356336383034333937393161623930313162356162333063373938656263373332 -36643032346264343465333531653138386137653335656330373533653739353632366435363131 -33363239643833356239376637373835383935663763356463343331626166306665336261323335 -32353365353862633162356134346364353566343564326336643234643062656263353130613934 -31383262663535383935636438663034363464346466616437346563306234306232636330616433 -65333035646561646238353032666138663934323930306639376265373534333764636161323161 -64343862656432643534383864636461623066393935346139616338323537643234313964393462 -31346364666532386663363535316365363164366364306262333239663866373437623932633133 -64313363313136356332333937376665616361316464616165663763646636313963303931653130 -63326435613032383963613565386332393161393736613035323664653638313963323465623961 -30383836663565356466393038323837326565386463316262393765336662653133616365646666 -30386239306266666133323439376630643630626137323665646334633932313730653362353363 -62643534393437663737623438303664643834393238356261306636643534353838363163376233 -31353962336132623562323333313531613164303531373737626164363738336431356239663434 -36323332366461363336633031373536646364356562313738663462656237313766356266653264 -39643661643030313163346537646663306234653561393065383935373234363866646635643566 -66316239653238343730613930353863663261383330353861656163323465633633663239356437 -64666138303862643464386234313332343836326135656135656636303838653964326664343662 -34336161623563666332343565326237616133653236656332356335623837396538366664383039 -35643963646131643033303937626530356161393436326132343130356334613763393338636532 -63336230363333386433636230373336353436316435326630363931323038626639336264636333 -36633534373462353932343736376163626336613931633063616262356165326130343333323930 -66323234636262313336313536353031653832656663393430666464363230616365373063643563 -39343335313862313435646463313336333739376332623631353464373536303235326630336465 -65336462356639643133643765363639313739643634343935613637323634363131356365376137 -38376363643766376261663037323037393061303431613562363663636434306233653339316261 -35643637373863633264313361386235393534623339326265393965353635323636313232386439 -32313232656436386163396238613232663037616631396366313137343062336334363566343361 -31306539306565666239363166626131393532323533626366656136386533666238613161643066 -64316637323966323066626437623038333936646231376435613063383936313962386636373166 -30623163663737376633303534396231356532646439643834303930383339386161373766396639 -33363635316330353163633761323361303830653036616138646430303037363962303732373432 -32653436343163373430356134363235656664653035666166653135346533306339663032653638 -61326430393261613535613566653439303030353563303435393366363265326261383831386333 -39666230373662663166306638306633393064363330376162326334393864626163383963356638 -64393663336234383138653563613538306663313962376462366231366565373437616262653361 -31646466663631323635316534363235663661646335386334663330636636383836346637613836 -37303438643534643461663866616162323362306338633238663231366665383535363565366262 -63653164333532393731616230303230363965646632333739636536316339636263323139363139 -64303639626335633333626634326663383139303835333464343237303366643635363566376634 -34613065666465346230313763636632643638636264646266386335386337666238653839623361 -62323934643835663530646234386432366435353132623066656163653034343533643765323336 -37306635383563353033666636333334306132656661313064313336653435333738643738343033 -65313066383330306539316131663936356561653233666636393537313832623936306165303939 -63653464623663666263366434313535653835616466303263643966373336626632366563613233 -31633734353664653464633033633834333538633732396238383134353534356662336630393035 -35373861396239313730336537663033646233633166613733663565626662613363653262303537 -36646634663838366363306335343632326162396139376266346332636137303364393066313063 -62653565343930653663356565363962643137646236636532613766363333306634386134623238 -63623462636235356263393862386362393463366438366632393833643137626438376266343130 -35313866656132613233343338643236663663343866653835643263643931653566666663363933 -37343363336533346365366335343131636466313334656463333963306330646165373932383831 -39616637313837616339313434653437386535666666323537623734636463393236386235636332 -30663966626637636465323030313364373138653736363561636561306133623661346234646533 -62653761353937366364623765396236376163303534633038616162353439353339666436646438 -37633363326438616433393133373436333566343934363933616236613738353361356432656630 -65396532336531373630623137303432656464396533633337396132623166373836633135646461 -66313637636662353139353637633365646466373730656330333737626334656435663666636339 -65353366383265303237316166363430376338643538613032376539353536376133663830353231 -36653335633038393230326466356261646461663263643036396430656165383136396631336435 -64373338343362336130313333623863313734633863353436616539333038666530623435373839 -32663737623137626566646166396665663435666338306334393964333933663936346630656638 -37386539653932303138303133306264613031336364323432353234346562363632326363323763 -35666263393230633034643361303537303939393837383038373138313730613230303738663465 -65363332306365323335666264653832333263366561383339623663323335626637663434666338 -31343837386236666330396530393736666637353436393633333664633333653135383766666536 -32623338313234323934326334323339643665633131656134333365663132616366353733613463 -30393335383435653536626465333232643066653930303630653239333765353339316138353132 -62663366366431653065653931343832616463313332353039393938383832303433326531373433 -32633136383731353261356433383663643063363763653232643065333865643136356134646464 -62646336663261636436326138346131353064306566393535653932656366613832326539393362 -39653133626238653463393333626265363163663030643530313563663037356431616235333561 -61393934656139653265393338646339393066366362373662643064353633633234316565396230 -36613439363865323534373762616662316463346164643832363866356439303937613537656638 -35666434363632663966313634353565346232363837346239613037613365386132626563383333 -30333365313932346564633830363732363534356364646534643731353530663065376165306635 -34333236643433633363616533333135323163313439653961616262663136656163356433383863 -31353832363733656139396335346332303737383939633364386631653838333761623436303365 -33656135313434326264343434316662323835363834346336326139386335343234323435613666 -39343465646334303364323034333039333433363232313963646132616631326331306565373362 -37613138343231343137666238383966396234383138303533376533626561643335386532636330 -35343339653266323539303366623232393938316565326466366435663432323835376336316166 -63366663303364383261323666383532366439613866353838323164313264623861366466363135 -30346332646334656637643266623835366535363633363035653564383361366435666465323965 -33353464316666376531663534613334343133396331383966333232386562356562646662303631 -33336562663239306539343236613462366532376637313832346638626561663031376430333134 -62313762303934393666616134386661363731333161373662623061386132303934633839383031 -39656431613764363632653034323638323430666335326331616530623137326237393531326666 -32623862376561393335373864616565313362623835633637636532353737343766633835616466 -65653561643366616234376365636134353135323165616563656361613132353363316236623039 -64636663326339366535313032366166383930613838376231326335646439323065633534333636 -39623033366361393635663266643739313964376534383466386438636263383062326531376632 -31326333383764373766666661663963643062393534646137613063303764356237373761323731 -33363662326338353635356430386233646436633938633366326639383635353035633634343363 -39383261353439333764643066326562666436656334396137633434363563326436373562656230 -36386536373762363664633533306462353936663730616666393364623434646135393735373034 -66356334366364613863323533313335393731363037306239333532346662363933646539383431 -30623432663935356262386437643335366662373539353762616330323834383938306638363638 -65346531343264393431386636343334376132303466636431353861326362323939393633396433 -63346636326532333863653330346462323239373339336139653631643661643930396632373539 -63313537623938336338323261386534303931313761643135326365613566363361376262613664 -63373061353465623731376631303663623266653263666665653262343661616234303063383265 -32383939633065316365313038333738336438386165626238303764316130383031316333623265 -64313666623538633434333261613564383661643437646434393266656131643633353632343435 -30353035326439623038626535333538656364646439316238626139373137373664303164323564 -31346534613833383233623434373738333039336630363865626432303466383732306639646231 -36643666323635346533303763323133303661326436626366373733666436646635646265336430 -36396664383831313665313566326165333533376337663162346639643063376462356537316531 -33373666383432326661613433383564323666333436396664636338383038663534646166323532 -65363039646665616461623362353131363638666232393365656566386138393330343732646639 -64643865376530336439393839656165303431313732636664326134666431346133643935643033 -31623838373031383438393435636439333438313231306537346131303135353066373538613730 -32306535653839396633313735316134353061376237326236343763386266363239353731323231 -31363465653565616263633837396564393761383431616566353765666663633739386231633431 -61376361616164303635396139336237373635333737646431656231646239396362343562353863 -62343565313137343461656332623765653761646338636261613839633830613661613565356537 -62363465373439396564363662666438386432366537373233613933303936323663653165316664 -33636439383961313236383036626439363039383336386463343537663433383431326561306530 -34383231376535366436636631326637323837363664653338363039306639616566663230353134 -61616363323133333033646334323264656431356337313932343937396337656464363663643937 -65383432386163363730326536616433336132653938393364326339343931386233383564653937 -63393830393332633564643666353031386337306535663132313734353635343338623230343036 -37373239313963303031656534356261316166333531396135356533623437303562343834613137 -39646461613538653932313365396231613933386630383538306434353638396361386665616439 -64356334663035386161666632616466656435643731623265613461386264653664643534633433 -64366439653735386364646133663666316563356664643365666431303863666635653761343163 -64323536666237333863373839313336626133386430393761386364633333623739333435366134 -36363638653834343862666435356437393564633237303664303466636664386537393431386633 -393238633965366361656264303232373639 +66373437653161303939646462656534303965396630363231383839333038393433646531393764 +6461343861643765663263383334363532653763323065380a633061356337316437393436306362 +63396437653031313364313663376139353537396633336366663633643339646635663765326265 +3763623731653563610a333166373664356332393737363831656532633563373030633162373366 +33393164396363326362306663373330356132386663393231376365386636633738376261656231 +62383235393737386632663463373737393565646362653539343261316136343161326564363130 +38653861663564343065376662303133366330306638333330633635376164326135336236626366 +33333831656138316362326231396339633330653766663136313434373137636633343061343932 +30313233323638396339373938646231353530363335316239623765323164616137613863626637 +63323965326363633966303432646130376665336563326636313064663036336137373635663433 +31323465363861333238613366616332363364313561363433373261386238373336393063346335 +65666538663131366433316465316635653531303465663136616130333930346134623865313665 +63643735356164633532303165613638316130613034613536363263366632343266613863623661 +30613761353263613038336365386339383735363337376362636132663765366565346363383833 +34356136356631356666643064383931373364316564636436613335373539383366653662636461 +64616433336462353837396537636233663265366530663933653562616138346463366463386437 +32623165316464316665653630363438383531626239356163656261353063646338393239663733 +38303632643464373764626639386139623363383466323338663830663631366339643131396330 +30666161336436613865383635663433333833323032613435336561353932333465323861303262 +62346333613361343236303266626566656231313139323931663838363433333562303434623437 +65636161626438613266363734343836393066623761363236656231656230333534336161643137 +31653238336265373337383732376133643031653439306136643163653835626538373564386366 +63343765313737383937353439336638336338353538326364636666633830373236663632636265 +32366365643964313365363436636233346566343935396465373330386562396332343237613839 +37613164313764333562353237306162326465333534623966316633633765653132343439346565 +33306565383232353433383839313732393436613338383361306136623664623338653835333963 +33366339653063346239653334356366656563366335313761656535626564623234323264383462 +64326662663536636564656432316430633836323565323230306234366137316336373334343339 +38346333303564656331646135666438643730383764353830353934353366346237313934393539 +35336534636238623430333965393336653033323434393832323930396134313365366662383163 +66346365323337393638323366353432633638666333616339656261663637353334326232313431 +62353264373264663931323036316633386133333333653066633133666566623638366261626666 +63663363356132666137336331336134376430373236336235313233646662646132376463313831 +64653633616664653830643435383339383563623836656161666361353338346332303662323835 +39636563616435306332323831343666386131636537376163376139656332393532646533393332 +61653132346166363733633337306566646235303765373564623863633336376630623739653733 +62356335363135613137313535636262383663353463303665396333613034326230663532393130 +61333034303766303566323636363162306333663634373361643334653538383838346564306539 +36393132376265653531383362323966643564663166373131333765356137636261633665303137 +65393138353336333538373537616563363066373364353462393136383231313162386364313536 +37373539343561336563656535386330316532386263633538336233663961343135613330343063 +34383565336633666534383935316664663631353433616365343339356166613935343431373463 +30343433646333386531343137616437373533623930613832626166326139643632373932613938 +33656636653630353331376562383339306634653362306536646563633035623837613535363339 +34366633353333323935383039363765366166383739653639633735663565386138373134313362 +39366134653463343538613331373032323964636231633263636536336162353832656362366130 +34363632636431376331303135616633333831366231623266343234386438646163633036303964 +33333332373538663064643838646362386464336536396634663464356161613133363531393134 +64343663633066323565303662303765356466326238663838653561396439303938646433356361 +39353331356462663366303262636533363135393730656361383565363864303536646539323961 +64356361303032313863663939336137373138366563326531376539646363363932306365643635 +63366636363535353133643532373930663732613334363637356133366564323739383662396431 +65333866333262653632623337383463613262646266313361616131663738303261643530613639 +33396364343439316434653936666164393961386137376633646364633237663562653766656532 +38393731336230656337613431366639346433396337653462663165386265363262663861343637 +33366632646564636265363765386331643563663766356238623663653233346163356537316563 +61306562653166333235336136383630353762353531366162633662363362663838626536396664 +33383564366262623731363233663162303535366534663365323161386233316534326435363436 +66323638663137663562656134643332343531393538663664313236303332613236616265353139 +64323562643165363864326163663037393932336364326639663734613430336235366434663865 +36383933303263346363306562306331613066393332613164666634646332393231336663333739 +37366562333131383839643131626361336338626138663536353331393031323963656230346532 +66616534633830363866356161346431663939386163303933613662396366363633303238616265 +36373234386238653639643637353235646564353962343031633438646335346630393636343632 +36393362633266303966313965383536383935666562343963346131356365343662626639336339 +35643363303036653663363537646262303734346631303931346331356363636662313930663130 +62333930356231656337616466623337663233366166656263323036643538373038373836626161 +65623431353562353363393830393966343832333561306136326335653435396638383764393434 +35393064613032393839666234353431653963613334333833636237353434626334396166663130 +64643834373063323434326563666464316630343061626263656466343932653165353434396664 +64333165303339613336373931316637323461366564343230323666663038633439653936383063 +61643464653138616538326565346337316130633237613737346338346432386131643461653262 +37316437626130623338313037386461356665666231626434613832333266343861383635306561 +66376338636539353835613538386432313731353133646239653461303235633261653937666561 +39326333623238666665356634633464383039396637393466306233663633346235363932663430 +63326462366663653137656536373433323764363932643864326464343037386436343433396366 +62333039356663373031316462356236623063373932613137623635633666346462383561613835 +62633734323233646165623035343335316637306332353632616131326433383865643063323163 +62653832623966626337383030633536623735633139306462353838393636393439393837323436 +64303834363938643535353666373235356238333932376439303636366132633262363864336431 +62313135616438393030313863636334653763353763623330326635626331613834373838633164 +35653365346236646438626136393936393539373866663734633065346631323938346638623063 +31643238313038393234326165613531633964643533333163643730336165333532643833656136 +66396265356166633165363563616635333962666339656465646663653264306436396164363137 +62633336346464623761363133656230353635366438383930363065613133343636313639346638 +33653837393131613938393364343263383963343631376565363036313963666163333365613164 +34303339303438626539343631616235376562313533333737323533373061303432306230656365 +39633735633033643138373735366165623666613339326630343163626639306631363032316466 +39383332363835643764663462636662623437646236353733313130373937373262663936306431 +31346463323837663735373035373935306136343364343933636138643336636662643132323861 +61623766623036383638333539336235656163366633336634663736653533363638643630316130 +65383836366433653735626330646635373632306262306363313936383266633534313033666235 +36646465313234306630303633313634626661643066333831626333333762336233636539386437 +33316363626637643663656237616331613930396662326137343737613963323237343031373064 +39303030633165356366366539346536626230306162653032613461303831393564306433646535 +63343835383039366538656665636162323130613162303136323335633766613631666261306661 +38306433346564626262393266666339333064333931663163366538643835353762313939613864 +62393331323166623337323038373534363332613961336261643666376239366333306536316561 +36323831363231666466633630393733616265313133663534643561663638353038366263366561 +35613566373464353537663939656236346264613266616534326433316638306334343662613464 +61383462663330633463383532303765376239326339363830626162363635346366346634656138 +39616433323433646539616532376264323530636663383937383739366462313232633337303163 +39656163353463313361613233353230616633623431353561646437396634633833643261623362 +36636239333739353561666632353236643965313332363439353362336234663335333834616561 +35333135663736396435383838353537386132623436386334656339326637623236323861323965 +64333666663338396337666466373235393530303132633437663662663238613436306538663062 +37373864653635353463623035356538323865323864333263303132633162616662316462396338 +64373339633562316434643933313432336466636362333634336163653235303634613039363732 +31643265363264323835646561353862303161646136303930633163363739336666663539383339 +30646533313336366438383737386163366332363236306537353537336665316537303933303762 +30343436616261396334313333336362643238613535346165313531303736333363613537643737 +38363530333134316266613237633933623865646432646638336237366631306334363539323531 +65663461373931626663303461366566646235633666306531376535623835393536623535333932 +30353364313461663437333731336339633661646261616333333733633733313232333333336232 +66353234306363653731306132356335666539323165333663656161653234646336383438653938 +66376536303136636666643566643266343832666135333737303938333563666261303562326432 +65393435663232303932663031623839616236616135366262666133323738316335366463666562 +31653931643336346134363366373831366231306231666439323830383664313362363766643734 +39666332393833383533646365323635393631353061396265393830313630613465623563353065 +33333836326537366233623236363436316161313435323934656234313331396663303136393261 +61623738346135383664323765363139306331346339393966623133396630643338623162366563 +36396561646137373438653864353563356664616338663962616366323938353536366139363063 +38653563383431366464353839396639366662393838386338383732363938383266326237643034 +61393538643730663834633366636230666464393537666134653463306133313235383031393437 +34313162346130376532643839306630363466356533356239613338653161346435326231393161 +66336530396435323835316464323336663263333234623933616533643332653738363236343738 +32613661303730363338343634333231323839303834306462386432383038656338353137393239 +63313532613061323166393933306664393138633837346238666236613439633430666536623234 +37366564626535656538376232376238363265316336626439313831336165333237346335323037 +33353966373933366437633531633134613935653532626139623761316264633536356638393437 +39373064656236343433353631353461626637336461383262363137653133613136646333353862 +34313865366463343365376136366637346662626432383438336335636534643232323139643430 +31613435336338306565396361376432653065366630333566636436363066366565656164643762 +35396434653937313439336336313564363333393639383731636137306263653037316534633437 +34343538613630613932303963386462346639313231373033336138313363313036383161643438 +64343063373464363537653464326430643333633831323563666332303238616638646533356562 +34363662363263336435353261316263303035666530363338663130313765396535373861393130 +38336430663432346662393361613862363663326438363036336562343165333139363139316264 +36346163366135643134653566353532663934663762366239303639636330336361636335376466 +32346563323661353762326533653736353562623161313938313236616661383761363863623131 +31323939646233643939653135383333626433663364353565326463663062343861383564356533 +30613464343338363533656330316532396131613935393962313237333566356335333661373764 +62343339393363326262653563333265316430626463633430363762333463316131343861333361 +66316363616131616464306162373236366631646432313464336339623131356131373639313465 +65333638363638303162393239666162616238363733396233323538393431343931656135373537 +36356362386431343534373466643335663464633230326562303232346236356239346636646435 +39353365303130333635336333626230376331376661656436616638663439343161333266333635 +39396261663832626461666130333137656566636236306535343066373261323664356339306530 +65633363396139346537633266386539323830333562313064633166306162353439653163306464 +35363261353530663338393236333363663139306235303066336263633462363736306536646230 +65643633666635373039653438663864386534633361383131303333643338333330383231303564 +39326438623666363230393330373233306139373039303235383634373739363637633633313365 +65623765353635313036373363646566326663643330316334633262623935323561323139376536 +62653861363336303333336361326663373261633830643264336538663861306339333461353132 +63383439383236336134313838313464636236323337633137386461373862656335633839343661 +34336334303936643139373737373033623464643135643264386138613130336662663563343838 +31343530633038326261653436646265373035623039636364353961663762333937323230396261 +61313238623930353533326437326364623633383663613663326536653131623030386632353438 +61363431316238616461663531636239626339303238386661643862616239613564633432336234 +62633963633837383565623933393730316562613235623161393430613136383265356161663130 +34373533373632373766613536333263613037383565633962353564393632616137363537633662 +38353038383035326632306231613837646535623864663039326565616431383761323739373836 +35353632333730653363616362666663373864363731323262613735623863643634356363363136 +31326461383632353864636164376639343562636131623636653834626235393666656333323836 +37346461306461353932303862656366663763303462393861366662386633636633613262356635 +65306134373339663532366537303462313766333666363234366438373362303737373132333639 +34643631386133373564646361313765656564643039366634613764363730626337396165336533 +61663038636635626330616332356161316536313664316463613063383334303735643933323664 +65366435363961616665376531323762343965353030363238363733396562396161306335623566 +66313939353033616432313738386461656430396531366230633561613761646435346131386639 +36353532323937653339376338656130343930313738343066366436326135316463616166643765 +30326566383738633534383037333334366165376433663066316339666332313034633932383761 +38313137656630316666313464383161313166323665356237616665633364343430366131633335 +62396630653433663561316339636337346365313835633863653565636330303461613639383764 +62656530333766643338656634363731663333383364323632353865353439663334396336336134 +65306631383465653431663335666333316531343338346466643334356565373061303264333138 +35393266393730383465326164633362363630336262306535653162636335313335373964656266 +62336236316134333937353036376463373565356435373862643539653563636465393939333764 +65356236623566326362333863353535663032333962373037393538353039663863646461623537 +62313936333832386531383339333938653139383938383064663337366465613261333265363033 +65306161353132643838366265636634373235646236666464633539353662333465663037326635 +65653766353561633163346465363437633039353339393838326461336533353836376532646262 +64633866373663633238383262343830343264663734623730333464626466383463356563313132 +36313366366631616661303331343931626461633463646366343534386533653836376664393365 +38613837323363633135663665366239376232626534326564343566353964613064313339613834 +64383133626331656439623837336166323136663136626436333735626638316566363963303564 +36613432653163663861613932663237653133643039373762313335643235353035303737336532 +64353238393737643661323766626433396361643962616436376332346234663537623839646637 +31353562663561376536336230363231653265653136373031313736306566613137616665376666 +34633761326361626434303962346666353864346563636566613733643931303136613633323732 +61376438363766386533363330393836613538623833376634316230323931633135386231663238 +38343466336666633639366137646533376339633533303530386631333561323861356635643533 +32656263363531383233323263623536326565393635363661343337616532313935373562663765 +31363533343736373765646662393831626361623435646633393563383839626430306564653935 +32386164616534646330643164306439613463623731626163613237323330613737633537626164 +62313761383666363234626636633562303566346130666261373332656334643731636336366339 +66616130643433663435306639376663356637653765656266383765373532346466633534633761 +33383430383134383763393838316162613464323338333233333666356639343237633061323632 +39613636303462386635383762303834313035613331313231623839643464393031313333333232 +35326562303964333937396534333039626363363765323235393931623365636139366565366663 +64396232306539343166663165626663626461373633623638616330353035343534633561636462 +65613065666564316230393065326134373337613861383230663932633035303736643634373334 +37633232366430326536616130303762646565356330613862336439303062303732356335373536 +34323139336337383639303062303562393535303333323161646537663264656632313433366139 +64333962656663373731623033306530366165373362353434346430376634356631643665646138 +31316662386566383338653834643635626630656436386234323531336232363738363937313134 +33366538656463653662643164336262633466313665393938376439393364653937336562303737 +34343364356163393861353631373130643437303265643162646538613134653539366333343830 +32633337313636613261396465336566386561623165626631626462393632326433653230636133 +63353664616331343333333136306161656164663937363865666139306630613966653761353261 +33656234316232333036636536656630376263393439346636613839386163386165643232333064 +63666334363530626362653434633735373365326234613335643434376163343865663131666462 +33336364373964656565623862363662316632323335616238623462386263323931636563623031 +65303932643262386665363363613364623235353837353665333136633962633136303032613930 +34633439336235663133653563626263636330623037313963343335663263666331303936313633 +61306439376630656166376334643335346164323033323535353435643566663831386237386436 +66613435323863346332346438623038366362623935386365306332373238343164653464323130 +32636139336137633436303831386139383837656137313861336664666466346133633737326665 +30613036323438303836353834623461383638333939633164616663373363626235636135393364 +37623739386163653762303130313164393332373136343930666537613362363137363830653766 +66393164613264393530383362383665643032643262393665363236663736623062303930316166 +64383063383163383731386432336364373738366636383139616436366230323161343861623865 +39353465316663393939386562313163666138326362303231646430643039633234353363343132 +63373439306635616536323866303666313630356566346233303430333037336139623936666534 +61346465326332396663633239303663643732313066613163636538383931336530626566663435 +66323235396266633865316439313364396465646362316135346232613933303538623461313836 +34643233656466353436313664386633353430636634396332663864616564613331356537356332 +31633638653239306565636466343536353961316665386338636464363461353364663462393861 +38626138666631353835666166313836366334616362323936373565633831316231626566623663 +66383661323862353063636132646134633531386337653766303765373031386133363036303733 +30333438306631656365323732663434333062353539353665306664656533393432363866316137 +34393263346165306663663339643663313535613932633262646661373963306231373764623034 +34346566346538333530373863363036373365613966333030316164646364663236353764383431 +62363133326663386532383738333039346331626435306462363531316636643931666334663038 +36363638313632343861353039303233383639393130643837373630623439663261336364323531 +32303532636538626339613032323437643566323236626338616338363765633162653137353137 +38303331353035353832303235323863613537376537323532343765623262323562653964373030 +63386434353233336630376232313735323935663264333664326130396532313130376663363839 +36353631613163353233616565313830653334396365323137373238373030346164396432646563 +36343864383337623561396132643062386533303263386530646536396436613661336438653761 +36386562356233363830373135623336336537386236363531306561636538353432353339363866 +62646434646238396438343862386366373631316465303264313437666266346637633039656637 +35353735653331613464303263643563326636633333303162336636663931663433663132323336 +38663233393166613530396230656461363239376136333434356232346466633765633632393665 +66333865613436623531373061303565633831336437383630376133303764303762633763316364 +35393963366662316162653838396536613630643739313262356635656336636337636633336662 +36653130333936353639326333316233363162616632396136343064396135616164303436326562 +30623361323765333866343038633163356630326634633735356638636463626231356438363731 +34623436616535646632623230646339373431386564333062633034313662623432323162663039 +61663666303533646438313735663632306131346539623863306636316336383536313461363539 +65333965653430666364653936376634313465663437396236366631373837326239303866383737 +39326531346461616131333836373065323862303630366339393734626239303838623736616131 +37326331336434633564306265376233396631333332623035613132336139626538616636383361 +62366665633232396636323964393063623866616665633962356534663430346235323932376535 +31633364306233393533356434616666346237333665303531323366336361383130666461643466 +35376264383935383437303531386366626632623737356335336466336262613234663430316633 +32393166633561396433666164346466663436373961666564666262383962386337646366663333 +61316534633166306239376132313463373339643966316635323634663764613034363030373062 +62313038313265316464316137663162663963373365343164343935303331376639366337316434 +31666437333538373436336335656165376232653435363639383438396630643136353065313766 +30383239623634303235313433623964323936386337393238353932306561326331626530303834 +38653730393539363664393763383263616634386233356361613064333764353965356362316364 +32396332313435313130373331646164356138373831373863356139346637623234323533346330 +36343764356431633462633463313632363961663735636531643762623965343637613537393963 +36303235616238346661636333346164323633353562306235623838363031333062646335666165 +65616335643037643039303464306335613664383439323539343538346163646636373564323464 +66336566333339303463353033326633616666333433373637613961363465363863326466393362 +34393137616530363835383139346231386162316661353235396134336663323262373238666336 +36383761363836326164396436346261303263316131663738623233653633636666303235623839 +33626661376461643865343266666239383630633937303566383739363565313836663963363065 +36373864336131636266366462636539346161366464343339666662643839623263393262333934 +61363738366437323033383662633561633432313165393333353431343366613264653862623039 +38636135333439656432353564636338623566353631383065346437363331363738386565613535 +38356566363534363465643233636435656165633432393565613765376665656264666438336333 +37313038346331363661613037616239313333356664656363343531356465323032653865396633 +64633035313466363237363135653334636666353334333962363932656430316232353164653031 +62313836323239353130313136656363383237666531663732336235306238663834653633326231 +38373263386531366361353137393035353437353933313933396532643866623761343735373939 +63383363353461383634356665383264383864386366636564373132356464653839643935376431 +62366631623736623766363766356439666663383163303865643131623166353234626362306339 +39643336323464623861636538623736666662393766376565383633626136616461666130616532 +34646633613266393331623337346364383834323663663432366532373230303063646361303233 +30623231396431626438646365643739343463346338373432633266646462323962303138623533 +39356462333130616366353065346336366338633962353632366262316139636339643039633337 +63383734656536386537316166363862386538623530386233313335303737613163386431333131 +64333433383163323161633134303635376433336236343639366532346237376534636331623336 +64393836623861333331363266666531356536646561386162336535346131346637373239613035 +38343632376139653361616632623332656236333265643538393361613263383135336363306633 +34353665616434663633353434366263666261653932663461613534376334633064646333643333 +39653734613063613133386633306230303033386263613031353236333931633563343034626362 +38306266613339616162343561323832326534663636326538353232323834663663383432623864 +32306466306532363532653132363432323530663763343333663930386430376635343661326131 +39396331323238373835616161643032376537636430353766343337386438316465633533396666 +35623365656163376439656131333232313732613663343464653963613462636538623765616430 +63396639623939373130393037376238353361373337626362353964353033306337306538393763 +63393962613834333565666566373436303530643862623231346632363738366630393738343135 +35396538613961616437373566316163336636313730663331623863633735633634386464366262 +31353633346434666161353462316639306235663138313738356332653033323662653133613538 +31633537383765633566616264643061396635396331643231633465636639316164323230636564 +66636531363061616233356261336165616531386330363263343836326237303938646530383930 +34633037656461663039663638333963663235623535303566323530613337366337623838363234 +34376166613636383130616365306233303632356262326262366435633565393062383061373031 +30336634303234663631336664363865646435356431363066383932623362346232376163303938 +36366266643661346165393030393466396138643063326431643066363635656363383839623433 +31333338373762356533306366653330346164326631363033616163643364393032343363346366 +63633164646432663834636462653030643762333633316332623061333238306332633864333262 +63316436306439383135383431393434363338633336386632353962396463373935663933353136 +38323738363132393331643439633232343461383835373264383263613532313866653463646437 +31363461653630633266383131343831646136396336353865346435316566616536383263366631 +63353961316339633330343137363639636138633961343666323162303736313766623332613261 +65643065663930383739613337643233383062306131333138633734353264386361393434376438 +37666536343239346531333632346436623736653235393633376239316233623833343838383033 +62363765393036366264376131623339366234393866306338353832643364313732333438626132 +33343132396531663734386233353966326436393361333866383736383635316539336530343933 +61626561656466636332343563353565613735313565306561626632636563626363643738313364 +65333539646431396434396531636133366533343636356439646461393164376266313163333639 +6539 diff --git a/services/playbooks/site.yml b/services/playbooks/site.yml index 26a6298a..e463ee1e 100644 --- a/services/playbooks/site.yml +++ b/services/playbooks/site.yml @@ -56,10 +56,11 @@ roles: - redis -- name: Deploy trackeroo +- name: Deploy trackeroo-backend hosts: servers tags: - trackeroo + - trackeroo-backend vars_files: - secrets.yml roles: From 87124cd08130feeb3b9ecd862715884a3c1fac08 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:34:58 +0200 Subject: [PATCH 177/242] trying keda --- services/playbooks/roles/brokeroo/tasks/main.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index df059f33..7d877733 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -32,5 +32,3 @@ - "03-triggerauthentication.yml.j2" - "04-scaledobject.yml.j2" - "05-poddistruptionbudget.yml.j2" - - # - "03-hpa.yml.j2" From 552c751b27eb654bf8bdfcdd4c148753928ae1c6 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:38:16 +0200 Subject: [PATCH 178/242] trying keda --- .../playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 index 4689f0df..61bee168 100644 --- a/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 @@ -39,7 +39,7 @@ spec: protocol: auto mode: QueueLength value: "500" - queueName: "{{ brokeroo_amqp_queue_name: }}" + queueName: "{{ brokeroo_amqp_queue_name }}" activationValue: "10" authenticationRef: name: rabbitmq-auth From f7f41f6adf389195fdccee7db48758d5e5899d89 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:43:45 +0200 Subject: [PATCH 179/242] trying keda --- services/playbooks/roles/brokeroo/tasks/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index 7d877733..aa2eb121 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -18,6 +18,7 @@ name: "{{ brokeroo_app_name }}-secrets" stringData: brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string }}" + brokeroo_rabbitmq_connection_string_base64: "{{ brokeroo_rabbitmq_connection_string | b64encode }}" brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string }}" - name: "Deploy Brokeroo Deployment and Service" From 33d1d721d8cdfa51af71ea53296ed5cc1900f7fa Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:43:55 +0200 Subject: [PATCH 180/242] trying keda --- .../roles/brokeroo/templates/03-triggerauthentication.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 index f932c2f0..7b87d930 100644 --- a/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 @@ -7,4 +7,4 @@ spec: secretTargetRef: - parameter: connectionString name: "{{ brokeroo_app_name }}-secrets" - key: brokeroo_rabbitmq_connection_string + key: brokeroo_rabbitmq_connection_string_base64 From ba2a819c877f1d86c6ea575c85fc386132e30ff4 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:46:00 +0200 Subject: [PATCH 181/242] trying keda --- .../roles/brokeroo/templates/03-triggerauthentication.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 index 7b87d930..567156ef 100644 --- a/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 @@ -5,6 +5,6 @@ metadata: namespace: "{{ brokeroo_namespace }}" spec: secretTargetRef: - - parameter: connectionString + - parameter: host name: "{{ brokeroo_app_name }}-secrets" key: brokeroo_rabbitmq_connection_string_base64 From 259b1f9743630479291ec69133ac04d1ba9f98af Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:55:38 +0200 Subject: [PATCH 182/242] trying keda --- services/playbooks/roles/brokeroo/tasks/main.yml | 14 +++++++++++++- .../templates/03-triggerauthentication.yml.j2 | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index aa2eb121..04d647c2 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -18,9 +18,21 @@ name: "{{ brokeroo_app_name }}-secrets" stringData: brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string }}" - brokeroo_rabbitmq_connection_string_base64: "{{ brokeroo_rabbitmq_connection_string | b64encode }}" brokeroo_tsdb_connection_string: "{{ brokeroo_tsdb_connection_string }}" +- name: "Create Secrets for KEDA (RabbitMQ connection strings)" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + state: present + namespace: "{{ brokeroo_namespace }}" + definition: + apiVersion: v1 + kind: Secret + metadata: + name: "{{ brokeroo_app_name }}-keda-secrets" + data: + brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string }}" + - name: "Deploy Brokeroo Deployment and Service" kubernetes.core.k8s: kubeconfig: /etc/rancher/k3s/k3s.yaml diff --git a/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 index 567156ef..e5aa001b 100644 --- a/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/03-triggerauthentication.yml.j2 @@ -6,5 +6,5 @@ metadata: spec: secretTargetRef: - parameter: host - name: "{{ brokeroo_app_name }}-secrets" - key: brokeroo_rabbitmq_connection_string_base64 + name: "{{ brokeroo_app_name }}-keda-secrets" + key: brokeroo_rabbitmq_connection_string From c096523825cdf74302f511d379f8b74341952034 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 22:57:04 +0200 Subject: [PATCH 183/242] trying keda --- services/playbooks/roles/brokeroo/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/tasks/main.yml b/services/playbooks/roles/brokeroo/tasks/main.yml index 04d647c2..6ae46e17 100644 --- a/services/playbooks/roles/brokeroo/tasks/main.yml +++ b/services/playbooks/roles/brokeroo/tasks/main.yml @@ -31,7 +31,7 @@ metadata: name: "{{ brokeroo_app_name }}-keda-secrets" data: - brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string }}" + brokeroo_rabbitmq_connection_string: "{{ brokeroo_rabbitmq_connection_string | b64encode }}" - name: "Deploy Brokeroo Deployment and Service" kubernetes.core.k8s: From 641bdd86a655d735605a1af95828ac8710cf273b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 23:14:10 +0200 Subject: [PATCH 184/242] trackeroo allow monitoring --- trackeroo-backend/src/internal/handler/mqttauth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trackeroo-backend/src/internal/handler/mqttauth.go b/trackeroo-backend/src/internal/handler/mqttauth.go index b7367a56..e43c104f 100644 --- a/trackeroo-backend/src/internal/handler/mqttauth.go +++ b/trackeroo-backend/src/internal/handler/mqttauth.go @@ -41,7 +41,7 @@ func UserAuth(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "deny") return } - fmt.Fprint(w, "allow administrator") + fmt.Fprint(w, "allow administrator monitoring") return } key, err := service.GetDeviceKey(ctx, form.Username) From 93c42bae95fc4d0af064bdeb977b50aae9c1c3ad Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 23:22:25 +0200 Subject: [PATCH 185/242] trackeroo allow monitoring --- services/playbooks/secrets.yml | 634 ++++++++++++++++----------------- 1 file changed, 317 insertions(+), 317 deletions(-) diff --git a/services/playbooks/secrets.yml b/services/playbooks/secrets.yml index bc70b93e..027e780a 100644 --- a/services/playbooks/secrets.yml +++ b/services/playbooks/secrets.yml @@ -1,318 +1,318 @@ $ANSIBLE_VAULT;1.1;AES256 -66373437653161303939646462656534303965396630363231383839333038393433646531393764 -6461343861643765663263383334363532653763323065380a633061356337316437393436306362 -63396437653031313364313663376139353537396633336366663633643339646635663765326265 -3763623731653563610a333166373664356332393737363831656532633563373030633162373366 -33393164396363326362306663373330356132386663393231376365386636633738376261656231 -62383235393737386632663463373737393565646362653539343261316136343161326564363130 -38653861663564343065376662303133366330306638333330633635376164326135336236626366 -33333831656138316362326231396339633330653766663136313434373137636633343061343932 -30313233323638396339373938646231353530363335316239623765323164616137613863626637 -63323965326363633966303432646130376665336563326636313064663036336137373635663433 -31323465363861333238613366616332363364313561363433373261386238373336393063346335 -65666538663131366433316465316635653531303465663136616130333930346134623865313665 -63643735356164633532303165613638316130613034613536363263366632343266613863623661 -30613761353263613038336365386339383735363337376362636132663765366565346363383833 -34356136356631356666643064383931373364316564636436613335373539383366653662636461 -64616433336462353837396537636233663265366530663933653562616138346463366463386437 -32623165316464316665653630363438383531626239356163656261353063646338393239663733 -38303632643464373764626639386139623363383466323338663830663631366339643131396330 -30666161336436613865383635663433333833323032613435336561353932333465323861303262 -62346333613361343236303266626566656231313139323931663838363433333562303434623437 -65636161626438613266363734343836393066623761363236656231656230333534336161643137 -31653238336265373337383732376133643031653439306136643163653835626538373564386366 -63343765313737383937353439336638336338353538326364636666633830373236663632636265 -32366365643964313365363436636233346566343935396465373330386562396332343237613839 -37613164313764333562353237306162326465333534623966316633633765653132343439346565 -33306565383232353433383839313732393436613338383361306136623664623338653835333963 -33366339653063346239653334356366656563366335313761656535626564623234323264383462 -64326662663536636564656432316430633836323565323230306234366137316336373334343339 -38346333303564656331646135666438643730383764353830353934353366346237313934393539 -35336534636238623430333965393336653033323434393832323930396134313365366662383163 -66346365323337393638323366353432633638666333616339656261663637353334326232313431 -62353264373264663931323036316633386133333333653066633133666566623638366261626666 -63663363356132666137336331336134376430373236336235313233646662646132376463313831 -64653633616664653830643435383339383563623836656161666361353338346332303662323835 -39636563616435306332323831343666386131636537376163376139656332393532646533393332 -61653132346166363733633337306566646235303765373564623863633336376630623739653733 -62356335363135613137313535636262383663353463303665396333613034326230663532393130 -61333034303766303566323636363162306333663634373361643334653538383838346564306539 -36393132376265653531383362323966643564663166373131333765356137636261633665303137 -65393138353336333538373537616563363066373364353462393136383231313162386364313536 -37373539343561336563656535386330316532386263633538336233663961343135613330343063 -34383565336633666534383935316664663631353433616365343339356166613935343431373463 -30343433646333386531343137616437373533623930613832626166326139643632373932613938 -33656636653630353331376562383339306634653362306536646563633035623837613535363339 -34366633353333323935383039363765366166383739653639633735663565386138373134313362 -39366134653463343538613331373032323964636231633263636536336162353832656362366130 -34363632636431376331303135616633333831366231623266343234386438646163633036303964 -33333332373538663064643838646362386464336536396634663464356161613133363531393134 -64343663633066323565303662303765356466326238663838653561396439303938646433356361 -39353331356462663366303262636533363135393730656361383565363864303536646539323961 -64356361303032313863663939336137373138366563326531376539646363363932306365643635 -63366636363535353133643532373930663732613334363637356133366564323739383662396431 -65333866333262653632623337383463613262646266313361616131663738303261643530613639 -33396364343439316434653936666164393961386137376633646364633237663562653766656532 -38393731336230656337613431366639346433396337653462663165386265363262663861343637 -33366632646564636265363765386331643563663766356238623663653233346163356537316563 -61306562653166333235336136383630353762353531366162633662363362663838626536396664 -33383564366262623731363233663162303535366534663365323161386233316534326435363436 -66323638663137663562656134643332343531393538663664313236303332613236616265353139 -64323562643165363864326163663037393932336364326639663734613430336235366434663865 -36383933303263346363306562306331613066393332613164666634646332393231336663333739 -37366562333131383839643131626361336338626138663536353331393031323963656230346532 -66616534633830363866356161346431663939386163303933613662396366363633303238616265 -36373234386238653639643637353235646564353962343031633438646335346630393636343632 -36393362633266303966313965383536383935666562343963346131356365343662626639336339 -35643363303036653663363537646262303734346631303931346331356363636662313930663130 -62333930356231656337616466623337663233366166656263323036643538373038373836626161 -65623431353562353363393830393966343832333561306136326335653435396638383764393434 -35393064613032393839666234353431653963613334333833636237353434626334396166663130 -64643834373063323434326563666464316630343061626263656466343932653165353434396664 -64333165303339613336373931316637323461366564343230323666663038633439653936383063 -61643464653138616538326565346337316130633237613737346338346432386131643461653262 -37316437626130623338313037386461356665666231626434613832333266343861383635306561 -66376338636539353835613538386432313731353133646239653461303235633261653937666561 -39326333623238666665356634633464383039396637393466306233663633346235363932663430 -63326462366663653137656536373433323764363932643864326464343037386436343433396366 -62333039356663373031316462356236623063373932613137623635633666346462383561613835 -62633734323233646165623035343335316637306332353632616131326433383865643063323163 -62653832623966626337383030633536623735633139306462353838393636393439393837323436 -64303834363938643535353666373235356238333932376439303636366132633262363864336431 -62313135616438393030313863636334653763353763623330326635626331613834373838633164 -35653365346236646438626136393936393539373866663734633065346631323938346638623063 -31643238313038393234326165613531633964643533333163643730336165333532643833656136 -66396265356166633165363563616635333962666339656465646663653264306436396164363137 -62633336346464623761363133656230353635366438383930363065613133343636313639346638 -33653837393131613938393364343263383963343631376565363036313963666163333365613164 -34303339303438626539343631616235376562313533333737323533373061303432306230656365 -39633735633033643138373735366165623666613339326630343163626639306631363032316466 -39383332363835643764663462636662623437646236353733313130373937373262663936306431 -31346463323837663735373035373935306136343364343933636138643336636662643132323861 -61623766623036383638333539336235656163366633336634663736653533363638643630316130 -65383836366433653735626330646635373632306262306363313936383266633534313033666235 -36646465313234306630303633313634626661643066333831626333333762336233636539386437 -33316363626637643663656237616331613930396662326137343737613963323237343031373064 -39303030633165356366366539346536626230306162653032613461303831393564306433646535 -63343835383039366538656665636162323130613162303136323335633766613631666261306661 -38306433346564626262393266666339333064333931663163366538643835353762313939613864 -62393331323166623337323038373534363332613961336261643666376239366333306536316561 -36323831363231666466633630393733616265313133663534643561663638353038366263366561 -35613566373464353537663939656236346264613266616534326433316638306334343662613464 -61383462663330633463383532303765376239326339363830626162363635346366346634656138 -39616433323433646539616532376264323530636663383937383739366462313232633337303163 -39656163353463313361613233353230616633623431353561646437396634633833643261623362 -36636239333739353561666632353236643965313332363439353362336234663335333834616561 -35333135663736396435383838353537386132623436386334656339326637623236323861323965 -64333666663338396337666466373235393530303132633437663662663238613436306538663062 -37373864653635353463623035356538323865323864333263303132633162616662316462396338 -64373339633562316434643933313432336466636362333634336163653235303634613039363732 -31643265363264323835646561353862303161646136303930633163363739336666663539383339 -30646533313336366438383737386163366332363236306537353537336665316537303933303762 -30343436616261396334313333336362643238613535346165313531303736333363613537643737 -38363530333134316266613237633933623865646432646638336237366631306334363539323531 -65663461373931626663303461366566646235633666306531376535623835393536623535333932 -30353364313461663437333731336339633661646261616333333733633733313232333333336232 -66353234306363653731306132356335666539323165333663656161653234646336383438653938 -66376536303136636666643566643266343832666135333737303938333563666261303562326432 -65393435663232303932663031623839616236616135366262666133323738316335366463666562 -31653931643336346134363366373831366231306231666439323830383664313362363766643734 -39666332393833383533646365323635393631353061396265393830313630613465623563353065 -33333836326537366233623236363436316161313435323934656234313331396663303136393261 -61623738346135383664323765363139306331346339393966623133396630643338623162366563 -36396561646137373438653864353563356664616338663962616366323938353536366139363063 -38653563383431366464353839396639366662393838386338383732363938383266326237643034 -61393538643730663834633366636230666464393537666134653463306133313235383031393437 -34313162346130376532643839306630363466356533356239613338653161346435326231393161 -66336530396435323835316464323336663263333234623933616533643332653738363236343738 -32613661303730363338343634333231323839303834306462386432383038656338353137393239 -63313532613061323166393933306664393138633837346238666236613439633430666536623234 -37366564626535656538376232376238363265316336626439313831336165333237346335323037 -33353966373933366437633531633134613935653532626139623761316264633536356638393437 -39373064656236343433353631353461626637336461383262363137653133613136646333353862 -34313865366463343365376136366637346662626432383438336335636534643232323139643430 -31613435336338306565396361376432653065366630333566636436363066366565656164643762 -35396434653937313439336336313564363333393639383731636137306263653037316534633437 -34343538613630613932303963386462346639313231373033336138313363313036383161643438 -64343063373464363537653464326430643333633831323563666332303238616638646533356562 -34363662363263336435353261316263303035666530363338663130313765396535373861393130 -38336430663432346662393361613862363663326438363036336562343165333139363139316264 -36346163366135643134653566353532663934663762366239303639636330336361636335376466 -32346563323661353762326533653736353562623161313938313236616661383761363863623131 -31323939646233643939653135383333626433663364353565326463663062343861383564356533 -30613464343338363533656330316532396131613935393962313237333566356335333661373764 -62343339393363326262653563333265316430626463633430363762333463316131343861333361 -66316363616131616464306162373236366631646432313464336339623131356131373639313465 -65333638363638303162393239666162616238363733396233323538393431343931656135373537 -36356362386431343534373466643335663464633230326562303232346236356239346636646435 -39353365303130333635336333626230376331376661656436616638663439343161333266333635 -39396261663832626461666130333137656566636236306535343066373261323664356339306530 -65633363396139346537633266386539323830333562313064633166306162353439653163306464 -35363261353530663338393236333363663139306235303066336263633462363736306536646230 -65643633666635373039653438663864386534633361383131303333643338333330383231303564 -39326438623666363230393330373233306139373039303235383634373739363637633633313365 -65623765353635313036373363646566326663643330316334633262623935323561323139376536 -62653861363336303333336361326663373261633830643264336538663861306339333461353132 -63383439383236336134313838313464636236323337633137386461373862656335633839343661 -34336334303936643139373737373033623464643135643264386138613130336662663563343838 -31343530633038326261653436646265373035623039636364353961663762333937323230396261 -61313238623930353533326437326364623633383663613663326536653131623030386632353438 -61363431316238616461663531636239626339303238386661643862616239613564633432336234 -62633963633837383565623933393730316562613235623161393430613136383265356161663130 -34373533373632373766613536333263613037383565633962353564393632616137363537633662 -38353038383035326632306231613837646535623864663039326565616431383761323739373836 -35353632333730653363616362666663373864363731323262613735623863643634356363363136 -31326461383632353864636164376639343562636131623636653834626235393666656333323836 -37346461306461353932303862656366663763303462393861366662386633636633613262356635 -65306134373339663532366537303462313766333666363234366438373362303737373132333639 -34643631386133373564646361313765656564643039366634613764363730626337396165336533 -61663038636635626330616332356161316536313664316463613063383334303735643933323664 -65366435363961616665376531323762343965353030363238363733396562396161306335623566 -66313939353033616432313738386461656430396531366230633561613761646435346131386639 -36353532323937653339376338656130343930313738343066366436326135316463616166643765 -30326566383738633534383037333334366165376433663066316339666332313034633932383761 -38313137656630316666313464383161313166323665356237616665633364343430366131633335 -62396630653433663561316339636337346365313835633863653565636330303461613639383764 -62656530333766643338656634363731663333383364323632353865353439663334396336336134 -65306631383465653431663335666333316531343338346466643334356565373061303264333138 -35393266393730383465326164633362363630336262306535653162636335313335373964656266 -62336236316134333937353036376463373565356435373862643539653563636465393939333764 -65356236623566326362333863353535663032333962373037393538353039663863646461623537 -62313936333832386531383339333938653139383938383064663337366465613261333265363033 -65306161353132643838366265636634373235646236666464633539353662333465663037326635 -65653766353561633163346465363437633039353339393838326461336533353836376532646262 -64633866373663633238383262343830343264663734623730333464626466383463356563313132 -36313366366631616661303331343931626461633463646366343534386533653836376664393365 -38613837323363633135663665366239376232626534326564343566353964613064313339613834 -64383133626331656439623837336166323136663136626436333735626638316566363963303564 -36613432653163663861613932663237653133643039373762313335643235353035303737336532 -64353238393737643661323766626433396361643962616436376332346234663537623839646637 -31353562663561376536336230363231653265653136373031313736306566613137616665376666 -34633761326361626434303962346666353864346563636566613733643931303136613633323732 -61376438363766386533363330393836613538623833376634316230323931633135386231663238 -38343466336666633639366137646533376339633533303530386631333561323861356635643533 -32656263363531383233323263623536326565393635363661343337616532313935373562663765 -31363533343736373765646662393831626361623435646633393563383839626430306564653935 -32386164616534646330643164306439613463623731626163613237323330613737633537626164 -62313761383666363234626636633562303566346130666261373332656334643731636336366339 -66616130643433663435306639376663356637653765656266383765373532346466633534633761 -33383430383134383763393838316162613464323338333233333666356639343237633061323632 -39613636303462386635383762303834313035613331313231623839643464393031313333333232 -35326562303964333937396534333039626363363765323235393931623365636139366565366663 -64396232306539343166663165626663626461373633623638616330353035343534633561636462 -65613065666564316230393065326134373337613861383230663932633035303736643634373334 -37633232366430326536616130303762646565356330613862336439303062303732356335373536 -34323139336337383639303062303562393535303333323161646537663264656632313433366139 -64333962656663373731623033306530366165373362353434346430376634356631643665646138 -31316662386566383338653834643635626630656436386234323531336232363738363937313134 -33366538656463653662643164336262633466313665393938376439393364653937336562303737 -34343364356163393861353631373130643437303265643162646538613134653539366333343830 -32633337313636613261396465336566386561623165626631626462393632326433653230636133 -63353664616331343333333136306161656164663937363865666139306630613966653761353261 -33656234316232333036636536656630376263393439346636613839386163386165643232333064 -63666334363530626362653434633735373365326234613335643434376163343865663131666462 -33336364373964656565623862363662316632323335616238623462386263323931636563623031 -65303932643262386665363363613364623235353837353665333136633962633136303032613930 -34633439336235663133653563626263636330623037313963343335663263666331303936313633 -61306439376630656166376334643335346164323033323535353435643566663831386237386436 -66613435323863346332346438623038366362623935386365306332373238343164653464323130 -32636139336137633436303831386139383837656137313861336664666466346133633737326665 -30613036323438303836353834623461383638333939633164616663373363626235636135393364 -37623739386163653762303130313164393332373136343930666537613362363137363830653766 -66393164613264393530383362383665643032643262393665363236663736623062303930316166 -64383063383163383731386432336364373738366636383139616436366230323161343861623865 -39353465316663393939386562313163666138326362303231646430643039633234353363343132 -63373439306635616536323866303666313630356566346233303430333037336139623936666534 -61346465326332396663633239303663643732313066613163636538383931336530626566663435 -66323235396266633865316439313364396465646362316135346232613933303538623461313836 -34643233656466353436313664386633353430636634396332663864616564613331356537356332 -31633638653239306565636466343536353961316665386338636464363461353364663462393861 -38626138666631353835666166313836366334616362323936373565633831316231626566623663 -66383661323862353063636132646134633531386337653766303765373031386133363036303733 -30333438306631656365323732663434333062353539353665306664656533393432363866316137 -34393263346165306663663339643663313535613932633262646661373963306231373764623034 -34346566346538333530373863363036373365613966333030316164646364663236353764383431 -62363133326663386532383738333039346331626435306462363531316636643931666334663038 -36363638313632343861353039303233383639393130643837373630623439663261336364323531 -32303532636538626339613032323437643566323236626338616338363765633162653137353137 -38303331353035353832303235323863613537376537323532343765623262323562653964373030 -63386434353233336630376232313735323935663264333664326130396532313130376663363839 -36353631613163353233616565313830653334396365323137373238373030346164396432646563 -36343864383337623561396132643062386533303263386530646536396436613661336438653761 -36386562356233363830373135623336336537386236363531306561636538353432353339363866 -62646434646238396438343862386366373631316465303264313437666266346637633039656637 -35353735653331613464303263643563326636633333303162336636663931663433663132323336 -38663233393166613530396230656461363239376136333434356232346466633765633632393665 -66333865613436623531373061303565633831336437383630376133303764303762633763316364 -35393963366662316162653838396536613630643739313262356635656336636337636633336662 -36653130333936353639326333316233363162616632396136343064396135616164303436326562 -30623361323765333866343038633163356630326634633735356638636463626231356438363731 -34623436616535646632623230646339373431386564333062633034313662623432323162663039 -61663666303533646438313735663632306131346539623863306636316336383536313461363539 -65333965653430666364653936376634313465663437396236366631373837326239303866383737 -39326531346461616131333836373065323862303630366339393734626239303838623736616131 -37326331336434633564306265376233396631333332623035613132336139626538616636383361 -62366665633232396636323964393063623866616665633962356534663430346235323932376535 -31633364306233393533356434616666346237333665303531323366336361383130666461643466 -35376264383935383437303531386366626632623737356335336466336262613234663430316633 -32393166633561396433666164346466663436373961666564666262383962386337646366663333 -61316534633166306239376132313463373339643966316635323634663764613034363030373062 -62313038313265316464316137663162663963373365343164343935303331376639366337316434 -31666437333538373436336335656165376232653435363639383438396630643136353065313766 -30383239623634303235313433623964323936386337393238353932306561326331626530303834 -38653730393539363664393763383263616634386233356361613064333764353965356362316364 -32396332313435313130373331646164356138373831373863356139346637623234323533346330 -36343764356431633462633463313632363961663735636531643762623965343637613537393963 -36303235616238346661636333346164323633353562306235623838363031333062646335666165 -65616335643037643039303464306335613664383439323539343538346163646636373564323464 -66336566333339303463353033326633616666333433373637613961363465363863326466393362 -34393137616530363835383139346231386162316661353235396134336663323262373238666336 -36383761363836326164396436346261303263316131663738623233653633636666303235623839 -33626661376461643865343266666239383630633937303566383739363565313836663963363065 -36373864336131636266366462636539346161366464343339666662643839623263393262333934 -61363738366437323033383662633561633432313165393333353431343366613264653862623039 -38636135333439656432353564636338623566353631383065346437363331363738386565613535 -38356566363534363465643233636435656165633432393565613765376665656264666438336333 -37313038346331363661613037616239313333356664656363343531356465323032653865396633 -64633035313466363237363135653334636666353334333962363932656430316232353164653031 -62313836323239353130313136656363383237666531663732336235306238663834653633326231 -38373263386531366361353137393035353437353933313933396532643866623761343735373939 -63383363353461383634356665383264383864386366636564373132356464653839643935376431 -62366631623736623766363766356439666663383163303865643131623166353234626362306339 -39643336323464623861636538623736666662393766376565383633626136616461666130616532 -34646633613266393331623337346364383834323663663432366532373230303063646361303233 -30623231396431626438646365643739343463346338373432633266646462323962303138623533 -39356462333130616366353065346336366338633962353632366262316139636339643039633337 -63383734656536386537316166363862386538623530386233313335303737613163386431333131 -64333433383163323161633134303635376433336236343639366532346237376534636331623336 -64393836623861333331363266666531356536646561386162336535346131346637373239613035 -38343632376139653361616632623332656236333265643538393361613263383135336363306633 -34353665616434663633353434366263666261653932663461613534376334633064646333643333 -39653734613063613133386633306230303033386263613031353236333931633563343034626362 -38306266613339616162343561323832326534663636326538353232323834663663383432623864 -32306466306532363532653132363432323530663763343333663930386430376635343661326131 -39396331323238373835616161643032376537636430353766343337386438316465633533396666 -35623365656163376439656131333232313732613663343464653963613462636538623765616430 -63396639623939373130393037376238353361373337626362353964353033306337306538393763 -63393962613834333565666566373436303530643862623231346632363738366630393738343135 -35396538613961616437373566316163336636313730663331623863633735633634386464366262 -31353633346434666161353462316639306235663138313738356332653033323662653133613538 -31633537383765633566616264643061396635396331643231633465636639316164323230636564 -66636531363061616233356261336165616531386330363263343836326237303938646530383930 -34633037656461663039663638333963663235623535303566323530613337366337623838363234 -34376166613636383130616365306233303632356262326262366435633565393062383061373031 -30336634303234663631336664363865646435356431363066383932623362346232376163303938 -36366266643661346165393030393466396138643063326431643066363635656363383839623433 -31333338373762356533306366653330346164326631363033616163643364393032343363346366 -63633164646432663834636462653030643762333633316332623061333238306332633864333262 -63316436306439383135383431393434363338633336386632353962396463373935663933353136 -38323738363132393331643439633232343461383835373264383263613532313866653463646437 -31363461653630633266383131343831646136396336353865346435316566616536383263366631 -63353961316339633330343137363639636138633961343666323162303736313766623332613261 -65643065663930383739613337643233383062306131333138633734353264386361393434376438 -37666536343239346531333632346436623736653235393633376239316233623833343838383033 -62363765393036366264376131623339366234393866306338353832643364313732333438626132 -33343132396531663734386233353966326436393361333866383736383635316539336530343933 -61626561656466636332343563353565613735313565306561626632636563626363643738313364 -65333539646431396434396531636133366533343636356439646461393164376266313163333639 -6539 +35326333313331623365633462323932656139656133666465656537366566663033306632346139 +3363653733306261316131326664396137613866646134650a373638303861623834633432383164 +33623861656234323436663137636561343062633734653661356461626335313535623637396239 +3633656539333131320a656439383032636665616539383666386662373166323730666364396363 +63333363333830613433383564363039313864326235303262333662326233623365343830333666 +35663363656336646435653535333466393262353732386230626263363035333765323930343366 +31346333336637313232303035313238616566323239616539333264393262396332303035646561 +31383630323961343730656533616639353337383963646138623263333838333961326330393064 +31396135343564383166353232306130653131623262366465363065316566326361336237646565 +34383563343435613839623831356535303231633665313539623834636165353736353137613666 +37636632393933376438376533326432643937623331393535663433393636633031356163333833 +35333762636365333136653239643866386633396466393731383330363336333739643636633266 +33306662623363396663303933366530373231366331333330303339623336373165313131383234 +65663639616531336562313730336439353132316238376638353661313266656335386534303332 +32643839376536333162326538366230386139336339636566383166363666613965636566336537 +61323830623733306232316331376537643433326239303566343366396565396439383063343138 +30383339646332613437353730386237653063333130633463633334326530633336303236396538 +32323735353962373635306466616161323964623763656231363533366639383832623666666164 +39383933626336383636363463373063336166316566363964396430363036646134396334383062 +38633063303466323234303164366661306136366235633738343832386364653830663162316461 +32646464653664646332323438373532323061396630616462383037353337393833356563646433 +32623933326162653662353336666465373362323436333432316163666366303466313535633433 +31383561646339326631623034626463323432616435303563383339376231353161393862353137 +38353734326364366132343733646231316337643266383135383939333666663439363432373664 +35353363326339623634326131663964643939663536343134393133643833316465333332343337 +39653461653235333936376134393238653164633032393665383335313237623833613437346638 +35623833646363396233393563306336333338313165393066313064316139366532306261643838 +36376133356633623364666334653530393565623138616233366330303366663333333837393037 +33373466643736333534383862333730363661636264663161343666323965613238326361653434 +31393632343136633636626430623164393832383661343531316232326264396135303735333761 +36643265373365663166333438613061343138653064633432303833313265356265663066666236 +66383966323539376234353633393736396231346361623362663439393262316164666632303434 +64386434653334313530653332393136396230656233326432643466353038363961656431616234 +34396233663531613763306162303063333339333361303861343138633761313539643162313463 +63613661323765306639316532333165306562386434383863643464663562353461363839633139 +30656366313830376531306264626532393066396236376334396230626264306235303161623632 +65323136633531313233316136383965376538343739643466326233363564363964316533356465 +38383566626431653061326330623962376338646461306238323030633735313661306239346461 +37303637383561313835323763383230376233306631343738653462353433303961386133313036 +35633264383362626465356436636162366232363935363936626432663933373336393238303662 +39666335346230303365333738326131383065393631656236616365313837663933386663646236 +32313130626562353065663030636563303637656564303933663862666164356164316433313239 +36623366326562346661616465656133303662643832353633626339353366623939363738346464 +38363434363666316238313436313562636437616161343031333066373566326363313461386163 +33313238356463336565383838346531386339346633343436346563373362336666303165666437 +66356231336534313939313364656538366331313166626633616138373134336661363838616163 +65393836356134396265326237323338306163626639366661346437326133356262336361353538 +39643762306437643261303465313232303262343964663539646361313336613965333163653936 +34373364313134376635373734346234633033356163306535333363623366346338643531383366 +35386532613064323637303637393039343865303137363965363439366535636666373366366362 +37396230363362333632393439333631306266656232386636626630326664353863373434393631 +36623435336263663033376164323537343832393465396435336530633531346434386563623130 +37383935616431353537346333323165386531376238656266613132623065663039313339643039 +36616237326532653932636136653766343462656439353337383537623231366563356165363034 +36343236333231656230666131363133313931623435376134356530356435306439383737336463 +30366431623436666138616366633630663761366638326337386436613962646534643637336539 +63343431356538343533626238336563613839353730363332643533396364623834363833306535 +38386266383961663464396330613838373438653237626336396630316165376166353031393962 +66303833363435643433613432323638663038343738623165373965353336313437636465376539 +39323633303238393766323730613937653634323034636565636562343066393233326261333062 +32353636623138313030643937333161653564343365613265363064636435663933643436306533 +30343537393133626266386231613632303834353030623834373833363932323332353563383763 +31373961363961373165613434393039363462373837613064613237666337323935636665353561 +64393831646438323339396163666533623336336532396433373336663066343432646164653635 +66356537363833616638383463646162333137336436633638616238363139396261666233633431 +31653036613862376166313865666639373566613735396131313133336537643136343661666436 +32326331386464666137356166343038376163383838633535656262383934613766653335646461 +37646362663564616230396465313166643632326232626631306161623934656165323335343764 +39323162626230353862643237646265333862363164636334323033313665613366336365386231 +37636139373439326462363131613061326235666231316133333166303035623431393764636633 +38613530306339323839666539653937653635393035323366666363666439643964636634363436 +33303465393632393139643762333062306538643264336237393039383062393039663332663037 +34353339656562616538346532353432356566373831343862343437343838343130613863616138 +63643265623762366561313631643765353638653834643331343465653662633764336361353838 +66346665653265663932366438623836343061363939633734313237343866333936646134613462 +65643235323466656239393434393530326332346161613435306361643430653863663635626562 +37643037373930623639356332393837643539636535386430633239366162383834363431666262 +34343866653463376533326135393533323637636366323333613939306261613838633261383333 +36333362366532343162303964636632316337343665326331323430373065363032373265343861 +38663661356236376563373130323662313563613532333735373964646435313039626264633537 +34343134346434396163393635633131623365333739336435666265396266626664376435333631 +62336166613431383932303234343164363534616465643033626662313630636666396461336533 +62663165386335643130356337373937363666353061373563366337316236626638313862323235 +61346166326237383332303637373139306231633631353964313165383338373832356633393461 +34636332326430333334353066383035376465663162333334653663313261636535356562663862 +34353834616531373738313732646664626461383562396661356134373439393134353765373231 +32363434333136613534353937646365613739643264663861363263613865396138633966643937 +31356339636530313836643938633937636533366435323737626561396165643464643831643330 +36303264633434376538363839336162643436653866363831646132323363646235363561366135 +32363462646333633534363666623333636137666432303132303033653939326239383861383363 +66313166656136653433626561633561376431313237613531343232656135393263636336323936 +65303339396364373063623939636661353738663039646463363262653030636234653136613530 +34653531373736303839323236656237353036383537303064303138616630386634643833613033 +62396561326334613963393666643335646636323539386331343536353634646664336234643131 +33653436353132396230653166363364373736613430643135373930373239636337383831363838 +31336266666631633364633333613333333964303138613037303965646166363434636231306230 +39303136656164346664643036356534383433653036326530326234656261633566346134613763 +35636136623965313031666531393038633165643532343062363863623934303736396631633161 +33363330376135656365643433623866323434333939666132636232616238616131303431353331 +39326237653831343434626630646639363538323332306434316539623233333837356531633331 +33646237613164623037306130633563343266343164653566336431653862303734633134623933 +66363337303836643166383532363538373566666461623666363836653964653039313362623236 +37356437343737653630363766613137363632373631316137333331336361393238363237323862 +66313366613931316132613939643537656236383730623832613761373066646261343631626166 +39633730323539663231613038623739383132623730643866663565346330333332666263363732 +66633939303136303861333837643432336139646538316438383466633961383337633661323764 +31633337376432663461323961653931363961343837366263323732633434663364343537623238 +30386136343438376434626231623132623538346633616432346532653761323035386435613332 +64373936326362653334343037363336396539656564643830313339363733653964383732663334 +32356331636632366266386632303962303834396136643233613737633332373533383433313334 +39316262376163666162313534633636613764386633363230393437663238616166316633633638 +31313733313234316361646364313134363431316564613137303031346362393566366634323237 +38323439306165363265666662663230376334663664393661326263663161373033356539363730 +65373039343762393231633635353161316332643130643438613065313763346137353734636531 +32326438336232363139303665616234366435326334373264643539346531316565343364393533 +62613462346566616135666432323665383363643538393566393137336334623638383636393363 +39666666303635323034356466613263326532383262666134323438656462306666373937333765 +65616131346432313861393966313331333663633838366339313537643336646566633363323764 +34343863666363653163383330326463356234323132363338663966366233396131393365303965 +39623866646464613438366461633935303964393637313036383838656430623236653934393836 +30343436386165373032303261313931343134323035633464613532613833643039343533306337 +32663736653865633538353433396666313264396632333966393366386133666562383962613966 +61303034336630613264393438356662656535646433646235613661313534623662653665666437 +63663834326663346530623864643164353533616239303133373065643938323334356234666138 +31373634323834386664633235383362633339633766313832353130393633653033373062323331 +30393837656463633332363035303532303735623039356666363237633830393639336638623563 +66366338396236386665666535363938646161313031313966666134333534636538663532346663 +30643837373062653763343131636463623966383331313163336364616430356331616333663765 +33396562376261393236326262356639306532333465633930333638386264316630313162316162 +37363262393033306562383032383634666464396234396630353735383962323939323965653839 +34666461306265373561323730366431343066313335633164303734326563643061313366643062 +34323165653739656235333563643164373238666664356133373865613862633730313131316536 +30613833363162646138323732353739326366653366353734653464663138626263666639313135 +36633530323361666139363264353930613939306631313932316339643135343633383730326234 +61616263663136383033356436313364636530353030383130666563323766616562346135396637 +34633563633061663461616164316365633262373939636666303161663062313836333637613865 +61636535373832353564613237343331633632353665343831386266663130313761353865366639 +61633462666666393137396431626634633961376665666562313433386530343363623235653130 +36653034346364633865663134306638333165323266396635343962313563323935336233356133 +34633234663966303139623066333261636232666436386334353561623765623965626430656362 +66353938626238393365363132396438613232316566373362386165393363363165653030663037 +63373633323132323764613231396135336333323033316631323965346165616261393366323639 +61336332313561623333313762393032326236623166616265613062656331363738366165353233 +64376635306233326463633535306138303135656531313739636266356262303262376161376535 +38653333346235383030383139643735376430326633623266613861643437393566356433393062 +32623539343366303738373362316536656338373338323530313463363037313634383264343837 +64336165643437633033646466643431663339613761373437616339633861336263663037396563 +33616439316539653931376635396463646331636664363239353930353062663231323665346364 +30343536343261373733363733653861616439316134326538666362353432623536366662633463 +34313464663635633331383232333936306233383562356363373866396538363064633939346563 +33383639626664653637323534396633393366313361623161643735336533316139303763376366 +64396139353962326465626537646462363664313130383237663439316537636234613930386436 +36396336613833356334346333636465613031613932336234373836336166313634386366623461 +30383833316438396334633335616639623863336333623039343836613537656438623566323231 +31353562313166336431653430663266373162316534366234383536306166633561346230373337 +62306239376530343036643264373432336437346631666138326237616435646538333732396437 +34346535626330376136396464653233326233636163343566396665343338643837396663333134 +34313935383330633039313739663564626638626430333034303631303966663236653763643730 +39313965316233346564326464636363643431663235323535386132653063386139373237303339 +30636531613334316432646331613131313663626332323461613735646337656461383031336438 +39376466363735643865353765356564656238306134326439363261363332623561336330646637 +39643835356231366163323739343166323932653961306464333938343463386233393831313966 +61366334306134373938663130616163363039663536386263656662663536303062623961396434 +31343435313166333931316364626163616563306466633532656535336437626632663162633761 +63373831656132316636323130376434383462343635666566393966393564343638653937346463 +30646139396531373034633738373736636163326533656637393335393431323064346666623563 +37353862373736666236353663303263343437663038373534633961396130396430353939393331 +39313633626436313338623837613836353433383535316132613138653563336139613137386161 +34353834343834646438346466353739663964636463373432653564373465643532396231643033 +39623039633765653133653666313439383665366365303630613036386538346435356338383465 +65663766363564393732623635313932323436303134643135613634613333643539336438653030 +64353661363366653661333262306431653537316332623237393534303430313231326565346535 +39333936333432386536373531613963396130643234393533383637623665663635343438303466 +35393965363433333631663831643437653362363534303133633232613464343762666464373936 +37666561363631363638633434626365363336393230313063623531333665613738343162323133 +61313736633335363337383361353738346561383437646338363636623430386236373236616336 +35323634386538656663623735333261383537623563343139313261613036323461306462356636 +62303536663534373038336363323662633562346638336136613133383133356130353166363039 +65633861386365646532666139386333303630613961663038376633656137323932356331623865 +32396234366430333433343862366666396438313033393833663938623330646436333733303266 +32313539623435303938653432393164653633663065373230333561336533343333333739396235 +61346661363163356232646462313238326661356439373561646636616463623937373265633530 +35316131316438363030326130303334343438393833386232313032666662313133633734303332 +66353133343835323834623339633663303937613564303539666431663030646233373461623836 +36663563346166663530353231636632653332303739363139396366343432323232623964383163 +66643639333166336138346531653664643330336166663564623233396261663531393365393637 +33613332303530343839656237366665633434653265383661356531383631323733333931643834 +62613832636265303834613365373533363033353534633461623736633665653436353361343131 +30363933363265623539633131326535643662383833623531383135366438663139303630316664 +39366634626637616638666439356266656231396331356630643461366233633663336336643761 +61393838653235383662346364356261303033353932333833313564313238656532333231343935 +34303737323539636363363432656438386361306361346366373562633132373839646563666530 +65363761326263373233343263613039346434376434616236616631663433646538323065343266 +32656530333163373433613535633133366566636461383633396264326566366531653663623366 +32366266316261303262363233353665343931386663643736333130373863313133383964643035 +64366562393331643561316334646639616439653937623534343563633065383162623665333234 +37616531623338653666383939306665373235633565616232353733363166326162613634663130 +36306464313333333361633835383434363264343934666337363934393831646432646465366462 +36653261636366626437343231613366303338666134346531363739363662396638363333386662 +65303036326438656531663434646664353337636532353832323331353636393637666666346164 +33343964386438356434663164396535666261393031646133663036306262313935373065633336 +66646538383338343063363236383437653063613631666432613064363833353666393437616533 +30353337643338653133356564663231663661306162386432333031376165323138643961386237 +64643762386335313834396532633838306331646666386465386230326230613934323139643832 +38316666343930646439666233626662633762336162616664373236373661356562343361623863 +63636639633966663034333837363664323266623964343733306530643738636230386631353333 +30623365373533616164666462636432646661643737633031333865356363363231643461373165 +65353663343561643533623963373732303530333963353233316135656330386666613238643631 +30663237353565333431333930643233333062313232316532386531313333653233643838663562 +32333631643965633565343066656133663639626366326561623734356233336134363465653132 +62303836313838636436373730336333383830363239633766323461666135393064643131626234 +39333664653935326462343836616632303261383363346437643534643530373763613864353137 +35333163323135323639323564353637653739303630386466393931363738373361303334396537 +64616466353337666233326639343662346465346532343235303936653836333537353738396365 +33363830633761623666393039393961396333393335303664613032653530363432633330626536 +39343165303433626166396134336437316437656661323466333436333638613361643834336436 +30666135353165626161656335613335363630313063643237393964633339306264363737616533 +35316533333939643565393265643165643264316636376466623039343264303862313162666361 +30646264306363636539353063353035366138356561626565303736343238306238363161626132 +34333531386263346335636262643862646661353262336662646538623430653961393938323762 +63353461653964646537353332333138313231396465353638633731336665336264303061306633 +63353066623163333838313235633430653232393031613038626434343337383039646363313366 +31666233646134356662363833626566393564343837396261653137656337376630323364653035 +38396164373434323930623733303562366235666165383663383534366364386136343861363461 +31393331393363653662623737373336316363356539626638623064636633363562343530663734 +38383532393261633631383330653332393230373734656633343431643032303266366266663535 +30306232356433643161653661393639653935323938663230363336616465356636383933363332 +33356466666566636137346363386364303237323761616135353264613338613036623538646330 +31333566353464383139383030653435653130633638633238656535343361316134623863336162 +33656234373939316364643931313664333561366161316230633737373233653139363230613161 +35353935333831313566626138343031313038396439373032383761653637646231636634313734 +34383163316530366266636537363733626465373961626338666462373935393839373966323163 +35663632633339303361653265373239666431653061383131343631313934663761376665323164 +34353836636362666665343538613238376331336564626531393634616132346236373133386364 +32643031383836616133373238633764623031646537623935323539663964336238306162663939 +33633535613734393430323336323064663836666233373265333331346333653430666564396262 +65666666353738316463323132363936323334303634646436393161313666356265666630643732 +62333862626362646365303761346363393633363838376438333139383366306137343162356565 +32653462663336666131383766393736306131333533373033323665303665393761643933353664 +34633264313030363832643364303832333336306235653533366432396261383632303637306130 +63666238326636373831353137343833353730343264623764346563333662613731376366663861 +66663361353533316235616165623938376562633662626537633730336163303862356335363137 +34633038643333643562323065313366613135393036303164363033653165316539323363653636 +64323863623438353833623235623565316235333230653464353932633262373135643832326236 +61323831323265663833666333316238373731383061353862316133333136623362653863363732 +32336664316461613763383962663632313762333962656634636163323632613136633139646530 +62343432316334626161383335366466303963373664376633306132303232346162313030626464 +36366162613233633532643162656161346234656437396630383631646537373339643136373232 +66346531616334313761336564383636346566656634356433316636643038306632353337303065 +65363264363363303437313066616265343137333836366266363137663032336637316533396663 +31356464376661616439663836323338303739383066373636383430303439346261393863393064 +33343135306131336365663066323139613730336533626163613232313434386231656564356636 +32643937666238303464333939393633353937323339653331373233623433653631336431623738 +65336564626638396462313538333239366538663961313036643732316464353834623463336664 +33653261333134633237643938656337306463343563306539343239636564386463396530313435 +63613866326234623630663438353062323236353966316165333763346166353932363162393564 +62653430333938353466643764643233363365393637376436636631646230636565623866323633 +38646262643138343762313033313335643337363163353161666238663561626131636661353732 +32303131636638303630316131646530313235663234393139383934343334343736663635343763 +63373563373835623238313162333438346637653736643831646636366635376561336437313566 +33343532613636623638633161633639306539303664366661316435303864333534666261633638 +39613439383763333465336332326463613231323737376363326162346164313139333364313233 +31303731633566653539643465353962363238373865323162383237643361303439616662393839 +63383932356537353063636438656133633334633963393438653932396234356163346138353863 +66343037626463623730373035306136653738306632613638353030303866316332303939636661 +39626466323462633235383439346163653766396362363234353531346439366636393131323561 +35653762623763396235326339633138633038343730663232316662393333343133613639323761 +34616132326366353137323365313039383939356130353463336362323235663636626236383863 +66643932393663346132663539653661626562643863616535616138386530613339636437366535 +66353939353533373336373465643936646463363962323132303932326137336666306235393432 +33666335333466633632323065643933626164623661363362383535383330613562643963643439 +39613465633635353339633466343538303962373663323234343461633839643837373566376232 +66356430376432346562343461346438656432633336633763336439356632373731396363346533 +36303839616635643632636530343266306263313537613262343563623165616661323133633334 +35333766393938653531356264326164306265326431373763373563616439306265656333346266 +30636438663236303331666662646330643935386466666530373831653066353438373864316463 +39323463336161376562653535373836666166373233363463646637323234356636303666353337 +36653639653732643330623634396334333031386433656538373133323864653238643566636639 +39623338616363326139353265373361613934653832303639613962306332306366366161616338 +66616162376632356136313434333939616431643036613263663262326133366331303361656434 +64393261646565626336613231336136363437656135373037643436336163313534373063316461 +66376334633362643532336561613633626234653636373331333531363334373365643138666438 +33333933613038666265346538313034393066386634366631366131626532663831353330663631 +32393933646164663539363264393135653834653735363364623663666438303063613366396261 +32623739316161626266336436393534336661393033653038353239336232656234666139376431 +32363964616161626532326261366238646638386664363836643035303235393535333738393732 +66633335383637323264336637363136363762346561646630663438643364316533336531623564 +66396463313964643737616632333161343664323564653433356431326137303438653233396439 +63326533313039303462376433333763343161616166366566616135396365306565353563633565 +65663336633531643335363534353033633764656463386438363664653537373763393961396332 +63623837616634623665343765653935303631613436333232306331656433666633333764626665 +30386432623563323865393166343662373636303063623739626634626163323464373861306432 +32373766383130376339306165356338383561616433383066306564343664626632626135623730 +35663234353466613039323866316364323262623433323336386265306537626532646165383161 +36313061386363396266363364333837316534346439396636643939643633396432313966393735 +65346136303966363438646639366563306564633464656135656361623734656535366331666462 +32306630663838363566303133646634346235313933616332356537643564373731386335643836 +36386330313365303634336162643933353530346135313263326461336634616335393963653465 +35646230626537363935333162653966393031616234393563656435393664393839386263353864 +64313932373737306136663436636530323534343166626161653535333137316437303363326637 +66326136336665373330646336646438663561383133313532373237386230333864343863636462 +31373036326365393862343035356433313231663963393136653234343835323866666131366362 +65646334623066353064663431393830643963353065653631636164316339313963393039626634 +32346431616137656262633362333230616633316239643237396663336562313139313930653930 +36323836316630373961396565383166633733613861333463393036366538323662613462383465 +30356264643161613339396661336462653337633434333030313264613437626533626638346438 +34336566636135633736346537333833376664623139376430326666633666656664306439666164 +34366530313137343439303330303666396534326134636237373534636561653361656436363437 +63626637633335333336306437346162396532363634313932626565313361303532623030343937 +63396332356566313736366162666165333438343862386366316463656336363239376665626563 +33313034353062623432366663663562633230663764643861346433333436646637363462643539 +35333331666566326334643937336635306334633231666632313462363038366435353933646130 +30306663386166626261623466353465616435633439373363333235303237343836386537643634 +33326464663662613566396635386332653938303039373961386165353530313134633861376262 +30636462353766616537393837383537353064336630346661633638626333356635393561653038 +61653761613638656632333133316264386439323236643463363332333538323562633236336230 +6262 From 7dfb097e8c09914fa9456dc3c94c5bfdce5c2b7e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Wed, 22 Oct 2025 23:35:28 +0200 Subject: [PATCH 186/242] test keda --- .../playbooks/roles/brokeroo/templates/01-deployment.yml.j2 | 2 ++ .../playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index f2ab9b38..35b28697 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -35,6 +35,8 @@ spec: secretKeyRef: name: "{{ brokeroo_app_name }}-secrets" key: brokeroo_tsdb_connection_string + - name: QUEUE_NAME + value: "{{ brokeroo_amqp_queue_name }}" - name: ROUTING_KEY value: "j.data.*.*" - name: KAFKA_BROKER diff --git a/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 index 61bee168..8e31cd1d 100644 --- a/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 @@ -36,7 +36,7 @@ spec: triggers: - type: rabbitmq metadata: - protocol: auto + protocol: amqp mode: QueueLength value: "500" queueName: "{{ brokeroo_amqp_queue_name }}" From e7cb05e6349aac2a34e939c363d4dc41abebfa57 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 00:23:59 +0200 Subject: [PATCH 187/242] fixing rabbit --- .../brokeroo/templates/01-deployment.yml.j2 | 2 - .../playbooks/roles/rabbitmq/tasks/main.yml | 51 +++++-------------- .../roles/rabbitmq/templates/02-sa.yml.j2 | 5 ++ .../roles/rabbitmq/templates/03-role.yml.j2 | 9 ++++ .../rabbitmq/templates/04-rolebinding.yml.j2 | 12 +++++ ...atefulset.yml.j2 => 05-statefulset.yml.j2} | 1 + ...vice.yml.j2 => 06-headless-service.yml.j2} | 0 .../{04-service.yml.j2 => 07-service.yml.j2} | 0 ...policy-job.yml.j2 => 08-policy-job.yml.j2} | 0 9 files changed, 39 insertions(+), 41 deletions(-) create mode 100644 services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 create mode 100644 services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 create mode 100644 services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 rename services/playbooks/roles/rabbitmq/templates/{02-statefulset.yml.j2 => 05-statefulset.yml.j2} (97%) rename services/playbooks/roles/rabbitmq/templates/{03-headless-service.yml.j2 => 06-headless-service.yml.j2} (100%) rename services/playbooks/roles/rabbitmq/templates/{04-service.yml.j2 => 07-service.yml.j2} (100%) rename services/playbooks/roles/rabbitmq/templates/{05-policy-job.yml.j2 => 08-policy-job.yml.j2} (100%) diff --git a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 index 35b28697..17cc709c 100644 --- a/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/01-deployment.yml.j2 @@ -5,8 +5,6 @@ metadata: labels: app: {{ brokeroo_app_name }} spec: - nodeSelector: - workload-type: apps replicas: {{ brokeroo_replicas }} selector: matchLabels: diff --git a/services/playbooks/roles/rabbitmq/tasks/main.yml b/services/playbooks/roles/rabbitmq/tasks/main.yml index 3d2b50a5..0991df8d 100644 --- a/services/playbooks/roles/rabbitmq/tasks/main.yml +++ b/services/playbooks/roles/rabbitmq/tasks/main.yml @@ -7,13 +7,6 @@ kind: Namespace state: present -- name: "Create RabbitMQ ConfigMap" - kubernetes.core.k8s: - kubeconfig: /etc/rancher/k3s/k3s.yaml - state: present - namespace: "{{ rabbitmq_namespace }}" - definition: "{{ lookup('template', '01-configmap.yml.j2') | from_yaml }}" - - name: "Create RabbitMQ Secrets (Erlang Cookie and admin credentials)" kubernetes.core.k8s: kubeconfig: /etc/rancher/k3s/k3s.yaml @@ -47,38 +40,18 @@ server_certificate.pem: "{{ server_certificate }}" server_key.pem: "{{ server_key }}" -- name: "Create RabbitMQ Headless Service for clustering" +- name: "Deploy RabbitMQ" kubernetes.core.k8s: kubeconfig: /etc/rancher/k3s/k3s.yaml state: present - namespace: "{{ rabbitmq_namespace }}" - definition: "{{ lookup('template', '03-headless-service.yml.j2') | from_yaml }}" - -- name: "Create RabbitMQ StatefulSet" - kubernetes.core.k8s: - kubeconfig: /etc/rancher/k3s/k3s.yaml - state: present - namespace: "{{ rabbitmq_namespace }}" - definition: "{{ lookup('template', '02-statefulset.yml.j2') | from_yaml }}" - -- name: "Create RabbitMQ client-facing Service" - kubernetes.core.k8s: - kubeconfig: /etc/rancher/k3s/k3s.yaml - state: present - namespace: "{{ rabbitmq_namespace }}" - definition: "{{ lookup('template', '04-service.yml.j2') | from_yaml }}" -# - name: "Ensure previous HA Policy Job is removed" -# kubernetes.core.k8s: -# kubeconfig: /etc/rancher/k3s/k3s.yaml -# state: absent -# namespace: "{{ rabbitmq_namespace }}" -# kind: Job -# # The name must match the metadata.name in your J2 template -# name: "{{ rabbitmq_app_name }}-set-ha-policy" - -# - name: "Create Job to apply RabbitMQ HA Policy" -# kubernetes.core.k8s: -# kubeconfig: /etc/rancher/k3s/k3s.yaml -# state: present -# namespace: "{{ rabbitmq_namespace }}" -# definition: "{{ lookup('template', '05-policy-job.yml.j2') | from_yaml }}" + namespace: "{{ brokeroo_namespace }}" + definition: "{{ lookup('template', item) | from_yaml }}" + loop: + - "01-configmap.yml.j2" + - "02-sa.yml.j2" + - "03-role.yml.j2" + - "04-rolebinding.yml.j2" + - "05-statefulset.yml.j2" + - "06-headless-service.yml.j2" + - "07-service.yml.j2" + - "08-policy-job.yml.j2" diff --git a/services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 b/services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 new file mode 100644 index 00000000..a4f0be99 --- /dev/null +++ b/services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: "{{ rabbitmq_app_name }}-sa" + namespace: "{{ rabbitmq_namespace }}" diff --git a/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 b/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 new file mode 100644 index 00000000..7982bae1 --- /dev/null +++ b/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 @@ -0,0 +1,9 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: "{{ rabbitmq_app_name }}-peer-finder" + namespace: "{{ rabbitmq_namespace }}" +rules: +- apiGroups: [""] + resources: ["endpoints"] + verbs: ["get", "list", "watch"] # These are the required permissions diff --git a/services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 b/services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 new file mode 100644 index 00000000..b25cedd1 --- /dev/null +++ b/services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: "{{ rabbitmq_app_name }}-peer-finder-binding" + namespace: "{{ rabbitmq_namespace }}" +subjects: +- kind: ServiceAccount + name: "{{ rabbitmq_app_name }}-sa" +roleRef: + kind: Role + name: "{{ rabbitmq_app_name }}-peer-finder" + apiGroup: rbac.authorization.k8s.io diff --git a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 similarity index 97% rename from services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 rename to services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 index 14e37902..7943f078 100644 --- a/services/playbooks/roles/rabbitmq/templates/02-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 @@ -15,6 +15,7 @@ spec: labels: app: "{{ rabbitmq_app_name }}" spec: + serviceAccountName: "{{ rabbitmq_app_name }}-sa" nodeSelector: workload-type: apps containers: diff --git a/services/playbooks/roles/rabbitmq/templates/03-headless-service.yml.j2 b/services/playbooks/roles/rabbitmq/templates/06-headless-service.yml.j2 similarity index 100% rename from services/playbooks/roles/rabbitmq/templates/03-headless-service.yml.j2 rename to services/playbooks/roles/rabbitmq/templates/06-headless-service.yml.j2 diff --git a/services/playbooks/roles/rabbitmq/templates/04-service.yml.j2 b/services/playbooks/roles/rabbitmq/templates/07-service.yml.j2 similarity index 100% rename from services/playbooks/roles/rabbitmq/templates/04-service.yml.j2 rename to services/playbooks/roles/rabbitmq/templates/07-service.yml.j2 diff --git a/services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 b/services/playbooks/roles/rabbitmq/templates/08-policy-job.yml.j2 similarity index 100% rename from services/playbooks/roles/rabbitmq/templates/05-policy-job.yml.j2 rename to services/playbooks/roles/rabbitmq/templates/08-policy-job.yml.j2 From 2ed66c31463b7a8613d52fea3b70eb748cc192a5 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 00:25:32 +0200 Subject: [PATCH 188/242] fixing rabbit --- services/playbooks/roles/rabbitmq/tasks/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/tasks/main.yml b/services/playbooks/roles/rabbitmq/tasks/main.yml index 0991df8d..a0a16781 100644 --- a/services/playbooks/roles/rabbitmq/tasks/main.yml +++ b/services/playbooks/roles/rabbitmq/tasks/main.yml @@ -44,7 +44,7 @@ kubernetes.core.k8s: kubeconfig: /etc/rancher/k3s/k3s.yaml state: present - namespace: "{{ brokeroo_namespace }}" + namespace: "{{ rabbitmq_namespace }}" definition: "{{ lookup('template', item) | from_yaml }}" loop: - "01-configmap.yml.j2" From a622e450b1e3aa980ac0885dc2312cbf50c0ef5d Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 00:26:40 +0200 Subject: [PATCH 189/242] fixing rabbit --- services/playbooks/roles/rabbitmq/tasks/main.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/tasks/main.yml b/services/playbooks/roles/rabbitmq/tasks/main.yml index a0a16781..e19386ad 100644 --- a/services/playbooks/roles/rabbitmq/tasks/main.yml +++ b/services/playbooks/roles/rabbitmq/tasks/main.yml @@ -54,4 +54,3 @@ - "05-statefulset.yml.j2" - "06-headless-service.yml.j2" - "07-service.yml.j2" - - "08-policy-job.yml.j2" From e74163fd101f69012ac5927f4c23a0c1afe774bf Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 00:48:39 +0200 Subject: [PATCH 190/242] fixing rabbit --- .../playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 | 1 + services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 | 3 +++ .../roles/rabbitmq/templates/05-statefulset.yml.j2 | 6 ++++++ .../roles/rabbitmq/templates/06-headless-service.yml.j2 | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 index 4e10d4cd..035ef50c 100644 --- a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 @@ -12,6 +12,7 @@ data: # --- Clustering Configuration --- cluster_formation.peer_discovery_backend = k8s cluster_formation.k8s.host = kubernetes.default.svc.cluster.local + cluster_formation.k8s.address_type = hostname cluster_formation.k8s.service_name = {{ rabbitmq_app_name }}-headless cluster_formation.node_cleanup.interval = 60 cluster_formation.node_cleanup.only_log_warning = true diff --git a/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 b/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 index 7982bae1..a9d9687c 100644 --- a/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 @@ -7,3 +7,6 @@ rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch"] # These are the required permissions +- apiGroups: [""] + resources: ["events"] + verbs: ["create"] diff --git a/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 index 7943f078..d17244e0 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 @@ -26,6 +26,10 @@ spec: containerPort: 5672 - name: management containerPort: 15672 + - name: epmd + containerPort: 4369 + - name: dist + containerPort: 25672 - name: mqtt containerPort: 1883 - name: mqtts @@ -38,6 +42,8 @@ spec: key: rabbitmq_erlang_cookie - name: RABBITMQ_USE_LONGNAME value: "true" + - name: K8S_SERVICE_NAME + value: "{{ rabbitmq_app_name }}-headless" volumeMounts: - name: config-volume mountPath: /etc/rabbitmq/ diff --git a/services/playbooks/roles/rabbitmq/templates/06-headless-service.yml.j2 b/services/playbooks/roles/rabbitmq/templates/06-headless-service.yml.j2 index 93b9947e..0562f818 100644 --- a/services/playbooks/roles/rabbitmq/templates/06-headless-service.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/06-headless-service.yml.j2 @@ -15,3 +15,9 @@ spec: - name: management protocol: TCP port: 15672 + - name: epmd + port: 4369 + targetPort: 4369 + - name: dist + port: 25672 + targetPort: 25672 From b5fb6f3a6a6a3d60127014b87ace8907447f639f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 00:55:48 +0200 Subject: [PATCH 191/242] fixing rabbit --- services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 | 2 +- services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 | 2 +- .../roles/rabbitmq/templates/04-rolebinding.yml.j2 | 6 +++--- .../roles/rabbitmq/templates/05-statefulset.yml.j2 | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 b/services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 index a4f0be99..53e4fbe1 100644 --- a/services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/02-sa.yml.j2 @@ -1,5 +1,5 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: "{{ rabbitmq_app_name }}-sa" + name: "{{ rabbitmq_app_name }}" namespace: "{{ rabbitmq_namespace }}" diff --git a/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 b/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 index a9d9687c..129e7ea3 100644 --- a/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/03-role.yml.j2 @@ -1,7 +1,7 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: - name: "{{ rabbitmq_app_name }}-peer-finder" + name: "{{ rabbitmq_app_name }}" namespace: "{{ rabbitmq_namespace }}" rules: - apiGroups: [""] diff --git a/services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 b/services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 index b25cedd1..85c971d4 100644 --- a/services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/04-rolebinding.yml.j2 @@ -1,12 +1,12 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: - name: "{{ rabbitmq_app_name }}-peer-finder-binding" + name: "{{ rabbitmq_app_name }}" namespace: "{{ rabbitmq_namespace }}" subjects: - kind: ServiceAccount - name: "{{ rabbitmq_app_name }}-sa" + name: "{{ rabbitmq_app_name }}" roleRef: kind: Role - name: "{{ rabbitmq_app_name }}-peer-finder" + name: "{{ rabbitmq_app_name }}" apiGroup: rbac.authorization.k8s.io diff --git a/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 index d17244e0..cfc01d80 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 @@ -15,7 +15,7 @@ spec: labels: app: "{{ rabbitmq_app_name }}" spec: - serviceAccountName: "{{ rabbitmq_app_name }}-sa" + serviceAccountName: "{{ rabbitmq_app_name }}" nodeSelector: workload-type: apps containers: From 6770ece081ba4346185e122c8852c8169d3c2826 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 01:00:35 +0200 Subject: [PATCH 192/242] fixing rabbit --- .../roles/rabbitmq/templates/01-configmap.yml.j2 | 2 ++ .../rabbitmq/templates/05-statefulset.yml.j2 | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 index 035ef50c..2252a185 100644 --- a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 @@ -12,6 +12,8 @@ data: # --- Clustering Configuration --- cluster_formation.peer_discovery_backend = k8s cluster_formation.k8s.host = kubernetes.default.svc.cluster.local + cluster_formation.k8s.hostname_suffix = .rabbitmq-headless.trackeroo.svc.cluster.local + cluster_formation.k8s.namespace = trackeroo cluster_formation.k8s.address_type = hostname cluster_formation.k8s.service_name = {{ rabbitmq_app_name }}-headless cluster_formation.node_cleanup.interval = 60 diff --git a/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 index cfc01d80..231a6b6a 100644 --- a/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/05-statefulset.yml.j2 @@ -35,6 +35,22 @@ spec: - name: mqtts containerPort: 8883 env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: RABBITMQ_USE_LONGNAME + value: "true" + - name: RABBITMQ_NODENAME + value: "rabbit@$(POD_NAME).rabbitmq-headless.$(POD_NAMESPACE).svc.cluster.local" + - name: K8S_SERVICE_NAME + value: "rabbitmq-headless" + - name: K8S_HOSTNAME_SUFFIX + value: ".rabbitmq-headless.$(POD_NAMESPACE).svc.cluster.local" - name: RABBITMQ_ERLANG_COOKIE valueFrom: secretKeyRef: From 06c47f85915969942a29242e5c1dbce3acbe81c8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 01:02:12 +0200 Subject: [PATCH 193/242] fixing rabbit --- services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 | 1 - 1 file changed, 1 deletion(-) diff --git a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 index 2252a185..4aad2b50 100644 --- a/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/rabbitmq/templates/01-configmap.yml.j2 @@ -13,7 +13,6 @@ data: cluster_formation.peer_discovery_backend = k8s cluster_formation.k8s.host = kubernetes.default.svc.cluster.local cluster_formation.k8s.hostname_suffix = .rabbitmq-headless.trackeroo.svc.cluster.local - cluster_formation.k8s.namespace = trackeroo cluster_formation.k8s.address_type = hostname cluster_formation.k8s.service_name = {{ rabbitmq_app_name }}-headless cluster_formation.node_cleanup.interval = 60 From 31825ffcd55afe1409fa2b963ecd43a4bcb521c3 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 01:22:38 +0200 Subject: [PATCH 194/242] testing --- services/playbooks/roles/tsdb/files/02-schema.sql | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index 82869cd1..e9ea8a29 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -22,9 +22,10 @@ CREATE TABLE IF NOT EXISTS trackeroo.aggregated ( PRIMARY KEY (ts, route_hash, dev_id) ); -SELECT create_hypertable('trackeroo.data', 'ts', 'dev_id', 16); -SELECT create_hypertable('trackeroo.aggregated', 'ts', 'dev_id', 16); - +SELECT create_hypertable('trackeroo.data', 'ts', 'dev_id', 4); +SELECT create_hypertable('trackeroo.aggregated', 'ts', 'dev_id', 4); +SELECT set_chunk_time_interval('trackeroo.data', INTERVAL '12 hours'); +SELECT set_chunk_time_interval('trackeroo.aggregated', INTERVAL '12 hours'); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_dev_id ON trackeroo.data(dev_id); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_tag ON trackeroo.data(tag); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_ts ON trackeroo.data(ts); From d79fbd14feea3b7bb39859c7b32b1cd711e5d579 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 13:15:31 +0200 Subject: [PATCH 195/242] use vip in ansible --- services/inventory/hosts.yml | 5 +++++ services/playbooks/site.yml | 26 +++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/services/inventory/hosts.yml b/services/inventory/hosts.yml index 1b6959d9..e4bd261d 100644 --- a/services/inventory/hosts.yml +++ b/services/inventory/hosts.yml @@ -4,6 +4,11 @@ all: ansible_become: true rabbitmq_service_ip: 10.20.30.120 +kubernetes: + hosts: + kubernetes-vip: + ansible_host: 10.20.30.40 + servers: hosts: k3s-server-cronus: diff --git a/services/playbooks/site.yml b/services/playbooks/site.yml index e463ee1e..7627d706 100644 --- a/services/playbooks/site.yml +++ b/services/playbooks/site.yml @@ -1,5 +1,5 @@ - name: Deploy tsdb - hosts: servers + hosts: kubernetes tags: - tsdb - data @@ -7,7 +7,7 @@ - tsdb - name: Deploy pgAdmin - hosts: servers + hosts: kubernetes tags: - pgadmin - management @@ -15,7 +15,7 @@ - pgadmin - name: Deploy Mongo Express - hosts: servers + hosts: kubernetes tags: - mongo-express - management @@ -23,7 +23,7 @@ - mongo-express - name: Deploy keda - hosts: servers + hosts: kubernetes tags: - trackeroo - keda @@ -31,7 +31,7 @@ - keda - name: Deploy rabbitmq - hosts: servers + hosts: kubernetes tags: - rabbitmq - trackeroo @@ -41,7 +41,7 @@ - rabbitmq - name: Deploy mongo - hosts: servers + hosts: kubernetes tags: - mongo - data @@ -49,7 +49,7 @@ - mongo - name: Deploy redis - hosts: servers + hosts: kubernetes tags: - redis - data @@ -57,7 +57,7 @@ - redis - name: Deploy trackeroo-backend - hosts: servers + hosts: kubernetes tags: - trackeroo - trackeroo-backend @@ -67,7 +67,7 @@ - trackeroo - name: Deploy Kafka and Zookeeper - hosts: servers + hosts: kubernetes tags: - kafka - data @@ -75,7 +75,7 @@ - kafka - name: Deploy Flink - hosts: servers + hosts: kubernetes tags: - flink - data @@ -83,7 +83,7 @@ - flink - name: Deploy Brokeroo - hosts: servers + hosts: kubernetes tags: - brokeroo - trackeroo @@ -93,13 +93,13 @@ - brokeroo - name: Deploy Grafana - hosts: servers + hosts: kubernetes tags: grafana roles: - grafana - name: Deploy Nginx - hosts: servers + hosts: kubernetes tags: nginx roles: - nginx From 2e46b0945b212ac27b34fd9d6cd746b9084836af Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 13:29:00 +0200 Subject: [PATCH 196/242] changed min replicas to 3 to have HA --- .../playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 | 2 +- .../playbooks/roles/trackeroo/templates/01-deployment.yml.j2 | 2 +- services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 index 8e31cd1d..d04d73b5 100644 --- a/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 +++ b/services/playbooks/roles/brokeroo/templates/04-scaledobject.yml.j2 @@ -6,7 +6,7 @@ metadata: spec: scaleTargetRef: name: brokeroo - minReplicaCount: 2 + minReplicaCount: 3 maxReplicaCount: 20 pollingInterval: 10 cooldownPeriod: 60 diff --git a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 index cd463468..29a6cdb2 100644 --- a/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/trackeroo/templates/01-deployment.yml.j2 @@ -29,7 +29,7 @@ spec: name: http resources: requests: - cpu: "100m" + cpu: "512m" memory: "256Mi" limits: cpu: "1" diff --git a/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 b/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 index dc6593d3..9cdaf570 100644 --- a/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 +++ b/services/playbooks/roles/trackeroo/templates/03-hpa.yml.j2 @@ -9,7 +9,7 @@ spec: apiVersion: apps/v1 kind: Deployment name: {{ trackeroo_app_name }} - minReplicas: 1 + minReplicas: 3 maxReplicas: 6 metrics: - type: Resource From 0d373a423cec9158131584bef361bc349f3ae0a1 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 13:38:08 +0200 Subject: [PATCH 197/242] tracky reconnection --- tracky/src/trackeroo/mqtt.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/mqtt.go b/tracky/src/trackeroo/mqtt.go index 275f4830..7db765ae 100755 --- a/tracky/src/trackeroo/mqtt.go +++ b/tracky/src/trackeroo/mqtt.go @@ -131,11 +131,14 @@ func (t *TdmClient) run() { // fmt.Printf("%+v", z) for t.running { for !t.client.IsConnected() { - t.initClient() + // t.initClient() + Info("Trying to reconnect...") err := t.connect() if err != nil { Error("Cannot connect, %v", err) Millisleep(2000) + } else { + Info("Connected: %t", t.client.IsConnected()) } } t.Kick() @@ -173,6 +176,10 @@ func (t *TdmClient) initClient() { opts.SetAutoReconnect(true) opts.SetConnectionLostHandler(func(c pahoMqtt.Client, err error) { Error("MQTT Connection lost:", err) + for !c.IsConnected() { + Info("Trying to reconnect...") + + } }) opts.SetOnConnectHandler(func(c pahoMqtt.Client) { Info("Connected!") From 69d104d1e7dc04cc56efd9b40dafe3960c8902c0 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 13:41:20 +0200 Subject: [PATCH 198/242] tracky reconnection --- .gitignore | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.gitignore b/.gitignore index 52d123dd..d1e389e2 100644 --- a/.gitignore +++ b/.gitignore @@ -17,12 +17,6 @@ status brockeroo trackeroo-backend/grafana trackeroo-backend/mongo/data -<<<<<<< HEAD -======= -nominatim-data -osrm-data -overpass-data ->>>>>>> feature/tracky-italy trackeroo-backend/redis mqtt_client tracky/docker-compose.yml From 0899933bb5948eb716be76b259f2772caa69f784 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 14:00:06 +0200 Subject: [PATCH 199/242] tracky reconnection --- tracky/src/trackeroo/mqtt.go | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/tracky/src/trackeroo/mqtt.go b/tracky/src/trackeroo/mqtt.go index 7db765ae..acf6fdb4 100755 --- a/tracky/src/trackeroo/mqtt.go +++ b/tracky/src/trackeroo/mqtt.go @@ -128,18 +128,10 @@ func (t *TdmClient) handleDnMsg(client pahoMqtt.Client, msg pahoMqtt.Message) { func (t *TdmClient) run() { t.initClient() t.running = true - // fmt.Printf("%+v", z) for t.running { for !t.client.IsConnected() { - // t.initClient() - Info("Trying to reconnect...") - err := t.connect() - if err != nil { - Error("Cannot connect, %v", err) - Millisleep(2000) - } else { - Info("Connected: %t", t.client.IsConnected()) - } + Info("Not connected...") + Millisleep(2000) } t.Kick() Millisleep(1000) @@ -174,12 +166,12 @@ func (t *TdmClient) initClient() { opts.SetKeepAlive(time.Duration(t.heartbeat) * time.Second) opts.SetPingTimeout(time.Duration(t.heartbeat) * time.Second) opts.SetAutoReconnect(true) + opts.SetMaxReconnectInterval(5 * time.Second) + opts.SetReconnectingHandler(func(c pahoMqtt.Client, op *pahoMqtt.ClientOptions) { + Info("Trying to reconnect...") + }) opts.SetConnectionLostHandler(func(c pahoMqtt.Client, err error) { Error("MQTT Connection lost:", err) - for !c.IsConnected() { - Info("Trying to reconnect...") - - } }) opts.SetOnConnectHandler(func(c pahoMqtt.Client) { Info("Connected!") From 1e7feeec8ac111f63646173d277d10e910a4c221 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 14:07:03 +0200 Subject: [PATCH 200/242] tracky reconnection --- tracky/src/trackeroo/mqtt.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tracky/src/trackeroo/mqtt.go b/tracky/src/trackeroo/mqtt.go index acf6fdb4..b301afb8 100755 --- a/tracky/src/trackeroo/mqtt.go +++ b/tracky/src/trackeroo/mqtt.go @@ -128,6 +128,9 @@ func (t *TdmClient) handleDnMsg(client pahoMqtt.Client, msg pahoMqtt.Message) { func (t *TdmClient) run() { t.initClient() t.running = true + for t.connect() != nil { + Info("Trying to connect to the tdm...") + } for t.running { for !t.client.IsConnected() { Info("Not connected...") From 2b52b432018e512c4d003b12bca0fb9caec9b672 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 14:07:50 +0200 Subject: [PATCH 201/242] tracky reconnection --- tracky/src/trackeroo/mqtt.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tracky/src/trackeroo/mqtt.go b/tracky/src/trackeroo/mqtt.go index b301afb8..857facaa 100755 --- a/tracky/src/trackeroo/mqtt.go +++ b/tracky/src/trackeroo/mqtt.go @@ -143,8 +143,7 @@ func (t *TdmClient) run() { func (t *TdmClient) connect() error { token := t.client.Connect() - for !token.WaitTimeout(3 * time.Second) { - } + token.WaitTimeout(3 * time.Second) return token.Error() } From 162dae64204c21c6f727a50c0691ce2d3eec1d36 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 14:20:53 +0200 Subject: [PATCH 202/242] wait for rabbit cluster formation --- services/playbooks/roles/rabbitmq/tasks/main.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/services/playbooks/roles/rabbitmq/tasks/main.yml b/services/playbooks/roles/rabbitmq/tasks/main.yml index e19386ad..9c163a3c 100644 --- a/services/playbooks/roles/rabbitmq/tasks/main.yml +++ b/services/playbooks/roles/rabbitmq/tasks/main.yml @@ -54,3 +54,16 @@ - "05-statefulset.yml.j2" - "06-headless-service.yml.j2" - "07-service.yml.j2" + +- name: "Wait for RabbitMQ cluster formation" + kubernetes.core.k8s_wait: + kubeconfig: /etc/rancher/k3s/k3s.yaml + namespace: "{{ rabbitmq_namespace }}" + api_version: apps/v1 + kind: StatefulSet + name: "{{ rabbitmq_app_name }}" + wait_condition: + field: status.readyReplicas + value: "{{ rabbitmq_replicas }}" + wait_timeout: 600 # Wait for up to 10 minutes (600 seconds) + wait_sleep: 10 From 183758c75fc9d7cab13b0b0d435e19a80e5ebc9e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 14:23:02 +0200 Subject: [PATCH 203/242] wait for rabbit cluster formation --- services/playbooks/site.yml | 68 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/services/playbooks/site.yml b/services/playbooks/site.yml index 7627d706..d5d89077 100644 --- a/services/playbooks/site.yml +++ b/services/playbooks/site.yml @@ -6,6 +6,38 @@ roles: - tsdb +- name: Deploy mongo + hosts: kubernetes + tags: + - mongo + - data + roles: + - mongo + +- name: Deploy redis + hosts: kubernetes + tags: + - redis + - data + roles: + - redis + +- name: Deploy Kafka and Zookeeper + hosts: kubernetes + tags: + - kafka + - data + roles: + - kafka + +- name: Deploy Flink + hosts: kubernetes + tags: + - flink + - data + roles: + - flink + - name: Deploy pgAdmin hosts: kubernetes tags: @@ -40,22 +72,6 @@ roles: - rabbitmq -- name: Deploy mongo - hosts: kubernetes - tags: - - mongo - - data - roles: - - mongo - -- name: Deploy redis - hosts: kubernetes - tags: - - redis - - data - roles: - - redis - - name: Deploy trackeroo-backend hosts: kubernetes tags: @@ -66,22 +82,6 @@ roles: - trackeroo -- name: Deploy Kafka and Zookeeper - hosts: kubernetes - tags: - - kafka - - data - roles: - - kafka - -- name: Deploy Flink - hosts: kubernetes - tags: - - flink - - data - roles: - - flink - - name: Deploy Brokeroo hosts: kubernetes tags: @@ -100,6 +100,8 @@ - name: Deploy Nginx hosts: kubernetes - tags: nginx + tags: + - grafana + - nginx roles: - nginx From f5ae42f2db01a1e08fcc914e85838d57b66b2991 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 14:26:32 +0200 Subject: [PATCH 204/242] wait for rabbit cluster formation --- services/playbooks/roles/rabbitmq/tasks/main.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/services/playbooks/roles/rabbitmq/tasks/main.yml b/services/playbooks/roles/rabbitmq/tasks/main.yml index 9c163a3c..26ee389b 100644 --- a/services/playbooks/roles/rabbitmq/tasks/main.yml +++ b/services/playbooks/roles/rabbitmq/tasks/main.yml @@ -56,14 +56,16 @@ - "07-service.yml.j2" - name: "Wait for RabbitMQ cluster formation" - kubernetes.core.k8s_wait: + kubernetes.core.k8s_info: kubeconfig: /etc/rancher/k3s/k3s.yaml namespace: "{{ rabbitmq_namespace }}" api_version: apps/v1 kind: StatefulSet name: "{{ rabbitmq_app_name }}" - wait_condition: - field: status.readyReplicas - value: "{{ rabbitmq_replicas }}" - wait_timeout: 600 # Wait for up to 10 minutes (600 seconds) - wait_sleep: 10 + register: rabbitmq_statefulset + until: > + rabbitmq_statefulset.resources | length > 0 and + rabbitmq_statefulset.resources[0].status.readyReplicas is defined and + rabbitmq_statefulset.resources[0].status.readyReplicas | int == rabbitmq_replicas | int + retries: 60 # 60 retries + delay: 10 # 10 seconds between retries = 600 seconds total From c2d650257de469d2872ea6b5ad3052be4be30783 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 14:57:39 +0200 Subject: [PATCH 205/242] removed other type from devices --- mongo/init.js | 32 ++-- services/playbooks/roles/mongo/files/init.js | 175 +++++++++---------- utils/gen_mongo_dev/main.go | 4 +- 3 files changed, 105 insertions(+), 106 deletions(-) diff --git a/mongo/init.js b/mongo/init.js index f1391798..209dde5f 100644 --- a/mongo/init.js +++ b/mongo/init.js @@ -56,7 +56,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8414acfcb9165b1", name: "wonderful_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "m9mFoEWSL+GwWtoyPZsF2q4HpwLddf7JfsxmedN8h+Y=", created_at: ISODate("2025-08-18T03:36:46Z"), }, @@ -152,7 +152,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8456a397013ce6b", name: "gentle_church", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "KH+3BS3QnEec8vME0ToemUn3mK9i0bwCg1ZlvgnRfkU=", created_at: ISODate("2025-08-15T20:23:46Z"), }, @@ -200,7 +200,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8460bf33167dbdc", name: "hyper_shockley", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "BzHUYgawXJvf458ZW6fLaKxbTEoOXBI1pgI4Z5ebMuM=", created_at: ISODate("2025-08-17T07:01:46Z"), }, @@ -272,7 +272,7 @@ db.devices.insertMany([ _id: "trk-18608d12c846e0a3e38974e5", name: "dazzling_maxwell", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "KSG9WiZ6pWINfm9FH9vS/GSo3t1TmLf+eE5eGhU+Hik=", created_at: ISODate("2025-08-05T06:51:46Z"), }, @@ -296,7 +296,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84742df27b88f6b", name: "cranky_ampere", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "cS34G/an+Z+MM1M5P5dh48B+y4kjyy0eI/8cw4ClkT4=", created_at: ISODate("2025-08-08T18:36:46Z"), }, @@ -312,7 +312,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84770f5153b97ef", name: "amazing_turing", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "X9Lx6+KllLFtNDyvj/466CrOQmF6UewS+3xs9j18ILA=", created_at: ISODate("2025-08-03T11:49:46Z"), }, @@ -376,7 +376,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8487a58b5c5651d", name: "heartwarming_bose", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "LsgbCoMQG+opSUt9JrsiDIL4Z1k5VU+WnTGajUsfRMU=", created_at: ISODate("2025-08-04T01:01:46Z"), }, @@ -392,7 +392,7 @@ db.devices.insertMany([ _id: "trk-18608d12c848b620cb14aa25", name: "fascinated_noether", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "XJVLbd6UO12QkuIGo3EbZGXjG4xPKSvliiOLRLnMZmI=", created_at: ISODate("2025-08-09T07:11:46Z"), }, @@ -440,7 +440,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8494897112ba78e", name: "peaceful_pascal", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "WAVVSnHd8206VRwJOtgHDuUGDf0orqqYBIqodJA9L1I=", created_at: ISODate("2025-08-15T05:44:46Z"), }, @@ -520,7 +520,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84aa049b09a2169", name: "eager_darwin", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "EC7AoSY05EyPbRVEl/eGTSfESGXZZ4OWF5FsPcaKdTU=", created_at: ISODate("2025-08-24T18:39:46Z"), }, @@ -552,7 +552,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84afa2c10aa6c55", name: "inspiring_bardeen", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "6dU2H5RdD5VaZyXi5ZWaj5rkydlEV5f2PS1l9+fvL+c=", created_at: ISODate("2025-08-07T16:21:46Z"), }, @@ -608,7 +608,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84ba2911c4a675e", name: "cool_ohm", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "7TXa0utsnnJXx7tHWYt5KC8nwv1xThn8iy12KI2zOvE=", created_at: ISODate("2025-08-12T01:49:46Z"), }, @@ -616,7 +616,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84bde9e8b791f18", name: "fervent_abel", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "1doRBvIJsrXQIG1Ui9albOMUHxMjtrjU6VvNLZTZQak=", created_at: ISODate("2025-08-29T22:05:46Z"), }, @@ -640,7 +640,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84c3ae0fd8aad7e", name: "optimized_higgs", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "csXqVuqw2AXm2A46aCt97ytsUzs5pA6t5Jnit25JFkI=", created_at: ISODate("2025-08-15T19:27:46Z"), }, @@ -696,7 +696,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84cdbbc4c9327d2", name: "dreamy_tesla", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "/kDru3xkiT7oAfKFD4Mp6nVl5IIFEMXponchC0ojKlo=", created_at: ISODate("2025-08-01T00:21:46Z"), }, @@ -720,7 +720,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84d2247a477b6ff", name: "interesting_watson", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "ZBNn287pTaxPwGShBOOICVcZDmQbcdr2vtmLYbelgoU=", created_at: ISODate("2025-08-19T19:46:46Z"), }, diff --git a/services/playbooks/roles/mongo/files/init.js b/services/playbooks/roles/mongo/files/init.js index 83a7b36b..eb941942 100644 --- a/services/playbooks/roles/mongo/files/init.js +++ b/services/playbooks/roles/mongo/files/init.js @@ -56,7 +56,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8414acfcb9165b1", name: "wonderful_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "m9mFoEWSL+GwWtoyPZsF2q4HpwLddf7JfsxmedN8h+Y=", created_at: ISODate("2025-08-18T03:36:46Z"), }, @@ -152,7 +152,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8456a397013ce6b", name: "gentle_church", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "KH+3BS3QnEec8vME0ToemUn3mK9i0bwCg1ZlvgnRfkU=", created_at: ISODate("2025-08-15T20:23:46Z"), }, @@ -160,7 +160,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84581a0b80ca1c5", name: "practical_michelson", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "ab3Wu7Glx9xhfSFUNRKzi1CZPfPeiCI7ujc/iJmYWpI=", created_at: ISODate("2025-08-04T21:37:46Z"), }, @@ -200,7 +200,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8460bf33167dbdc", name: "hyper_shockley", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "BzHUYgawXJvf458ZW6fLaKxbTEoOXBI1pgI4Z5ebMuM=", created_at: ISODate("2025-08-17T07:01:46Z"), }, @@ -272,7 +272,7 @@ db.devices.insertMany([ _id: "trk-18608d12c846e0a3e38974e5", name: "dazzling_maxwell", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "KSG9WiZ6pWINfm9FH9vS/GSo3t1TmLf+eE5eGhU+Hik=", created_at: ISODate("2025-08-05T06:51:46Z"), }, @@ -280,7 +280,7 @@ db.devices.insertMany([ _id: "trk-18608d12c847064ce1bdf7ee", name: "elegant_lagrange", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "tlrnwpslaBwOChP+dAFPQ2sfItsoKERU+MR33NHk9yQ=", created_at: ISODate("2025-08-19T09:04:46Z"), }, @@ -296,7 +296,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84742df27b88f6b", name: "cranky_ampere", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "cS34G/an+Z+MM1M5P5dh48B+y4kjyy0eI/8cw4ClkT4=", created_at: ISODate("2025-08-08T18:36:46Z"), }, @@ -304,7 +304,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84759c8a9ef04f8", name: "energetic_hilbert", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "EInJWD1jh2t06pz3D5WZjspYvxzqs57NRKAxVhe9uIk=", created_at: ISODate("2025-08-28T01:57:46Z"), }, @@ -312,7 +312,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84770f5153b97ef", name: "amazing_turing", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "X9Lx6+KllLFtNDyvj/466CrOQmF6UewS+3xs9j18ILA=", created_at: ISODate("2025-08-03T11:49:46Z"), }, @@ -344,7 +344,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8480b18fe88b4af", name: "patient_wu", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "bHzGkyOqJLG9GAnkC25B2OLoXhQhIUu3bPVIE9sBlzU=", created_at: ISODate("2025-08-24T18:56:46Z"), }, @@ -360,7 +360,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8483aeb4dce2724", name: "hopeful_bardeen", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "Xd5a7XzvWCVjDtduORbuAH1sykFtGHcvAhK/4BadcaI=", created_at: ISODate("2025-08-06T23:01:46Z"), }, @@ -376,7 +376,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8487a58b5c5651d", name: "heartwarming_bose", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "LsgbCoMQG+opSUt9JrsiDIL4Z1k5VU+WnTGajUsfRMU=", created_at: ISODate("2025-08-04T01:01:46Z"), }, @@ -392,7 +392,7 @@ db.devices.insertMany([ _id: "trk-18608d12c848b620cb14aa25", name: "fascinated_noether", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "XJVLbd6UO12QkuIGo3EbZGXjG4xPKSvliiOLRLnMZmI=", created_at: ISODate("2025-08-09T07:11:46Z"), }, @@ -440,7 +440,7 @@ db.devices.insertMany([ _id: "trk-18608d12c8494897112ba78e", name: "peaceful_pascal", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "WAVVSnHd8206VRwJOtgHDuUGDf0orqqYBIqodJA9L1I=", created_at: ISODate("2025-08-15T05:44:46Z"), }, @@ -480,7 +480,7 @@ db.devices.insertMany([ _id: "trk-18608d12c849bd6d485879c1", name: "tender_faraday", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "O8XxluA24EC4bsgPrBHWCwS8q8GmBK7mv0byordbYc8=", created_at: ISODate("2025-08-13T13:09:46Z"), }, @@ -488,7 +488,7 @@ db.devices.insertMany([ _id: "trk-18608d12c849d409351613c2", name: "jaunty_pauling", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "OLbAlVzxkhzr2wlaO/WV8fCB/m4jJQ5AIfrJ0tUgF0A=", created_at: ISODate("2025-08-20T22:21:46Z"), }, @@ -512,7 +512,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84a892c3aad3955", name: "eager_gauss", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "Dl4fLpzCBXqNHjtrgm+5jrj+tSXPZRxttltQPvr/JcY=", created_at: ISODate("2025-08-29T10:30:46Z"), }, @@ -520,7 +520,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84aa049b09a2169", name: "eager_darwin", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "EC7AoSY05EyPbRVEl/eGTSfESGXZZ4OWF5FsPcaKdTU=", created_at: ISODate("2025-08-24T18:39:46Z"), }, @@ -552,7 +552,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84afa2c10aa6c55", name: "inspiring_bardeen", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "6dU2H5RdD5VaZyXi5ZWaj5rkydlEV5f2PS1l9+fvL+c=", created_at: ISODate("2025-08-07T16:21:46Z"), }, @@ -568,7 +568,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84b2feca3792861", name: "modest_dyson", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "5XYG/w/clJolar2hAO3n4D9+fJdckv7i0ZO0S2m2KRo=", created_at: ISODate("2025-08-02T00:09:46Z"), }, @@ -608,7 +608,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84ba2911c4a675e", name: "cool_ohm", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "7TXa0utsnnJXx7tHWYt5KC8nwv1xThn8iy12KI2zOvE=", created_at: ISODate("2025-08-12T01:49:46Z"), }, @@ -616,7 +616,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84bde9e8b791f18", name: "fervent_abel", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "1doRBvIJsrXQIG1Ui9albOMUHxMjtrjU6VvNLZTZQak=", created_at: ISODate("2025-08-29T22:05:46Z"), }, @@ -640,7 +640,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84c3ae0fd8aad7e", name: "optimized_higgs", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "csXqVuqw2AXm2A46aCt97ytsUzs5pA6t5Jnit25JFkI=", created_at: ISODate("2025-08-15T19:27:46Z"), }, @@ -656,7 +656,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84c678173241105", name: "curious_feynman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "XxN0HpCbfzUE2AMRPcteDPSRLT5YgnAy4ILOxwIzm/g=", created_at: ISODate("2025-08-26T19:07:46Z"), }, @@ -696,7 +696,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84cdbbc4c9327d2", name: "dreamy_tesla", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "/kDru3xkiT7oAfKFD4Mp6nVl5IIFEMXponchC0ojKlo=", created_at: ISODate("2025-08-01T00:21:46Z"), }, @@ -720,7 +720,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84d2247a477b6ff", name: "interesting_watson", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "private_transport", private_key: "ZBNn287pTaxPwGShBOOICVcZDmQbcdr2vtmLYbelgoU=", created_at: ISODate("2025-08-19T19:46:46Z"), }, @@ -752,7 +752,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84db5aa45ada38e", name: "elastic_fourier", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "8loHVYewF31YJGSlkcOrMZpfc5eQ2DFhuvpne8M68Xc=", created_at: ISODate("2025-08-09T06:44:46Z"), }, @@ -760,7 +760,7 @@ db.devices.insertMany([ _id: "trk-18608d12c84dccaa3ac843bd", name: "thrilled_gauss", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "public_transport", + device_type: "private_transport", private_key: "jhESuO3AwXCtX0TcH5E9l91DDRUUx3SIErqpjt+SpUk=", created_at: ISODate("2025-08-25T19:51:46Z"), }, @@ -953,7 +953,7 @@ db.devices.insertMany([ _id: "trk-186e120746e6a53392e5a1d6", name: "dreamy_morse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "AdaUNQ0ddcyYZlMHzoFPFDiM+lQS9akdrF086C5uvnU=", created_at: ISODate("2025-09-19T01:06:26Z"), }, @@ -1009,7 +1009,7 @@ db.devices.insertMany([ _id: "trk-186e120746e798d285808a70", name: "bold_fourier", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "4zwMIKqs8mtNveECyMvcFt+K7OedZ+MnOS6o42EUEWU=", created_at: ISODate("2025-09-17T06:50:26Z"), }, @@ -1025,7 +1025,7 @@ db.devices.insertMany([ _id: "trk-186e120746e7d271ec706172", name: "sleepy_pauling", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "2+j+X2Im01XBzllw/xpq1fq8M2TxlOos/ClmmD0Gzaw=", created_at: ISODate("2025-10-10T06:17:26Z"), }, @@ -1041,7 +1041,7 @@ db.devices.insertMany([ _id: "trk-186e120746e80afd0d8d37e1", name: "beautiful_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "SMPBDRGLD9aVElnzLvrsHyRgrM4ywaxwQa+ybapdStM=", created_at: ISODate("2025-09-24T17:20:26Z"), }, @@ -1049,7 +1049,7 @@ db.devices.insertMany([ _id: "trk-186e120746e833b3dfa6e5ff", name: "jovial_kolmogorov", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "X9ZHSPIBXi5gsoXM0LO7Lsuv8LbVA8EMv/y/J8jXKMc=", created_at: ISODate("2025-10-01T03:02:26Z"), }, @@ -1065,7 +1065,7 @@ db.devices.insertMany([ _id: "trk-186e120746e86e09d1953e23", name: "blissful_leibniz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "uW6S9QZqdTN9n8nROsXWugdetpdTwdD/NAgsHfVlKVQ=", created_at: ISODate("2025-10-11T13:42:26Z"), }, @@ -1081,7 +1081,7 @@ db.devices.insertMany([ _id: "trk-186e120746e8b7c338ebf0df", name: "sweet_babbage", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "fDrzR+XXddUMT7sjv1lTdCqCrMxpIuoFhJF/FjORBTM=", created_at: ISODate("2025-10-13T14:47:26Z"), }, @@ -1177,7 +1177,7 @@ db.devices.insertMany([ _id: "trk-186e120746ea8e7196b3093b", name: "adoring_newton", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "aCIzO3EwhWTHXQpWQP7BYEvr6W5HybnsMSUEX13mL30=", created_at: ISODate("2025-09-18T22:57:26Z"), }, @@ -1201,7 +1201,7 @@ db.devices.insertMany([ _id: "trk-186e120746eb21c56b310cda", name: "admiring_darwin", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "s5ryhLp1YeNYA5ac6plvh1XbGAbrSinlGEAfFX+XB/w=", created_at: ISODate("2025-10-02T21:14:26Z"), }, @@ -1233,7 +1233,7 @@ db.devices.insertMany([ _id: "trk-186e120746ebbc9238d17b60", name: "gracious_weierstrass", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "40PvNz4whHc4hLO/7Q9lMe6YGJO6ZkMvjN1dA30zAA4=", created_at: ISODate("2025-10-04T07:08:26Z"), }, @@ -1249,7 +1249,7 @@ db.devices.insertMany([ _id: "trk-186e120746ebe5ac2d343d5f", name: "zealous_laplace", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "y0VUGEVC3cOc4sX1nj7u10m75QasW8LIdwWVs1rf2TY=", created_at: ISODate("2025-10-04T13:25:26Z"), }, @@ -1257,7 +1257,7 @@ db.devices.insertMany([ _id: "trk-186e120746ebf958faa8280e", name: "busy_jobs", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "OENsQJipdvtlRI+5C8F/phEfSjTHS2F9CWXt+cXGHcI=", created_at: ISODate("2025-10-01T16:44:26Z"), }, @@ -1353,7 +1353,7 @@ db.devices.insertMany([ _id: "trk-186e120746ee4e09aceffd05", name: "xenodochial_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "SR7J6zXtzZ+MzTCt+PULdrBEVstzj3j8FWbY8lIEn90=", created_at: ISODate("2025-09-14T14:54:26Z"), }, @@ -1361,7 +1361,7 @@ db.devices.insertMany([ _id: "trk-186e120746ee68da26273cf5", name: "lucid_nyquist", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "iakRwwyTjiD+zM7uC7h/UQm6gz6QIVntEhsL5kChETk=", created_at: ISODate("2025-09-21T11:01:26Z"), }, @@ -1393,7 +1393,7 @@ db.devices.insertMany([ _id: "trk-186e120746eedcee1f256e01", name: "amazing_westinghouse", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "UX2Qmw3cmXuF/IcgT0gIzavalplncAuB9c1hCDebu0k=", created_at: ISODate("2025-09-22T15:06:26Z"), }, @@ -1401,7 +1401,7 @@ db.devices.insertMany([ _id: "trk-186e120746eef951821b96c3", name: "bold_born", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "YXD9WH6vDeIHC5YQZqEz7WvkHrcKgIAnfFAGl59htyE=", created_at: ISODate("2025-09-22T18:36:26Z"), }, @@ -1409,7 +1409,7 @@ db.devices.insertMany([ _id: "trk-186e120746ef14ada5d82853", name: "ecstatic_bohr", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "EyfR76x+gHf56NtxCJrPP2yEbKNAWAytY7GnJ5iD6Dc=", created_at: ISODate("2025-09-22T14:45:26Z"), }, @@ -1417,7 +1417,7 @@ db.devices.insertMany([ _id: "trk-186e120746ef30a453a2681f", name: "xenodochial_yang", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "KA7GeAJz7HYtBr+quD2ByRsih8xN94nkw82YHCa+ekE=", created_at: ISODate("2025-09-23T11:28:26Z"), }, @@ -1433,7 +1433,7 @@ db.devices.insertMany([ _id: "trk-186e120746ef7561a82b805e", name: "puzzled_wirth", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "U3e0bbtRB/4oFdwAyqaUWdiWc3KBJxCdwL4GnrajrvE=", created_at: ISODate("2025-09-16T18:55:26Z"), }, @@ -1465,7 +1465,7 @@ db.devices.insertMany([ _id: "trk-186e120746efef261a621259", name: "heuristic_galois", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "7xF3Ws3DC15XXi+wN0TLJ/xfOYsl1wthIcg1WDJSPGE=", created_at: ISODate("2025-09-29T07:18:26Z"), }, @@ -1513,7 +1513,7 @@ db.devices.insertMany([ _id: "trk-186e120746f0b6c58812e233", name: "merry_torvalds", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "SfPGmp/POZ0OJ46PfaCF4YWga1fkw9hxx4Uu2Oqc12U=", created_at: ISODate("2025-10-02T12:53:26Z"), }, @@ -1545,7 +1545,7 @@ db.devices.insertMany([ _id: "trk-186e120746f146b5f322b565", name: "furious_planck", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "YsXCrd24M5R0/N8Zo8NptQSAgfuOKlb/6Mquo9+5f6w=", created_at: ISODate("2025-10-10T19:53:26Z"), }, @@ -1553,7 +1553,7 @@ db.devices.insertMany([ _id: "trk-186e120746f15f4e4ac77e69", name: "flamboyant_hertz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "GwTCImAqU45wG0/+jxkHCuhKym5mzA7ga9AgmiPxXt8=", created_at: ISODate("2025-10-04T23:43:26Z"), }, @@ -1577,7 +1577,7 @@ db.devices.insertMany([ _id: "trk-186e120746f1b4d87f6a4ab5", name: "iron_galvani", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "W3QvXGjvUvqvTKippTBM1SFuOpMKW8QWnoD0Mme6OYE=", created_at: ISODate("2025-09-26T05:09:26Z"), }, @@ -1585,7 +1585,7 @@ db.devices.insertMany([ _id: "trk-186e120746f1ce4eea4b728b", name: "relaxed_feynman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "LZR+p/doe7p09bMaY/q8YakuBQGrsGyX74cbpYztN0I=", created_at: ISODate("2025-09-28T06:39:26Z"), }, @@ -1593,7 +1593,7 @@ db.devices.insertMany([ _id: "trk-186e120746f1e7f64d2a0414", name: "merry_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "pW2aKuxC2muX5hOWr+bk1aySwlsEof16dOwGGVbv0hE=", created_at: ISODate("2025-10-06T09:51:26Z"), }, @@ -1633,7 +1633,7 @@ db.devices.insertMany([ _id: "trk-186e120746f267cbf0b2059a", name: "furious_hertz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "nsgQCOmszyc8AS0cr/jasr6AqOfBCjGWWqBOEH3JYAQ=", created_at: ISODate("2025-09-17T10:52:26Z"), }, @@ -1673,7 +1673,7 @@ db.devices.insertMany([ _id: "trk-186e1309839e3cc066512dbd", name: "elastic_morley", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "k7fQ1A277mZYtLp4yZwgQv5SAHg+CQykl65IYmBOcLw=", created_at: ISODate("2025-10-13T05:51:55Z"), }, @@ -1729,7 +1729,7 @@ db.devices.insertMany([ _id: "trk-186e1309839edcbc0e9ccdee", name: "hyper_schrodinger", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "m6ltZvHHeKGnbg/7OCLoDwz5JuXP2lr1pcY4Vj+iY6Y=", created_at: ISODate("2025-09-15T11:08:55Z"), }, @@ -1753,7 +1753,7 @@ db.devices.insertMany([ _id: "trk-186e1309839fda077e230f18", name: "sleepy_noether", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "K/fnViP3HJeORW02MDQiODA2KJIIOklTQ95dp8KR1Aw=", created_at: ISODate("2025-10-08T09:06:55Z"), }, @@ -1769,7 +1769,7 @@ db.devices.insertMany([ _id: "trk-186e130983a01ae99c930d78", name: "brave_ritchie", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "DdkJUpGmJY7ZMiMKeyTIUh+NOId0DzLi7dp6alJhQ88=", created_at: ISODate("2025-09-18T08:13:55Z"), }, @@ -1793,7 +1793,7 @@ db.devices.insertMany([ _id: "trk-186e130983a07ae5a7263ec1", name: "crazy_thompson", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "hbTWXcPaFt/C79Q3ljLio7j7GkYT4DT6UKavFR/7tOg=", created_at: ISODate("2025-10-04T02:54:55Z"), }, @@ -1833,7 +1833,7 @@ db.devices.insertMany([ _id: "trk-186e130983a159e2bbb9f5f8", name: "upbeat_babbage", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "FlfO21D9qS/voZQhw7ALRXcQpl+4P0+bcsAVx+HqTys=", created_at: ISODate("2025-10-10T03:06:55Z"), }, @@ -1857,7 +1857,7 @@ db.devices.insertMany([ _id: "trk-186e130983a1ea63e8dbee65", name: "laughing_nyquist", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "gqr+1LMynMxT9/LCZi34YT7w7kNetDPAIM5vgxuJ62E=", created_at: ISODate("2025-09-26T16:11:55Z"), }, @@ -1897,7 +1897,7 @@ db.devices.insertMany([ _id: "trk-186e130983a26a15f661928b", name: "eloquent_dedekind", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "X8atklQ+PoJ0GuKFPwfSs49w1C1tjiwstgnvu+3Uaq8=", created_at: ISODate("2025-09-29T19:35:55Z"), }, @@ -1913,7 +1913,7 @@ db.devices.insertMany([ _id: "trk-186e130983a291f1e443cd5a", name: "proud_markov", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "UzmsA89/TC3Y9HXzAj/FFajvNUheAN9dGb/0axlXtb8=", created_at: ISODate("2025-10-01T10:25:55Z"), }, @@ -1945,7 +1945,7 @@ db.devices.insertMany([ _id: "trk-186e130983a2fe87872f4f49", name: "thoughtful_compton", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "hcUkyXC/+F/nxBV8iOeTaXlbPlVbefYzFfrbXkGV8Sg=", created_at: ISODate("2025-10-05T01:51:55Z"), }, @@ -1953,7 +1953,7 @@ db.devices.insertMany([ _id: "trk-186e130983a322c165ec9526", name: "sad_stallman", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "vNNucwhglkB7Y1aVZrx8AmdKQH0T8NQ/nDA6WvAmHYA=", created_at: ISODate("2025-09-28T01:45:55Z"), }, @@ -2017,7 +2017,7 @@ db.devices.insertMany([ _id: "trk-186e130983a47ab26312a621", name: "serene_leibniz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "ZEey/z8mahhYZ6P2370knAdpoBRxrl+rUc8IRGe7X+s=", created_at: ISODate("2025-10-11T19:15:55Z"), }, @@ -2033,7 +2033,7 @@ db.devices.insertMany([ _id: "trk-186e130983a4af6de88c809f", name: "practical_cantor", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "n7DXivw4BcVLW2WE3NGNZGADmQgpJuAqcDxd/3ys6oo=", created_at: ISODate("2025-09-14T14:27:55Z"), }, @@ -2041,7 +2041,7 @@ db.devices.insertMany([ _id: "trk-186e130983a4c1a2c1717cf8", name: "keen_berners", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "QzRG4fj6Ieu/CEDn4y6+Bu1gBFqY4ISF+tHNhDtlNOU=", created_at: ISODate("2025-10-11T10:09:55Z"), }, @@ -2049,7 +2049,7 @@ db.devices.insertMany([ _id: "trk-186e130983a4d36ac7ba8b7a", name: "proud_tesla", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "EX3KV2PKMP/B3ZQ2W/lWny+J+Ph56ZZvPU5Ee4JyKN4=", created_at: ISODate("2025-09-25T21:44:55Z"), }, @@ -2057,7 +2057,7 @@ db.devices.insertMany([ _id: "trk-186e130983a4e47156945059", name: "goofy_crick", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "vazs6yunKp5x6D8iixRFQWIPPtuhKeHi8k+cnv/oP10=", created_at: ISODate("2025-09-19T10:10:55Z"), }, @@ -2073,7 +2073,7 @@ db.devices.insertMany([ _id: "trk-186e130983a508c15816b9c0", name: "nervous_shannon", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "wcyoP8iDI3UU5H1r/qqVYLR1tsMuB0fwqilajOO4+vc=", created_at: ISODate("2025-09-19T21:06:55Z"), }, @@ -2081,7 +2081,7 @@ db.devices.insertMany([ _id: "trk-186e130983a519b7a38da4ea", name: "polite_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "1tk9YjVrNKneUDY1Osjo/Dwi4i10Gso/pN46e3GvYYY=", created_at: ISODate("2025-09-14T23:19:55Z"), }, @@ -2089,7 +2089,7 @@ db.devices.insertMany([ _id: "trk-186e130983a52afe9fa16029", name: "proud_weinberg", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "1f2wPh9Ox2inN18mT1YuK4jRHKvVGoKG8SpgAzQkHSY=", created_at: ISODate("2025-09-23T19:32:55Z"), }, @@ -2121,7 +2121,7 @@ db.devices.insertMany([ _id: "trk-186e130983a5965d6dada7f4", name: "quirky_nyquist", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "baCodUXLbJPBkTX0SYlNZoiS+wCQNxSCOQVl11U/nlw=", created_at: ISODate("2025-09-26T23:13:55Z"), }, @@ -2137,7 +2137,7 @@ db.devices.insertMany([ _id: "trk-186e130983a5d7349ac354d7", name: "epic_michelson", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "1Dw3ZR9Thr0Hcy4/nSnpDXiBfPsctFt9l+vlsNJ0IPk=", created_at: ISODate("2025-10-05T23:44:55Z"), }, @@ -2209,7 +2209,7 @@ db.devices.insertMany([ _id: "trk-186e130983a68a6c4e789068", name: "xenodochial_pauli", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "5jEOTEisy9PAHGo2cUxTLjcS7U/j1z+iDVu4AmPAQB4=", created_at: ISODate("2025-10-09T09:38:55Z"), }, @@ -2217,7 +2217,7 @@ db.devices.insertMany([ _id: "trk-186e130983a6a42c3aa15795", name: "eloquent_coulomb", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "fktsbKDjJeccJCECW3jEVln0OHXFMvTFa/JQb2T7zX4=", created_at: ISODate("2025-09-27T11:41:55Z"), }, @@ -2249,7 +2249,7 @@ db.devices.insertMany([ _id: "trk-186e130983a6ebaaea0d4795", name: "competent_leibniz", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "P6dDQCF6Fgjub8xGk93uxOQKX/KYcyB6e5bVrDrmHZ0=", created_at: ISODate("2025-09-25T07:45:55Z"), }, @@ -2257,7 +2257,7 @@ db.devices.insertMany([ _id: "trk-186e130983a6fd0db9d5a841", name: "keen_jacobi", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "wW1zdnRBu/V+TTrdSPjtT/enxkpbwHgcngL/n5oKQGI=", created_at: ISODate("2025-09-22T07:56:55Z"), }, @@ -2265,7 +2265,7 @@ db.devices.insertMany([ _id: "trk-186e130983a70f40a79fedae", name: "fabulous_rutherford", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "2Rg2uMXrpuF9EtKsOXnqxokMWKCDy6Qtgy/92Vq6WHI=", created_at: ISODate("2025-09-21T20:54:55Z"), }, @@ -2305,7 +2305,7 @@ db.devices.insertMany([ _id: "trk-186e130983a770bd6a437b45", name: "inspiring_kolmogorov", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "GJRtvBmPmKbU2LIEG1J4qP5kjhin6FjzjpxcfdgmYHg=", created_at: ISODate("2025-09-15T04:05:55Z"), }, @@ -2321,7 +2321,7 @@ db.devices.insertMany([ _id: "trk-186e130983a79453f87f853d", name: "funny_hardy", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "DdlS8ZewVy8MnaPEyQ6ExhyVzZ+Ym6pmplr2OdFyVu8=", created_at: ISODate("2025-10-09T09:21:55Z"), }, @@ -2369,7 +2369,7 @@ db.devices.insertMany([ _id: "trk-186e130983a827f007a9b2b3", name: "thoughtful_penrose", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "rWTp82vUW/6XjsvgtDfREFW5crHPAtI6fhHQMUalNTQ=", created_at: ISODate("2025-09-16T19:10:55Z"), }, @@ -2409,7 +2409,7 @@ db.devices.insertMany([ _id: "trk-186e130983a88346a0103419", name: "trusting_whitehead", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "V2Gm/mIE2Uxwcrplrf/glr7A8e/VQFK/iBqjTdXarxw=", created_at: ISODate("2025-09-22T03:30:55Z"), }, @@ -2425,7 +2425,7 @@ db.devices.insertMany([ _id: "trk-186e130983a8a62ec36b8234", name: "noble_dijkstra", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "TWKFkqd+aAj+YNskjVxR6ftBy6AnldQ+UvzUXYr27kE=", created_at: ISODate("2025-09-24T08:20:55Z"), }, @@ -2449,9 +2449,8 @@ db.devices.insertMany([ _id: "trk-186e130983a8e3cfea83018f", name: "blissful_carmack", status: { connected: false, last_message: "1970-01-01T00:00:00Z" }, - device_type: "other", + device_type: "public_transport", private_key: "gzu43V5D0h7gjzYWkhV8eGecgWY97ULsA+GAFp0votU=", created_at: ISODate("2025-09-26T15:42:55Z"), }, ]); - diff --git a/utils/gen_mongo_dev/main.go b/utils/gen_mongo_dev/main.go index 5dfc665e..c85271f0 100644 --- a/utils/gen_mongo_dev/main.go +++ b/utils/gen_mongo_dev/main.go @@ -14,7 +14,7 @@ const ( FOOD = "food" PRIVATE_TRANSPORT = "private_transport" PUBLIC_TRANSPORT = "public_transport" - OTHER = "other" + // OTHER = "other" ) var adjectives = []string{ @@ -81,7 +81,7 @@ func generateRandomName() string { return fmt.Sprintf("%s_%s", adjective, name) } -var deviceTypes = []string{VALUABLES, FOOD, PRIVATE_TRANSPORT, PUBLIC_TRANSPORT, OTHER} +var deviceTypes = []string{VALUABLES, FOOD, PRIVATE_TRANSPORT, PUBLIC_TRANSPORT} func GenPrivateKey() (string, error) { privateKey := make([]byte, 32) From 1423de6e7f69b201db3252506b0f45e21b465c3b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 15:40:56 +0200 Subject: [PATCH 206/242] grafana plugins --- .../playbooks/roles/grafana/templates/01-deployment.yml.j2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index a0839b11..b4da1056 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -47,6 +47,9 @@ spec: value: "https://trackeroo.rblabs.net/dashboards/" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" + - name: GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS + value: "grafana-kubernetes-app" + volumeMounts: - name: grafana-storage mountPath: /var/lib/grafana From 7b63e8ed5d600c29ff0754d5acc825e3cc262cdc Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 15:45:18 +0200 Subject: [PATCH 207/242] grafana plugins --- services/playbooks/roles/grafana/templates/01-deployment.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index b4da1056..0182d70c 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -48,7 +48,7 @@ spec: - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" - name: GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS - value: "grafana-kubernetes-app" + value: "grafana-kubernetes-datasource" volumeMounts: - name: grafana-storage From 08a5788046bef150769447b91a5665aa41ea7528 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 16:10:00 +0200 Subject: [PATCH 208/242] grafana plugins --- services/playbooks/roles/grafana/tasks/main.yml | 7 ++++++- .../roles/grafana/templates/01-deployment.yml.j2 | 2 -- .../playbooks/roles/grafana/templates/04-sa.yml.j2 | 5 +++++ .../playbooks/roles/grafana/templates/05-role.yml.j2 | 11 +++++++++++ .../roles/grafana/templates/06-rolebinding.yml.j2 | 12 ++++++++++++ .../roles/grafana/templates/07-secrettoken.yml.j2 | 8 ++++++++ 6 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 services/playbooks/roles/grafana/templates/04-sa.yml.j2 create mode 100644 services/playbooks/roles/grafana/templates/05-role.yml.j2 create mode 100644 services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 create mode 100644 services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 diff --git a/services/playbooks/roles/grafana/tasks/main.yml b/services/playbooks/roles/grafana/tasks/main.yml index 40d2cdf7..5b0e021e 100644 --- a/services/playbooks/roles/grafana/tasks/main.yml +++ b/services/playbooks/roles/grafana/tasks/main.yml @@ -125,4 +125,9 @@ definition: "{{ lookup('template', item) | from_yaml }}" loop: - "01-deployment.yml.j2" - - "02-service.yml.j2" + - " 02-service.yml.j2" + - " 03-pvc.yml.j2" + - " 04-sa.yml.j2" + - " 05-role.yml.j2" + - " 06-rolebinding.yml.j2" + - " 07-secrettoken.yml.j2" diff --git a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 index 0182d70c..6926b4fe 100644 --- a/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 +++ b/services/playbooks/roles/grafana/templates/01-deployment.yml.j2 @@ -47,8 +47,6 @@ spec: value: "https://trackeroo.rblabs.net/dashboards/" - name: GF_SERVER_SERVE_FROM_SUB_PATH value: "true" - - name: GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS - value: "grafana-kubernetes-datasource" volumeMounts: - name: grafana-storage diff --git a/services/playbooks/roles/grafana/templates/04-sa.yml.j2 b/services/playbooks/roles/grafana/templates/04-sa.yml.j2 new file mode 100644 index 00000000..ef34d873 --- /dev/null +++ b/services/playbooks/roles/grafana/templates/04-sa.yml.j2 @@ -0,0 +1,5 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: "{{ grafana_app_name }}" + namespace: "{{ grafana_namespace }}" diff --git a/services/playbooks/roles/grafana/templates/05-role.yml.j2 b/services/playbooks/roles/grafana/templates/05-role.yml.j2 new file mode 100644 index 00000000..1340060e --- /dev/null +++ b/services/playbooks/roles/grafana/templates/05-role.yml.j2 @@ -0,0 +1,11 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: "{{ grafana_app_name }}"-metrics-reader +rules: +- apiGroups: ["metrics.k8s.io"] + resources: ["nodes", "pods"] + verbs: ["get", "list"] +- apiGroups: [""] + resources: ["nodes", "pods", "namespaces"] + verbs: ["get", "list"] diff --git a/services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 b/services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 new file mode 100644 index 00000000..7aa97e38 --- /dev/null +++ b/services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: "{{ grafana_app_name }}-metrics-reader" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: "{{ grafana_app_name }}-metrics-reader" +subjects: +- kind: ServiceAccount + name: "{{ grafana_app_name }}" + namespace: "{{ grafana_namespace }}" diff --git a/services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 b/services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 new file mode 100644 index 00000000..9892620d --- /dev/null +++ b/services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: Secret +metadata: + name: "{{ grafana_app_name }}-sa-token" + namespace: "{{ grafana_namespace }}" + annotations: + kubernetes.io/service-account.name: "{{ grafana_app_name }}" +type: kubernetes.io/service-account-token From 0762c8e5db16e661cdc8d24fad1a94ab00b609fe Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 16:11:48 +0200 Subject: [PATCH 209/242] grafana plugins --- services/playbooks/roles/grafana/tasks/main.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/services/playbooks/roles/grafana/tasks/main.yml b/services/playbooks/roles/grafana/tasks/main.yml index 5b0e021e..cbf87327 100644 --- a/services/playbooks/roles/grafana/tasks/main.yml +++ b/services/playbooks/roles/grafana/tasks/main.yml @@ -125,9 +125,8 @@ definition: "{{ lookup('template', item) | from_yaml }}" loop: - "01-deployment.yml.j2" - - " 02-service.yml.j2" - - " 03-pvc.yml.j2" - - " 04-sa.yml.j2" - - " 05-role.yml.j2" - - " 06-rolebinding.yml.j2" - - " 07-secrettoken.yml.j2" + - "02-service.yml.j2" + - "04-sa.yml.j2" + - "05-role.yml.j2" + - "06-rolebinding.yml.j2" + - "07-secrettoken.yml.j2" From e0d5a02cfb194c9a12b0be99fdf4401d9753112b Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 16:13:08 +0200 Subject: [PATCH 210/242] grafana plugins --- services/playbooks/roles/grafana/templates/05-role.yml.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/grafana/templates/05-role.yml.j2 b/services/playbooks/roles/grafana/templates/05-role.yml.j2 index 1340060e..ed4ca050 100644 --- a/services/playbooks/roles/grafana/templates/05-role.yml.j2 +++ b/services/playbooks/roles/grafana/templates/05-role.yml.j2 @@ -1,7 +1,7 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - name: "{{ grafana_app_name }}"-metrics-reader + name: "{{ grafana_app_name }}-metrics-reader" rules: - apiGroups: ["metrics.k8s.io"] resources: ["nodes", "pods"] From 098f717a35bdef84e330f4327f9d90d87f345487 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 20:26:51 +0200 Subject: [PATCH 211/242] prometheus --- .../playbooks/roles/grafana/tasks/main.yml | 4 -- .../roles/grafana/templates/04-sa.yml.j2 | 5 --- .../roles/grafana/templates/05-role.yml.j2 | 11 ----- .../grafana/templates/06-rolebinding.yml.j2 | 12 ------ .../grafana/templates/07-secrettoken.yml.j2 | 8 ---- .../roles/prometheus/defaults/main.yml | 7 +++ .../playbooks/roles/prometheus/tasks/main.yml | 22 ++++++++++ .../prometheus/templates/01-configmap.yml.j2 | 43 +++++++++++++++++++ .../roles/prometheus/templates/02-sa.yml.j2 | 6 +++ .../roles/prometheus/templates/03-role.yml.j2 | 16 +++++++ .../templates/04-rolebinding.yml.j2 | 12 ++++++ .../prometheus/templates/05-deployment.yml.j2 | 36 ++++++++++++++++ .../prometheus/templates/06-service.yml.j2 | 15 +++++++ services/playbooks/site.yml | 8 ++++ 14 files changed, 165 insertions(+), 40 deletions(-) delete mode 100644 services/playbooks/roles/grafana/templates/04-sa.yml.j2 delete mode 100644 services/playbooks/roles/grafana/templates/05-role.yml.j2 delete mode 100644 services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 delete mode 100644 services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 create mode 100644 services/playbooks/roles/prometheus/defaults/main.yml create mode 100644 services/playbooks/roles/prometheus/tasks/main.yml create mode 100644 services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 create mode 100644 services/playbooks/roles/prometheus/templates/02-sa.yml.j2 create mode 100644 services/playbooks/roles/prometheus/templates/03-role.yml.j2 create mode 100644 services/playbooks/roles/prometheus/templates/04-rolebinding.yml.j2 create mode 100644 services/playbooks/roles/prometheus/templates/05-deployment.yml.j2 create mode 100644 services/playbooks/roles/prometheus/templates/06-service.yml.j2 diff --git a/services/playbooks/roles/grafana/tasks/main.yml b/services/playbooks/roles/grafana/tasks/main.yml index cbf87327..40d2cdf7 100644 --- a/services/playbooks/roles/grafana/tasks/main.yml +++ b/services/playbooks/roles/grafana/tasks/main.yml @@ -126,7 +126,3 @@ loop: - "01-deployment.yml.j2" - "02-service.yml.j2" - - "04-sa.yml.j2" - - "05-role.yml.j2" - - "06-rolebinding.yml.j2" - - "07-secrettoken.yml.j2" diff --git a/services/playbooks/roles/grafana/templates/04-sa.yml.j2 b/services/playbooks/roles/grafana/templates/04-sa.yml.j2 deleted file mode 100644 index ef34d873..00000000 --- a/services/playbooks/roles/grafana/templates/04-sa.yml.j2 +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: "{{ grafana_app_name }}" - namespace: "{{ grafana_namespace }}" diff --git a/services/playbooks/roles/grafana/templates/05-role.yml.j2 b/services/playbooks/roles/grafana/templates/05-role.yml.j2 deleted file mode 100644 index ed4ca050..00000000 --- a/services/playbooks/roles/grafana/templates/05-role.yml.j2 +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: "{{ grafana_app_name }}-metrics-reader" -rules: -- apiGroups: ["metrics.k8s.io"] - resources: ["nodes", "pods"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["nodes", "pods", "namespaces"] - verbs: ["get", "list"] diff --git a/services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 b/services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 deleted file mode 100644 index 7aa97e38..00000000 --- a/services/playbooks/roles/grafana/templates/06-rolebinding.yml.j2 +++ /dev/null @@ -1,12 +0,0 @@ -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: "{{ grafana_app_name }}-metrics-reader" -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: "{{ grafana_app_name }}-metrics-reader" -subjects: -- kind: ServiceAccount - name: "{{ grafana_app_name }}" - namespace: "{{ grafana_namespace }}" diff --git a/services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 b/services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 deleted file mode 100644 index 9892620d..00000000 --- a/services/playbooks/roles/grafana/templates/07-secrettoken.yml.j2 +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v1 -kind: Secret -metadata: - name: "{{ grafana_app_name }}-sa-token" - namespace: "{{ grafana_namespace }}" - annotations: - kubernetes.io/service-account.name: "{{ grafana_app_name }}" -type: kubernetes.io/service-account-token diff --git a/services/playbooks/roles/prometheus/defaults/main.yml b/services/playbooks/roles/prometheus/defaults/main.yml new file mode 100644 index 00000000..d866a900 --- /dev/null +++ b/services/playbooks/roles/prometheus/defaults/main.yml @@ -0,0 +1,7 @@ +prometheus_namespace: monitoring +prometheus_app_name: prometheus +prometheus_replicas: 1 +prometheus_image: prom/prometheus:v3.0.0 +prometheus_port: 9090 +prometheus_storage_size: 5Gi +prometheus_scrape_interval: 15s diff --git a/services/playbooks/roles/prometheus/tasks/main.yml b/services/playbooks/roles/prometheus/tasks/main.yml new file mode 100644 index 00000000..62a37b1f --- /dev/null +++ b/services/playbooks/roles/prometheus/tasks/main.yml @@ -0,0 +1,22 @@ +--- +- name: "Create Prometheus Kubernetes namespace" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + name: "{{ prometheus_namespace }}" + api_version: v1 + kind: Namespace + state: present + +- name: "Deploy Prometheus components" + kubernetes.core.k8s: + kubeconfig: /etc/rancher/k3s/k3s.yaml + state: present + namespace: "{{ prometheus_namespace }}" + definition: "{{ lookup('template', item) | from_yaml }}" + loop: + - "01-configmap.yml.j2" + - "02-sa.yml.j2" + - "03-clusterrole.yml.j2" + - "04-clusterrolebinding.yml.j2" + - "05-deployment.yml.j2" + - "06-service.yml.j2" diff --git a/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 b/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 new file mode 100644 index 00000000..7a82e4ea --- /dev/null +++ b/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 @@ -0,0 +1,43 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ prometheus_app_name }}-config + labels: + app: {{ prometheus_app_name }} +data: + prometheus.yml: | + global: + scrape_interval: {{ prometheus_scrape_interval }} + + scrape_configs: + - job_name: 'kubernetes-nodes' + kubernetes_sd_configs: + - role: node + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + + - job_name: 'kubernetes-pods' + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] + action: keep + regex: true + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] + action: replace + target_label: __metrics_path__ + regex: (.+) + - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] + action: replace + regex: (.+):(?:\d+);(\d+) + replacement: $1:$2 + target_label: __address__ + + - job_name: 'kubernetes-apiservers' + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] + action: keep + regex: kubernetes;https diff --git a/services/playbooks/roles/prometheus/templates/02-sa.yml.j2 b/services/playbooks/roles/prometheus/templates/02-sa.yml.j2 new file mode 100644 index 00000000..865e4ae3 --- /dev/null +++ b/services/playbooks/roles/prometheus/templates/02-sa.yml.j2 @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ prometheus_app_name }} + labels: + app: {{ prometheus_app_name }} diff --git a/services/playbooks/roles/prometheus/templates/03-role.yml.j2 b/services/playbooks/roles/prometheus/templates/03-role.yml.j2 new file mode 100644 index 00000000..7b93e520 --- /dev/null +++ b/services/playbooks/roles/prometheus/templates/03-role.yml.j2 @@ -0,0 +1,16 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ prometheus_app_name }} +rules: + - apiGroups: [""] + resources: + - nodes + - nodes/metrics + - services + - endpoints + - pods + - configmaps + verbs: ["get", "list", "watch"] + - nonResourceURLs: ["/metrics"] + verbs: ["get"] diff --git a/services/playbooks/roles/prometheus/templates/04-rolebinding.yml.j2 b/services/playbooks/roles/prometheus/templates/04-rolebinding.yml.j2 new file mode 100644 index 00000000..48b52b66 --- /dev/null +++ b/services/playbooks/roles/prometheus/templates/04-rolebinding.yml.j2 @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ prometheus_app_name }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ prometheus_app_name }} +subjects: + - kind: ServiceAccount + name: {{ prometheus_app_name }} + namespace: {{ prometheus_namespace }} diff --git a/services/playbooks/roles/prometheus/templates/05-deployment.yml.j2 b/services/playbooks/roles/prometheus/templates/05-deployment.yml.j2 new file mode 100644 index 00000000..dea30e71 --- /dev/null +++ b/services/playbooks/roles/prometheus/templates/05-deployment.yml.j2 @@ -0,0 +1,36 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ prometheus_app_name }} + labels: + app: {{ prometheus_app_name }} +spec: + replicas: {{ prometheus_replicas }} + selector: + matchLabels: + app: {{ prometheus_app_name }} + template: + metadata: + labels: + app: {{ prometheus_app_name }} + spec: + serviceAccountName: {{ prometheus_app_name }} + containers: + - name: prometheus + image: {{ prometheus_image }} + args: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + ports: + - containerPort: {{ prometheus_port }} + volumeMounts: + - name: config + mountPath: /etc/prometheus/ + - name: data + mountPath: /prometheus + volumes: + - name: config + configMap: + name: "{{ prometheus_app_name }}-config" + - name: data + emptyDir: {} diff --git a/services/playbooks/roles/prometheus/templates/06-service.yml.j2 b/services/playbooks/roles/prometheus/templates/06-service.yml.j2 new file mode 100644 index 00000000..7a2fec64 --- /dev/null +++ b/services/playbooks/roles/prometheus/templates/06-service.yml.j2 @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ prometheus_app_name }} + labels: + app: {{ prometheus_app_name }} +spec: + type: ClusterIP + ports: + - port: {{ prometheus_port }} + targetPort: {{ prometheus_port }} + protocol: TCP + name: http + selector: + app: {{ prometheus_app_name }} diff --git a/services/playbooks/site.yml b/services/playbooks/site.yml index d5d89077..ceb04cc4 100644 --- a/services/playbooks/site.yml +++ b/services/playbooks/site.yml @@ -105,3 +105,11 @@ - nginx roles: - nginx + +- name: Deploy Prometheus + hosts: kubernetes + tags: + - grafana + - prometheus + roles: + - prometheus From 437f75c5a16fc80b97f42fb7e1781481bc108ef4 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 20:28:05 +0200 Subject: [PATCH 212/242] prometheus --- services/playbooks/roles/prometheus/tasks/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/prometheus/tasks/main.yml b/services/playbooks/roles/prometheus/tasks/main.yml index 62a37b1f..cbd761b3 100644 --- a/services/playbooks/roles/prometheus/tasks/main.yml +++ b/services/playbooks/roles/prometheus/tasks/main.yml @@ -16,7 +16,7 @@ loop: - "01-configmap.yml.j2" - "02-sa.yml.j2" - - "03-clusterrole.yml.j2" - - "04-clusterrolebinding.yml.j2" + - "03-role.yml.j2" + - "04-rolebinding.yml.j2" - "05-deployment.yml.j2" - "06-service.yml.j2" From 830a6472bc698991d2bff0b8c168f7961cbf28c8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Thu, 23 Oct 2025 20:37:07 +0200 Subject: [PATCH 213/242] prometheus --- .../roles/prometheus/templates/03-role.yml.j2 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/services/playbooks/roles/prometheus/templates/03-role.yml.j2 b/services/playbooks/roles/prometheus/templates/03-role.yml.j2 index 7b93e520..e695656f 100644 --- a/services/playbooks/roles/prometheus/templates/03-role.yml.j2 +++ b/services/playbooks/roles/prometheus/templates/03-role.yml.j2 @@ -12,5 +12,17 @@ rules: - pods - configmaps verbs: ["get", "list", "watch"] + + - apiGroups: ["extensions", "apps"] + resources: + - deployments + - replicasets + verbs: ["get", "list", "watch"] + + - apiGroups: [""] + resources: + - namespaces + verbs: ["get", "list", "watch"] + - nonResourceURLs: ["/metrics"] verbs: ["get"] From 960a58dc82f9cce51490ec322934ad8fe64ad346 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 13:28:42 +0200 Subject: [PATCH 214/242] prometheus --- services/playbooks/roles/prometheus/defaults/main.yml | 1 + .../playbooks/roles/prometheus/templates/06-service.yml.j2 | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/prometheus/defaults/main.yml b/services/playbooks/roles/prometheus/defaults/main.yml index d866a900..57ae6263 100644 --- a/services/playbooks/roles/prometheus/defaults/main.yml +++ b/services/playbooks/roles/prometheus/defaults/main.yml @@ -2,6 +2,7 @@ prometheus_namespace: monitoring prometheus_app_name: prometheus prometheus_replicas: 1 prometheus_image: prom/prometheus:v3.0.0 +prometheus_ip: 10.20.30.130 prometheus_port: 9090 prometheus_storage_size: 5Gi prometheus_scrape_interval: 15s diff --git a/services/playbooks/roles/prometheus/templates/06-service.yml.j2 b/services/playbooks/roles/prometheus/templates/06-service.yml.j2 index 7a2fec64..fdaa6bc7 100644 --- a/services/playbooks/roles/prometheus/templates/06-service.yml.j2 +++ b/services/playbooks/roles/prometheus/templates/06-service.yml.j2 @@ -5,7 +5,8 @@ metadata: labels: app: {{ prometheus_app_name }} spec: - type: ClusterIP + type: LoadBalancer + loadBalancerIP: {{ prometheus_ip }} ports: - port: {{ prometheus_port }} targetPort: {{ prometheus_port }} From aace2f71e3a5698aa79e669f244382829470b181 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 13:34:43 +0200 Subject: [PATCH 215/242] prometheus --- .../prometheus/templates/01-configmap.yml.j2 | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 b/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 index 7a82e4ea..67adad9d 100644 --- a/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 @@ -1,28 +1,54 @@ apiVersion: v1 kind: ConfigMap metadata: - name: {{ prometheus_app_name }}-config + name: "{{ prometheus_app_name }}-config" labels: app: {{ prometheus_app_name }} data: prometheus.yml: | global: scrape_interval: {{ prometheus_scrape_interval }} - scrape_configs: - - job_name: 'kubernetes-nodes' + # Scrape API servers + - job_name: 'kubernetes-apiservers' + kubernetes_sd_configs: + - role: endpoints + scheme: https + tls_config: + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + relabel_configs: + - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] + action: keep + regex: default;kubernetes;https + + # Scrape kubelet metrics (node metrics) + - job_name: 'kubernetes-kubelet' kubernetes_sd_configs: - role: node + scheme: http + metrics_path: /metrics relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) + # Scrape cAdvisor (container metrics) + - job_name: 'kubernetes-cadvisor' + kubernetes_sd_configs: + - role: node + scheme: http + metrics_path: /metrics/cadvisor + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + + # Scrape pods that expose /metrics - job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] - action: keep + - action: keep + source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] regex: true - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] action: replace @@ -30,14 +56,14 @@ data: regex: (.+) - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] action: replace - regex: (.+):(?:\d+);(\d+) - replacement: $1:$2 + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: ${1}:${2} target_label: __address__ - - - job_name: 'kubernetes-apiservers' - kubernetes_sd_configs: - - role: endpoints - relabel_configs: - - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - action: keep - regex: kubernetes;https + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - source_labels: [__meta_kubernetes_namespace] + action: replace + target_label: namespace + - source_labels: [__meta_kubernetes_pod_name] + action: replace + target_label: pod From 9ecfc7e53ec6ede63be7f7b5bfb4531362be50aa Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 13:47:56 +0200 Subject: [PATCH 216/242] prometheus --- .../roles/prometheus/templates/01-configmap.yml.j2 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 b/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 index 67adad9d..428afc47 100644 --- a/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/prometheus/templates/01-configmap.yml.j2 @@ -22,12 +22,16 @@ data: action: keep regex: default;kubernetes;https + # Scrape kubelet metrics (node metrics) - job_name: 'kubernetes-kubelet' kubernetes_sd_configs: - role: node - scheme: http + scheme: https # <-- CHANGED from http metrics_path: /metrics + tls_config: + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) @@ -36,8 +40,11 @@ data: - job_name: 'kubernetes-cadvisor' kubernetes_sd_configs: - role: node - scheme: http + scheme: https metrics_path: /metrics/cadvisor + tls_config: + insecure_skip_verify: true + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) From cebc38a250b92b4f04b74b48839f1bacb45fa82f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 14:09:35 +0200 Subject: [PATCH 217/242] nginx --- services/playbooks/roles/nginx/templates/01-configmap.yml.j2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 index ff715b6b..edbef8fa 100644 --- a/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 +++ b/services/playbooks/roles/nginx/templates/01-configmap.yml.j2 @@ -22,6 +22,11 @@ data: proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; + proxy_read_timeout 600s; + proxy_connect_timeout 60s; + proxy_send_timeout 600s; + send_timeout 600s; + proxy_buffering off; } } } From 9b72dfb5a111573a0c4eced0f0b20345e74d6781 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 14:35:03 +0200 Subject: [PATCH 218/242] max consumption and index --- services/playbooks/roles/tsdb/files/02-schema.sql | 3 +++ tracky/src/trackeroo/driving.go | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index e9ea8a29..ce93df83 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -30,6 +30,9 @@ CREATE INDEX IF NOT EXISTS idx_trackeroo_data_dev_id ON trackeroo.data(dev_id); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_tag ON trackeroo.data(tag); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_ts ON trackeroo.data(ts); +-- Added to speedup the last position query +CREATE INDEX IF NOT EXISTS idx_trackeroo_data_dev_id_ts_desc ON trackeroo.data (dev_id, ts DESC); + CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_dev_id ON trackeroo.aggregated(dev_id); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_route_hash ON trackeroo.aggregated(route_hash); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_tag ON trackeroo.aggregated(tag); diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index 908d9604..a2677783 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -25,6 +25,8 @@ var consumptionMultipliers = map[string]float32{ "public_transport": 1.8, // buses have much higher consumption } +const MAX_CONSUMPTION = 30.0 + type Coordinate struct { Lat float64 `json:"lat"` Lng float64 `json:"lon"` @@ -151,7 +153,7 @@ func getConsumption(speed float64, devType string) float64 { if speed >= threshold { consumption += 5 * math.Log(speed/threshold) } - return consumption * float64(consumptionMultipliers[devType]) + return max(consumption*float64(consumptionMultipliers[devType]), MAX_CONSUMPTION) } // DrivingSimulator simulates realistic car driving From b06dd90a75cc396c73ddc12ffccc1c188915b6db Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 14:38:55 +0200 Subject: [PATCH 219/242] added ram to the nodes --- bootstrap/cloud-init/specs.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bootstrap/cloud-init/specs.yaml b/bootstrap/cloud-init/specs.yaml index 2b2824fe..95b1df5a 100644 --- a/bootstrap/cloud-init/specs.yaml +++ b/bootstrap/cloud-init/specs.yaml @@ -46,7 +46,7 @@ - machine_type: node name: k3s-node-hermes cpu: 8 - ram: 6144 + ram: 8192 os_storage: 20 longhorn_storage: 150 networks: @@ -61,7 +61,7 @@ - machine_type: node name: k3s-node-achilles cpu: 8 - ram: 6144 + ram: 8192 os_storage: 20 longhorn_storage: 150 networks: @@ -76,7 +76,7 @@ - machine_type: node name: k3s-node-odysseus cpu: 8 - ram: 6144 + ram: 8192 os_storage: 20 longhorn_storage: 150 networks: From 5e41dda7e63bf5d949f4ec29069aed3f1f987aa8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 14:58:04 +0200 Subject: [PATCH 220/242] primer --- tracky/src-redis-primer/Dockerfile | 18 + tracky/src-redis-primer/docker-compose.yml | 16 + tracky/src-redis-primer/firmware.go | 135 ++++++ tracky/src-redis-primer/go.mod | 30 ++ tracky/src-redis-primer/go.sum | 61 +++ tracky/src-redis-primer/trackeroo/art.go | 30 ++ .../src-redis-primer/trackeroo/checkpoint.go | 80 ++++ tracky/src-redis-primer/trackeroo/driving.go | 392 ++++++++++++++++++ tracky/src-redis-primer/trackeroo/logger.go | 74 ++++ tracky/src-redis-primer/trackeroo/overpass.go | 249 +++++++++++ tracky/src-redis-primer/trackeroo/redis.go | 33 ++ tracky/src-redis-primer/trackeroo/routes.go | 80 ++++ tracky/src-redis-primer/trackeroo/utils.go | 79 ++++ tracky/src-redis-primer/tracky.go | 51 +++ 14 files changed, 1328 insertions(+) create mode 100644 tracky/src-redis-primer/Dockerfile create mode 100644 tracky/src-redis-primer/docker-compose.yml create mode 100644 tracky/src-redis-primer/firmware.go create mode 100755 tracky/src-redis-primer/go.mod create mode 100755 tracky/src-redis-primer/go.sum create mode 100644 tracky/src-redis-primer/trackeroo/art.go create mode 100644 tracky/src-redis-primer/trackeroo/checkpoint.go create mode 100644 tracky/src-redis-primer/trackeroo/driving.go create mode 100755 tracky/src-redis-primer/trackeroo/logger.go create mode 100644 tracky/src-redis-primer/trackeroo/overpass.go create mode 100644 tracky/src-redis-primer/trackeroo/redis.go create mode 100644 tracky/src-redis-primer/trackeroo/routes.go create mode 100755 tracky/src-redis-primer/trackeroo/utils.go create mode 100755 tracky/src-redis-primer/tracky.go diff --git a/tracky/src-redis-primer/Dockerfile b/tracky/src-redis-primer/Dockerfile new file mode 100644 index 00000000..f8c31e28 --- /dev/null +++ b/tracky/src-redis-primer/Dockerfile @@ -0,0 +1,18 @@ +# -------- Build Stage -------- +FROM golang:1.24-alpine AS builder + +ENV CGO_ENABLED=0 \ + GOOS=linux \ + GOARCH=amd64 +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN go build -o tracky tracky.go firmware.go + +FROM alpine:latest +WORKDIR /app +RUN mkdir -p /data +COPY --from=builder /app/tracky . + +ENTRYPOINT ["./tracky"] diff --git a/tracky/src-redis-primer/docker-compose.yml b/tracky/src-redis-primer/docker-compose.yml new file mode 100644 index 00000000..3fc59109 --- /dev/null +++ b/tracky/src-redis-primer/docker-compose.yml @@ -0,0 +1,16 @@ +services: + redis-primer: + build: + context: . + dockerfile: Dockerfile + environment: + ROUTING_SERVICE_URL: http://osrm:5000 + OVERPASS_URL: http://nginx:80/api/interpreter + REDIS_URI: redis://redis:6379 + networks: + - tracky + restart: "no" + +networks: + tracky: + external: true diff --git a/tracky/src-redis-primer/firmware.go b/tracky/src-redis-primer/firmware.go new file mode 100644 index 00000000..7a622dfa --- /dev/null +++ b/tracky/src-redis-primer/firmware.go @@ -0,0 +1,135 @@ +package main + +import ( + "math/rand" + "os" + "time" + "tracky/trackeroo" +) + +type ValuableSensors struct { + Alarm bool `json:"alarm"` + Vibration float64 `json:"vibration"` + RearHatchOpen bool `json:"rear_hatch_open"` + FrontHatchOpen bool `json:"front_hatch_open"` + Collision bool `json:"collision"` +} + +type FoodSensors struct { + RearHatchOpen bool `json:"rear_hatch_open"` + FrontHatchOpen bool `json:"front_hatch_open"` + Temperature float64 `json:"temperature"` + Humidity float64 `json:"humidity"` + Pressure float64 `json:"pressure"` +} + +type Payload struct { + TS int64 `json:"ts"` + Speed float64 `json:"speed"` + SpeedLimit float64 `json:"speed_limit"` + SpeedStats map[string]any `json:"speed_stats"` + Position trackeroo.Coordinate `json:"position"` + DeviceName string `json:"device_name"` + DeviceType string `json:"device_type"` + DeviceID string `json:"device_id"` + Status string `json:"status"` + Sensors any `json:"sensors,omitempty"` + Start trackeroo.Coordinate `json:"start"` + End trackeroo.Coordinate `json:"end"` + InstantConsumption float64 `json:"instant_consumption"` + ConsumptionStats map[string]any `json:"consumption_stats"` + DeltaDistance float64 `json:"delta_distance"` +} + +func normalValuablesData(position trackeroo.DrivePosition) ValuableSensors { + return ValuableSensors{ + Alarm: false, + Vibration: rand.Float64() * 100, + RearHatchOpen: position.Status == trackeroo.ARRIVED, + FrontHatchOpen: position.Status == trackeroo.ARRIVED, + Collision: false, + } +} + +func robberyValuablesData() ValuableSensors { + return ValuableSensors{ + Alarm: true, + Vibration: 100 + rand.Float64()*300, + RearHatchOpen: true, + FrontHatchOpen: rand.Float32() < 0.5, + Collision: true, + } +} + +func normalFoodData(position trackeroo.DrivePosition) FoodSensors { + minTemperature := 2.0 + minHumidity := 60.0 + minPressure := 1013.25 // Millibars + return FoodSensors{ + Temperature: minTemperature + rand.Float64()*2, + Humidity: minHumidity + rand.Float64()*10, + Pressure: minPressure + rand.Float64()*10, + RearHatchOpen: position.Status == trackeroo.ARRIVED, + FrontHatchOpen: position.Status == trackeroo.ARRIVED, + } +} + +func alteredFoodData(position trackeroo.DrivePosition) FoodSensors { + minTemperature := 4.0 + minHumidity := 70.0 + minPressure := 1013.25 // Millibars + return FoodSensors{ + Temperature: minTemperature + rand.Float64()*7, + Humidity: minHumidity + rand.Float64()*30, + Pressure: minPressure + rand.Float64()*100, + RearHatchOpen: rand.Float64() < 0.05, + FrontHatchOpen: position.Status == trackeroo.ARRIVED, + } +} + +var taskManager *trackeroo.TaskManager + +func Init() { + debugLevel := os.Getenv("DEBUG_LEVEL") + level := trackeroo.INFO + switch debugLevel { + case "DEBUG": + level = trackeroo.DEBUG + case "INFO": + level = trackeroo.INFO + case "WARN": + case "WARNING": + level = trackeroo.WARNING + case "ERROR": + level = trackeroo.ERROR + default: + level = trackeroo.INFO + } + trackeroo.InitLogger(level, "") + trackeroo.InitQueue("data") + taskManager = trackeroo.NewTaskManager() + go taskManager.Start() +} + +func Terminate() { + taskManager.Shutdown(0) +} + +func Loop() { + rand.Seed(time.Now().UnixNano()) + trackeroo.InitRedisClient() + overpassClient := trackeroo.NewOverpassClient(os.Getenv("OVERPASS_URL")) + + regions, err := overpassClient.GetRegions() + if err != nil { + trackeroo.Error("Cannot retrieve regions: %+v", err) + } + cities := make([]string, 0) + for _, region := range regions { + c, _ := overpassClient.GetCities(region) + cities = append(cities, c...) + } + for _, city := range cities { + overpassClient.GetStreets(city, 100, 2000) + } +} diff --git a/tracky/src-redis-primer/go.mod b/tracky/src-redis-primer/go.mod new file mode 100755 index 00000000..fcdbcd21 --- /dev/null +++ b/tracky/src-redis-primer/go.mod @@ -0,0 +1,30 @@ +module tracky + +go 1.22.6 + +toolchain go1.23.3 + +require ( + github.com/eclipse/paho.mqtt.golang v1.4.3 + github.com/golang-jwt/jwt/v5 v5.2.1 + modernc.org/sqlite v1.36.0 +) + +require ( + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/redis/go-redis/v9 v9.14.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect + golang.org/x/net v0.22.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.30.0 // indirect + modernc.org/libc v1.61.13 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.8.2 // indirect +) diff --git a/tracky/src-redis-primer/go.sum b/tracky/src-redis-primer/go.sum new file mode 100755 index 00000000..31e3d6d4 --- /dev/null +++ b/tracky/src-redis-primer/go.sum @@ -0,0 +1,61 @@ +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eclipse/paho.mqtt.golang v1.4.3 h1:2kwcUGn8seMUfWndX0hGbvH8r7crgcJguQNCyp70xik= +github.com/eclipse/paho.mqtt.golang v1.4.3/go.mod h1:CSYvoAlsMkhYOXh/oKyxa8EcBci6dVkLCbo5tTC1RIE= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/redis/go-redis/v9 v9.14.0 h1:u4tNCjXOyzfgeLN+vAZaW1xUooqWDqVEsZN0U01jfAE= +github.com/redis/go-redis/v9 v9.14.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo= +golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +modernc.org/cc/v4 v4.24.4 h1:TFkx1s6dCkQpd6dKurBNmpo+G8Zl4Sq/ztJ+2+DEsh0= +modernc.org/cc/v4 v4.24.4/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.23.16 h1:Z2N+kk38b7SfySC1ZkpGLN2vthNJP1+ZzGZIlH7uBxo= +modernc.org/ccgo/v4 v4.23.16/go.mod h1:nNma8goMTY7aQZQNTyN9AIoJfxav4nvTnvKThAeMDdo= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.6.3 h1:aJVhcqAte49LF+mGveZ5KPlsp4tdGdAOT4sipJXADjw= +modernc.org/gc/v2 v2.6.3/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/libc v1.61.13 h1:3LRd6ZO1ezsFiX1y+bHd1ipyEHIJKvuprv0sLTBwLW8= +modernc.org/libc v1.61.13/go.mod h1:8F/uJWL/3nNil0Lgt1Dpz+GgkApWh04N3el3hxJcA6E= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI= +modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.36.0 h1:EQXNRn4nIS+gfsKeUTymHIz1waxuv5BzU7558dHSfH8= +modernc.org/sqlite v1.36.0/go.mod h1:7MPwH7Z6bREicF9ZVUR78P1IKuxfZ8mRIDHD0iD+8TU= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/tracky/src-redis-primer/trackeroo/art.go b/tracky/src-redis-primer/trackeroo/art.go new file mode 100644 index 00000000..3c6a5011 --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/art.go @@ -0,0 +1,30 @@ +package trackeroo + +const ART = ` + + ⢠⣿⣦⡀ + ⢾⣿⣿⣿⣦⡀ + ⢀⣴⣿⣿⣿⣿⣿⣦⡀ + ⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀ + ⣀⣀⣀⣀⡀ ⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⠟⢿⡿⠿⠟ + ⠈⠻⣿⣿⣿⣿⣿⣶⣶⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁ + ⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁ + ⠈⠻⣿⣿⣿⣿⣿⣿⣿⡟⠁ + ⣠⣦⡈⠻⣿⣿⣿⣿⣿⣧ + ⢀⣴⣿⣿⡿⠂⠈⠻⣿⣿⣿⣿⡆ + ⣠⣾⣿⠟⠁ ⠈⠻⣿⣿⡇ + ⢀⣼⠿⠋ ⠈⠻⠃ + ⡠⠛⠁ + ⠈ + /$$$$$$$$ /$$ + |__ $$__/ | $$ + | $$ /$$$$$$ /$$$$$$ /$$$$$$$| $$ /$$ /$$ /$$ + | $$ /$$__ $$|____ $$ /$$_____/| $$ /$$/| $$ | $$ + | $$| $$ \__/ /$$$$$$$| $$ | $$$$$$/ | $$ | $$ + | $$| $$ /$$__ $$| $$ | $$_ $$ | $$ | $$ + | $$| $$ | $$$$$$$| $$$$$$$| $$ \ $$| $$$$$$$ + |__/|__/ \_______/ \_______/|__/ \__/ \____ $$ + /$$ | $$ + | $$$$$$/ + \______/ + ` diff --git a/tracky/src-redis-primer/trackeroo/checkpoint.go b/tracky/src-redis-primer/trackeroo/checkpoint.go new file mode 100644 index 00000000..f84d42f8 --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/checkpoint.go @@ -0,0 +1,80 @@ +package trackeroo + +import ( + "encoding/json" + "fmt" + "os" +) + +func ExistsCheckpoint(filename string) bool { + if redisClient != nil { + exists, err := redisClient.Exists(ctx, filename).Result() + return err == nil && exists > 0 + } + + _, err := os.Stat(filename) + return !os.IsNotExist(err) +} + +func SaveCheckpoint(checkpoint *Checkpoint, filename string) error { + if checkpoint == nil { + return fmt.Errorf("cannot save nil checkpoint") + } + + jsonData, err := json.Marshal(checkpoint) + if err != nil { + return err + } + + if redisClient != nil { + return redisClient.Set(ctx, filename, jsonData, 0).Err() + } + + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + + fmt.Fprintf(file, "%s\n", jsonData) + return nil +} + +func LoadCheckpoint(filename string) (*Checkpoint, error) { + var jsonData []byte + var err error + + if redisClient != nil { + jsonData, err = redisClient.Get(ctx, filename).Bytes() + if err != nil { + return nil, err + } + } else { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + var checkpoint Checkpoint + err = json.NewDecoder(file).Decode(&checkpoint) + if err != nil { + return nil, err + } + return &checkpoint, nil + } + + var checkpoint Checkpoint + err = json.Unmarshal(jsonData, &checkpoint) + if err != nil { + return nil, err + } + return &checkpoint, nil +} + +func DeleteCheckpoint(filename string) error { + if redisClient != nil { + return redisClient.Del(ctx, filename).Err() + } + return os.Remove(filename) +} diff --git a/tracky/src-redis-primer/trackeroo/driving.go b/tracky/src-redis-primer/trackeroo/driving.go new file mode 100644 index 00000000..a2677783 --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/driving.go @@ -0,0 +1,392 @@ +package trackeroo + +import ( + "encoding/json" + "fmt" + "io" + "math" + "math/rand" + "net/http" + "time" +) + +const ( + ARRIVED = "arrived" + DRIVING = "driving" + STOPPED = "stopped" + SLOWING = "slowing" + ACCELERATING = "accelerating" +) + +var consumptionMultipliers = map[string]float32{ + "valuable": 1.3, // heavier, armored vans/trucks + "food": 1.1, // refrigerated transport adds load + "private_transport": 1.0, // baseline + "public_transport": 1.8, // buses have much higher consumption +} + +const MAX_CONSUMPTION = 30.0 + +type Coordinate struct { + Lat float64 `json:"lat"` + Lng float64 `json:"lon"` +} + +type RouteSegment struct { + Coordinates []Coordinate + SpeedKmh float64 + ShouldStop bool +} + +type OSRMResponse struct { + Code string `json:"code"` + Routes []struct { + Geometry struct { + Coordinates [][]float64 `json:"coordinates"` + } `json:"geometry"` + Distance float64 `json:"distance"` + Duration float64 `json:"duration"` + Legs []struct { + Steps []struct { + Geometry struct { + Coordinates [][]float64 `json:"coordinates"` + } `json:"geometry"` + Distance float64 `json:"distance"` + Duration float64 `json:"duration"` + Name string `json:"name"` + Maneuver struct { + Type string `json:"type"` + Modifier string `json:"modifier"` + Location []float64 `json:"location"` + } `json:"maneuver"` + } `json:"steps"` + } `json:"legs"` + } `json:"routes"` +} + +type DrivePosition struct { + Coordinate + Timestamp time.Time + Speed float64 // km/h + SpeedLimit float64 + Status string // "driving", "stopped", "slowing", "accelerating" + Start Coordinate + End Coordinate + Consumption float64 + Distance float64 +} + +type RoutingService struct { + NominatimURL string + OSRMURL string + httpClient *http.Client +} + +func NewRoutingService(osrmURL string) *RoutingService { + return &RoutingService{ + OSRMURL: osrmURL, + httpClient: &http.Client{Timeout: 120 * time.Second}, + } +} + +// GetRoute gets routing directions from point A to B using OSRM +func (rs *RoutingService) GetRoute(from, to Coordinate) ([]RouteSegment, error) { + requestURL := fmt.Sprintf( + "%s/route/v1/driving/%f,%f;%f,%f?geometries=geojson&overview=full&steps=true", + rs.OSRMURL, from.Lng, from.Lat, to.Lng, to.Lat) + + resp, err := rs.httpClient.Get(requestURL) + if err != nil { + return nil, fmt.Errorf("failed to get route: %w", err) + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read response body: %w", err) + } + + var osrmResp OSRMResponse + if err := json.Unmarshal(body, &osrmResp); err != nil { + return nil, fmt.Errorf("failed to parse OSRM response: %w", err) + } + + if osrmResp.Code != "Ok" || len(osrmResp.Routes) == 0 { + return nil, fmt.Errorf("no routes found") + } + + var segments []RouteSegment + + for _, leg := range osrmResp.Routes[0].Legs { + for _, step := range leg.Steps { + speed := 0.0 + if step.Duration > 0 { + speed = (step.Distance / step.Duration) * 3.6 + } + + coords := make([]Coordinate, len(step.Geometry.Coordinates)) + for i, c := range step.Geometry.Coordinates { + coords[i] = Coordinate{Lat: c[1], Lng: c[0]} + } + shouldStop := false + switch step.Maneuver.Type { + case "turn", "roundabout", "end_of_road": + shouldStop = true + } + segments = append(segments, RouteSegment{ + Coordinates: coords, + SpeedKmh: speed, + ShouldStop: shouldStop, + }) + } + } + + return segments, nil +} + +func getConsumption(speed float64, devType string) float64 { + if speed == 0 { + return 0.0 + } + threshold := 80.0 + consumption := 5 + 60.7/speed + if speed >= threshold { + consumption += 5 * math.Log(speed/threshold) + } + return max(consumption*float64(consumptionMultipliers[devType]), MAX_CONSUMPTION) +} + +// DrivingSimulator simulates realistic car driving +type DrivingSimulator struct { + Route []RouteSegment + Start Coordinate + End Coordinate + DefaultAverageSpeed float64 // km/h + SpeedVariation float64 // percentage (0.0-1.0) + StopProbability float64 // probability of stopping per segment (0.0-1.0) + DevType string + StopDuration struct { + Min time.Duration + Max time.Duration + } + UpdateInterval time.Duration + IsPirate bool + rand *rand.Rand + Distance float64 +} + +func NewDrivingSimulator(routingService *RoutingService, checkpoint *Checkpoint, avgSpeed float64, updateIntervalMs int, isPirate bool, devType string) (*DrivingSimulator, error) { + route := make([]RouteSegment, 0) + for i := 0; i < len(checkpoint.Poles)-1; i++ { + start := checkpoint.Poles[i].Coordinate + end := checkpoint.Poles[i+1].Coordinate + r, err := routingService.GetRoute(start, end) + if err != nil { + return nil, err + } + checkpointRouteIndex := -1 + checkpointCoordinatesIndex := -1 + + for i, pos := range r { + if checkpoint == nil || checkpoint.LastPosition.Lat == 0.0 || checkpoint.LastPosition.Lng == 0.0 { + Warning("Invalid checkpoit +%v, starting from first waypoint", checkpoint) + break + } + for j, c := range pos.Coordinates { + // 50 meters + if haversineDistance(checkpoint.LastPosition, c) < 0.05 { + checkpointRouteIndex = i + checkpointCoordinatesIndex = j + Info("Found checkpoint %+v at index (%d, %d)", checkpoint, checkpointRouteIndex, checkpointCoordinatesIndex) + goto found + } + } + } + found: + if checkpointRouteIndex >= 0 { + r = r[checkpointRouteIndex:] + r[0].Coordinates = r[0].Coordinates[checkpointCoordinatesIndex:] + } + route = append(route, r...) + } + + return &DrivingSimulator{ + Route: route, + DefaultAverageSpeed: avgSpeed, + Start: checkpoint.Poles[0].Coordinate, + End: checkpoint.Poles[1].Coordinate, + SpeedVariation: 0.03, + StopProbability: 0.05, + StopDuration: struct { + Min time.Duration + Max time.Duration + }{ + Min: 2 * time.Second, + Max: 5 * time.Second, + }, + UpdateInterval: time.Duration(updateIntervalMs) * time.Millisecond, + rand: rand.New(rand.NewSource(time.Now().UnixNano())), + IsPirate: isPirate, + DevType: devType, + }, nil +} + +// SimulateDrive simulates driving along a route and sends positions through a channel +func (ds *DrivingSimulator) SimulateDrive() <-chan DrivePosition { + positionChan := make(chan DrivePosition, 100) + lastCoord := ds.Route[len(ds.Route)-1].Coordinates[len(ds.Route[len(ds.Route)-1].Coordinates)-1] + lastSpeed := 0.0 + go func() { + defer close(positionChan) + + if len(ds.Route) < 2 { + return + } + + currentTime := time.Now() + stopCompensation := 1 + consumptionCompensation := 1.0 + speedLimit := 0.0 + for _, segment := range ds.Route { + for i := 0; i < len(segment.Coordinates)-1; i++ { + currentPos := segment.Coordinates[i] + nextPos := segment.Coordinates[i+1] + + // Calculate distance between points + distance := haversineDistance(currentPos, nextPos) + + // Check if we should stop + if i == 0 && segment.ShouldStop { + // Send stopped position + positionChan <- DrivePosition{ + Coordinate: currentPos, + Timestamp: currentTime, + Speed: 0, + SpeedLimit: speedLimit, + Status: STOPPED, + Start: ds.Start, + End: ds.End, + Consumption: 0, + Distance: 0, + } + + // Random stop duration + stopTime := ds.StopDuration.Min + time.Duration( + ds.rand.Float64()*float64(ds.StopDuration.Max-ds.StopDuration.Min)) + time.Sleep(stopTime) + currentTime = time.Now() + stopCompensation = 3 + lastSpeed = 0 + } + + // Calculate current speed with variation + baseSpeed := ds.DefaultAverageSpeed + if segment.SpeedKmh > 0 { + baseSpeed = segment.SpeedKmh + } + if stopCompensation > 1 { + baseSpeed /= float64(stopCompensation) + stopCompensation -= 1 + } + speedLimit = baseSpeed + speedVariation := 1.0 + (ds.rand.Float64()-0.5)*2*ds.SpeedVariation + currentSpeed := baseSpeed * speedVariation + if ds.IsPirate { + currentSpeed *= 1.40 + } + + // Calculate time to travel this segment + travelTimeHours := distance / currentSpeed + segmentDuration := time.Duration(travelTimeHours * float64(time.Hour)) + + // Interpolate positions along the segment + steps := max(int(segmentDuration/ds.UpdateInterval), 1) + + status := DRIVING + consumptionCompensation = 1 + speedDifference := math.Abs(currentSpeed - lastSpeed) + tolerance := currentSpeed * 0.05 // 5% tolerance + + if speedDifference > tolerance { + if lastSpeed < currentSpeed { + status = ACCELERATING + consumptionCompensation = 1.3 + } else { + status = SLOWING + consumptionCompensation = 0.5 + } + } + lastSpeed = currentSpeed + + for step := 0; step <= steps; step++ { + progress := float64(step) / float64(steps) + + interpolatedPos := ds.interpolatePosition(currentPos, nextPos, progress) + + positionChan <- DrivePosition{ + Coordinate: interpolatedPos, + Timestamp: currentTime, + Speed: currentSpeed, + SpeedLimit: speedLimit, + Status: status, + Start: ds.Start, + End: ds.End, + Consumption: getConsumption(currentSpeed, ds.DevType) * consumptionCompensation, + Distance: distance, + } + time.Sleep(ds.UpdateInterval) + currentTime = time.Now() + } + } + } + + // Send final position + positionChan <- DrivePosition{ + Coordinate: lastCoord, + Timestamp: currentTime, + Speed: 0, + SpeedLimit: speedLimit, + Status: ARRIVED, + Start: ds.Start, + End: ds.End, + Consumption: 0, + Distance: 0, + } + }() + Info("Simulation started") + + return positionChan +} + +// haversineDistance calculates the great circle distance between two points +func haversineDistance(pos1, pos2 Coordinate) float64 { + const R = 6371 // Earth's radius in kilometers + + lat1Rad := pos1.Lat * math.Pi / 180 + lat2Rad := pos2.Lat * math.Pi / 180 + deltaLat := (pos2.Lat - pos1.Lat) * math.Pi / 180 + deltaLng := (pos2.Lng - pos1.Lng) * math.Pi / 180 + + a := math.Sin(deltaLat/2)*math.Sin(deltaLat/2) + + math.Cos(lat1Rad)*math.Cos(lat2Rad)* + math.Sin(deltaLng/2)*math.Sin(deltaLng/2) + + c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a)) + + return R * c +} + +// interpolatePosition interpolates between two positions +func (ds *DrivingSimulator) interpolatePosition(pos1, pos2 Coordinate, progress float64) Coordinate { + return Coordinate{ + Lat: pos1.Lat + (pos2.Lat-pos1.Lat)*progress, + Lng: pos1.Lng + (pos2.Lng-pos1.Lng)*progress, + } +} + +// Helper function to parse float from string +func parseFloat(s string) (float64, error) { + var f float64 + _, err := fmt.Sscanf(s, "%f", &f) + return f, err +} diff --git a/tracky/src-redis-primer/trackeroo/logger.go b/tracky/src-redis-primer/trackeroo/logger.go new file mode 100755 index 00000000..5cacf795 --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/logger.go @@ -0,0 +1,74 @@ +package trackeroo + +import ( + "fmt" + "path/filepath" + "runtime" + "time" +) + +type Logger struct { + logLevel int + logFile string +} + +const ( + DEBUG = iota + INFO = iota + WARNING = iota + ERROR = iota + DISABLED = iota +) + +var logger *Logger + +func newLogger(logLevel int, logFile string) *Logger { + return &Logger{ + logLevel: logLevel, + logFile: logFile, + } +} + +func InitLogger(logLevel int, logFile string) { + logger = newLogger(logLevel, logFile) +} + +func GetLogPrefixString(level int) string { + _, file, no, _ := runtime.Caller(2) + file = filepath.Base(file) + switch level { + case DEBUG: + return fmt.Sprintf("%v :: %s:%d :: [ \x1b[36mDEBUG\x1b[0m ] - ", time.Now().Format(time.UnixDate), file, no) + case INFO: + return fmt.Sprintf("%v :: [ \x1b[32mINFO\x1b[0m ] - ", time.Now().Format(time.UnixDate)) + case WARNING: + return fmt.Sprintf("%v :: %s:%d :: [ \x1b[33mWARNING\x1b[0m ] - ", time.Now().Format(time.UnixDate), file, no) + case ERROR: + return fmt.Sprintf("%v :: %s:%d :: [ \x1b[31mERROR\x1b[0m ] - ", time.Now().Format(time.UnixDate), file, no) + } + return "" +} + +func Debug(fmtStr string, args ...any) { + if logger.logLevel <= DEBUG { + fmt.Printf(GetLogPrefixString(DEBUG)+fmtStr+"\n", args...) + } +} + +func Info(fmtStr string, args ...any) { + if logger.logLevel <= INFO { + fmt.Printf(GetLogPrefixString(INFO)+fmtStr+"\n", args...) + } +} + +func Warning(fmtStr string, args ...any) { + if logger.logLevel <= WARNING { + fmt.Printf(GetLogPrefixString(WARNING)+fmtStr+"\n", args...) + } +} + +func Error(fmtStr string, args ...any) { + if logger.logLevel <= ERROR { + fmt.Printf(GetLogPrefixString(ERROR)+fmtStr+"\n", args...) + } +} diff --git a/tracky/src-redis-primer/trackeroo/overpass.go b/tracky/src-redis-primer/trackeroo/overpass.go new file mode 100644 index 00000000..c4575f14 --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/overpass.go @@ -0,0 +1,249 @@ +package trackeroo + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "math/rand" + "net/http" + "net/url" + "strings" + "time" + + "github.com/redis/go-redis/v9" +) + +type OverpassElement struct { + Type string `json:"type"` + ID int64 `json:"id"` + Tags map[string]string `json:"tags"` + Geometry []Coordinate `json:"geometry"` +} + +type OverpassResponse struct { + Elements []OverpassElement `json:"elements"` +} + +type OverpassClient struct { + BaseURL string + Client *http.Client +} + +func NewOverpassClient(baseURL string) *OverpassClient { + return &OverpassClient{ + BaseURL: baseURL, + Client: &http.Client{ + Timeout: 120 * time.Second, + }, + } +} + +func (c *OverpassClient) runQuery(query string) (OverpassResponse, error) { + const maxRetries = 10 + + form := url.Values{} + form.Set("data", query) + + var lastErr error + var overpassResp OverpassResponse + + for attempt := 1; attempt <= maxRetries; attempt++ { + resp, err := c.Client.Post( + c.BaseURL, + "application/x-www-form-urlencoded", + strings.NewReader(form.Encode()), + ) + if err != nil { + lastErr = fmt.Errorf("failed to query Overpass API: %w", err) + time.Sleep(time.Duration(attempt) * time.Second) + continue + } + + bodyBytes, _ := io.ReadAll(resp.Body) + resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + lastErr = fmt.Errorf("Overpass API returned status %d: %s", resp.StatusCode, string(bodyBytes)) + + if resp.StatusCode == http.StatusTooManyRequests || resp.StatusCode >= 500 { + time.Sleep(time.Duration(attempt) * time.Second) + continue + } + break + } + + contentType := resp.Header.Get("Content-Type") + if strings.Contains(contentType, "text/html") || bytes.HasPrefix(bodyBytes, []byte(".italy; +node["name"="%s"]["place"~"city|town"](area.italy)->.citynode; +( + way(around.citynode:%d)["highway"~"primary|secondary|tertiary|residential|unclassified"]["name"]["highway"!~"motorway|trunk|motorway_link|trunk_link"](area.italy); +); +out tags geom %d; +`, city, radiusMeters, limit) + + overpassResp, err := c.runQuery(query) + if err != nil { + return nil, err + } + + if len(overpassResp.Elements) == 0 { + return nil, fmt.Errorf("no streets found for city: %s", city) + } + + if redisClient != nil { + data, err := json.Marshal(overpassResp.Elements) + if err == nil { + if err := redisClient.Set(ctx, cityKey, data, 0).Err(); err != nil { + Warning("Failed to cache regions in Redis: %v", err) + } else { + Info("Cached %d streets (city: %s, limit: %d, radius: %d) in Redis", len(overpassResp.Elements), city, limit, radiusMeters) + } + } + } + return overpassResp.Elements, nil +} + +func (c *OverpassClient) GetRandomStreet(city string, radiusMeters int) (Street, error) { + streets, err := c.GetStreets(city, 100, radiusMeters) + if err != nil { + return Street{}, err + } + randStreet := streets[rand.Intn(len(streets))] + return stringToStreet(city, randStreet), nil +} + +func (c *OverpassClient) GetRegions() ([]string, error) { + if redisClient != nil { + cached, err := redisClient.Get(ctx, "tracky::regions").Result() + if err == nil { + var regions []string + if err := json.Unmarshal([]byte(cached), ®ions); err == nil { + Info("Retrieved %d regions from Redis cache", len(regions)) + return regions, nil + } + Warning("Failed to unmarshal cached regions: %v", err) + } else if err != redis.Nil { + Warning("Redis get error: %v", err) + } + } + query := `[out:json][timeout:120]; +area["ISO3166-1"="IT"][admin_level=2]->.italy; +relation["boundary"="administrative"]["admin_level"=4]["ISO3166-2"~"^IT-"](area.italy); +out tags;` + + overpassResp, err := c.runQuery(query) + if err != nil { + return nil, err + } + + if len(overpassResp.Elements) == 0 { + return nil, fmt.Errorf("no regions found") + } + regions := make([]string, 0) + for _, element := range overpassResp.Elements { + if element.Type == "relation" { + regions = append(regions, element.Tags["name"]) + } + } + if redisClient != nil { + data, err := json.Marshal(regions) + if err == nil { + if err := redisClient.Set(ctx, "tracky::regions", data, 0).Err(); err != nil { + Warning("Failed to cache regions in Redis: %v", err) + } else { + Info("Cached %d regions in Redis", len(regions)) + } + } + } + return regions, nil +} + +func (c *OverpassClient) GetCities(region string) ([]string, error) { + regionKey := fmt.Sprintf("tracky::regions::%s", region) + if redisClient != nil { + cached, err := redisClient.Get(ctx, regionKey).Result() + if err == nil { + var cities []string + if err := json.Unmarshal([]byte(cached), &cities); err == nil { + Info("Retrieved %d cities (%s) from Redis cache", len(cities), region) + return cities, nil + } + Warning("Failed to unmarshal cached cities: %v", err) + } else if err != redis.Nil { + Warning("Redis get error: %v", err) + } + } + query := fmt.Sprintf(`[out:json][timeout:120]; +relation["boundary"="administrative"]["name"="%s"]["admin_level"=4]->.reg; +.reg map_to_area->.region; +node["place"~"city|town"](area.region); +out tags;`, region) + + overpassResp, err := c.runQuery(query) + if err != nil { + return nil, err + } + + if len(overpassResp.Elements) == 0 { + return nil, fmt.Errorf("no cities found") + } + cities := make([]string, 0) + for _, element := range overpassResp.Elements { + if element.Type == "node" { + cities = append(cities, element.Tags["name"]) + } + } + + if redisClient != nil { + data, err := json.Marshal(cities) + if err == nil { + if err := redisClient.Set(ctx, regionKey, data, 0).Err(); err != nil { + Warning("Failed to cache regions in Redis: %v", err) + } else { + Info("Cached %d cities in Redis", len(cities)) + } + } + } + return cities, nil +} diff --git a/tracky/src-redis-primer/trackeroo/redis.go b/tracky/src-redis-primer/trackeroo/redis.go new file mode 100644 index 00000000..ae18d9b4 --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/redis.go @@ -0,0 +1,33 @@ +package trackeroo + +import ( + "context" + "os" + + "github.com/redis/go-redis/v9" +) + +var ( + redisClient *redis.Client + ctx = context.Background() +) + +func InitRedisClient() { + redisURI := os.Getenv("REDIS_URI") + if redisURI != "" { + opt, err := redis.ParseURL(redisURI) + if err != nil { + Error("Failed to parse REDIS_URI: %v\n", err) + return + } + redisClient = redis.NewClient(opt) + + if err := redisClient.Ping(ctx).Err(); err != nil { + Error("Failed to connect to Redis: %v\n", err) + redisClient = nil + } + } + if redisClient != nil { + Info("Saving checkpoint to %s", redisURI) + } +} diff --git a/tracky/src-redis-primer/trackeroo/routes.go b/tracky/src-redis-primer/trackeroo/routes.go new file mode 100644 index 00000000..096cbc2a --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/routes.go @@ -0,0 +1,80 @@ +package trackeroo + +import ( + "math/rand" +) + +type Street struct { + Coordinate Coordinate `json:"coordinate"` + StreetName string `json:"street_name"` + City string `json:"city"` +} + +type Checkpoint struct { + Poles []Street `json:"poles"` + LastPosition Coordinate `json:"last_position"` +} + +func stringToStreet(city string, street OverpassElement) Street { + return Street{ + Coordinate: street.Geometry[rand.Intn(len(street.Geometry))], + StreetName: street.Tags["name"], + City: city, + } +} + +type CachedStreetProvider struct { + client *OverpassClient + cache map[string][]OverpassElement +} + +func NewCachedStreetProvider(overpassClient *OverpassClient) *CachedStreetProvider { + return &CachedStreetProvider{ + client: overpassClient, + cache: make(map[string][]OverpassElement), + } +} + +func (p *CachedStreetProvider) GetRandomStreet(city string, isUrban bool) (Street, error) { + Info("Getting random street from %s", city) + if streets, ok := p.cache[city]; ok && len(streets) > 0 { + Info("Cache hit for %s", city) + return stringToStreet(city, streets[rand.Intn(len(streets))]), nil + } + radiusMeters := 2000 + if isUrban { + radiusMeters = 10000 + } + streets, err := p.client.GetStreets(city, 100, radiusMeters) + if err != nil { + return Street{}, err + } + + p.cache[city] = streets + + return stringToStreet(city, streets[rand.Intn(len(streets))]), nil +} + +func GetRoute(provider *CachedStreetProvider, cities []string, lastEnd Street, isUrban bool) ([]Street, error, string) { + var route []Street + + if lastEnd.StreetName != "" { + route = append(route, lastEnd) + } else { + city := cities[rand.Intn(len(cities))] + randStreet, err := provider.GetRandomStreet(city, isUrban) + if err != nil { + return nil, err, city + } + route = append(route, randStreet) + } + + city := cities[rand.Intn(len(cities))] + randStreet, err := provider.GetRandomStreet(city, isUrban) + if err != nil { + return nil, err, city + } + route = append(route, randStreet) + + return route, nil, "" +} diff --git a/tracky/src-redis-primer/trackeroo/utils.go b/tracky/src-redis-primer/trackeroo/utils.go new file mode 100755 index 00000000..ee205674 --- /dev/null +++ b/tracky/src-redis-primer/trackeroo/utils.go @@ -0,0 +1,79 @@ +package trackeroo + +import ( + "encoding/json" + "time" +) + +type Number interface { + ~int | ~int8 | ~int16 | ~int32 | ~int64 | + ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | + ~float32 | ~float64 +} + +type StatVar[T Number] struct { + Avg float64 `json:"avg"` + Min T `json:"min"` + Max T `json:"max"` + Count int `json:"count"` +} + +func NewStatVar[T Number]() StatVar[T] { + return StatVar[T]{} +} + +func (sv *StatVar[T]) Add(value T) { + if sv.Count == 0 { + sv.Avg = 0.0 + sv.Min = value + sv.Max = value + } else { + sv.Avg += (float64(value) - sv.Avg) / float64(sv.Count+1) + if value < sv.Min { + sv.Min = value + } + if value > sv.Max { + sv.Max = value + } + } + sv.Count++ +} + +func (sv *StatVar[T]) Get() map[string]any { + res := map[string]any{ + "avg": sv.Avg, + "min": sv.Min, + "max": sv.Max, + "count": sv.Count, + } + sv.Avg = 0.0 + sv.Min = 0 + sv.Max = 0 + sv.Count = 0 + return res +} + +func UnixTime() uint64 { + return uint64(time.Now().Unix()) +} + +func Millisleep(millis int) { + time.Sleep(time.Duration(millis) * time.Millisecond) +} + +func StructToMap[T any](s T) (map[string]any, error) { + // Marshal struct to JSON + jsonData, err := json.Marshal(s) + if err != nil { + return nil, err + } + + // Unmarshal JSON to map + var result map[string]any + err = json.Unmarshal(jsonData, &result) + if err != nil { + return nil, err + } + + return result, nil +} diff --git a/tracky/src-redis-primer/tracky.go b/tracky/src-redis-primer/tracky.go new file mode 100755 index 00000000..074055a3 --- /dev/null +++ b/tracky/src-redis-primer/tracky.go @@ -0,0 +1,51 @@ +package main + +import ( + "fmt" + "os" + "os/signal" + "runtime/debug" + "syscall" + "tracky/trackeroo" +) + +func main() { + fmt.Println(trackeroo.ART) + sigs := make(chan os.Signal, 1) + signal.Notify(sigs, os.Interrupt, syscall.SIGTERM) + + round := 1 + for { + done := make(chan struct{}) + + go func(r int) { + runLoop(r) + close(done) + }(round) + + select { + case <-sigs: + Terminate() + fmt.Println("Terminated task manager, waiting...") + trackeroo.Millisleep(2000) + os.Exit(0) + case <-done: + round++ + } + } +} + +func runLoop(round int) { + defer func() { + if r := recover(); r != nil { + fmt.Printf("Recovered from panic in round %d: %v\n", round, r) + fmt.Printf("Stack trace:\n%s\n", string(debug.Stack())) + + Terminate() + fmt.Println("Terminated task manager, waiting...") + trackeroo.Millisleep(2000) + } + }() + Init() + Loop() +} From 80bc761ab451edf52c3b95bbb1f302c0fe3e98d9 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 14:58:30 +0200 Subject: [PATCH 221/242] primer --- tracky/make_compose.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/make_compose.py b/tracky/make_compose.py index a2d32fa6..457eebe7 100644 --- a/tracky/make_compose.py +++ b/tracky/make_compose.py @@ -68,7 +68,7 @@ def create_compose(credentials: List[Dict]): "REDIS_URI": "redis://redis:6379", "REGIONAL": regional, "URBAN": urban, - "PUBLISH_PERIOD": "1000", + "PUBLISH_PERIOD": "10000", "PIRATE": "true" if random.randint(1, 100) < 10 else "false", }, networks=["tracky"], From 4bb7ca65e5750a9c1f5c260f552b1bda91e798c4 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 15:01:17 +0200 Subject: [PATCH 222/242] primer --- tracky/src-redis-primer/firmware.go | 6 ----- tracky/src-redis-primer/tracky.go | 39 ----------------------------- 2 files changed, 45 deletions(-) diff --git a/tracky/src-redis-primer/firmware.go b/tracky/src-redis-primer/firmware.go index 7a622dfa..92b1c857 100644 --- a/tracky/src-redis-primer/firmware.go +++ b/tracky/src-redis-primer/firmware.go @@ -87,8 +87,6 @@ func alteredFoodData(position trackeroo.DrivePosition) FoodSensors { } } -var taskManager *trackeroo.TaskManager - func Init() { debugLevel := os.Getenv("DEBUG_LEVEL") level := trackeroo.INFO @@ -106,13 +104,9 @@ func Init() { level = trackeroo.INFO } trackeroo.InitLogger(level, "") - trackeroo.InitQueue("data") - taskManager = trackeroo.NewTaskManager() - go taskManager.Start() } func Terminate() { - taskManager.Shutdown(0) } func Loop() { diff --git a/tracky/src-redis-primer/tracky.go b/tracky/src-redis-primer/tracky.go index 074055a3..3054af68 100755 --- a/tracky/src-redis-primer/tracky.go +++ b/tracky/src-redis-primer/tracky.go @@ -2,50 +2,11 @@ package main import ( "fmt" - "os" - "os/signal" - "runtime/debug" - "syscall" "tracky/trackeroo" ) func main() { fmt.Println(trackeroo.ART) - sigs := make(chan os.Signal, 1) - signal.Notify(sigs, os.Interrupt, syscall.SIGTERM) - - round := 1 - for { - done := make(chan struct{}) - - go func(r int) { - runLoop(r) - close(done) - }(round) - - select { - case <-sigs: - Terminate() - fmt.Println("Terminated task manager, waiting...") - trackeroo.Millisleep(2000) - os.Exit(0) - case <-done: - round++ - } - } -} - -func runLoop(round int) { - defer func() { - if r := recover(); r != nil { - fmt.Printf("Recovered from panic in round %d: %v\n", round, r) - fmt.Printf("Stack trace:\n%s\n", string(debug.Stack())) - - Terminate() - fmt.Println("Terminated task manager, waiting...") - trackeroo.Millisleep(2000) - } - }() Init() Loop() } From 7fae121f0c19ad843ea997d85d1d6bcfad441a1f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 15:11:22 +0200 Subject: [PATCH 223/242] primer --- tracky/src-redis-primer/firmware.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tracky/src-redis-primer/firmware.go b/tracky/src-redis-primer/firmware.go index 92b1c857..3f95e4e4 100644 --- a/tracky/src-redis-primer/firmware.go +++ b/tracky/src-redis-primer/firmware.go @@ -3,6 +3,7 @@ package main import ( "math/rand" "os" + "sync" "time" "tracky/trackeroo" ) @@ -123,7 +124,28 @@ func Loop() { c, _ := overpassClient.GetCities(region) cities = append(cities, c...) } - for _, city := range cities { - overpassClient.GetStreets(city, 100, 2000) + wg := sync.WaitGroup{} + i := 0 + for i = 0; i < len(cities); i += 4 { + tmp := cities[i : i+4] + for j := range 4 { + wg.Add(1) + go func() { + overpassClient.GetStreets(tmp[j], 100, 2000) + wg.Done() + }() + } + wg.Wait() + } + tmp := cities[i-4:] + if len(tmp) > 0 { + for j := range len(cities) { + wg.Add(1) + go func() { + overpassClient.GetStreets(tmp[j], 100, 2000) + wg.Done() + }() + } + wg.Wait() } } From 5049c075090517e1c878295babcf6d68085853a5 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 15:12:56 +0200 Subject: [PATCH 224/242] primer --- tracky/src-redis-primer/firmware.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tracky/src-redis-primer/firmware.go b/tracky/src-redis-primer/firmware.go index 3f95e4e4..e5118fdb 100644 --- a/tracky/src-redis-primer/firmware.go +++ b/tracky/src-redis-primer/firmware.go @@ -125,10 +125,11 @@ func Loop() { cities = append(cities, c...) } wg := sync.WaitGroup{} + parallelism := 8 i := 0 - for i = 0; i < len(cities); i += 4 { - tmp := cities[i : i+4] - for j := range 4 { + for i = 0; i < len(cities); i += parallelism { + tmp := cities[i : i+parallelism] + for j := range parallelism { wg.Add(1) go func() { overpassClient.GetStreets(tmp[j], 100, 2000) @@ -137,7 +138,7 @@ func Loop() { } wg.Wait() } - tmp := cities[i-4:] + tmp := cities[i-parallelism:] if len(tmp) > 0 { for j := range len(cities) { wg.Add(1) From 73b4e40937d4a97bfa404bbaa9de4cb129fad811 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 15:20:20 +0200 Subject: [PATCH 225/242] primer --- tracky/src-redis-primer/firmware.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tracky/src-redis-primer/firmware.go b/tracky/src-redis-primer/firmware.go index e5118fdb..6e2c7aff 100644 --- a/tracky/src-redis-primer/firmware.go +++ b/tracky/src-redis-primer/firmware.go @@ -130,6 +130,9 @@ func Loop() { for i = 0; i < len(cities); i += parallelism { tmp := cities[i : i+parallelism] for j := range parallelism { + if j > len(tmp) { + break + } wg.Add(1) go func() { overpassClient.GetStreets(tmp[j], 100, 2000) From 1f557b59bc5904259fad5552f3e5aaaacac46107 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 15:30:24 +0200 Subject: [PATCH 226/242] primer --- tracky/src/trackeroo/driving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index a2677783..fc548e20 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -145,7 +145,7 @@ func (rs *RoutingService) GetRoute(from, to Coordinate) ([]RouteSegment, error) } func getConsumption(speed float64, devType string) float64 { - if speed == 0 { + if speed <= 5.0 { return 0.0 } threshold := 80.0 From df3df3c7cdd0701fd403b242c74a59ea579bcecd Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 15:37:52 +0200 Subject: [PATCH 227/242] primer --- tracky/src/trackeroo/driving.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/driving.go b/tracky/src/trackeroo/driving.go index fc548e20..7fc0bc60 100644 --- a/tracky/src/trackeroo/driving.go +++ b/tracky/src/trackeroo/driving.go @@ -153,7 +153,7 @@ func getConsumption(speed float64, devType string) float64 { if speed >= threshold { consumption += 5 * math.Log(speed/threshold) } - return max(consumption*float64(consumptionMultipliers[devType]), MAX_CONSUMPTION) + return min(consumption*float64(consumptionMultipliers[devType]), MAX_CONSUMPTION) } // DrivingSimulator simulates realistic car driving From 9e1ebc4ad826830fe149173d1187a027d48a4527 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 16:04:12 +0200 Subject: [PATCH 228/242] tsdb --- .../playbooks/roles/tsdb/files/02-schema.sql | 7 ++++++ tsdb/docker-entrypoint-initdb.d/02-schema.sql | 24 +++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index ce93df83..5ce4a4c9 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -32,6 +32,13 @@ CREATE INDEX IF NOT EXISTS idx_trackeroo_data_ts ON trackeroo.data(ts); -- Added to speedup the last position query CREATE INDEX IF NOT EXISTS idx_trackeroo_data_dev_id_ts_desc ON trackeroo.data (dev_id, ts DESC); +CREATE INDEX IF NOT EXISTS idx_data_device_type ON trackeroo.data ((payload->>'device_type')); +ALTER TABLE trackeroo.data SET ( + timescaledb.compress, + timescaledb.compress_segmentby = 'dev_id,tag', + timescaledb.compress_orderby = 'ts DESC' +); +SELECT add_compression_policy('trackeroo.data', INTERVAL '6 hours'); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_dev_id ON trackeroo.aggregated(dev_id); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_route_hash ON trackeroo.aggregated(route_hash); diff --git a/tsdb/docker-entrypoint-initdb.d/02-schema.sql b/tsdb/docker-entrypoint-initdb.d/02-schema.sql index 3c5f91d4..9aae847f 100644 --- a/tsdb/docker-entrypoint-initdb.d/02-schema.sql +++ b/tsdb/docker-entrypoint-initdb.d/02-schema.sql @@ -10,7 +10,6 @@ CREATE TABLE IF NOT EXISTS trackeroo.data ( PRIMARY KEY (ts, dev_id) ); - CREATE TABLE IF NOT EXISTS trackeroo.aggregated ( ts_unix BIGINT NOT NULL, ts TIMESTAMPTZ NOT NULL, @@ -23,18 +22,35 @@ CREATE TABLE IF NOT EXISTS trackeroo.aggregated ( PRIMARY KEY (ts, route_hash, dev_id) ); -SELECT create_hypertable('trackeroo.data', 'ts', 'dev_id', 16); -SELECT create_hypertable('trackeroo.aggregated', 'ts', 'dev_id', 16); - +SELECT create_hypertable('trackeroo.data', 'ts', 'dev_id', 4); +SELECT create_hypertable('trackeroo.aggregated', 'ts', 'dev_id', 4); +SELECT set_chunk_time_interval('trackeroo.data', INTERVAL '12 hours'); +SELECT set_chunk_time_interval('trackeroo.aggregated', INTERVAL '12 hours'); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_dev_id ON trackeroo.data(dev_id); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_tag ON trackeroo.data(tag); CREATE INDEX IF NOT EXISTS idx_trackeroo_data_ts ON trackeroo.data(ts); +-- Added to speedup the last position query +CREATE INDEX IF NOT EXISTS idx_trackeroo_data_dev_id_ts_desc ON trackeroo.data (dev_id, ts DESC); +CREATE INDEX IF NOT EXISTS idx_data_device_type ON trackeroo.data ((payload->>'device_type')); +ALTER TABLE trackeroo.data SET ( + timescaledb.compress, + timescaledb.compress_segmentby = 'dev_id,tag', + timescaledb.compress_orderby = 'ts DESC' +); +SELECT add_compression_policy('trackeroo.data', INTERVAL '6 hours'); + CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_dev_id ON trackeroo.aggregated(dev_id); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_route_hash ON trackeroo.aggregated(route_hash); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_tag ON trackeroo.aggregated(tag); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_ts ON trackeroo.aggregated(ts); +ALTER TABLE trackeroo.aggregated SET ( + timescaledb.compress, + timescaledb.compress_segmentby = 'dev_id,route_hash,tag', + timescaledb.compress_orderby = 'ts DESC' +); +SELECT add_compression_policy('trackeroo.aggregated', INTERVAL '6 hours'); SELECT add_retention_policy('trackeroo.data', INTERVAL '3 days'); SELECT add_retention_policy('trackeroo.aggregated', INTERVAL '3 days'); From be6db139e5fdc1e2fc29b66f196f604d91f5d1a2 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Fri, 24 Oct 2025 16:28:33 +0200 Subject: [PATCH 229/242] checkpoint --- tracky/src/firmware.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 059e4677..20c10810 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -208,6 +208,7 @@ func Loop() { cities = append(cities[:i], cities[i+1:]...) } } + trackeroo.DeleteCheckpoint(checkpointFile) continue } } From 949f4615077f9e50a983fb87b09dc7addae4b5b7 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 16:58:02 +0200 Subject: [PATCH 230/242] memory limits and maerialized view --- .../templates/03-kafka-deployment.yml.j2 | 9 +++++ .../playbooks/roles/tsdb/files/01-init.sql | 1 + .../playbooks/roles/tsdb/files/02-schema.sql | 33 +++++++++++++++++++ .../roles/tsdb/templates/tsdb-cluster.yml.j2 | 7 ++++ 4 files changed, 50 insertions(+) diff --git a/services/playbooks/roles/kafka/templates/03-kafka-deployment.yml.j2 b/services/playbooks/roles/kafka/templates/03-kafka-deployment.yml.j2 index 5bceea53..342e2e5b 100644 --- a/services/playbooks/roles/kafka/templates/03-kafka-deployment.yml.j2 +++ b/services/playbooks/roles/kafka/templates/03-kafka-deployment.yml.j2 @@ -25,6 +25,13 @@ spec: containerPort: {{ kafka_port }} - name: plaintext-host containerPort: {{ kafka_host_port }} + resources: + requests: + memory: "2Gi" + cpu: "1" + limits: + memory: "3Gi" + cpu: "2" env: - name: KAFKA_BROKER_ID value: "{{ kafka_broker_id }}" @@ -38,6 +45,8 @@ spec: value: "PLAINTEXT" - name: KAFKA_LOG4J_ROOT_LOGLEVEL value: "INFO" + - name: KAFKA_HEAP_OPTS + value: "-Xms1G -Xmx2G" readinessProbe: tcpSocket: port: {{ kafka_port }} diff --git a/services/playbooks/roles/tsdb/files/01-init.sql b/services/playbooks/roles/tsdb/files/01-init.sql index 63d81558..2aaaa16d 100644 --- a/services/playbooks/roles/tsdb/files/01-init.sql +++ b/services/playbooks/roles/tsdb/files/01-init.sql @@ -3,6 +3,7 @@ CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; CREATE EXTENSION IF NOT EXISTS fuzzystrmatch; CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder; +CREATE EXTENSION IF NOT EXISTS pg_cron; DO $$ BEGIN diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index 5ce4a4c9..0e4efabf 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -44,7 +44,13 @@ CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_dev_id ON trackeroo.aggregat CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_route_hash ON trackeroo.aggregated(route_hash); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_tag ON trackeroo.aggregated(tag); CREATE INDEX IF NOT EXISTS idx_trackeroo_aggregated_ts ON trackeroo.aggregated(ts); +ALTER TABLE trackeroo.aggregated SET ( + timescaledb.compress, + timescaledb.compress_segmentby = 'dev_id,route_hash,tag', + timescaledb.compress_orderby = 'ts DESC' +); +SELECT add_compression_policy('trackeroo.aggregated', INTERVAL '6 hours'); SELECT add_retention_policy('trackeroo.data', INTERVAL '3 days'); SELECT add_retention_policy('trackeroo.aggregated', INTERVAL '3 days'); @@ -63,3 +69,30 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA trackeroo ALTER DEFAULT PRIVILEGES IN SCHEMA trackeroo GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO apps; + +-- Last position materialized views +CREATE MATERIALIZED VIEW trackeroo.latest_positions AS +SELECT d.dev_id, + last.ts, + (last.payload->'position'->>'lat')::double precision AS lat, + (last.payload->'position'->>'lon')::double precision AS lon, + last.payload->>'device_name' AS device_name, + last.payload->>'device_type' AS device_type +FROM (SELECT DISTINCT dev_id FROM trackeroo.data) d +CROSS JOIN LATERAL ( + SELECT ts, payload + FROM trackeroo.data + WHERE trackeroo.data.dev_id = d.dev_id + AND (payload->'position'->>'lat') IS NOT NULL + AND (payload->'position'->>'lon') IS NOT NULL + ORDER BY ts DESC + LIMIT 1 +) last; + +GRANT UPDATE, SELECT ON trackeroo.latest_positions TO apps; +CREATE UNIQUE INDEX ON trackeroo.latest_positions (dev_id); +SELECT cron.schedule( + 'refresh_latest_positions', + '*/2 * * * *', + 'REFRESH MATERIALIZED VIEW CONCURRENTLY trackeroo.latest_positions;' +); diff --git a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 index a96c9f95..61be4322 100644 --- a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 +++ b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 @@ -12,6 +12,13 @@ spec: instances: {{ instances }} imageName: {{ image }} imagePullPolicy: Always + resources: + requests: + memory: "1Gi" + cpu: "1" + limits: + memory: "3Gi" + cpu: "2" postgresql: shared_preload_libraries: - "timescaledb" From bf595be7dd02fa13b7e94be3e4fabf1d6703bdbe Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:10:18 +0200 Subject: [PATCH 231/242] pg_cron --- .../playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 | 1 + tsdb/Dockerfile | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 index 61be4322..9d0989ce 100644 --- a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 +++ b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 @@ -22,6 +22,7 @@ spec: postgresql: shared_preload_libraries: - "timescaledb" + - "pg_cron" parameters: max_connections: "{{ max_connections }}" timescaledb.telemetry_level: "off" diff --git a/tsdb/Dockerfile b/tsdb/Dockerfile index ad0d2342..160d9032 100644 --- a/tsdb/Dockerfile +++ b/tsdb/Dockerfile @@ -1,5 +1,4 @@ FROM postgres:17-bookworm - RUN apt-get update && apt-get install -y \ gnupg wget ca-certificates lsb-release software-properties-common && \ rm -rf /var/lib/apt/lists/* @@ -14,12 +13,13 @@ RUN wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor echo "deb [signed-by=/usr/share/keyrings/postgres.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -c -s)-pgdg main" \ > /etc/apt/sources.list.d/pgdg.list -# Install TimescaleDB + PostGIS +# Install TimescaleDB + PostGIS + pg_cron RUN apt-get update && apt-get install -y \ timescaledb-2-postgresql-17 \ postgresql-17-postgis-3 \ postgresql-17-postgis-3-scripts \ + postgresql-17-cron \ && rm -rf /var/lib/apt/lists/* -# Enable TimescaleDB preload -RUN echo "shared_preload_libraries='timescaledb'" >> /usr/share/postgresql/postgresql.conf +# Enable TimescaleDB and pg_cron preload +RUN echo "shared_preload_libraries='timescaledb,pg_cron'" >> /usr/share/postgresql/postgresql.conf From 08efc77047ba4c649a46bb0d9bccf48a42722936 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:11:13 +0200 Subject: [PATCH 232/242] pg_cron --- docker-compose-pull.yml | 8 ++++---- docker-compose.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docker-compose-pull.yml b/docker-compose-pull.yml index f4c8f3bd..80275276 100644 --- a/docker-compose-pull.yml +++ b/docker-compose-pull.yml @@ -97,7 +97,7 @@ services: interval: 10s timeout: 5s retries: 5 - command: ["postgres", "-c", "shared_preload_libraries=timescaledb"] + command: ["postgres", "-c", "shared_preload_libraries=timescaledb,pg_cron"] environment: POSTGRES_DB: tracker_db POSTGRES_USER: postgres @@ -138,7 +138,7 @@ services: TOPIC_PATTERN: j/data/+/+ KAFKA_BROKER: kafka:9092 depends_on: - kafka: + kafka: condition: service_started tsdb: condition: service_healthy @@ -182,7 +182,7 @@ services: KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT - KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT depends_on: - zookeeper @@ -231,7 +231,7 @@ volumes: tsdb-data: pgadmin-data: grafana-data: - redis-data: + redis-data: secrets: users_key: diff --git a/docker-compose.yml b/docker-compose.yml index b759b7ea..4b710f38 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -100,7 +100,7 @@ services: interval: 10s timeout: 5s retries: 5 - command: ["postgres", "-c", "shared_preload_libraries=timescaledb"] + command: ["postgres", "-c", "shared_preload_libraries=timescaledb,pg_cron"] environment: POSTGRES_DB: tracker_db POSTGRES_USER: postgres From 37a73026e879f3182c784ddfa0c877fe6839e415 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:18:09 +0200 Subject: [PATCH 233/242] pg_cron --- services/playbooks/roles/tsdb/files/01-init.sql | 1 - services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/services/playbooks/roles/tsdb/files/01-init.sql b/services/playbooks/roles/tsdb/files/01-init.sql index 2aaaa16d..63d81558 100644 --- a/services/playbooks/roles/tsdb/files/01-init.sql +++ b/services/playbooks/roles/tsdb/files/01-init.sql @@ -3,7 +3,6 @@ CREATE EXTENSION IF NOT EXISTS postgis; CREATE EXTENSION IF NOT EXISTS postgis_topology; CREATE EXTENSION IF NOT EXISTS fuzzystrmatch; CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder; -CREATE EXTENSION IF NOT EXISTS pg_cron; DO $$ BEGIN diff --git a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 index 9d0989ce..a4aefeef 100644 --- a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 +++ b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 @@ -36,6 +36,8 @@ spec: owner: {{ admin_user | default('admin') }} # https://cloudnative-pg.io/documentation/preview/bootstrap/#executing-queries-after-initialization # The ApplicationSQL indicates that the SQL scripts will be executed against the newly created database defined above. + postInitSQL: + - CREATE EXTENSION IF NOT EXISTS pg_cron postInitApplicationSQLRefs: configMapRefs: - name: "{{ cluster_name }}-init-scripts" From 53a51d8d886a688acbc03c4a7a225c61f7e1bbec Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:22:03 +0200 Subject: [PATCH 234/242] pg_cron --- services/playbooks/roles/tsdb/files/01-init.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/playbooks/roles/tsdb/files/01-init.sql b/services/playbooks/roles/tsdb/files/01-init.sql index 63d81558..2917bb1c 100644 --- a/services/playbooks/roles/tsdb/files/01-init.sql +++ b/services/playbooks/roles/tsdb/files/01-init.sql @@ -32,3 +32,5 @@ GRANT USAGE ON SCHEMA _timescaledb_config TO apps; GRANT USAGE ON SCHEMA _timescaledb_internal TO apps; GRANT SELECT ON ALL TABLES IN SCHEMA _timescaledb_catalog TO apps; GRANT SELECT ON ALL TABLES IN SCHEMA _timescaledb_config TO apps; +GRANT USAGE ON SCHEMA cron TO admin; +GRANT USAGE ON SCHEMA cron TO apps; From bda652b5d47747cd3e2e52156a01fe281b65af97 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:29:54 +0200 Subject: [PATCH 235/242] continuous aggregate --- docker-compose-pull.yml | 2 +- docker-compose.yml | 2 +- .../playbooks/roles/tsdb/files/01-init.sql | 2 - .../roles/tsdb/templates/tsdb-cluster.yml.j2 | 3 -- tsdb/Dockerfile | 8 ++-- tsdb/docker-entrypoint-initdb.d/02-schema.sql | 43 +++++++++++++++++++ 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/docker-compose-pull.yml b/docker-compose-pull.yml index 80275276..b679467b 100644 --- a/docker-compose-pull.yml +++ b/docker-compose-pull.yml @@ -97,7 +97,7 @@ services: interval: 10s timeout: 5s retries: 5 - command: ["postgres", "-c", "shared_preload_libraries=timescaledb,pg_cron"] + command: ["postgres", "-c", "shared_preload_libraries=timescaledb"] environment: POSTGRES_DB: tracker_db POSTGRES_USER: postgres diff --git a/docker-compose.yml b/docker-compose.yml index 4b710f38..b759b7ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -100,7 +100,7 @@ services: interval: 10s timeout: 5s retries: 5 - command: ["postgres", "-c", "shared_preload_libraries=timescaledb,pg_cron"] + command: ["postgres", "-c", "shared_preload_libraries=timescaledb"] environment: POSTGRES_DB: tracker_db POSTGRES_USER: postgres diff --git a/services/playbooks/roles/tsdb/files/01-init.sql b/services/playbooks/roles/tsdb/files/01-init.sql index 2917bb1c..63d81558 100644 --- a/services/playbooks/roles/tsdb/files/01-init.sql +++ b/services/playbooks/roles/tsdb/files/01-init.sql @@ -32,5 +32,3 @@ GRANT USAGE ON SCHEMA _timescaledb_config TO apps; GRANT USAGE ON SCHEMA _timescaledb_internal TO apps; GRANT SELECT ON ALL TABLES IN SCHEMA _timescaledb_catalog TO apps; GRANT SELECT ON ALL TABLES IN SCHEMA _timescaledb_config TO apps; -GRANT USAGE ON SCHEMA cron TO admin; -GRANT USAGE ON SCHEMA cron TO apps; diff --git a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 index a4aefeef..61be4322 100644 --- a/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 +++ b/services/playbooks/roles/tsdb/templates/tsdb-cluster.yml.j2 @@ -22,7 +22,6 @@ spec: postgresql: shared_preload_libraries: - "timescaledb" - - "pg_cron" parameters: max_connections: "{{ max_connections }}" timescaledb.telemetry_level: "off" @@ -36,8 +35,6 @@ spec: owner: {{ admin_user | default('admin') }} # https://cloudnative-pg.io/documentation/preview/bootstrap/#executing-queries-after-initialization # The ApplicationSQL indicates that the SQL scripts will be executed against the newly created database defined above. - postInitSQL: - - CREATE EXTENSION IF NOT EXISTS pg_cron postInitApplicationSQLRefs: configMapRefs: - name: "{{ cluster_name }}-init-scripts" diff --git a/tsdb/Dockerfile b/tsdb/Dockerfile index 160d9032..ad0d2342 100644 --- a/tsdb/Dockerfile +++ b/tsdb/Dockerfile @@ -1,4 +1,5 @@ FROM postgres:17-bookworm + RUN apt-get update && apt-get install -y \ gnupg wget ca-certificates lsb-release software-properties-common && \ rm -rf /var/lib/apt/lists/* @@ -13,13 +14,12 @@ RUN wget -qO- https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor echo "deb [signed-by=/usr/share/keyrings/postgres.gpg] http://apt.postgresql.org/pub/repos/apt $(lsb_release -c -s)-pgdg main" \ > /etc/apt/sources.list.d/pgdg.list -# Install TimescaleDB + PostGIS + pg_cron +# Install TimescaleDB + PostGIS RUN apt-get update && apt-get install -y \ timescaledb-2-postgresql-17 \ postgresql-17-postgis-3 \ postgresql-17-postgis-3-scripts \ - postgresql-17-cron \ && rm -rf /var/lib/apt/lists/* -# Enable TimescaleDB and pg_cron preload -RUN echo "shared_preload_libraries='timescaledb,pg_cron'" >> /usr/share/postgresql/postgresql.conf +# Enable TimescaleDB preload +RUN echo "shared_preload_libraries='timescaledb'" >> /usr/share/postgresql/postgresql.conf diff --git a/tsdb/docker-entrypoint-initdb.d/02-schema.sql b/tsdb/docker-entrypoint-initdb.d/02-schema.sql index 9aae847f..af84a730 100644 --- a/tsdb/docker-entrypoint-initdb.d/02-schema.sql +++ b/tsdb/docker-entrypoint-initdb.d/02-schema.sql @@ -69,3 +69,46 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA trackeroo ALTER DEFAULT PRIVILEGES IN SCHEMA trackeroo GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO apps; + +-- Latest positions continuous aggregate (replaces materialized view) +CREATE MATERIALIZED VIEW trackeroo.latest_positions +WITH (timescaledb.continuous) AS +SELECT + dev_id, + time_bucket('30 seconds', ts) AS bucket, + last(ts, ts) AS ts, + last((payload->'position'->>'lat')::double precision, ts) AS lat, + last((payload->'position'->>'lon')::double precision, ts) AS lon, + last(payload->>'device_name', ts) AS device_name, + last(payload->>'device_type', ts) AS device_type +FROM trackeroo.data +WHERE (payload->'position'->>'lat') IS NOT NULL + AND (payload->'position'->>'lon') IS NOT NULL +GROUP BY dev_id, bucket +WITH NO DATA; + +-- Add automatic refresh policy (refreshes every 2 minutes) +SELECT add_continuous_aggregate_policy('trackeroo.latest_positions', + start_offset => INTERVAL '1 hour', + end_offset => INTERVAL '30 seconds', + schedule_interval => INTERVAL '2 minutes'); + +-- Create unique index on the continuous aggregate +CREATE UNIQUE INDEX idx_latest_positions_dev_bucket ON trackeroo.latest_positions (dev_id, bucket); + +-- Create a simple view to get the current position for each device +-- This view queries the continuous aggregate and returns only the latest position per device +CREATE VIEW trackeroo.current_positions AS +SELECT DISTINCT ON (dev_id) + dev_id, + ts, + lat, + lon, + device_name, + device_type +FROM trackeroo.latest_positions +ORDER BY dev_id, bucket DESC; + +-- Grant permissions on the new views +GRANT SELECT ON trackeroo.latest_positions TO apps; +GRANT SELECT ON trackeroo.current_positions TO apps; From d01c5e696fd9581cfedc723e33ace6ad53a090a4 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:37:53 +0200 Subject: [PATCH 236/242] continuous aggregate --- services/playbooks/roles/tsdb/files/02-schema.sql | 5 ----- 1 file changed, 5 deletions(-) diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index 0e4efabf..8c7882ab 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -91,8 +91,3 @@ CROSS JOIN LATERAL ( GRANT UPDATE, SELECT ON trackeroo.latest_positions TO apps; CREATE UNIQUE INDEX ON trackeroo.latest_positions (dev_id); -SELECT cron.schedule( - 'refresh_latest_positions', - '*/2 * * * *', - 'REFRESH MATERIALIZED VIEW CONCURRENTLY trackeroo.latest_positions;' -); From 506484e533c7a911d0e83e70da7f9aae2ae74e77 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:38:23 +0200 Subject: [PATCH 237/242] continuous aggregate --- .../playbooks/roles/tsdb/files/02-schema.sql | 63 ++++++++++++------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index 8c7882ab..cb8f9041 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -70,24 +70,45 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA trackeroo ALTER DEFAULT PRIVILEGES IN SCHEMA trackeroo GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO apps; --- Last position materialized views -CREATE MATERIALIZED VIEW trackeroo.latest_positions AS -SELECT d.dev_id, - last.ts, - (last.payload->'position'->>'lat')::double precision AS lat, - (last.payload->'position'->>'lon')::double precision AS lon, - last.payload->>'device_name' AS device_name, - last.payload->>'device_type' AS device_type -FROM (SELECT DISTINCT dev_id FROM trackeroo.data) d -CROSS JOIN LATERAL ( - SELECT ts, payload - FROM trackeroo.data - WHERE trackeroo.data.dev_id = d.dev_id - AND (payload->'position'->>'lat') IS NOT NULL - AND (payload->'position'->>'lon') IS NOT NULL - ORDER BY ts DESC - LIMIT 1 -) last; - -GRANT UPDATE, SELECT ON trackeroo.latest_positions TO apps; -CREATE UNIQUE INDEX ON trackeroo.latest_positions (dev_id); +--- Latest positions continuous aggregate (replaces materialized view) +CREATE MATERIALIZED VIEW trackeroo.latest_positions +WITH (timescaledb.continuous) AS +SELECT + dev_id, + time_bucket('30 seconds', ts) AS bucket, + last(ts, ts) AS ts, + last((payload->'position'->>'lat')::double precision, ts) AS lat, + last((payload->'position'->>'lon')::double precision, ts) AS lon, + last(payload->>'device_name', ts) AS device_name, + last(payload->>'device_type', ts) AS device_type +FROM trackeroo.data +WHERE (payload->'position'->>'lat') IS NOT NULL + AND (payload->'position'->>'lon') IS NOT NULL +GROUP BY dev_id, bucket +WITH NO DATA; + +-- Add automatic refresh policy (refreshes every 2 minutes) +SELECT add_continuous_aggregate_policy('trackeroo.latest_positions', + start_offset => INTERVAL '1 hour', + end_offset => INTERVAL '30 seconds', + schedule_interval => INTERVAL '2 minutes'); + +-- Create unique index on the continuous aggregate +CREATE UNIQUE INDEX idx_latest_positions_dev_bucket ON trackeroo.latest_positions (dev_id, bucket); + +-- Create a simple view to get the current position for each device +-- This view queries the continuous aggregate and returns only the latest position per device +CREATE VIEW trackeroo.current_positions AS +SELECT DISTINCT ON (dev_id) + dev_id, + ts, + lat, + lon, + device_name, + device_type +FROM trackeroo.latest_positions +ORDER BY dev_id, bucket DESC; + +-- Grant permissions on the new views +GRANT SELECT ON trackeroo.latest_positions TO apps; +GRANT SELECT ON trackeroo.current_positions TO apps; From e6e7f505bb4c7aea78a5daaa26c7b00e6d5ae09f Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 17:41:11 +0200 Subject: [PATCH 238/242] continuous aggregate --- services/playbooks/roles/tsdb/files/02-schema.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index cb8f9041..eb48c499 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -93,8 +93,8 @@ SELECT add_continuous_aggregate_policy('trackeroo.latest_positions', end_offset => INTERVAL '30 seconds', schedule_interval => INTERVAL '2 minutes'); --- Create unique index on the continuous aggregate -CREATE UNIQUE INDEX idx_latest_positions_dev_bucket ON trackeroo.latest_positions (dev_id, bucket); +-- Create index on the continuous aggregate +CREATE INDEX idx_latest_positions_dev_bucket ON trackeroo.latest_positions (dev_id, bucket DESC); -- Create a simple view to get the current position for each device -- This view queries the continuous aggregate and returns only the latest position per device From 6de3b951209473b96fc031853d133b19d8f39d36 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sat, 25 Oct 2025 18:11:40 +0200 Subject: [PATCH 239/242] continuous aggregate --- services/playbooks/roles/tsdb/files/02-schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/playbooks/roles/tsdb/files/02-schema.sql b/services/playbooks/roles/tsdb/files/02-schema.sql index eb48c499..bbc48d67 100644 --- a/services/playbooks/roles/tsdb/files/02-schema.sql +++ b/services/playbooks/roles/tsdb/files/02-schema.sql @@ -89,7 +89,7 @@ WITH NO DATA; -- Add automatic refresh policy (refreshes every 2 minutes) SELECT add_continuous_aggregate_policy('trackeroo.latest_positions', - start_offset => INTERVAL '1 hour', + start_offset => INTERVAL '10 minutes', end_offset => INTERVAL '30 seconds', schedule_interval => INTERVAL '2 minutes'); From 7d5f8d74a15877b1cab9f36090387a6b161c7d9e Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 26 Oct 2025 18:41:48 +0100 Subject: [PATCH 240/242] new token --- tracky/src/trackeroo/mqtt.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tracky/src/trackeroo/mqtt.go b/tracky/src/trackeroo/mqtt.go index 857facaa..396d7d15 100755 --- a/tracky/src/trackeroo/mqtt.go +++ b/tracky/src/trackeroo/mqtt.go @@ -170,7 +170,13 @@ func (t *TdmClient) initClient() { opts.SetAutoReconnect(true) opts.SetMaxReconnectInterval(5 * time.Second) opts.SetReconnectingHandler(func(c pahoMqtt.Client, op *pahoMqtt.ClientOptions) { - Info("Trying to reconnect...") + token, err := GetToken(t.creds.PrivateKey, 200, 200, t.creds.ID) + // fmt.Println(token) + if err != nil { + Error("Cannot create token, %v", err) + } + op.SetPassword(token) + Info("Trying to reconnect with new token...") }) opts.SetConnectionLostHandler(func(c pahoMqtt.Client, err error) { Error("MQTT Connection lost:", err) From 406e1ae3690b4ca6377405239a9fab735cdb15f8 Mon Sep 17 00:00:00 2001 From: Skiby7 Date: Sun, 26 Oct 2025 21:16:43 +0100 Subject: [PATCH 241/242] MORE MEMORYYY' --- bootstrap/cloud-init/specs.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bootstrap/cloud-init/specs.yaml b/bootstrap/cloud-init/specs.yaml index 95b1df5a..432f82eb 100644 --- a/bootstrap/cloud-init/specs.yaml +++ b/bootstrap/cloud-init/specs.yaml @@ -46,7 +46,7 @@ - machine_type: node name: k3s-node-hermes cpu: 8 - ram: 8192 + ram: 10240 os_storage: 20 longhorn_storage: 150 networks: @@ -61,7 +61,7 @@ - machine_type: node name: k3s-node-achilles cpu: 8 - ram: 8192 + ram: 10240 os_storage: 20 longhorn_storage: 150 networks: @@ -76,7 +76,7 @@ - machine_type: node name: k3s-node-odysseus cpu: 8 - ram: 8192 + ram: 10240 os_storage: 20 longhorn_storage: 150 networks: From 4b5cf5bcfb79307f5c2ca6a69b5908823b9ba2aa Mon Sep 17 00:00:00 2001 From: Leonardo Scoppitto <70918126+skiby7@users.noreply.github.com> Date: Wed, 29 Oct 2025 00:44:38 +0100 Subject: [PATCH 242/242] Update firmware.go --- tracky/src/firmware.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tracky/src/firmware.go b/tracky/src/firmware.go index 20c10810..6ce8b7e2 100644 --- a/tracky/src/firmware.go +++ b/tracky/src/firmware.go @@ -230,6 +230,8 @@ func Loop() { positionChan := drivingSimulator.SimulateDrive() if rand.Float64() < 0.05 || os.Getenv("NORMAL_RUN") == "false" { normalRun = false + } else { + normalRun = true } for position := range positionChan { deltaDistance += position.Distance