Skip to content

Latest commit

Β 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Custom-TA λ°±μ—”λ“œ

Custom-TAλŠ” κ°•μ˜ 자료λ₯Ό 기반으둜 학생 μ§ˆλ¬Έμ— λ‹΅λ³€ν•˜κ³ , ν•™μŠ΅ 데이터λ₯Ό 뢄석해 κ΅κ°•μ‚¬μ—κ²Œ κ°œμž… μ œμ•ˆμ„ μ œκ³΅ν•˜λŠ” RAG 기반 AI 쑰ꡐ λ°±μ—”λ“œμž…λ‹ˆλ‹€. FastAPI, SQLAlchemy, TiDB, AWS S3, Gemini APIλ₯Ό μ‚¬μš©ν•΄ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

핡심 λͺ©ν‘œ

  • ꡐ강사가 μ—…λ‘œλ“œν•œ PDF κ°•μ˜ 자료λ₯Ό 뢄석해 학생 μ§ˆλ¬Έμ— κ·Όκ±° μžˆλŠ” λ‹΅λ³€ 제곡
  • 닡변에 μ‚¬μš©λœ κ°•μ˜ μžλ£Œμ™€ νŽ˜μ΄μ§€ 좜처λ₯Ό ν•¨κ»˜ μ €μž₯
  • ν•™μƒμ˜ 질문 ν‚€μ›Œλ“œ, ν€˜μŠ€νŠΈ μ˜€λ‹΅, μ·¨μ•½ κ°œλ…μ„ λˆ„μ  뢄석
  • ꡐ강사 λŒ€μ‹œλ³΄λ“œμ— 보좩 ν€˜μŠ€νŠΈ, 동기뢀여 λ©”μ‹œμ§€, μΆ”κ°€ 자료 μ—…λ‘œλ“œ μ œμ•ˆ 제곡
  • μΆ”ν›„ λͺ¨λΈκ³Ό μ €μž₯μ†Œλ₯Ό κ΅μ²΄ν•˜κΈ° 쉽도둝 AI, Storage, DB 계측을 뢄리

AI ν˜‘μ—… μ‚°μΆœλ¬Ό

λ³Έ ν”„λ‘œμ νŠΈλŠ” AIμ™€μ˜ 기획, 섀계, κ΅¬ν˜„ ν˜‘μ—… 과정을 λ¬Έμ„œλ‘œ λ‚¨κ²ΌμŠ΅λ‹ˆλ‹€.

  • docs/AI_COLLABORATION_GUIDE.md: AI 개발 μ—μ΄μ „νŠΈ ν˜‘μ—… μ§€μΉ¨μ„œ
  • docs/PRODUCT_REQUIREMENTS.md: μ œν’ˆ 기획 및 κΈ°λŠ₯ μ •μ˜μ„œ
  • docs/AI_DEVELOPMENT_LOG.md: AI ν˜‘μ—… 개발 둜그

기술 μŠ€νƒ

μ˜μ—­ μ‚¬μš© 기술
Backend FastAPI, Python 3.10+
ORM SQLAlchemy 2.0 Async
Database TiDB, MySQL ν˜Έν™˜
LLM Gemini 2.5 Flash-Lite
Embedding Gemini Embedding 001
File Storage AWS S3, Presigned URL
RAG μ €μž₯ TiDB document_chunks.embedding_json
Auth JWT Bearer Token

RAG λ™μž‘ ꡬ쑰

ν˜„μž¬ RAGλŠ” Pinecone 없이 S3, TiDB, Gemini만으둜 λ™μž‘ν•©λ‹ˆλ‹€.

PDF μ—…λ‘œλ“œ
β†’ AWS S3에 원본 PDF μ €μž₯
β†’ S3μ—μ„œ PDF 읽기
β†’ νŽ˜μ΄μ§€ ν…μŠ€νŠΈ μΆ”μΆœ
β†’ ν…μŠ€νŠΈ chunk 생성
β†’ Gemini Embedding으둜 chunk 벑터 생성
β†’ TiDB document_chunks.embedding_json에 μ €μž₯

학생 질문
β†’ μ§ˆλ¬Έμ„ Gemini Embedding으둜 벑터화
β†’ TiDBμ—μ„œ ν•΄λ‹Ή κ°•μ˜ chunk embedding 쑰회
β†’ Python cosine similarity둜 Top-K 검색
β†’ κ²€μƒ‰λœ κ°•μ˜ 자료λ₯Ό Gemini 2.5 Flash-Lite에 전달
β†’ λ‹΅λ³€κ³Ό 좜처λ₯Ό chat_messages, chat_message_sources에 μ €μž₯

ν”„λ‘œμ νŠΈ ꡬ쑰

Back/
|-- webapp/                 # FastAPI ν‘œν˜„ 계측
|   |-- main.py             # μ•± μ΄ˆκΈ°ν™”, CORS, μ˜ˆμ™Έ 처리
|   `-- routers/            # API λΌμš°ν„°
|       |-- auth.py
|       |-- courses.py
|       |-- documents.py
|       |-- chat.py
|       |-- quests.py
|       |-- dashboard.py
|       |-- interventions.py
|       |-- course_messages.py
|       `-- router.py
|-- src/                    # 도메인 및 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
|   |-- ai/                 # Gemini 호좜, embedding, λ‹΅λ³€ 생성
|   |-- auth/               # μ‚¬μš©μž λͺ¨λΈ
|   |-- courses/            # κ°•μ˜ λͺ¨λΈ
|   |-- enrollments/        # μˆ˜κ°• 등둝, μ·¨μ•½ κ°œλ…
|   |-- documents/          # S3 μ €μž₯, PDF 처리, RAG 색인
|   |-- chat/               # μ±„νŒ… λͺ¨λΈ
|   |-- quests/             # ν€˜μŠ€νŠΈ, λ¬Έν•­, 채점
|   |-- interventions/      # AI μžλ™ κ°œμž… μ œμ•ˆ
|   |-- analytics/          # ν‚€μ›Œλ“œ/μ·¨μ•½ κ°œλ… 뢄석
|   `-- models/             # 곡톡 enum export
|-- dependencies/           # 인증/μ˜μ‘΄μ„± μ£Όμž…
|-- database/               # Async DB engine/session
|-- core/                   # ν™˜κ²½ μ„€μ •, λ³΄μ•ˆ, 이벀트 루프
|-- requirements.txt
|-- run_server.py
|-- .env.example
`-- README.md

μ£Όμš” κΈ°λŠ₯

인증

  • νšŒμ›κ°€μž…, 둜그인, λ‘œκ·Έμ•„μ›ƒ
  • JWT 기반 인증
  • 학생과 ꡐ강사 μ—­ν•  뢄리

κ°•μ˜ 관리

  • ꡐ강사 κ°•μ˜ 생성
  • 학생 μž…μž₯ μ½”λ“œ 기반 κ°•μ˜ μ°Έμ—¬
  • ꡐ강사/학생별 κ°•μ˜ λͺ©λ‘ 쑰회

κ°•μ˜ 자료 관리

  • PDF μ—…λ‘œλ“œ
  • AWS S3 μ €μž₯
  • Presigned URL 기반 λ‹€μš΄λ‘œλ“œ
  • μ£Όμ°¨/주제 메타데이터 μ„€μ •
  • 곡개/λΉ„κ³΅κ°œ μ „ν™˜
  • 학생은 곡개된 자료만 쑰회 κ°€λŠ₯

RAG μ±„νŒ…

  • 학생 질문 μ €μž₯
  • κ°•μ˜λ³„ 자료 chunk 검색
  • Gemini λ‹΅λ³€ 생성
  • λ‹΅λ³€ 좜처 μ €μž₯
  • 질문 ν‚€μ›Œλ“œ 톡계 λˆ„μ 
  • 학생별 μ·¨μ•½ κ°œλ… κ°±μ‹ 

ν€˜μŠ€νŠΈ

  • ꡐ강사 직접 ν€˜μŠ€νŠΈ 생성
  • 객관식 λ¬Έν•­/보기/μ •λ‹΅ μ €μž₯
  • μž„μ‹œ μ €μž₯κ³Ό λ°œμ†‘ 뢄리
  • 학생 제좜 및 μžλ™ 채점
  • XP μ§€κΈ‰ 및 λ“±κΈ‰ κ°±μ‹ 
  • AI ν€˜μŠ€νŠΈ μ΄ˆμ•ˆ 생성
  • μ™„λ£Œ ν€˜μŠ€νŠΈ completed μƒνƒœ λ°˜ν™˜ 및 쀑볡 제좜 차단

학생 μ„±μž₯ 데이터

  • μ‹ κ·œ μˆ˜κ°•μƒμ€ Cλ“±κΈ‰, 0 XPμ—μ„œ μ‹œμž‘
  • Cλ“±κΈ‰: 0~599 λˆ„μ  XP
  • Bλ“±κΈ‰: 600~1199 λˆ„μ  XP
  • Aλ“±κΈ‰: 1200 XP 이상이며 졜고 λ“±κΈ‰
  • GET /courses/{course_id}/me/statsλŠ” λ“±κΈ‰ λ‚΄ μ§„ν–‰ XP와 λˆ„μ  XPλ₯Ό ν•¨κ»˜ λ°˜ν™˜
  • ν€˜μŠ€νŠΈ μ˜€λ‹΅κ³Ό μ±„νŒ… 기반 μ·¨μ•½ κ°œλ…μ„ AI μ˜€λ‹΅λ…ΈνŠΈλ‘œ 쑰회
  • μ˜€λ‹΅λ…ΈνŠΈλŠ” λ¬Έν•­, λ‚΄ λ‹΅, μ •λ‹΅, ν•΄μ„€, κ΄€λ ¨ ν€˜μŠ€νŠΈ λ˜λŠ” 자료 좜처λ₯Ό 포함

AI μžλ™ μ œμ•ˆ

κ΅κ°•μ‚¬μš© λŒ€μ‹œλ³΄λ“œμ—μ„œ λ‹€μŒ μ„Έ κ°€μ§€ μœ ν˜•μ˜ κ°œμž… μ œμ•ˆμ„ μ œκ³΅ν•©λ‹ˆλ‹€.

  • μ·¨μ•½ κ°œλ… 보좩 ν€˜μŠ€νŠΈ λ°œμ†‘
  • Cλ“±κΈ‰ λ˜λŠ” μ €μ°Έμ—¬ 학생 λŒ€μƒ 동기뢀여 λ©”μ‹œμ§€
  • 반볡 질문 ν‚€μ›Œλ“œ 기반 μΆ”κ°€ 자료 μ—…λ‘œλ“œ ꢌ고

각 μ œμ•ˆμ€ μ±„νŒ… 질문 ν‚€μ›Œλ“œ, ν€˜μŠ€νŠΈ μ°Έμ—¬μœ¨, μ˜€λ‹΅λ₯ , μ·¨μ•½ κ°œλ…, 자료 μ€€λΉ„ μƒνƒœλ₯Ό μ’…ν•©ν•΄ νŒλ‹¨ν•©λ‹ˆλ‹€.

μ£Όμš” API

ν”„λ‘ νŠΈμ—”λ“œ 계약에 맞좰 /api/v1 prefix 없이 μ œκ³΅ν•©λ‹ˆλ‹€.

Auth

  • POST /auth/signup
  • POST /auth/login
  • POST /auth/logout
  • GET /auth/me

Courses

  • GET /courses/me
  • GET /courses/{course_id}
  • POST /courses
  • POST /courses/join
  • DELETE /courses/{course_id}

Files

  • GET /courses/{course_id}/files
  • POST /courses/{course_id}/files
  • PATCH /courses/{course_id}/files/{file_id}
  • PATCH /courses/{course_id}/files/{file_id}/publish
  • DELETE /courses/{course_id}/files/{file_id}

Chat

  • GET /courses/{course_id}/chat
  • POST /courses/{course_id}/chat
  • POST /courses/{course_id}/chat/stream

Quests

  • GET /courses/{course_id}/quests
  • GET /courses/{course_id}/quests/{quest_id}/content
  • POST /courses/{course_id}/quests
  • PUT /courses/{course_id}/quests/{quest_id}
  • POST /courses/{course_id}/quests/{quest_id}/send
  • DELETE /courses/{course_id}/quests/{quest_id}
  • POST /courses/{course_id}/quests/{quest_id}/submit
  • POST /courses/{course_id}/quests/ai-draft

Dashboard

  • GET /courses/{course_id}/analytics
  • GET /courses/{course_id}/analytics/keywords
  • GET /courses/{course_id}/analytics/students
  • GET /courses/{course_id}/ai-proposals
  • GET /courses/{course_id}/ai-config
  • PUT /courses/{course_id}/ai-config
  • GET /courses/{course_id}/me/stats
  • GET /courses/{course_id}/me/weak-points
  • GET /courses/{course_id}/notifications
  • PATCH /courses/{course_id}/notifications/{notification_id}/read
  • PATCH /courses/{course_id}/notifications/read-all
  • POST /courses/{course_id}/quiz/submit

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

μ‹€μ œ 값은 .env에 μž‘μ„±ν•©λ‹ˆλ‹€. .envλŠ” Git에 μ˜¬λ¦¬μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

DATABASE_URL=mysql+aiomysql://<DB_USER>:<DB_PASSWORD>@<DB_HOST>:4000/<DB_NAME>
DATABASE_SSL=true

JWT_SECRET_KEY=<JWT_SECRET>

STORAGE_PROVIDER=s3
AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID>
AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY>
AWS_REGION=ap-northeast-2
S3_BUCKET_NAME=<S3_BUCKET_NAME>
S3_PREFIX=uploads
S3_PRESIGNED_URL_EXPIRES=3600

AI_PROVIDER=gemini
AI_MAX_OUTPUT_TOKENS=1024
GEMINI_API_KEY=<GEMINI_API_KEY>
GEMINI_MODEL=gemini-2.5-flash-lite

EMBEDDING_PROVIDER=gemini
GEMINI_EMBEDDING_MODEL=gemini-embedding-001
GEMINI_EMBEDDING_OUTPUT_DIMENSIONALITY=768

LOCAL_RAG_ENABLED=true
RAG_CHUNK_SIZE=1200
RAG_CHUNK_OVERLAP=200
RAG_TOP_K=5

μ‹€ν–‰ 방법

Windows ν™˜κ²½μ—μ„œλŠ” uvicorn을 직접 μ‹€ν–‰ν•˜μ§€ μ•Šκ³  run_server.pyλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. TiDB μ—°κ²° μ‹œ Windows Proactor event loop 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ Selector loopλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

cd Back
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
Copy-Item .env.example .env
python run_server.py

μ„œλ²„ μ‹€ν–‰ ν›„ 확인:

http://127.0.0.1:8000/docs
http://127.0.0.1:8000/health
http://127.0.0.1:8000/health/db

λ°μ΄ν„°λ² μ΄μŠ€ μΆ”κ°€ 컬럼

κΈ°λ³Έ 17개 ν…Œμ΄λΈ” 외에 ν˜„μž¬ λ°±μ—”λ“œ κΈ°λŠ₯을 μœ„ν•΄ λ‹€μŒ 컬럼과 보쑰 ν…Œμ΄λΈ”μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

ALTER TABLE enrollments
MODIFY current_rank ENUM('A', 'B', 'C') DEFAULT 'C';

ALTER TABLE course_documents
ADD COLUMN topic VARCHAR(255) NULL,
ADD COLUMN is_published BOOLEAN NOT NULL DEFAULT FALSE;

ALTER TABLE document_chunks
ADD COLUMN embedding_json LONGTEXT NULL,
ADD COLUMN embedding_model VARCHAR(100) NULL,
ADD COLUMN embedding_dim INT NULL;

CREATE INDEX idx_course_documents_course_id_deleted
ON course_documents(course_id, deleted_at);

CREATE TABLE IF NOT EXISTS notification_reads (
    notification_read_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    course_id BIGINT NOT NULL,
    notification_key VARCHAR(64) NOT NULL,
    read_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY unique_notification_read_user_course_key (
        user_id,
        course_id,
        notification_key
    ),
    KEY idx_notification_reads_user_course (user_id, course_id),
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

CREATE TABLE IF NOT EXISTS quiz_attempts (
    quiz_attempt_id BIGINT AUTO_INCREMENT PRIMARY KEY,
    course_id BIGINT NOT NULL,
    enrollment_id BIGINT NOT NULL,
    message_key VARCHAR(64) NOT NULL,
    selected_index INT NOT NULL,
    is_correct BOOLEAN NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY unique_quiz_attempt_enrollment_course_message (
        enrollment_id,
        course_id,
        message_key
    ),
    KEY idx_quiz_attempts_course_enrollment (course_id, enrollment_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id),
    FOREIGN KEY (enrollment_id) REFERENCES enrollments(enrollment_id)
);

notification_reads와 quiz_attemptsλŠ” μ•± μ‹œμž‘ μ‹œ μ—†μœΌλ©΄ μžλ™ μƒμ„±λ©λ‹ˆλ‹€.

λ³΄μ•ˆ μ •μ±…

  • .envλŠ” Git에 ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • AWS/Gemini/DB ν‚€λŠ” μ„œλ²„ ν™˜κ²½ λ³€μˆ˜λ‘œλ§Œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • S3 버킷은 Public Access Block을 μœ μ§€ν•©λ‹ˆλ‹€.
  • 파일 λ‹€μš΄λ‘œλ“œλŠ” S3 presigned URL둜만 μ œκ³΅ν•©λ‹ˆλ‹€.
  • Presigned URL κΈ°λ³Έ 만료 μ‹œκ°„μ€ 1μ‹œκ°„μž…λ‹ˆλ‹€.
  • 학생은 본인이 μˆ˜κ°• 쀑인 κ°•μ˜μ˜ 곡개 μžλ£Œμ™€ λ°œμ†‘λœ ν€˜μŠ€νŠΈλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

검증 μ™„λ£Œ ν•­λͺ©

  • Gemini ν…μŠ€νŠΈ 생성
  • Gemini embedding 768차원 생성
  • S3 μ—…λ‘œλ“œ, presigned λ‹€μš΄λ‘œλ“œ, μ‚­μ œ
  • PDF ν•œκΈ€ 파일λͺ… μ—…λ‘œλ“œ
  • S3 PDF 기반 RAG 색인
  • TiDB document_chunks.embedding_json μ €μž₯
  • RAG μ±„νŒ… λ‹΅λ³€ 및 좜처 λ°˜ν™˜
  • ν€˜μŠ€νŠΈ 생성, μˆ˜μ •, λ°œμ†‘, 제좜, 채점
  • μ‹ κ·œ μˆ˜κ°•μƒ Cλ“±κΈ‰ μ‹œμž‘ 및 XP 기반 λ“±κΈ‰ κ°±μ‹ 
  • A/B/C λ“±κΈ‰ κΈ°μ€€ 및 λ“±κΈ‰ λ‚΄ XP 진행도 λ°˜ν™˜
  • ν€˜μŠ€νŠΈ μ™„λ£Œ μƒνƒœ λ°˜ν™˜ 및 쀑볡 제좜 λ°©μ§€
  • μ•Œλ¦Ό 읽음 μƒνƒœ DB μ €μž₯
  • AI μ˜€λ‹΅λ…ΈνŠΈ λ¬Έν•­/λ‚΄ λ‹΅/μ •λ‹΅/ν•΄μ„€ λ°˜ν™˜
  • μ±„νŒ… ν€΄μ¦ˆ κ²°κ³Ό μ €μž₯ 및 톡계 반영
  • AI ν€˜μŠ€νŠΈ μ΄ˆμ•ˆ 생성 μ‹œ 주차별 자료 필터링
  • Cloudflare Tunnel을 ν†΅ν•œ HTTPS ν”„λ‘ νŠΈ 연동

ν˜„μž¬ 배포 ꡬ성

ν˜„μž¬ λ°±μ—”λ“œλŠ” AWS EC2 μΈμŠ€ν„΄μŠ€μ—μ„œ FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μ‹€ν–‰λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘ νŠΈμ—”λ“œλŠ” Vercel에 λ°°ν¬λ˜μ–΄ 있으며, λΈŒλΌμš°μ €μ˜ HTTPS μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ Cloudflare Tunnel을 톡해 λ°±μ—”λ“œ HTTPS μ—”λ“œν¬μΈνŠΈλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

Vercel Frontend
https://custom-ta.vercel.app
        |
        | HTTPS API request
        v
Cloudflare Tunnel
https://scheduled-cars-nest-warranty.trycloudflare.com
        |
        | forwards to
        v
AWS EC2 Ubuntu Server
FastAPI / Uvicorn / systemd
http://127.0.0.1:8000
        |
        +-- TiDB Cloud
        +-- AWS S3
        +-- Gemini API

EC2 μ„œλΉ„μŠ€ μ‹€ν–‰ 방식

FastAPI μ„œλ²„λŠ” EC2 λ‚΄λΆ€μ—μ„œ systemd μ„œλΉ„μŠ€λ‘œ μ‹€ν–‰ν•©λ‹ˆλ‹€.

sudo systemctl status custom-ta
sudo systemctl restart custom-ta
journalctl -u custom-ta -f

μ„œλΉ„μŠ€ μ‹€ν–‰ λͺ…령은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

/home/ubuntu/Back/.venv/bin/uvicorn webapp.main:app --host 0.0.0.0 --port 8000

Cloudflare Tunnel

Cloudflare Tunnel은 EC2 λ‚΄λΆ€μ˜ 127.0.0.1:8000으둜 λ“€μ–΄μ˜€λŠ” FastAPI μ„œλ²„λ₯Ό μ™ΈλΆ€ HTTPS μ£Όμ†Œλ‘œ λ…ΈμΆœν•©λ‹ˆλ‹€.

cloudflared tunnel --url http://127.0.0.1:8000

터널은 tmux μ„Έμ…˜μ—μ„œ μœ μ§€ν•©λ‹ˆλ‹€.

tmux ls
tmux attach -t tunnel

터널 ν™”λ©΄μ—μ„œ λΉ μ Έλ‚˜μ˜¬ λ•ŒλŠ” μ„œλ²„λ₯Ό 끄지 μ•Šκ³  detachν•©λ‹ˆλ‹€.

Ctrl + B
D

ν”„λ‘ νŠΈμ—”λ“œ ν™˜κ²½λ³€μˆ˜

Vercel ν”„λ‘ νŠΈμ—”λ“œλŠ” μ•„λž˜ ν™˜κ²½λ³€μˆ˜λ‘œ λ°±μ—”λ“œ API μ£Όμ†Œλ₯Ό λ°”λΌλ΄…λ‹ˆλ‹€.

VITE_API_BASE_URL=https://scheduled-cars-nest-warranty.trycloudflare.com

배포 반영 절차

GitHub main λΈŒλžœμΉ˜μ— 변경사항을 pushν•œ λ’€, EC2μ—μ„œ λ‹€μŒ λͺ…λ ΉμœΌλ‘œ μ΅œμ‹  μ½”λ“œλ₯Ό λ°˜μ˜ν•©λ‹ˆλ‹€.

cd ~/Back
git pull origin main
sudo systemctl restart custom-ta
sudo systemctl status custom-ta

정상 λ™μž‘ 확인:

curl https://scheduled-cars-nest-warranty.trycloudflare.com/health

운영 μ „ν™˜ μ‹œ ꢌμž₯ 사항

  • Google Cloud λ˜λŠ” AI Studio μ˜ˆμ‚° μ•Œλ¦Ό μ„€μ •
  • AWS Budget μ•Œλ¦Ό μ„€μ •
  • S3 IAM κΆŒν•œμ„ νŠΉμ • λ²„ν‚·μ˜ uploads/*둜 μ œν•œ
  • Cloudflare quick tunnel λŒ€μ‹  named tunnel λ˜λŠ” κ³ μ • 도메인 적용
  • WEEKLY_INTERVENTION_INTERVAL_SECONDS=604800
  • APP_DEBUG=false
  • μΆ©λΆ„νžˆ κΈ΄ JWT_SECRET_KEY μ‚¬μš©

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages