개요
Answer는 팀과 커뮤니티를 위한 오픈소스 Q&A 플랫폼입니다. Stack Overflow의 셀프호스팅 대안으로, 제품 헬프센터, 고객 지원 포럼, 사내 지식 베이스 등을 구축할 수 있습니다. Apache Software Foundation 프로젝트입니다.
| 항목 | 내용 |
|---|---|
| GitHub | https://github.com/apache/answer |
| 공식 사이트 | https://answer.apache.org |
| 문서 | https://answer.apache.org/docs |
| 라이선스 | Apache 2.0 |
| GitHub Stars | 13K+ |
Answer란?
왜 Answer인가?
Stack Overflow for Teams
→ 유료 SaaS
→ 데이터 외부 저장
Answer
→ 오픈소스 무료
→ 셀프호스팅 (데이터 소유)
→ 커스터마이징 자유
핵심 기능
"Q&A + Knowledge Base + Community"
1. 질문/답변 - Stack Overflow 스타일
2. 투표 시스템 - 좋은 답변 선별
3. 태그 분류 - 주제별 정리
4. 평판 시스템 - 활동 보상
5. 플러그인 - 기능 확장
아키텍처
┌─────────────────────────────────────────┐
│ Answer Frontend │
│ (React + TypeScript) │
└─────────────────┬───────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Answer Backend │
│ (Go/Golang) │
│ ┌─────────────────────────────────┐ │
│ │ Q&A Engine (질문/답변/댓글) │ │
│ ├─────────────────────────────────┤ │
│ │ Search (검색 엔진) │ │
│ ├─────────────────────────────────┤ │
│ │ Reputation (평판 시스템) │ │
│ ├─────────────────────────────────┤ │
│ │ Plugin System (확장) │ │
│ └─────────────────────────────────┘ │
└─────────────────┬───────────────────────┘
│
▼
┌─────────────────────────────────────────┐
│ Database (SQLite / MySQL / PostgreSQL)│
└─────────────────────────────────────────┘
주요 기능
❓ Q&A
| 기능 | 설명 |
|---|---|
| 질문 작성 | 마크다운 에디터 |
| 답변 작성 | 다중 답변 |
| 채택 | 최고 답변 선정 |
| 댓글 | 추가 토론 |
| 이미지 업로드 | 드래그앤드롭 |
👍 투표 시스템
| 기능 | 설명 |
|---|---|
| 추천/비추천 | 질문, 답변에 투표 |
| 정렬 | 인기순, 최신순 |
| 최고 답변 | 채택 표시 |
🏷️ 태그
| 기능 | 설명 |
|---|---|
| 태그 생성 | 주제 분류 |
| 태그 팔로우 | 관심 주제 구독 |
| 태그 관리 | 동의어, 설명 |
⭐ 평판 시스템
| 활동 | 점수 |
|---|---|
| 질문 추천받음 | +10 |
| 답변 추천받음 | +10 |
| 답변 채택됨 | +15 |
| 비추천받음 | -2 |
🔌 플러그인
| 플러그인 | 설명 |
|---|---|
| Connector | OAuth (GitHub, Google) |
| Search | Algolia, Meilisearch |
| Storage | S3, Aliyun OSS |
| Cache | Redis |
| Editor | 에디터 확장 |
👥 사용자 관리
| 기능 | 설명 |
|---|---|
| 역할 | Admin, Moderator, User |
| 권한 | 활동별 권한 레벨 |
| 프로필 | 사용자 정보, 활동 |
| 배지 | 업적 시스템 |
🔍 검색
| 기능 | 설명 |
|---|---|
| 전문 검색 | 질문, 답변 검색 |
| 태그 필터 | 태그별 검색 |
| 정렬 | 관련도, 최신순, 인기순 |
시스템 요구 사항
| 항목 | 최소 | 권장 |
|---|---|---|
| CPU | 1 코어 | 2+ 코어 |
| RAM | 512MB | 2GB+ |
| 저장소 | 5GB | 20GB+ |
| 포트 | 80 (내부 9080) | – |
Docker 설치
방법 1: 가장 간단한 설치 (SQLite)
# docker-compose.yml
services:
answer:
image: apache/answer
container_name: answer
restart: unless-stopped
ports:
- "9080:80"
volumes:
- ./answer-data:/data
docker compose up -d
접속: http://localhost:9080 (첫 접속 시 설치 마법사 실행)
방법 2: Docker Compose 기본
# docker-compose.yml
version: "3"
services:
answer:
image: apache/answer:latest
container_name: answer
restart: unless-stopped
ports:
- "9080:80"
volumes:
- ./answer-data:/data
environment:
- TZ=Asia/Seoul
방법 3: MySQL 사용
# docker-compose.yml
services:
answer:
image: apache/answer:latest
container_name: answer
restart: unless-stopped
ports:
- "9080:80"
volumes:
- ./answer-data:/data
environment:
- TZ=Asia/Seoul
- DB_TYPE=mysql
- DB_USERNAME=answer
- DB_PASSWORD=answer_password
- DB_HOST=answer-db
- DB_PORT=3306
- DB_DATABASE=answer
depends_on:
- answer-db
answer-db:
image: mysql:8
container_name: answer-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: answer
MYSQL_USER: answer
MYSQL_PASSWORD: answer_password
volumes:
- ./data/mysql:/var/lib/mysql
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
방법 4: PostgreSQL 사용
# docker-compose.yml
services:
answer:
image: apache/answer:latest
container_name: answer
restart: unless-stopped
ports:
- "9080:80"
volumes:
- ./answer-data:/data
environment:
- TZ=Asia/Seoul
- DB_TYPE=postgres
- DB_USERNAME=answer
- DB_PASSWORD=answer_password
- DB_HOST=answer-db
- DB_PORT=5432
- DB_DATABASE=answer
depends_on:
- answer-db
answer-db:
image: postgres:16-alpine
container_name: answer-db
restart: unless-stopped
environment:
POSTGRES_DB: answer
POSTGRES_USER: answer
POSTGRES_PASSWORD: answer_password
volumes:
- ./data/postgres:/var/lib/postgresql/data
방법 5: 플러그인 포함 설치
Answer는 플러그인을 포함한 커스텀 이미지를 빌드할 수 있습니다.
Dockerfile:
FROM apache/answer:latest as answer-builder
# 플러그인 설치
RUN answer build \
--with github.com/apache/incubator-answer-plugins/connector-github \
--with github.com/apache/incubator-answer-plugins/connector-google \
--with github.com/apache/incubator-answer-plugins/search-algolia \
--with github.com/apache/incubator-answer-plugins/storage-s3
FROM alpine:latest
COPY --from=answer-builder /usr/bin/answer /usr/bin/answer
COPY --from=answer-builder /data /data
EXPOSE 80
ENTRYPOINT ["/usr/bin/answer"]
CMD ["run", "-C", "/data/"]
# docker-compose.yml
services:
answer:
build: .
container_name: answer
restart: unless-stopped
ports:
- "9080:80"
volumes:
- ./answer-data:/data
방법 6: OAuth 플러그인 (GitHub, Google)
# docker-compose.yml
services:
answer:
image: apache/answer:latest
container_name: answer
restart: unless-stopped
ports:
- "9080:80"
volumes:
- ./answer-data:/data
environment:
- TZ=Asia/Seoul
# OAuth 설정은 관리자 패널에서 진행
설치 후 Admin → Plugins → Connector에서 설정:
- GitHub OAuth: Client ID, Client Secret
- Google OAuth: Client ID, Client Secret
방법 7: SMTP 이메일 설정
# docker-compose.yml
services:
answer:
image: apache/answer:latest
container_name: answer
restart: unless-stopped
ports:
- "9080:80"
volumes:
- ./answer-data:/data
environment:
- TZ=Asia/Seoul
# SMTP 설정 (또는 Admin 패널에서 설정)
- SMTP_HOST=smtp.gmail.com
- SMTP_PORT=587
- SMTP_USERNAME=your-email@gmail.com
- SMTP_PASSWORD=your-app-password
- SMTP_FROM_EMAIL=noreply@yourdomain.com
- SMTP_FROM_NAME=Answer Community
방법 8: Traefik + HTTPS
# docker-compose.yml
services:
answer:
image: apache/answer:latest
container_name: answer
restart: unless-stopped
volumes:
- ./answer-data:/data
environment:
- TZ=Asia/Seoul
labels:
- "traefik.enable=true"
- "traefik.http.routers.answer.rule=Host(`qa.yourdomain.com`)"
- "traefik.http.routers.answer.entrypoints=websecure"
- "traefik.http.routers.answer.tls.certresolver=letsencrypt"
- "traefik.http.services.answer.loadbalancer.server.port=80"
networks:
- traefik-net
networks:
traefik-net:
external: true
환경 변수
데이터베이스
| 변수 | 설명 |
|---|---|
DB_TYPE | sqlite, mysql, postgres |
DB_HOST | DB 호스트 |
DB_PORT | DB 포트 |
DB_DATABASE | DB 이름 |
DB_USERNAME | DB 사용자 |
DB_PASSWORD | DB 비밀번호 |
이메일 (SMTP)
| 변수 | 설명 |
|---|---|
SMTP_HOST | SMTP 서버 |
SMTP_PORT | SMTP 포트 |
SMTP_USERNAME | SMTP 사용자 |
SMTP_PASSWORD | SMTP 비밀번호 |
SMTP_FROM_EMAIL | 발신 이메일 |
SMTP_FROM_NAME | 발신자 이름 |
기타
| 변수 | 설명 |
|---|---|
TZ | 타임존 (예: Asia/Seoul) |
LANGUAGE | 기본 언어 |
초기 설정
1. 시작
docker compose up -d
2. 설치 마법사
http://localhost:9080접속- 언어 선택
- 데이터베이스 설정 (SQLite 기본)
- 사이트 정보 입력
- 관리자 계정 생성
3. 사이트 설정
Admin → General:
- 사이트 이름
- 사이트 설명
- 로고, 파비콘
Admin → Interface:
- 테마 색상
- 시간대
- 언어
Admin → SMTP:
- 이메일 발송 설정
- 테스트 이메일
4. 플러그인 설정
Admin → Plugins:
- OAuth Connector 활성화
- 검색 엔진 설정
- 스토리지 설정
사용 가이드
질문하기
- “Ask Question” 클릭
- 제목 입력 (명확하게)
- 본문 작성 (마크다운)
- 태그 추가
- 게시
답변하기
- 질문 페이지로 이동
- 답변 작성
- 코드, 이미지 포함 가능
- 게시
채택하기 (질문자)
- 최고 답변 선택
- “Accept” 클릭
- 채택 표시됨
태그 관리 (관리자)
- Admin → Contents → Tags
- 새 태그 생성
- 동의어 설정
- 설명 추가
백업 및 복원
데이터 구조
./answer-data/
├── answer.db # SQLite (기본)
├── uploads/ # 업로드 파일
├── cache/ # 캐시
└── i18n/ # 번역
백업
# 컨테이너 정지
docker compose down
# 전체 백업
tar -czvf answer-backup-$(date +%Y%m%d).tar.gz answer-data/
# MySQL 사용 시
docker exec answer-db mysqldump -u answer -p answer > backup.sql
# 재시작
docker compose up -d
복원
tar -xzvf answer-backup.tar.gz
docker compose up -d
업데이트
# 최신 이미지
docker compose pull
# 재시작
docker compose down
docker compose up -d
트러블슈팅
설치 마법사 재실행
# 데이터 삭제 후 재시작
rm -rf ./answer-data/*
docker compose up -d
권한 오류
sudo chown -R 1000:1000 ./answer-data
DB 연결 오류
- MySQL/PostgreSQL 컨테이너가 먼저 시작되었는지 확인
- 네트워크 설정 확인
이메일 발송 안 됨
- SMTP 설정 확인
- Gmail 사용 시 앱 비밀번호 사용
- Admin → SMTP에서 테스트 메일 발송
대안 비교
| 기능 | Answer | Discourse | Stack Overflow Teams |
|---|---|---|---|
| 오픈소스 | ✅ | ✅ | ❌ |
| 셀프호스팅 | ✅ | ✅ | ❌ |
| Q&A 특화 | ✅ | 포럼 중심 | ✅ |
| 투표 시스템 | ✅ | ✅ | ✅ |
| 채택 기능 | ✅ | ❌ | ✅ |
| 평판 시스템 | ✅ | ✅ | ✅ |
| 설치 난이도 | 쉬움 | 복잡 | N/A (SaaS) |
| 리소스 사용 | 낮음 | 높음 | N/A |
| 언어 | Go | Ruby | – |
선택 가이드
| 용도 | 추천 |
|---|---|
| Q&A 커뮤니티 | Answer |
| 일반 포럼 | Discourse |
| 기업 내부 Q&A | Answer |
| 제품 헬프센터 | Answer |
| 대규모 커뮤니티 | Discourse |
활용 사례
1. 제품 헬프센터
구성:
- FAQ 형태 Q&A
- 태그로 제품별 분류
- 검색 기능
효과: 고객 문의 감소, 셀프서비스
2. 사내 지식 베이스
구성:
- 팀별 태그 분류
- OAuth 연동 (사내 SSO)
- 비공개 운영
효과: 지식 공유, 온보딩 효율화
3. 개발자 커뮤니티
구성:
- GitHub OAuth
- 코드 하이라이팅
- 평판 시스템
효과: 기술 토론, 오픈소스 지원
4. 교육 플랫폼
구성:
- 과목별 태그
- 학생/교사 역할
- 채택 시스템
효과: 질문 해결, 학습 효과
마무리
Answer는 Stack Overflow 스타일의 오픈소스 Q&A 플랫폼입니다. 간단한 설치로 제품 헬프센터, 사내 지식 베이스, 커뮤니티 포럼을 구축할 수 있습니다.
핵심 장점
| 장점 | 설명 |
|---|---|
| 쉬운 설치 | Docker 원커맨드 |
| 경량 | Go 기반, 저리소스 |
| Q&A 특화 | 질문/답변/채택 |
| 평판 시스템 | 게이미피케이션 |
| 플러그인 | OAuth, 검색, 스토리지 |
| Apache 프로젝트 | 안정적 지원 |