Billionmail/BillionMail · error

failed to convert overview data: %v

Error message

failed to convert overview data: %v

What it means

rebuildPostfixServiceNetworks1 found the 'services' mapping but no map entry named 'postfix-billionmail', so it cannot rebuild the Postfix service's network config. Message wording differs from error 403 but the condition is identical.

Source

Thrown at core/internal/controller/batch_mail/batch_mail_v1_task_stat_chart.go:39

		res.Code = 500
		res.SetError(gerror.New(public.LangCtx(ctx, "Failed to get task information: {}", err.Error())))
		return
	}

	if taskInfo == nil || taskInfo.Id == 0 {
		res.Code = 404
		res.SetError(gerror.New(public.LangCtx(ctx, "Task not found: {}", req.TaskId)))
		return
	}

	// reuse the maillog_stat service to get the overview
	overview := maillog_stat.NewOverview()
	overviewMap := overview.Overview(req.TaskId, req.Domain, req.StartTime, req.EndTime)

	err = gconv.Struct(overviewMap, &res.Data)

	if err != nil {
		err = fmt.Errorf("failed to convert overview data: %v", err)
		return
	}

	//statService := batch_mail.NewTaskStatService()
	//
	//chartData := statService.GetTaskStatChart(req.TaskId, req.Domain, req.StartTime, req.EndTime)
	//
	//res.Data.Dashboard = chartData["dashboard"]
	//res.Data.MailProviders = chartData["mail_providers"]
	//res.Data.SendMailChart = chartData["send_mail_chart"]
	//res.Data.BounceRateChart = chartData["bounce_rate_chart"]
	//res.Data.OpenRateChart = chartData["open_rate_chart"]
	//res.Data.ClickRateChart = chartData["click_rate_chart"]

	res.SetSuccess(public.LangCtx(ctx, "Task statistics retrieved successfully"))
	return
}

View on GitHub (pinned to fc36c76c05)

Solutions

  1. Add/restore a service named exactly 'postfix-billionmail' in the compose file being parsed
  2. Merge override files into the config before calling the rebuild
  3. Adapt the hardcoded service key in config_manager.go if renaming intentionally
  4. Log the keys of dockerConfig["services"] to confirm what the parser produced

Example fix

// before
services:
  postfix: {image: billionmail/postfix}
// after
services:
  postfix-billionmail: {image: billionmail/postfix}
Defensive patterns

Strategy: validation

Validate before calling

services, _ := dockerConfig["services"].(map[string]interface{})
if _, ok := services["postfix-billionmail"]; !ok {
	return fmt.Errorf("cannot rebuild: postfix-billionmail absent")
}

Type guard

func hasPostfixService(cfg map[string]interface{}) bool {
	svc, _ := cfg["services"].(map[string]interface{})
	_, ok := svc["postfix-billionmail"]
	return ok
}

Try / catch

if err := m.rebuildPostfixServiceNetworks1(dockerConfig, configs); err != nil {
	if strings.Contains(err.Error(), "configuration does not exist") {
		// restore or merge the service definition, then retry
	}
	return err
}

Prevention

When it happens

Trigger: services exists in dockerConfig but contains no 'postfix-billionmail' mapping: service renamed, defined only in an unmerged override file, or the wrong file was parsed.

Common situations: Custom compose files with a renamed mail service; forgetting `docker compose config` merge semantics when only the base file is loaded; typos.

Related errors


AI-assisted analysis of Billionmail/BillionMail@fc36c76c05 (2026-09-05). Data as JSON: /api/errors/22462636c3c81ce2. Report an issue: GitHub.