视频保存
This commit is contained in:
@@ -22,8 +22,8 @@ RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /build/echochat ./cmd/
|
|||||||
# --- 第二阶段:运行 ---
|
# --- 第二阶段:运行 ---
|
||||||
FROM alpine:3.19
|
FROM alpine:3.19
|
||||||
|
|
||||||
# 安装运行时依赖(时区数据 + CA 证书)
|
# 安装运行时依赖(时区数据 + CA 证书 + 录制 WebM→MP4 转码所需 ffmpeg)
|
||||||
RUN apk add --no-cache ca-certificates tzdata
|
RUN apk add --no-cache ca-certificates tzdata ffmpeg
|
||||||
|
|
||||||
# 设置时区为上海
|
# 设置时区为上海
|
||||||
ENV TZ=Asia/Shanghai
|
ENV TZ=Asia/Shanghai
|
||||||
|
|||||||
@@ -83,5 +83,5 @@ meeting:
|
|||||||
# 生产部署请通过环境变量 ECHOCHAT_MEETING_INTERNAL_WEBHOOK_SECRET 覆盖(viper.AutomaticEnv 已开启)
|
# 生产部署请通过环境变量 ECHOCHAT_MEETING_INTERNAL_WEBHOOK_SECRET 覆盖(viper.AutomaticEnv 已开启)
|
||||||
internal_webhook_secret: internal-webhook-12xqs
|
internal_webhook_secret: internal-webhook-12xqs
|
||||||
recording_transcode_enabled: true
|
recording_transcode_enabled: true
|
||||||
recording_transcode_ffmpeg_path: /home/ykf/jenkins/yuyin/ffmpeg/ffmpeg-7.0.2-amd64-static/ffmpeg
|
recording_transcode_ffmpeg_path: ffmpeg
|
||||||
recording_transcode_timeout_seconds: 600
|
recording_transcode_timeout_seconds: 600
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package db
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -43,6 +44,12 @@ func (l *zapGormLogger) Trace(ctx context.Context, begin time.Time, fc func() (s
|
|||||||
zap.String("sql", sql),
|
zap.String("sql", sql),
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
// gorm.ErrRecordNotFound 在业务侧大量被用作"是否存在"判定(GetByXxx 返回 nil, nil)
|
||||||
|
// 没必要在 SQL 层把它当 ERROR 刷出来,否则会误触告警;保持原 fields 在 Debug 层级即可排障
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
logs.Debug(ctx, "gorm.trace", "SQL未命中(record not found)", fields...)
|
||||||
|
return
|
||||||
|
}
|
||||||
fields = append(fields, zap.Error(err))
|
fields = append(fields, zap.Error(err))
|
||||||
logs.Error(ctx, "gorm.trace", "SQL执行失败", fields...)
|
logs.Error(ctx, "gorm.trace", "SQL执行失败", fields...)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -69,7 +69,10 @@ services:
|
|||||||
ECHOCHAT_MEDIA_SERVER_INTERNAL_TOKEN: ${MEDIA_INTERNAL_TOKEN:-}
|
ECHOCHAT_MEDIA_SERVER_INTERNAL_TOKEN: ${MEDIA_INTERNAL_TOKEN:-}
|
||||||
# media-server 失败回调共享密钥:与 media-server 服务的 INTERNAL_WEBHOOK_SECRET 保持一致
|
# media-server 失败回调共享密钥:与 media-server 服务的 INTERNAL_WEBHOOK_SECRET 保持一致
|
||||||
# 未配置时 go-service 会拒绝所有 webhook(Forbidden),录制失败状态将无法及时落 failed
|
# 未配置时 go-service 会拒绝所有 webhook(Forbidden),录制失败状态将无法及时落 failed
|
||||||
INTERNAL_WEBHOOK_SECRET: ${INTERNAL_WEBHOOK_SECRET:-internal-webhook-secret-change-me}
|
ECHOCHAT_MEETING_INTERNAL_WEBHOOK_SECRET: ${INTERNAL_WEBHOOK_SECRET:-internal-webhook-12xqs}
|
||||||
|
ECHOCHAT_MEETING_RECORDING_TRANSCODE_ENABLED: ${RECORDING_TRANSCODE_ENABLED:-true}
|
||||||
|
ECHOCHAT_MEETING_RECORDING_TRANSCODE_FFMPEG_PATH: ${RECORDING_TRANSCODE_FFMPEG_PATH:-ffmpeg}
|
||||||
|
ECHOCHAT_MEETING_RECORDING_TRANSCODE_TIMEOUT_SECONDS: ${RECORDING_TRANSCODE_TIMEOUT_SECONDS:-600}
|
||||||
ports:
|
ports:
|
||||||
- "${GO_SERVICE_PORT:-8085}:8085"
|
- "${GO_SERVICE_PORT:-8085}:8085"
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -81,6 +84,9 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
media-server:
|
media-server:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
volumes:
|
||||||
|
# 与 media-server 使用同一个 host 目录,确保容器部署 go-service 时也能读取录制产物并转码/上传
|
||||||
|
- ${RECORDING_OUTPUT_DIR:-/home/ykf/jenkins/yuyin/data}:${RECORDING_OUTPUT_DIR:-/home/ykf/jenkins/yuyin/data}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user