Flutter Web foreground 알림을 준비하기 위해 초기화 옵션과 token prefix 경계를 public API로 고정한다. 포트/환경 기준 문서와 로드맵 정리, agent-task 리뷰 산출물도 함께 반영한다.
128 lines
12 KiB
Markdown
128 lines
12 KiB
Markdown
# Nexo Runtime Image 검증
|
|
|
|
이 문서는 nexo-owned runtime image의 registry, tag, architecture, verification digest를 기록한다.
|
|
현재 포트와 환경 기준의 원천은
|
|
`../services/core/compose/README.md`의 Port And Environment Inventory다. 이
|
|
문서의 명령 출력은 당시 검증 증거이며, 새 private host, token,
|
|
credential, concrete endpoint 값을 추가 기록하지 않는다.
|
|
|
|
## 게시된 Image 요약
|
|
|
|
| 서비스 | 대상 Architecture | Immutable Tag | Latest Tag | Digest (Immutable Tag) | Digest (Latest) |
|
|
|---|---|---|---|---|---|
|
|
| **Core (Mattermost)** | `linux/arm64` | `v11.4.2-arm64` | `latest` | `sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee` | `sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee` |
|
|
| **Push-Proxy** | `linux/arm64` | `v11.4.2-arm64` | `latest` | `sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b` | `sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b` |
|
|
|
|
## 검증 증거
|
|
|
|
### Registry API Manifest Header
|
|
이 섹션은 일치하는 `Docker-Content-Digest`가 해석되는지 확인한 registry manifest 검증 log를 보여준다.
|
|
|
|
```sh
|
|
# registry에서 Core(Mattermost) manifest 조회
|
|
$ curl -fsSI -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' https://toki-labs.com:5050/v2/nexo/mattermost/manifests/latest
|
|
HTTP/1.1 200 OK
|
|
Server: nginx/1.29.3
|
|
Content-Type: application/vnd.docker.distribution.manifest.v2+json
|
|
Content-Length: 6766
|
|
Docker-Content-Digest: sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee
|
|
Etag: "sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee"
|
|
|
|
# registry에서 Push-Proxy manifest 조회
|
|
$ curl -fsSI -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' https://toki-labs.com:5050/v2/nexo/push-proxy/manifests/latest
|
|
HTTP/1.1 200 OK
|
|
Server: nginx/1.29.3
|
|
Content-Type: application/vnd.docker.distribution.manifest.v2+json
|
|
Content-Length: 1577
|
|
Docker-Content-Digest: sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b
|
|
Etag: "sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b"
|
|
```
|
|
|
|
### Remote Host Image Inspect (Architecture 증거)
|
|
이 섹션은 remote Mac build host(`toki@toki-labs.com`)에서 직접 실행한 inspect output을 기록한다.
|
|
|
|
```sh
|
|
$ ssh toki@toki-labs.com '/usr/local/bin/docker image inspect toki-labs.com:5050/nexo/mattermost:latest --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}" && /usr/local/bin/docker image inspect toki-labs.com:5050/nexo/mattermost:v11.4.2-arm64 --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}" && /usr/local/bin/docker image inspect toki-labs.com:5050/nexo/push-proxy:latest --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}" && /usr/local/bin/docker image inspect toki-labs.com:5050/nexo/push-proxy:v11.4.2-arm64 --format "{{.Os}}/{{.Architecture}} {{range .RepoDigests}}{{.}} {{end}}"'
|
|
|
|
linux/arm64 toki-labs.com:5050/nexo/mattermost@sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee
|
|
linux/arm64 toki-labs.com:5050/nexo/mattermost@sha256:a811233f0625dd72a43c4b2315010ad67355fccc34be3e29d44e7aaab202b3ee
|
|
linux/arm64 toki-labs.com:5050/nexo/push-proxy@sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b
|
|
linux/arm64 toki-labs.com:5050/nexo/push-proxy@sha256:73d104148e66bb24e901bd1787624cf9b46e41268955e20bdfe4c6fc70f10b0b
|
|
```
|
|
|
|
### Remote Compose Smoke 증거
|
|
이 섹션은 local compose file을 remote development host로 복사하고, config check를 실행하고, nexo-owned image를 pull한 뒤 service smoke test를 수행한 검증 log를 담는다.
|
|
|
|
```sh
|
|
# 1. local/remote file hash 비교(parity verification)
|
|
$ sha256sum docker-compose.yml .env.example
|
|
c46bc291e42b1e87ca5e6b49d118bb59c67b0b2b1412a2751c6089e49d492563 docker-compose.yml
|
|
fa56a8dc7a8dddc7737d42ec048e4f29836252e277e2d270f0ad0e7cbb38d430 .env.example
|
|
|
|
$ ssh toki@toki-labs.com 'cd ~/docker/agent-service/nexo/compose && sha256sum docker-compose.yml .env.example'
|
|
c46bc291e42b1e87ca5e6b49d118bb59c67b0b2b1412a2751c6089e49d492563 docker-compose.yml
|
|
fa56a8dc7a8dddc7737d42ec048e4f29836252e277e2d270f0ad0e7cbb38d430 .env.example
|
|
|
|
# 2. remote Docker Compose configuration 확인
|
|
$ ssh toki@toki-labs.com 'cd ~/docker/agent-service/nexo/compose && /usr/local/bin/docker compose --env-file .env.example config >/tmp/nexo-compose-config.yml && /usr/bin/grep -E "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64" /tmp/nexo-compose-config.yml'
|
|
image: toki-labs.com:5050/nexo/mattermost:latest
|
|
platform: linux/arm64
|
|
image: toki-labs.com:5050/nexo/push-proxy:latest
|
|
|
|
# 3. remote server에서 service pull 및 시작
|
|
$ ssh toki@toki-labs.com 'export PATH=$PATH:/Applications/Docker.app/Contents/Resources/bin && cd ~/docker/agent-service/nexo/compose && /usr/local/bin/docker compose pull && /usr/local/bin/docker compose up -d'
|
|
Container nexo-core-db Running
|
|
Container nexo-core-push-proxy Recreated
|
|
Container nexo-core Recreated
|
|
Container nexo-core-push-proxy Started
|
|
Container nexo-core-db Healthy
|
|
Container nexo-core Started
|
|
|
|
# 4. remote runtime smoke check
|
|
$ ssh toki@toki-labs.com 'cd ~/docker/agent-service/nexo/compose && curl -fsS "http://localhost:18065/api/v4/system/ping" && /usr/local/bin/docker compose exec -T db pg_isready -U mmuser -d mattermost && curl -fsSI "http://localhost:18065" && /usr/local/bin/docker compose ps push-proxy'
|
|
{"ActiveSearchBackend":"database","AndroidLatestVersion":"","AndroidMinVersion":"","IosLatestVersion":"","IosMinVersion":"","status":"OK"}
|
|
/var/run/postgresql:5432 - accepting connections
|
|
HTTP/1.1 200 OK
|
|
Cache-Control: no-cache, max-age=31556926, public
|
|
Content-Security-Policy: frame-ancestors 'self' ; script-src 'self'
|
|
Content-Type: text/html
|
|
Permissions-Policy:
|
|
Referrer-Policy: no-referrer
|
|
X-Content-Type-Options: nosniff
|
|
X-Frame-Options: SAMEORIGIN
|
|
X-Request-Id: 1z4r5bc67b89fd8x816dexgsse
|
|
X-Version-Id: 11.4.2.22416167438.bfd0f10f265c336e8b5a043b0dccdcd64438e08f73bcc5627b72c815906e1130.false
|
|
Date: Thu, 28 May 2026 01:41:27 GMT
|
|
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
|
|
nexo-core-push-proxy toki-labs.com:5050/nexo/push-proxy:latest "/usr/local/b..." push-proxy 3 seconds ago Up 2 seconds 0.0.0.0:18066->8066/tcp
|
|
```
|
|
|
|
---
|
|
|
|
## 현재 Repo Runtime 및 App 증거
|
|
|
|
이 섹션은 이 repository 안의 nexo local/remote runtime component와 app에 대한 검증 matrix를 보여준다.
|
|
|
|
| 대상 | 명령 / 수동 단계 | 환경 | 기대 결과 | 실제 증거 | 상태 / 후속 조치 |
|
|
|---|---|---|---|---|---|
|
|
| **Remote Runtime Smoke** | `ssh toki@toki-labs.com '...'` | Remote host(`toki-labs.com` Mac ARM64) | active system ping이 `"status":"OK"`를 반환하고 docker compose service가 healthy 상태다. | `{"status":"OK"}`, 모든 container(`core`, `db`, `push-proxy`)가 port `18065`/`18066`에서 Up/healthy 상태를 보였다. | **PASS** |
|
|
| **Unit & Widget Tests** | `bin/test` | Local workspace container | `packages/messaging_flutter`와 `apps/flutter-test`의 모든 test가 성공한다. | Flutter plugin package와 test app 모두 `All tests passed!` output을 남겼다. | **PASS** |
|
|
| **Static Code Analysis** | `bin/lint` | Local workspace container | 두 project 모두 static issue 또는 lint warning 없이 analyze된다. | `Analyzing messaging_flutter... No issues found!`, `Analyzing flutter-test... No issues found!`. | **PASS** |
|
|
| **Android Build Unit Tests** | `ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/flutter-test/android && ./gradlew testDebugUnitTest'` | Remote host Android SDK(`emulator-5554`) | Gradle이 Android host wrapper의 native unit test를 compile하고 실행한다. | Remote Gradle test가 `BUILD SUCCESSFUL in 22s`로 완료되었고 `NexoMessagingPluginTest > onMethodCall_getPlatformVersion_returnsExpectedValue() PASSED`를 남겼다. | **PASS** |
|
|
| **Flutter Integration Test** | `ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/flutter-test && flutter test && flutter test integration_test -d emulator-5554'` | Remote host Flutter + Android emulator(`emulator-5554`) | Integration test가 연결된 device/emulator에서 plugin debug event flow를 검증한다. | Widget test가 통과했고(`4/4`), debug APK가 `emulator-5554`에 build/install되었으며 integration suite의 모든 `3`개 test가 통과했다. | **PASS** |
|
|
| **Original Mattermost App** | `ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/mattermost && npm run check-test'` | Remote host Node `22.22.3` / npm `10.9.8`, Ruby/watchman Mattermost workspace | ESLint + TypeScript check + Jest unit test가 remote host baseline에서 통과한다. | Korean `FormattedDate` snapshot baseline을 `AM`에서 remote `Intl.DateTimeFormat` output인 `오전`으로 갱신했다. Retry 결과: `PASS app/components/formatted_date/index.test.tsx`; `Test Suites: 2 skipped, 612 passed, 612 of 614 total`; `Tests: 7 skipped, 8162 passed, 8169 total`; `Snapshots: 303 passed, 303 total`. | **PASS** |
|
|
| **Detox E2E Testing** | `ssh toki@toki-labs.com 'cd ~/agent-work/nexo/apps/mattermost && npm run e2e:android'` | Remote host Android emulator + Mattermost runtime | Detox가 emulated app을 build하고 end-to-end user flow를 실행한다. | Firebase debug config는 matching `com.mattermost.rnbeta` client와 함께 ignored local/remote `apps/mattermost/android/app/google-services.json`로 제공되었고, Gradle은 `assembleDebug assembleAndroidTest`를 `BUILD SUCCESSFUL in 9m`로 완료했다. `.detoxrc.json`은 이제 Android emulator run을 remote host의 `Pixel_6_Pro_API_34`로 기본 설정한다. `CI=true npm run e2e:android-test`를 통한 Detox auto-boot는 `@Pixel_6_Pro_API_34`용 qemu를 시작하지만 약 5분 후에도 auto-booted process가 `adb devices`에 attach되지 않았다. 수동 `Pixel_6_Pro_API_34` boot는 `emulator-5554`로 attach된다. Metro와 `adb reverse tcp:8081 tcp:8081` 설정 후 default-config smoke retry에서 `server_login.e2e.ts`가 `emulator-5554 (Pixel_6_Pro_API_34)`에 배정되었지만, `beforeAll` app readiness에서 `Exceeded timeout of 180000 ms`와 Detox multiple-interaction/app-disconnect error로 실패했다. | **FAIL** — default AVD 선택은 수정되었지만, Android E2E는 login-flow PASS 전에 안정적인 boot/start 절차와 app readiness/synchronization 후속 작업이 필요하다. |
|
|
|
|
---
|
|
|
|
## Consumer Project 증거
|
|
|
|
이 섹션은 sibling/consumer project의 setup, integration status, verification metric을 기록한다.
|
|
|
|
| 대상 | 명령 / 수동 단계 | 환경 | 기대 결과 | 실제 증거 | 상태 / 후속 조치 |
|
|
|---|---|---|---|---|---|
|
|
| **`../nomadcode` Setup & Dependency** | dependency reference file scanning | Local workspace sibling | local path dependency가 등록되고 `packages/messaging_flutter`에 mapping된다. | `apps/client/pubspec.yaml`이 dependency `nexo_messaging`을 path `../../../nexo/packages/messaging_flutter`로 mapping한다(`.flutter-plugins-dependencies`, `pubspec.lock`에서 성공적으로 generated/resolved). | **PASS** |
|
|
| **`../nomadcode` Test & Smoke** | `../nomadcode/bin/test` | Local workspace sibling | Core Go test suite와 Client Flutter test가 깨끗하게 통과한다(push host integration 포함). | 모든 Go module test(`cmd/plane-smoke`, `internal/adapters/*` 등)와 모든 Flutter widget test가 성공했다. | **PASS** |
|
|
| **`../nomadcode` Android Smoke** | Remote Android notification smoke | Remote Android emulator env | 실제 FCM credential이 load되고, push notification이 도착하며, ACK가 검증된다. | 2026-05-26/27에 task `mattermost-messaging-android-smoke`에서 확인 및 archive되었다. | **PASS** |
|
|
| **`../iop` Setup & Test** | `cd ../iop/apps/portal && flutter test` | Local workspace sibling | messaging plugin integration과 code stability를 확인한다. | shared `proto-socket` module의 upstream `protobuf` package version mismatch 때문에 test compile이 실패했다. 아직 `nexo_messaging` dependency는 통합되지 않았다. | **SKIP** (upstream protobuf compilation mismatch; 아직 nexo integration 없음) |
|
|
| **`../alt` Setup & Test** | `../alt/bin/test` | Local workspace sibling | messaging plugin integration과 code stability를 확인한다. | ALT Go server component와 Flutter widget test에서 `All tests passed!` output을 남겼다. 아직 `nexo_messaging` dependency는 통합되지 않았다. | **PASS** (clean baseline; 아직 nexo integration 없음) |
|