feat: Add database migration service with Alembic for PostgreSQL, integrating job management and counting functionalities. Update Docker Compose to include db-migrations service, enhancing the microservices architecture. Revise documentation for clarity on database schema and migration processes.

This commit is contained in:
erik
2026-07-06 00:50:50 -05:00
parent d95f8f6ad8
commit 081da999d4
43 changed files with 2911 additions and 2271 deletions
@@ -6,15 +6,11 @@ import (
"os"
"os/signal"
"syscall"
"time"
"github.com/pys/pdf-count/internal/api"
"github.com/pys/pdf-count/internal/config"
"github.com/pys/pdf-count/internal/model"
"github.com/pys/pdf-count/internal/ocr"
"github.com/pys/pdf-count/internal/queue"
"github.com/pys/pdf-count/internal/storage"
"github.com/pys/pdf-count/internal/store"
)
func main() {
@@ -24,9 +20,12 @@ func main() {
predictor, err := model.NewPredictor(cfg.ModelPath, cfg.InferencePath)
if err != nil {
log.Fatalf("model: %v", err)
log.Printf("WARN: modelo ML no disponible (%v) — usando heuristica de conteo", err)
predictor = nil
} else {
defer predictor.Close()
log.Printf("modelo ONNX cargado: %s", cfg.ModelPath)
}
defer predictor.Close()
poolSize := cfg.OCRPoolSize
if poolSize <= 0 {
@@ -38,37 +37,16 @@ func main() {
}
defer ocrEngine.Close()
st, err := store.New(cfg.RedisURL, cfg.JobResultTTL)
if err != nil {
log.Fatalf("redis: %v", err)
}
defer st.Close()
stg, err := storage.New(cfg.MinIOEndpoint, cfg.MinIOAccessKey, cfg.MinIOSecretKey, cfg.MinIOBucket, cfg.MinIOUseSSL)
if err != nil {
log.Fatalf("minio: %v", err)
}
initCtx, initCancel := context.WithTimeout(ctx, 10*time.Second)
if err := stg.EnsureBucket(initCtx); err != nil {
initCancel()
log.Fatalf("minio bucket: %v", err)
}
initCancel()
pub, err := queue.NewPublisher(cfg.NATSURL, cfg.StreamName, cfg.SubjectPrefix)
if err != nil {
log.Fatalf("nats: %v", err)
}
openAPIPath := os.Getenv("OPENAPI_PATH")
if openAPIPath == "" {
openAPIPath = "api/openapi.json"
openAPIPath = "api/openapi.yaml"
}
srv := api.NewServer(cfg, predictor, ocrEngine, st, stg, pub, api.LoadOpenAPI(openAPIPath))
srv := api.NewServer(cfg, predictor, ocrEngine, api.LoadOpenAPI(openAPIPath))
addr := ":" + cfg.Port
log.Printf("api listening on %s", addr)
log.Printf("count-api escuchando en %s", addr)
if err := api.ListenAndServe(ctx, addr, srv.Router()); err != nil {
log.Fatalf("api: %v", err)
log.Fatalf("server: %v", err)
}
}