nexo/docs/runtime-image-validation.md

12 KiB

Nexo Runtime Image 검증

이 문서는 nexo-owned runtime image의 registry, tag, architecture, verification digest를 기록한다.

게시된 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를 보여준다.

# 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을 기록한다.

$ 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를 담는다.

# 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_flutterapps/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 assembleAndroidTestBUILD 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.tsemulator-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 없음)