Skip to content

A FastAPI & inference model backend for a handwriting-to-font generation service. A FastAPI-based pipeline that generates custom TTF fonts from user handwriting. It integrates image cropping, deep learning inference, SVG vectorization, and TTF font creation. Powered by AWS S3/SQS and PyTorch-based style transfer models.

Notifications You must be signed in to change notification settings

team-fontory/Fontory_Pipeline

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

21 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

폰트 νŒŒμ΄ν”„λΌμΈ API μ„œλ²„

μ‚¬μš©μž 손글씨λ₯Ό 기반으둜 폰트λ₯Ό μžλ™ μƒμ„±ν•˜λŠ” νŒŒμ΄ν”„λΌμΈ μ„œλ²„μž…λ‹ˆλ‹€.

κΈ°λŠ₯

  • FastAPI 기반 API ν…ŒμŠ€νŠΈ μ„œλ²„
  • AWS SQS 기반 μžλ™ν™” νŒŒμ΄ν”„λΌμΈ
  • ν•œκ΅­μ–΄ 손글씨 폰트 μžλ™ 생성
  • 상세 λ‘œκΉ… 및 였λ₯˜ 처리
  • AWS S3 파일 μžλ™ 처리 (μ—…λ‘œλ“œ/λ‹€μš΄λ‘œλ“œ)

λ™μž‘ 방식

이 ν”„λ‘œμ νŠΈλŠ” 두 κ°€μ§€ λ°©μ‹μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€:

  1. FastAPI μ„œλ²„ (ν…ŒμŠ€νŠΈ μš©λ„):

    • 폰트 생성 κΈ°λŠ₯만 제곡
    • 둜컬 ν…ŒμŠ€νŠΈ 및 개발 ν™˜κ²½μ—μ„œ μ‚¬μš©
  2. AWS SQS 기반 νŒŒμ΄ν”„λΌμΈ:

    • SQS 큐λ₯Ό μ§€μ†μ μœΌλ‘œ ν΄λ§ν•˜λ©° λ©”μ‹œμ§€ μˆ˜μ‹  λŒ€κΈ°
    • λ©”μ‹œμ§€ μˆ˜μ‹  μ‹œ μžλ™μœΌλ‘œ 폰트 생성 νŒŒμ΄ν”„λΌμΈ μ‹œμž‘
    • S3μ—μ„œ ν…œν”Œλ¦Ώ λ‹€μš΄λ‘œλ“œ
    • 폰트 생성
    • μƒμ„±λœ 폰트 및 둜그 파일 S3 μ—…λ‘œλ“œ
    • 처리 μ™„λ£Œ ν›„ SQS λ©”μ‹œμ§€ μžλ™ μ‚­μ œ

νŒŒμ΄ν”„λΌμΈ 단계

  1. S3 ν…œν”Œλ¦Ώ λ‹€μš΄λ‘œλ“œ - AWS S3에 μ €μž₯된 ν…œν”Œλ¦Ώμ„ λ‹€μš΄λ‘œλ“œ (SQS λͺ¨λ“œμ—μ„œλ§Œ μ‹€ν–‰) ν…œν”Œλ¦Ώ μ˜ˆμ‹œ

  2. 글리프 크둭 - μž‘μ„±λœ 문자 이미지λ₯Ό κ°œλ³„ κΈ€λ¦¬ν”„λ‘œ μΆ”μΆœ (Docker μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰)

    μ—…λ‘œλ“œλœ 이미지 μ‹€μ œ μΆ”μΆœν•  λΆ€λΆ„
    001_download 001_05_overlay_with_crops_init

    cropκ²°κ³Ό

    001_crops

  3. μΆ”λ‘  μ‹€ν–‰ - λ”₯λŸ¬λ‹ λͺ¨λΈμ„ μ‚¬μš©ν•œ 글리프 생성 (Docker μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰)

  4. JPG β†’ SVG λ³€ν™˜ - λΉ„νŠΈλ§΅ 이미지λ₯Ό 벑터 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ (Docker μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰)

  5. SVG β†’ TTF/WOFF λ³€ν™˜ - 벑터 글리프λ₯Ό 폰트 파일둜 λ³€ν™˜ (Docker μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰)

  6. S3 μ—…λ‘œλ“œ - μƒμ„±λœ 폰트 및 결과물을 AWS S3에 μ—…λ‘œλ“œ (SQS λͺ¨λ“œμ—μ„œλ§Œ μ‹€ν–‰)

    μƒμ„±λœ 폰트

    Screen.Recording.2025-11-13.at.14.13.33.mp4

μ°Έκ³ : S3 연계(ν…œν”Œλ¦Ώ λ‹€μš΄λ‘œλ“œ 및 κ²°κ³Όλ¬Ό μ—…λ‘œλ“œ)λ₯Ό μ œμ™Έν•œ λͺ¨λ“  νŒŒμ΄ν”„λΌμΈ λ‹¨κ³„λŠ” Docker μ»¨ν…Œμ΄λ„ˆλ‘œ μ‹€ν–‰λ©λ‹ˆλ‹€. 각 λ‹¨κ³„λŠ” 독립적인 Docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ μ‹€ν–‰λ˜λ©°, 쀑간 결과물은 호슀트 μ‹œμŠ€ν…œμ˜ 곡유 λ³Όλ₯¨μ„ 톡해 μ „λ‹¬λ©λ‹ˆλ‹€.

λͺ¨λΈ 파일 μ„€μ •

이 ν”„λ‘œμ νŠΈλŠ” ν•œκ΅­μ–΄ κΈ€κΌ΄ 생성을 μœ„ν•΄ DM-FONT λͺ¨λΈμ„ μ‚¬μš©ν•©λ‹ˆλ‹€. λͺ¨λΈ 파일(체크포인트)은 λ‹€μŒ μœ„μΉ˜μ— λ°°μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€:

inference/resources/checkpoints/
                               └── last.pth  # λͺ¨λΈ 체크포인트 파일

λͺ¨λΈ νŒŒμΌμ„ λ°°μΉ˜ν•œ 후에 νŒŒμ΄ν”„λΌμΈμ΄ μ˜¬λ°”λ₯΄κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

μš”κ΅¬μ‚¬ν•­ 및 ꡬ쑰

μš”κ΅¬ 사항

  • Python 3.8 이상
  • Docker
  • pip
  • Ubuntu 20.04 LTS 이상 (ꢌμž₯)
  • NVIDIA GPU: μ΅œμ†Œ 8GB VRAM (ꢌμž₯ 12GB 이상, μΆ”λ‘  λͺ¨λΈ μ‹€ν–‰μš©)

디렉토리 ꡬ쑰

pipeline/                    # ν”„λ‘œμ νŠΈ 루트 디렉토리
β”‚
β”œβ”€β”€ crop/                    # 이미지 크둭 κ΄€λ ¨ μ½”λ“œ
β”œβ”€β”€ jpg2svg/                 # JPG to SVG λ³€ν™˜ κ΄€λ ¨ μ½”λ“œ
β”œβ”€β”€ make_template/           # ν…œν”Œλ¦Ώ 생성 κ΄€λ ¨ μ½”λ“œ
β”œβ”€β”€ svg2ttf/                 # SVG to TTF λ³€ν™˜ κ΄€λ ¨ μ½”λ“œ
β”œβ”€β”€ inference/               # λͺ¨λΈ μΆ”λ‘  κ΄€λ ¨ μ½”λ“œ
β”‚   └── resources/checkpoints/
β”‚       └── last.pth         # λͺ¨λΈ 체크포인트 파일
β”‚
β”œβ”€β”€ scripts/                 # νŒŒμ΄ν”„λΌμΈ 단계별 μ‹€ν–‰ 슀크립트
β”‚
β”œβ”€β”€ fastAPI/                 # FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ
β”‚   β”œβ”€β”€ config.py            # μ„€μ • 관리
β”‚   β”œβ”€β”€ main.py              # μ„œλ²„ μ§„μž…μ 
β”‚   β”œβ”€β”€ models.py            # 데이터 λͺ¨λΈ μ •μ˜
β”‚   β”œβ”€β”€ s3_utils.py          # S3 κ΄€λ ¨ μœ ν‹Έλ¦¬ν‹°
β”‚   β”œβ”€β”€ sqs_utils.py         # SQS κ΄€λ ¨ μœ ν‹Έλ¦¬ν‹°
β”‚   β”œβ”€β”€ prometheus_loki/     # Prometheus 및 Loki λͺ¨λ‹ˆν„°λ§ μ„€μ •
β”‚   β”‚   β”œβ”€β”€ compose.yml      # λͺ¨λ‹ˆν„°λ§ μ„œλΉ„μŠ€ Docker Compose 파일
β”‚   β”‚   β”œβ”€β”€ prometheus.config # Prometheus μ„€μ • 파일
β”‚   β”‚   β”œβ”€β”€ prometheus_api.py # Prometheus API 톡합 μ½”λ“œ
β”‚   β”‚   └── prometheus_config.py # Prometheus μ„€μ • 관리
β”‚   └── .env                 # ν™˜κ²½ λ³€μˆ˜ μ„€μ • 파일
β”‚
β”œβ”€β”€ resource/                # ν”„λ‘œμ νŠΈ λ¦¬μ†ŒμŠ€ 파일
β”œβ”€β”€ written/                 # μ‚¬μš©μž μž‘μ„± 이미지 μž…λ ₯
β”œβ”€β”€ log/                     # μ‹€ν–‰ 둜그 파일
β”‚
β”œβ”€β”€ result/                  # νŒŒμ΄ν”„λΌμΈ κ²°κ³Ό 디렉토리
β”‚   β”œβ”€β”€ 1_cropped/           # 크둭된 글리프
β”‚   β”œβ”€β”€ 2_inference/         # μΆ”λ‘  κ²°κ³Ό
β”‚   β”œβ”€β”€ 3_svg/               # SVG λ³€ν™˜ κ²°κ³Ό
β”‚   └── 4_fonts/             # μ΅œμ’… 폰트 파일
β”‚
β”œβ”€β”€ reference_chars.txt      # 폰트 μƒμ„±μš© μ°Έμ‘° 문자 파일
β”œβ”€β”€ run_server.sh            # μ„œλ²„ μ‹€ν–‰ 슀크립트
β”œβ”€β”€ stop_server.sh           # μ„œλ²„ 쀑지 슀크립트
└── test_request.py          # μ„œλ²„ ν…ŒμŠ€νŠΈ 슀크립트

ν™˜κ²½ λ³€μˆ˜ μ„€μ •

이 ν”„λ‘œμ νŠΈλŠ” AWS μ„œλΉ„μŠ€μ™€μ˜ 연동을 μœ„ν•΄ ν™˜κ²½ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ 루트의 fastAPI 디렉토리 내에 .env νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ λ³€μˆ˜λ“€μ„ μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€:

AWS_REGION=your_aws_region
AWS_ACCESS_KEY=your_aws_access_key
AWS_SECRET_KEY=your_aws_secret_key
QUEUE_URL=your_sqs_queue_url
FONT_BUCKET_NAME=your_font_bucket_name
FONT_CREATE_LOG_BUCKET_NAME=your_log_bucket_name
FONT_ENG_NAME=영문 폰트λͺ… (예: "MyHandwriting")  
CDN_URL=이미지 CDN 베이슀 URL (예: "https://cdn.example.com/")
  • AWS_REGION: μ‚¬μš©ν•˜λŠ” AWS 리전 (예: ap-northeast-2)
  • AWS_ACCESS_KEY: AWS IAM μ‚¬μš©μžμ˜ μ•‘μ„ΈμŠ€ ν‚€ ID
  • AWS_SECRET_KEY: AWS IAM μ‚¬μš©μžμ˜ λΉ„λ°€ μ•‘μ„ΈμŠ€ ν‚€
  • QUEUE_URL: 폰트 생성 μš”μ²­μ„ μ²˜λ¦¬ν•  SQS 큐의 URL
  • FONT_BUCKET_NAME: μƒμ„±λœ 폰트 νŒŒμΌμ„ μ—…λ‘œλ“œν•  S3 버킷 이름
  • FONT_CREATE_LOG_BUCKET_NAME: 둜그 νŒŒμΌμ„ μ—…λ‘œλ“œν•  S3 버킷 이름
  • FONT_ENG_NAME: 영문 폰트λͺ… (예: "MyHandwriting")
  • CDN_URL: 이미지 CDN 베이슀 URL (예: "https://cdn.example.com/")

AWS κΆŒν•œ μš”κ΅¬μ‚¬ν•­

AWS IAM μ‚¬μš©μžλŠ” λ‹€μŒ κΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€:

  1. SQS κ΄€λ ¨ κΆŒν•œ:

    • sqs:ReceiveMessage - νμ—μ„œ λ©”μ‹œμ§€λ₯Ό λ°›μ•„μ˜€λŠ” κΆŒν•œ
    • sqs:DeleteMessage - 처리 μ™„λ£Œλœ λ©”μ‹œμ§€λ₯Ό μ‚­μ œν•˜λŠ” κΆŒν•œ
  2. S3 κ΄€λ ¨ κΆŒν•œ:

    • s3:PutObject - μƒμ„±λœ 폰트 파일(.ttf, .woff)κ³Ό 둜그 νŒŒμΌμ„ μ—…λ‘œλ“œν•˜λŠ” κΆŒν•œ
    • 버킷 정책에 따라 λ‹€μŒ κ²½λ‘œμ— λŒ€ν•œ μ—…λ‘œλ“œ κΆŒν•œ ν•„μš”:
      • [FONT_BUCKET_NAME]/fonts/* - 폰트 파일 μ €μž₯ 경둜
      • [FONT_CREATE_LOG_BUCKET_NAME]/logs/* - 둜그 파일 μ €μž₯ 경둜
  3. ν…œν”Œλ¦Ώ 이미지 μ ‘κ·Όμ„±:

    • ν…œν”Œλ¦Ώ 이미지가 μ €μž₯된 S3 버킷/κ°μ²΄λŠ” 곡개적으둜 μ ‘κ·Ό κ°€λŠ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.
    • λ˜λŠ” SQS λ©”μ‹œμ§€μ˜ templateURL ν•„λ“œμ— μœ νš¨ν•œ 미리 μ„œλͺ…λœ URL(pre-signed URL)을 μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.
    • μ½”λ“œλŠ” urllib.request.urlretrieveλ₯Ό μ‚¬μš©ν•˜μ—¬ HTTP URL을 톡해 직접 λ‹€μš΄λ‘œλ“œν•˜λ―€λ‘œ S3 인증이 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ κΆŒν•œμ΄ μžˆλŠ” IAM μ‚¬μš©μžμ˜ ACCESS_KEY와 SECRET_KEYλ₯Ό μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ‚¬μš© 방법

κΆŒν•œ λΆ€μ—¬

chmod +x ./scripts/*
chmod +X ./*.sh

0. ν…œν”Œλ¦Ώ 생성

./scripts/0_generate_template.sh

1. 이미지 μ€€λΉ„ (ν…ŒμŠ€νŠΈμš© API μ „μš©)

μ°Έκ³ : 이 λ‹¨κ³„λŠ” ν…ŒμŠ€νŠΈμš© APIλ₯Ό μ‚¬μš©ν•  λ•Œλ§Œ ν•„μš”ν•©λ‹ˆλ‹€. SQS λ°©μ‹μ—μ„œλŠ” S3μ—μ„œ ν…œν”Œλ¦Ώμ„ μžλ™μœΌλ‘œ λ‹€μš΄λ‘œλ“œν•˜λ―€λ‘œ 이 단계λ₯Ό κ±΄λ„ˆλ›Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„μ—μ„œ μƒμ„±λœ ν…œν”Œλ¦Ώμ„ λ‹€μš΄λ°›κ³  μ†κΈ€μ”¨λ‘œ μž‘μ„±λœ 이미지 파일(.jpg) 을 ./written 디렉토리에 μ €μž₯ν•©λ‹ˆλ‹€.

2. μ„œλ²„ μ‹€ν–‰

./run_server.sh

μ„œλ²„ μ‹€ν–‰ μ‹œ λ‹€μŒ μž‘μ—…μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€:

  • ν•„μš”ν•œ 디렉토리 ꡬ쑰 생성
  • Python 가상 ν™˜κ²½ μ„€μ •
  • μ˜μ‘΄μ„± νŒ¨ν‚€μ§€ μ„€μΉ˜
  • Prometheus 및 Loki λͺ¨λ‹ˆν„°λ§ μ„œλΉ„μŠ€ μ‹œμž‘ (Docker Compose μ‚¬μš©)
  • FastAPI μ„œλ²„ μ‹€ν–‰

3. 폰트 생성 μš”μ²­

3-1. API μ„œλ²„ 호좜 (ν…ŒμŠ€νŠΈμš©)

둜컬 API μ„œλ²„λ₯Ό 톡해 폰트 생성을 ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 방식은 폰트 μƒμ„±λ§Œ μˆ˜ν–‰ν•˜λ©° S3 μ—…λ‘œλ“œλŠ” ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

# ν…ŒμŠ€νŠΈ 슀크립트 μ‚¬μš©
python test_request.py MyCustomFont

# λ˜λŠ” curl μ‚¬μš©
curl -X POST "http://localhost:8000/font" \
     -H "Content-Type: application/json" \
     -d '{
       "fontId": "231", 
       "memberId": "213123", 
       "fontName": "ν°νŠΈν•œκΈ€μ΄λ¦„", 
       "fontEngName": "testFontNameEng",
       "templateURL": "https://....", 
       "author": "author", 
       "requestUUID": "550e8400-e29b-41d4-a716-446655440000"
     }'

3-2. SQS 큐 직접 호좜

AWS SQS νμ—μ„œ λ©”μ‹œμ§€λ₯Ό 받아와 νŒŒμ΄ν”„λΌμΈμ„ μ‹€ν–‰ν•©λ‹ˆλ‹€. 이 방식은 ν…œν”Œλ¦Ώ λ‹€μš΄λ‘œλ“œ + 폰트 생성 + 폰트 및 둜그 S3 μ—…λ‘œλ“œλ₯Ό λͺ¨λ‘ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

AWS CLI ν˜Ήμ€ AWS μ½˜μ†”μ„ 톡해 직접 SQS에 λ©”μ‹œμ§€λ₯Ό 보낼 수 μžˆμŠ΅λ‹ˆλ‹€. .env νŒŒμΌμ— μ„€μ •λœ QUEUE_URL을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

(μ°Έκ³ : AWS CLIλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ AWS 자격 증λͺ… 섀정이 ν•„μš”ν•©λ‹ˆλ‹€. aws configure λͺ…λ Ήμ–΄λ‚˜ ν™˜κ²½ λ³€μˆ˜ 등을 톡해 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.)

aws sqs send-message --queue-url YOUR_SQS_QUEUE_URL \
     --message-body '{
       "memberId": "213123",
       "author": "author",
       "fontId": "231",
       "fontName": "ν°νŠΈν•œκΈ€μ΄λ¦„",
       "fontEngName": "testFontNameEng"
       "templateURL": "https://....",
       "requestUUID": "550e8400-e29b-41d4-a716-446655440000"
     }' \
     --message-group-id MyFontGroup
  • YOUR_SQS_QUEUE_URL: .env νŒŒμΌμ— μ„€μ •ν•œ SQS 큐 URL둜 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • --message-body: 폰트 κ΄€λ ¨ 정보λ₯Ό ν¬ν•¨ν•˜λŠ” JSON ν˜•μ‹μ˜ λ©”μ‹œμ§€ λ³Έλ¬Έμž…λ‹ˆλ‹€.
  • --message-group-id: FIFO 큐의 경우 λ©”μ‹œμ§€ κ·Έλ£Ή IDκ°€ ν•„μš”ν•©λ‹ˆλ‹€. λ™μΌν•œ κ·Έλ£Ή ID λ‚΄μ—μ„œλŠ” λ©”μ‹œμ§€ μˆœμ„œκ°€ 보μž₯λ©λ‹ˆλ‹€. 폰트 μ΄λ¦„μ΄λ‚˜ μ‚¬μš©μž ID λ“± μ μ ˆν•œ 값을 μ‚¬μš©ν•©λ‹ˆλ‹€.

4. μ„œλ²„ 쀑지

λ‹€μŒ μ„œλ²„λ₯Ό λͺ…λ ΉμœΌλ‘œ 쀑지할 수 μžˆμŠ΅λ‹ˆλ‹€:

./stop_server.sh

이 λͺ…λ Ήμ–΄λŠ” λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€:

  • Prometheus 및 Loki λͺ¨λ‹ˆν„°λ§ μ„œλΉ„μŠ€ 쀑지 (Docker Compose μ‚¬μš©)
  • 포트 8000μ—μ„œ μ‹€ν–‰ 쀑인 FastAPI μ„œλ²„ ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ

λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œ

이 ν”„λ‘œμ νŠΈλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λͺ¨λ‹ˆν„°λ§μ„ μœ„ν•΄ Prometheus와 Lokiλ₯Ό ν†΅ν•©ν–ˆμŠ΅λ‹ˆλ‹€:

Prometheus

  • λ©”νŠΈλ¦­ μˆ˜μ§‘ 및 λͺ¨λ‹ˆν„°λ§μ„ μœ„ν•œ μ˜€ν”ˆμ†ŒμŠ€ μ‹œμŠ€ν…œ
  • 포트 9090μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ (http://localhost:9090/prometheus)
  • API μš”μ²­ 수, 응닡 μ‹œκ°„, 였λ₯˜μœ¨ λ“±μ˜ λ©”νŠΈλ¦­ μˆ˜μ§‘

Loki

  • 둜그 집계 μ‹œμŠ€ν…œ
  • 포트 3100μ—μ„œ μ ‘κ·Ό κ°€λŠ₯
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그λ₯Ό 쀑앙 μ§‘μ€‘μ‹μœΌλ‘œ μ €μž₯ 및 쑰회 κ°€λŠ₯

λͺ¨λ‹ˆν„°λ§ μ„œλΉ„μŠ€λŠ” Docker Composeλ₯Ό 톡해 κ΄€λ¦¬λ˜λ©°, run_server.sh 및 stop_server.sh μŠ€ν¬λ¦½νŠΈμ— ν†΅ν•©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ : Prometheus와 LokiλŠ” Grafana의 데이터 μ†ŒμŠ€λ‘œ μΆ”κ°€ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Grafanaμ—μ„œ Prometheus(9090 포트)와 Loki(3100 포트)λ₯Ό 데이터 μ†ŒμŠ€λ‘œ λ“±λ‘ν•˜λ©΄ λ©”νŠΈλ¦­κ³Ό 둜그 데이터λ₯Ό μ‹œκ°ν™”ν•˜κ³  λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œλ₯Ό ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

API λͺ…μ„Έ

POST /font (ν…ŒμŠ€νŠΈμš©)

ν…ŒμŠ€νŠΈμš© 둜컬 API μ—”λ“œν¬μΈνŠΈλ‘œ, 폰트 μƒμ„±λ§Œ μˆ˜ν–‰ν•©λ‹ˆλ‹€. S3 μ—…λ‘œλ“œλŠ” ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš”μ²­ λ³Έλ¬Έ:

{
  "fontId": "231",
  "memberId": "213123",
  "fontName": "ν°νŠΈν•œκΈ€μ΄λ¦„",
  "templateURL": "https://....",
  "author": "author",
  "fontEngName": "testFontNameEng",
  "requestUUID": "550e8400-e29b-41d4-a716-446655440000"
}

응닡:

{
  "message": "폰트 'testFontName' 생성 μ™„λ£Œ",
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "log_file": "./log/550e84_213123_231_testFontName.log",
  "output_ttf": "./result/4_fonts/testFontName.ttf",
  "output_woff": "./result/4_fonts/testFontName.woff"
}

SQS λ©”μ‹œμ§€ ν˜•μ‹

SQS 큐에 λ©”μ‹œμ§€λ₯Ό μ „μ†‘ν•˜λ©΄ μ™„μ „ν•œ νŒŒμ΄ν”„λΌμΈ(ν…œν”Œλ¦Ώ λ‹€μš΄λ‘œλ“œ, 폰트 생성, S3 μ—…λ‘œλ“œ)이 μ‹€ν–‰λ©λ‹ˆλ‹€.

λ©”μ‹œμ§€ ν˜•μ‹:

{
  "memberId": "213123",
  "author": "author",
  "fontId": "231",
  "fontName": "ν°νŠΈν•œκΈ€μ΄λ¦„",
  "templateURL": "https://....",
  "fontEngName": "testFontNameEng",
  "requestUUID": "550e8400-e29b-41d4-a716-446655440000"
}

처리 결과:

  • ν…œν”Œλ¦Ώ λ‹€μš΄λ‘œλ“œ (templateURLμ—μ„œ)
  • 폰트 파일 생성 (.ttf, .woff)
  • μƒμ„±λœ 폰트 및 둜그 파일 S3 μ—…λ‘œλ“œ
  • μ™„λ£Œ μ‹œ S3에 λ‹€μŒ νŒŒμΌλ“€μ΄ μ—…λ‘œλ“œλ©λ‹ˆλ‹€:
    • [FONT_BUCKET_NAME]/fonts/[fontId].ttf
    • [FONT_BUCKET_NAME]/fonts/[fontId].woff
    • [FONT_CREATE_LOG_BUCKET_NAME]/logs/[fontId].log

μ°Έκ³ : 처리 κ³Όμ •μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜λ”λΌλ„ 둜그 νŒŒμΌμ€ S3에 μ—…λ‘œλ“œλ©λ‹ˆλ‹€.

API λ¬Έμ„œ

Swagger UI λ¬Έμ„œ μ ‘κ·Ό URL (둜컬 API μ„œλ²„ μ‹€ν–‰ μ‹œ):

http://localhost:8000/docs

둜그

각 μš”μ²­μ€ 고유 ID와 μ‚¬μš©μž 정보가 ν¬ν•¨λœ 둜그 νŒŒμΌμ— κΈ°λ‘λ©λ‹ˆλ‹€:

API λͺ¨λ“œ 및 SQS λͺ¨λ“œ 둜컬 둜그 ν˜•μ‹

./log/[short-requestUUID]_[memberId]_[fontId]_[fontName].log

μ˜ˆμ‹œ: ./log/550e84_213123_231_testFontName.log

SQS λͺ¨λ“œ S3 μ—…λ‘œλ“œ ν˜•μ‹

SQS λͺ¨λ“œμ—μ„œλŠ” 둜그 파일이 λ‘œμ»¬μ— μ €μž₯된 ν›„ S3에도 μ—…λ‘œλ“œλ©λ‹ˆλ‹€. S3에 μ—…λ‘œλ“œλ  λ•ŒλŠ” λ‹€μŒ ν˜•μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€:

[FONT_CREATE_LOG_BUCKET_NAME]/[fontId].log

μ˜ˆμ‹œ: font_log_bucket/231.log

SQS μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ 둜컬 둜그 파일과 S3에 μ—…λ‘œλ“œλœ 둜그 파일 λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

About

A FastAPI & inference model backend for a handwriting-to-font generation service. A FastAPI-based pipeline that generates custom TTF fonts from user handwriting. It integrates image cropping, deep learning inference, SVG vectorization, and TTF font creation. Powered by AWS S3/SQS and PyTorch-based style transfer models.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages