Files
school-attendance-deploy/DEPLOY.md
T

3.3 KiB

다른 학교에 설치하기

이 시스템을 새 학교 서버에 설치하는 절차입니다. 백엔드는 도커로 뜨고, 도메인만 지정하면 HTTPS 인증서는 자동으로 발급됩니다.

1. Firebase 프로젝트 만들기 (학교마다 1개씩)

푸시 알림(FCM)과 웹 대시보드 호스팅에 필요합니다.

  1. https://console.firebase.google.com 에서 새 프로젝트 생성
  2. Flutter 앱 폴더에서 flutterfire configure 실행 → 방금 만든 프로젝트 선택
    • lib/firebase_options.dart, android/app/google-services.json이 새 프로젝트 값으로 교체됩니다
  3. Firebase 콘솔 → 프로젝트 설정 → Cloud Messaging → 웹 푸시 인증서에서 VAPID 키 발급 (아래 3번에서 사용)
  4. Firebase 콘솔 → 프로젝트 설정 → 서비스 계정 → 새 비공개 키 생성 → firebase-key.json으로 저장 (서버에 올릴 파일, 4번에서 사용)

2. 안드로이드 앱 ID 변경 (학교마다 다르게)

  • android/app/build.gradle.kts의 applicationId를 학교별 고유 값으로 변경 (예: com.myschool.attendance)
  • 릴리즈 키스토어 새로 생성하고 android/key.properties에 경로/비밀번호 등록 (기존 백산고 릴리즈와 절대 같은 키스토어 쓰지 않기)

3. 서버에 백엔드 배포

가장 쉬운 방법 — 설치 스크립트 한 줄:

curl -fsSL https://hootongerungit.mcv.kr/sihoo/school-attendance-deploy/raw/branch/main/install.sh | bash

Docker가 없으면 자동으로 설치하고, 도메인/교사 인증코드를 물어본 뒤 미리 빌드해둔 이미지(hootongerungit.mcv.kr/sihoo/school-backend)를 내려받아 바로 실행합니다. (소스코드는 비공개 레포에 있고, 이 이미지는 그 코드로 미리 빌드해서 공개로 올려둔 것 — 설치할 땐 소스코드 접근이 필요 없습니다.)

수동으로 하고 싶다면:

git clone https://hootongerungit.mcv.kr/sihoo/school-attendance-deploy.git
cd school-attendance-deploy
cp .env.example .env
vi .env   # DOMAIN, DB_PASSWORD, TEACHER_SECRET_CODE, ADMIN_RESET_PASSWORD 채우기
# 1-4번에서 만든 firebase-key.json을 이 폴더에 복사
docker compose pull
docker compose up -d
  • DOMAIN으로 지정한 주소의 DNS A레코드를 이 서버의 공인 IP로 미리 연결해두세요 (포트 80/443 오픈 필요). Caddy가 첫 요청부터 자동으로 Let's Encrypt 인증서를 발급합니다.
  • docker compose logs -f backend로 정상 기동(DB 연결 완료 로그) 확인.
  • 백엔드 코드가 업데이트되면 docker compose pull && docker compose up -d로 최신 이미지로 갱신하면 됩니다.

4. Flutter 앱 빌드 (학교별 서버 주소로)

flutter build web --release -t lib/main_client_app.dart \
  --dart-define=BASE_URL=https://<2번에서 지정한 DOMAIN> \
  --dart-define=WEB_VAPID_KEY=<1-3번에서 발급받은 VAPID 키> \
  --dart-define=SCHOOL_NAME=<학교 이름>

flutter build apk --release --split-per-abi -t lib/main_client_app.dart \
  --dart-define=BASE_URL=https://<DOMAIN> \
  --dart-define=WEB_VAPID_KEY=<VAPID 키> \
  --dart-define=SCHOOL_NAME=<학교 이름>

인자를 안 주면 기존 백산고 서버(backsanhi.mcv.kr) 기본값으로 빌드되니, 새 학교용 빌드에는 반드시 세 값을 다 넘겨야 합니다.