Answer Docker 설치 가이드: Q&A 커뮤니티 플랫폼




개요

Answer는 팀과 커뮤니티를 위한 오픈소스 Q&A 플랫폼입니다. Stack Overflow의 셀프호스팅 대안으로, 제품 헬프센터, 고객 지원 포럼, 사내 지식 베이스 등을 구축할 수 있습니다. Apache Software Foundation 프로젝트입니다.

항목내용
GitHubhttps://github.com/apache/answer
공식 사이트https://answer.apache.org
문서https://answer.apache.org/docs
라이선스Apache 2.0
GitHub Stars13K+

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

🔌 플러그인

플러그인설명
ConnectorOAuth (GitHub, Google)
SearchAlgolia, Meilisearch
StorageS3, Aliyun OSS
CacheRedis
Editor에디터 확장

👥 사용자 관리

기능설명
역할Admin, Moderator, User
권한활동별 권한 레벨
프로필사용자 정보, 활동
배지업적 시스템

🔍 검색

기능설명
전문 검색질문, 답변 검색
태그 필터태그별 검색
정렬관련도, 최신순, 인기순

시스템 요구 사항

항목최소권장
CPU1 코어2+ 코어
RAM512MB2GB+
저장소5GB20GB+
포트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_TYPEsqlite, mysql, postgres
DB_HOSTDB 호스트
DB_PORTDB 포트
DB_DATABASEDB 이름
DB_USERNAMEDB 사용자
DB_PASSWORDDB 비밀번호

이메일 (SMTP)

변수설명
SMTP_HOSTSMTP 서버
SMTP_PORTSMTP 포트
SMTP_USERNAMESMTP 사용자
SMTP_PASSWORDSMTP 비밀번호
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 활성화
  • 검색 엔진 설정
  • 스토리지 설정

사용 가이드

질문하기

  1. “Ask Question” 클릭
  2. 제목 입력 (명확하게)
  3. 본문 작성 (마크다운)
  4. 태그 추가
  5. 게시

답변하기

  1. 질문 페이지로 이동
  2. 답변 작성
  3. 코드, 이미지 포함 가능
  4. 게시

채택하기 (질문자)

  1. 최고 답변 선택
  2. “Accept” 클릭
  3. 채택 표시됨

태그 관리 (관리자)

  1. Admin → Contents → Tags
  2. 새 태그 생성
  3. 동의어 설정
  4. 설명 추가

백업 및 복원

데이터 구조

./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에서 테스트 메일 발송

대안 비교

기능AnswerDiscourseStack Overflow Teams
오픈소스
셀프호스팅
Q&A 특화포럼 중심
투표 시스템
채택 기능
평판 시스템
설치 난이도쉬움복잡N/A (SaaS)
리소스 사용낮음높음N/A
언어GoRuby

선택 가이드

용도추천
Q&A 커뮤니티Answer
일반 포럼Discourse
기업 내부 Q&AAnswer
제품 헬프센터Answer
대규모 커뮤니티Discourse

활용 사례

1. 제품 헬프센터

구성:

  • FAQ 형태 Q&A
  • 태그로 제품별 분류
  • 검색 기능

효과: 고객 문의 감소, 셀프서비스

2. 사내 지식 베이스

구성:

  • 팀별 태그 분류
  • OAuth 연동 (사내 SSO)
  • 비공개 운영

효과: 지식 공유, 온보딩 효율화

3. 개발자 커뮤니티

구성:

  • GitHub OAuth
  • 코드 하이라이팅
  • 평판 시스템

효과: 기술 토론, 오픈소스 지원

4. 교육 플랫폼

구성:

  • 과목별 태그
  • 학생/교사 역할
  • 채택 시스템

효과: 질문 해결, 학습 효과


마무리

Answer는 Stack Overflow 스타일의 오픈소스 Q&A 플랫폼입니다. 간단한 설치로 제품 헬프센터, 사내 지식 베이스, 커뮤니티 포럼을 구축할 수 있습니다.

핵심 장점

장점설명
쉬운 설치Docker 원커맨드
경량Go 기반, 저리소스
Q&A 특화질문/답변/채택
평판 시스템게이미피케이션
플러그인OAuth, 검색, 스토리지
Apache 프로젝트안정적 지원



댓글 남기기