# Windows 앱 배포

Windows 설치 파일은 웹 블루/그린 릴리스 디렉터리와 분리해 보관합니다.

## 서버 최초 준비

```bash
mkdir -p /var/www/front/official-mail-downloads/windows
chmod 755 /var/www/front/official-mail-downloads/windows
```

기본 경로는 `/var/www/front/official-mail-downloads/windows`입니다. 다른 경로를 사용하려면 웹 서버의 `.env.production`에 다음 값을 추가합니다.

```dotenv
OFFICIAL_MAIL_WINDOWS_RELEASE_DIR=/absolute/path/to/windows-releases
```

웹 배포 후 다음 주소가 `503`을 반환하면 아직 정상입니다. 첫 Windows 릴리스를 올리면 JSON 응답으로 바뀝니다.

```text
https://mail.officialsite.kr/api/app/releases/windows/latest?channel=stable
```

## 릴리스 게시

먼저 Flutter 저장소에서 서명된 Windows 설치 파일을 만듭니다. 이후 웹 저장소에서 다음 명령을 실행합니다.

```powershell
powershell -ExecutionPolicy Bypass -File ".\scripts\publish-windows-release.ps1" `
  -InstallerPath "..\..\build\windows\installer\OfficialMailSetup-1.0.1-2.exe" `
  -Version "1.0.1" `
  -Build 2 `
  -MinimumVersion "1.0.0" `
  -ReleaseNotes "메일 동기화 안정성을 개선했습니다." `
  -SshTarget "root@SERVER_HOST"
```

강제 업데이트는 `-Mandatory`를 추가합니다. 베타 채널은 `-Channel beta`를 사용합니다.

스크립트는 설치 파일의 SHA-256과 크기를 계산하고 설치 파일을 먼저 게시한 뒤, `${Channel}.json`을 마지막에 원자적으로 교체합니다. 앱은 JSON에 기록된 파일 크기와 SHA-256이 일치할 때만 설치를 시작합니다.

## 배포 원칙

- `pubspec.yaml`의 버전과 `-Version`, `-Build`를 항상 일치시킵니다.
- 기존 파일을 덮어쓰지 않고 버전별 파일명을 유지합니다.
- 설치 파일은 코드 서명 인증서로 서명한 뒤 게시합니다.
- 일반 업데이트는 선택 사항으로, 보안 또는 호환성상 필요한 경우에만 강제 업데이트로 게시합니다.
- 이전 버전으로 되돌릴 때는 이전 설치 파일을 다시 올리지 않고 해당 정보로 새 `stable.json`을 게시합니다.
