Gin 프레임워크를 사용한 파일 업로드 및 다운로드 서버입니다.
- 파일 업로드 (직접 업로드 또는 URL에서 다운로드)
- API 키 인증 (Bearer Token 방식)
- Rate Limiting (분당 요청 횟수 제한)
- 요청 로깅 및 모니터링
- 파일 다운로드
- 중복되지 않는 랜덤 파일명으로 저장 (UUID 사용)
- 최대 파일 크기 제한 (100MB)
- 디렉토리 트래버셜 공격 방지
먼저 .env 파일을 생성하여 API 키를 설정합니다:
# .env.example을 복사하여 .env 파일 생성
cp .env.example .env.env 파일 내용:
# API 키 설정 (필수) - 안전한 랜덤 문자열로 변경하세요
API_KEY=your_secret_api_key_here
# Rate Limiting 설정 (선택사항)
RATE_LIMIT_PER_MINUTE=100
# 서버 포트 (선택사항)
PORT=9999중요: 프로덕션 환경에서는 반드시 강력한 API 키로 변경하세요!
# Docker 컨테이너 빌드 및 실행
docker-compose up -d
# 로그 확인
docker-compose logs -f
# 서버 중지
docker-compose down서버는 http://0.0.0.0:9999 에서 실행됩니다.
go mod tidygo run main.gogo build -o gofiler
./gofiler서버는 http://0.0.0.0:9999 에서 실행됩니다.
- URL:
POST /upload - 설명: 파일을 업로드하거나 URL에서 파일을 다운로드하여 저장
- 인증: Bearer Token 필요
- Rate Limit: 분당 100회 (기본값, 설정 가능)
파일 업로드 방식:
curl -X POST "http://127.0.0.1:9999/upload" \
-H "Authorization: Bearer your_secret_api_key_here" \
-F "file=@example.jpg"URL 다운로드 방식:
curl -X POST "http://127.0.0.1:9999/upload" \
-H "Authorization: Bearer your_secret_api_key_here" \
-d "url=https://example.com/image.jpg"응답 예시:
{
"message": "파일이 성공적으로 업로드되었습니다.",
"filename": "b83dd18a.jpg",
"original_filename": "example.jpg",
"size": 102400,
"download_url": "/files/b83dd18a.jpg",
"view_url": "/view/b83dd18a.jpg"
}- URL:
GET /files/{filename} - 설명: 업로드된 파일을 다운로드
curl -O "http://127.0.0.1:9999/files/b83dd18a.jpg"- URL:
GET /view/{filename} - 설명: 업로드된 파일을 보기/다운로드 (이미지는 브라우저에서 직접 표시, 다른 파일은 다운로드)
# 브라우저에서 접근
http://127.0.0.1:9999/view/b83dd18a.jpg동작 방식:
- 이미지 파일(image/*)의 경우: 브라우저에서 직접 표시 (inline)
- 다른 파일의 경우: 다운로드 (attachment)
- URL:
GET / - 설명: 서버 상태 및 사용 가능한 엔드포인트 확인
curl "http://127.0.0.1:9999/"업로드된 파일은 프로젝트 하위의 files/ 폴더에 저장됩니다.
n8n 워크플로우에서 이 API를 사용하는 방법:
- 노드 추가: "HTTP Request" 노드를 추가합니다
- Method: POST
- URL:
http://your-server:9999/upload - Authentication: Generic Credential Type
- Credential Type: Header Auth
- Name:
Authorization - Value:
Bearer your_secret_api_key_here
방법 1: 바이너리 파일 업로드
- Body Content Type:
Form-Data - Body Parameters:
- Name:
file - Type:
File - Input Data Field Name: 이전 노드의 바이너리 데이터 필드명
- Name:
방법 2: URL에서 다운로드
- Body Content Type:
Form URL Encoded - Body Parameters:
- Name:
url - Value:
https://example.com/image.jpg
- Name:
업로드 성공 시 다음과 같은 JSON 응답을 받습니다:
{
"message": "파일이 성공적으로 업로드되었습니다.",
"filename": "b83dd18a.jpg",
"download_url": "/files/b83dd18a.jpg",
"view_url": "/view/b83dd18a.jpg"
}다음 노드에서 {{ $json.download_url }} 또는 {{ $json.view_url }}로 파일 URL을 참조할 수 있습니다.
- API 키 인증: Bearer Token 방식으로 업로드 엔드포인트 보호
- Rate Limiting: 분당 요청 횟수 제한으로 남용 방지
- 요청 로깅: 모든 API 요청 로그 기록 (IP, 타임스탬프, 상태 코드, 응답 시간)
- 파일 경로 검증으로 디렉토리 트래버셜 공격 방지
- 파일 크기 제한 (100MB)
- UUID를 사용한 고유 파일명 생성으로 파일명 충돌 방지
- 언어: Go 1.21+
- 웹 프레임워크: Gin
- UUID 생성: google/uuid
- 환경변수 관리: joho/godotenv
- Rate Limiting: ulule/limiter
gofiler/
├── main.go # 메인 애플리케이션 코드
├── go.mod # Go 모듈 파일
├── go.sum # Go 의존성 체크섬
├── .env # 환경변수 설정 (git 제외)
├── .env.example # 환경변수 예시 파일
├── .gitignore # Git 제외 파일 목록
├── Dockerfile # Docker 이미지 빌드 파일
├── docker-compose.yml # Docker Compose 설정
├── .dockerignore # Docker 빌드 제외 파일 목록
├── README.md # 프로젝트 문서
└── files/ # 업로드된 파일 저장 디렉토리 (자동 생성)
- 멀티 스테이지 빌드로 최적화된 이미지 생성
- Alpine Linux 기반으로 경량화
- 포트 9999 노출
- 포트 매핑: 9999:9999
- 볼륨 마운트:
./files:/root/files(파일 영구 저장) - 자동 재시작:
unless-stopped - 타임존:
Asia/Seoul
이 Go 버전은 file-server/ 디렉토리의 Python FastAPI 버전과 동일한 기능을 제공합니다:
- 동일한 API 엔드포인트:
/upload,/files/{filename},/view/{filename} - 동일한 기능: 파일 업로드, URL에서 다운로드, 파일명 중복 방지
- 동일한 보안 기능: 파일 크기 제한, 경로 검증
주요 차이점:
- Python의 비동기 처리 대신 Go의 고루틴 사용
- FastAPI 대신 Gin 프레임워크 사용
- 의존성 관리:
requirements.txt대신go.mod사용