Hi everyone. I’m having this issue: when writing a record to a MySQL table via the NOCODB v3 API, the container crashes. The Docker logs show nothing except LOG [RoutesResolver]. Here’s my Golang code that inserts the record:
// =========================================================================
// CREATE
// =========================================================================
func (s *MacService) Create(mac models.MACAddress, userID int, userName string) error {
normMac := normalizeMAC(mac.MacAddress)
if len(normMac) == 0 {
return fmt.Errorf("MAC-адрес не может быть пустым")
}
mac.MacAddress = normMac
exists, err := s.repo.Exists(normMac, 0)
if err != nil {
return fmt.Errorf("ошибка проверки БД: %v", err)
}
if exists {
return fmt.Errorf("MAC-адрес %s уже существует в базе", normMac)
}
isDomain := false
if mac.User != nil && isSyncSource(mac.User.Source) && s.ldap != nil {
if mac.ZUPDataID == "" {
return fmt.Errorf("ZUP ID обязателен для официального сотрудника")
}
foundInAd, err := s.ldap.UserExists(mac.ZUPDataID)
if err != nil {
return fmt.Errorf("ошибка проверки AD: %v", err)
}
if foundInAd {
isDomain = true
} else {
isDomain = false
mac.DomainID = DomainNoDomainID
}
}
if mac.User != nil && isSyncSource(mac.User.Source) {
if ex, _ := s.repo.UserExists(mac.ZUPDataID); !ex {
return fmt.Errorf("сотрудник не найден в Master-таблице")
}
}
if isDomain {
if err := s.ldap.AddMacToUser(mac.ZUPDataID, normMac); err != nil {
return fmt.Errorf("ошибка записи в AD: %v", err)
}
}
payload := []map[string]interface{}{
{
"mac_address": normMac,
"comment": mac.Comment,
"is_active": mac.IsActive,
"added_by": userName,
"added_by_id": userID,
"updated_by": userName,
"updated_by_id": userID,
},
}
ids, err := s.nocoClient.BulkCreate(models.TableMacAddresses, payload)
if err != nil {
if isDomain && s.ldap != nil {
_ = s.ldap.RemoveMacFromUser(mac.ZUPDataID, normMac)
}
return fmt.Errorf("ошибка API NocoDB: %v", err)
}
if len(ids) == 0 {
return nil
}
newID := ids[0]
if mac.DomainID != 0 {
_ = s.nocoClient.LinkRecord(models.TableMacAddresses, models.FieldMacLinkToDomain, newID, mac.DomainID)
}
if mac.ZUPDataID != "" {
_ = s.nocoClient.LinkRecord(models.TableMacAddresses, models.FieldMacLinkToZup, newID, mac.ZUPDataID)
}
// 7. ДЕТАЛЬНОЕ ЛОГИРОВАНИЕ (CREATE)
go func() {
var details []string
// Статус
status := "Неактивен"
if mac.IsActive {
status = "Активен"
}
details = append(details, fmt.Sprintf("Статус: %s", status))
// Владелец
ownerName := "Нет"
if mac.User != nil && mac.User.Username != "" {
ownerName = mac.User.Username
} else if mac.ZUPDataID != "" {
// Если пришел только ID без объекта User
ownerName = mac.ZUPDataID
}
if ownerName != "Нет" {
details = append(details, fmt.Sprintf("Владелец: %s", ownerName))
}
// Домен
if mac.DomainName != "" {
details = append(details, fmt.Sprintf("Домен: %s", mac.DomainName))
}
// Комментарий
if strings.TrimSpace(mac.Comment) != "" {
details = append(details, fmt.Sprintf("Комментарий: '%s'", mac.Comment))
}
// Формируем сообщение: "Admin добавил MAC [AA-BB...]: Статус: Активен; Владелец: Иванов..."
logMessage := fmt.Sprintf("%s добавил MAC [%s]: %s", userName, normMac, strings.Join(details, "; "))
s.logger.Log(
"mac_address",
newID,
"create",
logMessage,
map[string]interface{}{
"mac": normMac,
"details": details,
},
userID,
userName,
)
}()
return nil
}
func (c *NocoClient) LinkRecord(tableID, linkFieldID string, recordID int, targetID interface{}) error {
if recordID == 0 {
return fmt.Errorf("recordID is 0")
}
path := fmt.Sprintf("/api/v3/data/%s/%s/links/%s/%d", c.ProjectID, tableID, linkFieldID, recordID)
payload := map[string]interface{}{
"id": targetID,
}
resp, err := c.client.R().
SetBody(payload).
Post(path)
if err != nil {
return fmt.Errorf("сеть: %w", err)
}
if resp.IsError() {
// Логируем ошибку, чтобы видеть детали
c.logger.Error("LinkRecord Fail", "path", path, "body", resp.String())
return fmt.Errorf("api link error: %s", resp.String())
}
return nil
}
In response: 2025/12/12 14:44:28 INFO Successful batch insert tableID=m6fb7qiyo72ivm4 total_created=12025/12/12 14:44:28.554752 WARN RESTY Post “http://192.168.100.164:8082/api/v3/data/p97p0j5vsq21uo1/ms79qjxpgfmzudv/records”: EOF, Attempt 1
And that’s it, the container crashes and reboots.