init studio admin frontend

This commit is contained in:
2026-07-01 17:34:15 +09:00
commit c50bd2b941
64 changed files with 22452 additions and 0 deletions
+877
View File
@@ -0,0 +1,877 @@
import {
Bell,
Boxes,
ChartNoAxesColumnIncreasing,
FileKey,
KeyRound,
LayoutDashboard,
Megaphone,
Network,
Rocket,
ServerCog,
ShieldCheck,
Users
} from 'lucide-react';
export const navGroups = [
{
label: '플랫폼',
items: [
{ label: '대시보드', icon: LayoutDashboard, active: true },
{
label: '런처',
icon: Rocket,
children: [
{ label: '소스 관리', view: 'launcherSources' },
{ label: '빌드 관리', view: 'launcherBuilds' },
{ label: '버전 관리' },
{ label: '공통 설정' },
{ label: '앱 연결' }
]
},
{
label: '어플리케이션',
icon: Boxes,
children: [
{ label: '앱 관리' },
{ label: '소스 관리' },
{ label: '빌드 관리' },
{ label: '릴리즈 관리' },
{ label: '실행 설정' },
{ label: '배포 관리' },
{ label: '마이그레이션' },
{ label: '로그/이벤트' }
]
},
{
label: '테일스케일',
icon: Network,
children: [
{ label: '노드 현황' },
{ label: '라우트' },
{ label: 'ACL' },
{ label: '연결 진단' }
]
},
{
label: 'Agent',
icon: ShieldCheck,
children: [
{ label: '장비 등록' },
{ label: '장비 제어' },
{ label: '설치 상태' },
{ label: 'SSH 키 배포' },
{ label: 'Workspace 설정' },
{ label: '원격 명령' }
]
},
{
label: '플랫폼 게이트웨이',
icon: ServerCog,
children: [
{ label: '연결 상태' },
{ label: 'Agent 관리' },
{ label: '장비 동기화' }
]
}
]
},
{
label: '운영',
items: [
{ label: '관리자 관리', icon: ShieldCheck },
{ label: '사용자/세션', icon: Users },
{ label: '라이센스', icon: FileKey },
{ label: '공지사항', icon: Megaphone }
]
},
{
label: '시스템',
items: [
{ label: '모니터링', icon: ChartNoAxesColumnIncreasing },
{ label: '정책', icon: ShieldCheck },
{ label: '인프라', icon: ServerCog }
]
}
];
export const metrics = [
{ label: '활성 앱', value: '10', delta: '+0', hint: '런처 등록 앱 10개', tone: 'emerald' },
{ label: '접속 사용자', value: '1,284', delta: '+9.8%', hint: '활성 세션 176개', tone: 'sky' },
{ label: '라이센스 사용률', value: '72%', delta: '+4%', hint: '468 / 650 시트', tone: 'amber' },
{ label: '런타임 정상률', value: '96.4%', delta: '-1.2%', hint: '주의 워크로드 3개', tone: 'rose' }
];
export const launcherVersions = [
{
name: 'Autonomy Studio Launcher',
appKey: 'launcher',
latestVersion: '1.0.1',
minimumSupportedVersion: '1.0.0',
status: '활성',
artifact: 'autonomy-studio-launcher-1.0.1.deb',
downloadUrl: 'https://testfile.autonomystudio.net/media/platform/autonomy-studio-launcher-1.0.1.deb',
releaseNotes: '런처 업데이트 확인 및 앱별 설치 상태 판단 기능이 추가되었습니다.'
}
];
export const launcherCommonSettings = [
{
name: '공통 인증 서버',
key: 'AUTH_BASE_URL',
value: 'http://localhost:4100',
type: 'endpoint',
status: '활성',
description: 'atnmy-stdo-auth. 로그인, 토큰 갱신, 사용자 프로필, handoff 토큰을 제공하는 공통 인증 API'
},
{
name: '인증 DB',
key: 'AUTH_DATABASE_URL',
value: 'postgres://atnmy_auth:***@auth-postgres:5432/atnmy_auth',
type: 'database',
status: '활성',
description: 'users, refresh_tokens, handoff_tokens, licenses, user_app_roles, organizations 저장소'
},
{
name: '인증 Redis',
key: 'AUTH_REDIS_URL',
value: 'redis://auth-redis:6379',
type: 'cache',
status: '활성',
description: '이메일 인증 코드, 비밀번호 재설정 코드, 로그인 실패 제한 상태를 저장'
},
{
name: 'JWT Issuer',
key: 'AUTH_JWT_ISSUER',
value: 'atnmy-stdo-auth',
type: 'security',
status: '활성',
description: '공통 인증 서버가 발급하는 access token issuer'
},
{
name: 'Refresh Cookie',
key: 'AUTH_REFRESH_COOKIE_NAME',
value: 'atnmy_refresh',
type: 'security',
status: '활성',
description: 'refresh token 저장용 HttpOnly 쿠키 이름. SameSite=Lax, Path=/ 기준'
},
{
name: 'Handoff Token',
key: 'AUTH_HANDOFF_TOKEN_TTL_SECONDS',
value: '60',
type: 'security',
status: '활성',
description: '런처에서 앱으로 인증 상태를 넘길 때 사용하는 일회성 토큰 TTL'
},
{
name: 'CORS Origins',
key: 'AUTH_CORS_ORIGINS',
value: '5173,5174,5175,5176,4200,4300,4400',
type: 'cors',
status: '활성',
description: '런처와 앱 개발 포트에서 인증 API 호출을 허용하는 origin 목록'
},
{
name: '인증 메일',
key: 'AUTH_SMTP_HOST',
value: 'smtp.gmail.com:587',
type: 'email',
status: '활성',
description: '회원가입 이메일 인증 코드와 비밀번호 재설정 코드 발송'
},
{
name: '플랫폼 게이트웨이',
key: 'PLATFORM_GATEWAY_BASE_URL',
value: 'https://platform-gateway.autonomystudio.local',
type: 'endpoint',
status: '활성',
description: '런처가 클러스터, 테일스케일, 원격 실행 상태를 조회할 때 거치는 공통 게이트웨이'
},
{
name: '런처 API',
key: 'LAUNCHER_API_BASE_URL',
value: 'https://launcher-api.autonomystudio.local',
type: 'endpoint',
status: '활성',
description: '앱 목록, 런처 버전, 공지, 다운로드 정보를 제공하는 API'
},
{
name: '플랫폼 Gitea',
key: 'PLATFORM_GITEA_BASE_URL',
value: 'https://gitea.autonomystudio.local',
type: 'repository',
status: '활성',
description: '런처와 앱별 소스, 버전 태그, 릴리즈 산출물 기준 저장소. 앱 내부 업무용 저장소와 분리'
},
{
name: '플랫폼 Gitea 토큰',
key: 'PLATFORM_GITEA_TOKEN_REF',
value: 'secret/platform-gitea-readonly',
type: 'secret',
status: '활성',
description: '앱 버전별 소스 조회와 릴리즈 메타데이터 수집에 사용하는 읽기 권한 토큰'
},
{
name: '테일스케일 연결',
key: 'TAILSCALE_STATUS_PROVIDER',
value: 'platform-gateway/tailscale',
type: 'integration',
status: '활성',
description: '런처가 테일스케일 세부 설정을 직접 관리하지 않고 게이트웨이에서 연결 상태만 조회'
},
{
name: '파일 서버',
key: 'DOWNLOAD_BASE_URL',
value: 'https://testfile.autonomystudio.net/media/platform',
type: 'storage',
status: '활성',
description: '런처와 앱 설치 파일을 제공하는 다운로드 베이스 URL'
},
{
name: '라이센스 검증',
key: 'LICENSE_CHECK_MODE',
value: 'online',
type: 'policy',
status: '활성',
description: '런처 앱 실행 전 라이센스와 앱 권한 검증 방식'
}
];
export const authApiEndpoints = [
{ group: '상태', method: 'GET', path: '/health', purpose: '서비스 및 Redis 상태 확인', auth: '없음' },
{ group: '인증', method: 'POST', path: '/auth/login', purpose: 'access token 발급 및 refresh cookie 설정', auth: '없음' },
{ group: '인증', method: 'POST', path: '/auth/refresh', purpose: 'refresh token 회전 및 access token 재발급', auth: '쿠키/토큰' },
{ group: '인증', method: 'POST', path: '/auth/logout', purpose: 'refresh token 폐기 및 쿠키 제거', auth: '쿠키/토큰' },
{ group: '사용자', method: 'GET', path: '/auth/me', purpose: '현재 사용자, 앱 권한, 라이센스, 소속 조회', auth: 'Bearer' },
{ group: '앱 연결', method: 'POST', path: '/auth/handoff', purpose: '런처에서 앱으로 넘길 handoff token 생성', auth: 'Bearer' },
{ group: '앱 연결', method: 'POST', path: '/auth/handoff/exchange', purpose: 'handoff token을 앱용 token pair로 교환', auth: '없음' },
{ group: '관리자', method: 'POST', path: '/auth/admin/users', purpose: '관리자 사용자 생성, 소속, 라이센스 할당', auth: 'ADMIN' },
{ group: '관리자', method: 'GET', path: '/auth/admin/organizations', purpose: '조직 목록 조회', auth: 'ADMIN' }
];
export const apps = [
{
name: 'ADS IDE',
key: 'ADS IDE',
status: '활성',
version: '1.1.0',
containers: 2,
cpu: 52,
memory: 68,
gitea: './apps/ads-ide/ads-ide-fe',
release: 'ADS-IDE-1.1.0.AppImage',
secrets: 8,
launcherLinked: true,
launcherOrder: 1,
launchUrl: 'Ingress 예정 / localhost:5175'
},
{
name: 'LMS',
key: 'LMS',
status: '활성',
version: '1.0.0',
containers: 3,
cpu: 74,
memory: 81,
gitea: './apps/lms/lms-fe',
release: 'LMS-1.0.0.AppImage',
secrets: 11,
launcherLinked: true,
launcherOrder: 2,
launchUrl: 'Ingress 예정 / localhost:5176'
},
{
name: 'Data Management',
key: 'Data Management',
status: '준비중',
version: '1.0.0',
containers: 0,
cpu: 31,
memory: 48,
gitea: '미연결',
release: 'data-management',
secrets: 0,
launcherLinked: false,
launcherOrder: null,
launchUrl: '미설정'
},
{
name: 'FMS',
key: 'FMS',
status: '활성',
version: '2.3.1',
containers: 0,
cpu: 63,
memory: 57,
gitea: '미연결',
release: 'fms',
secrets: 0,
launcherLinked: true,
launcherOrder: 3,
launchUrl: '미설정'
},
{
name: 'ADS Education',
key: 'ADS Education',
status: '활성',
version: '1.0.0',
containers: 0,
cpu: 18,
memory: 22,
gitea: '미연결',
release: 'ads-education',
secrets: 0,
launcherLinked: true,
launcherOrder: 4,
launchUrl: '미설정'
},
{
name: 'Calibration',
key: 'Calibration',
status: '활성',
version: '1.0.4',
containers: 0,
cpu: 21,
memory: 26,
gitea: '미연결',
release: 'calibration',
secrets: 0,
launcherLinked: false,
launcherOrder: null,
launchUrl: '미설정'
},
{
name: 'HDMAP Builder',
key: 'HDMAP Builder',
status: '활성',
version: '1.0.0',
containers: 0,
cpu: 15,
memory: 19,
gitea: '미연결',
release: 'hdmap-builder',
secrets: 0,
launcherLinked: false,
launcherOrder: null,
launchUrl: '미설정'
}
];
export const sessions = [
{ user: 'kim.admin', role: '소유자', location: '서울', device: 'Chrome macOS', state: '활성', lastSeen: '2분 전' },
{ user: 'park.ops', role: '운영자', location: '판교', device: 'Edge Windows', state: '활성', lastSeen: '7분 전' },
{ user: 'lee.viewer', role: '조회자', location: '부산', device: 'Safari iOS', state: '대기', lastSeen: '31분 전' },
{ user: 'choi.dev', role: '개발자', location: '서울', device: 'Firefox Linux', state: '잠김', lastSeen: '1시간 전' },
{ user: 'han.pm', role: '관리자', location: '대전', device: 'Chrome Windows', state: '활성', lastSeen: '12분 전' },
{ user: 'jung.viewer', role: '조회자', location: '광주', device: 'Safari macOS', state: '대기', lastSeen: '46분 전' },
{ user: 'yoon.ops', role: '운영자', location: '서울', device: 'Edge Windows', state: '활성', lastSeen: '5분 전' },
{ user: 'seo.admin', role: '관리자', location: '판교', device: 'Chrome Linux', state: '활성', lastSeen: '1분 전' },
{ user: 'moon.dev', role: '개발자', location: '부산', device: 'Firefox Linux', state: '잠김', lastSeen: '2시간 전' },
{ user: 'lim.user', role: '사용자', location: '인천', device: 'Chrome Android', state: '대기', lastSeen: '28분 전' },
{ user: 'oh.instructor', role: '강사', location: '서울', device: 'Safari iPadOS', state: '활성', lastSeen: '9분 전' }
];
export const licensePlans = [
{
code: 'FREE',
name: 'Free',
description: '기본 무료 라이선스',
defaultDurationDays: 365,
assigned: 182,
activeUsers: 164,
expiringSoon: 18,
status: '활성'
},
{
code: 'EDU',
name: 'Education',
description: '교육기관용 라이선스',
defaultDurationDays: 365,
assigned: 296,
activeUsers: 271,
expiringSoon: 21,
status: '활성'
},
{
code: 'PRO',
name: 'Professional',
description: '전문가용 라이선스',
defaultDurationDays: 365,
assigned: 172,
activeUsers: 158,
expiringSoon: 3,
status: '활성'
}
];
export const userLicenseAssignments = [
{ user: 'admin@futuredrive.net', name: 'ATNMY Studio Admin', code: 'PRO', licenseName: 'Professional', startsAt: '06.01.', expiresAt: '무기한', assignedBy: 'system', status: '활성' },
{ user: 'teacher@futuredrive.net', name: 'Future Drive Teacher', code: 'EDU', licenseName: 'Education', startsAt: '06.02.', expiresAt: '06.02.', assignedBy: 'admin@futuredrive.net', status: '활성' },
{ user: 'teacher@yu.ac.kr', name: 'YU Instructor', code: 'EDU', licenseName: 'Education', startsAt: '06.02.', expiresAt: '06.02.', assignedBy: 'admin@futuredrive.net', status: '활성' },
{ user: 'student01@example.com', name: 'student01', code: 'FREE', licenseName: 'Free', startsAt: '06.05.', expiresAt: '06.05.', assignedBy: 'system', status: '활성' },
{ user: 'student03@example.com', name: 'student03', code: 'FREE', licenseName: 'Free', startsAt: '06.05.', expiresAt: '06.05.', assignedBy: 'system', status: '활성' },
{ user: 'ops@autonomystudio.local', name: 'ops', code: 'PRO', licenseName: 'Professional', startsAt: '06.10.', expiresAt: '06.10.', assignedBy: 'admin@futuredrive.net', status: '활성' },
{ user: 'viewer@example.com', name: 'viewer', code: 'FREE', licenseName: 'Free', startsAt: '07.01.', expiresAt: '07.01.', assignedBy: 'system', status: '주의' }
];
export const appBundles = [
{
name: 'LMS',
key: 'LMS',
status: '활성',
namespace: 'stdo-lms',
launcherTarget: 'lms-fe',
launcherArtifact: 'LMS-1.0.0.AppImage',
ingress: 'https://lms.apps.autonomystudio.local',
release: 'lms-1.0.0',
components: [
{
name: 'lms-fe',
role: '런처 다운로드 앱',
type: 'electron',
workload: 'artifact',
image: 'LMS-1.0.0.AppImage',
replicas: '-',
status: '배포됨',
repository: './apps/lms/lms-fe'
},
{
name: 'lms-be',
role: 'API 서버',
type: 'deployment',
workload: 'Deployment/lms-api',
image: 'registry.local/lms-be:1.0.0',
replicas: '2/2',
status: '실행 중',
repository: './apps/lms/lms-be'
},
{
name: 'lms-adm-fe',
role: '강사용 웹 어드민',
type: 'deployment',
workload: 'Deployment/lms-adm-web',
image: 'registry.local/lms-adm-fe:0.1.0',
replicas: '1/1',
status: '실행 중',
repository: './apps/lms/lms-adm-fe'
},
{
name: 'lms-db',
role: 'PostgreSQL',
type: 'statefulset',
workload: 'StatefulSet/lms-postgres',
image: 'postgres:16',
replicas: '1/1',
status: '실행 중',
repository: 'PVC/lms-postgres-data'
}
]
},
{
name: 'ADS IDE',
key: 'ADS IDE',
status: '활성',
namespace: 'stdo-ads-ide',
launcherTarget: 'ads-ide-fe',
launcherArtifact: 'ADS-IDE-1.1.0.AppImage',
ingress: 'https://ads-ide.apps.autonomystudio.local',
release: 'ads-ide-1.1.0',
components: [
{
name: 'ads-ide-fe',
role: '런처 다운로드 앱',
type: 'electron',
workload: 'artifact',
image: 'ADS-IDE-1.1.0.AppImage',
replicas: '-',
status: '배포됨',
repository: './apps/ads-ide/ads-ide-fe'
},
{
name: 'ads-ide-be',
role: 'API 서버',
type: 'deployment',
workload: 'Deployment/ads-ide-api',
image: 'registry.local/ads-ide-be:0.1.0',
replicas: '1/1',
status: '주의',
repository: './apps/ads-ide/ads-ide-be'
}
]
},
{
name: 'Data Management',
key: 'Data Management',
status: '준비중',
namespace: 'stdo-data',
launcherTarget: 'data-management-fe',
launcherArtifact: '미등록',
ingress: '미설정',
release: 'data-management-1.0.0',
components: [
{
name: 'data-management-fe',
role: '런처 다운로드 앱',
type: 'electron',
workload: 'artifact',
image: '미등록',
replicas: '-',
status: '준비중',
repository: '미연결'
},
{
name: 'data-api',
role: 'API 서버',
type: 'deployment',
workload: 'Deployment/data-api',
image: 'registry.local/data-api:1.0.0',
replicas: '0/1',
status: '준비중',
repository: '미연결'
}
]
}
];
export const appSourceConfigs = [
{
app: 'LMS',
component: 'lms-fe',
repository: 'platform/lms-fe',
branch: 'release',
commit: '8d41c2a',
sourceType: 'electron',
target: 'LMS-1.0.0.AppImage',
status: '활성'
},
{
app: 'LMS',
component: 'lms-be',
repository: 'platform/lms-be',
branch: 'release',
commit: '3ac92ef',
sourceType: 'container',
target: 'registry.local/lms-be:1.0.0',
status: '활성'
},
{
app: 'LMS',
component: 'lms-adm-fe',
repository: 'platform/lms-adm-fe',
branch: 'release',
commit: 'f17ab31',
sourceType: 'static-web',
target: 'registry.local/lms-adm-fe:0.1.0',
status: '활성'
},
{
app: 'LMS',
component: 'lms-db',
repository: 'platform/lms-be',
branch: 'release',
commit: '3ac92ef',
sourceType: 'migration',
target: 'prisma/migrations',
status: '활성'
},
{
app: 'ADS IDE',
component: 'ads-ide-fe',
repository: 'platform/ads-ide-fe',
branch: 'develop',
commit: 'b902a11',
sourceType: 'electron',
target: 'ADS-IDE-1.1.0.AppImage',
status: '활성'
},
{
app: 'ADS IDE',
component: 'ads-ide-be',
repository: 'platform/ads-ide-be',
branch: 'develop',
commit: '10fd8b0',
sourceType: 'container',
target: 'registry.local/ads-ide-be:0.1.0',
status: '주의'
}
];
export const appBuildJobs = [
{ app: 'LMS', component: 'lms-fe', branch: 'release', job: 'electron build', artifact: 'LMS-1.0.0.AppImage', duration: '6분 12초', status: '완료', time: '12분 전' },
{ app: 'LMS', component: 'lms-be', branch: 'release', job: 'image build', artifact: 'registry.local/lms-be:1.0.0', duration: '4분 31초', status: '완료', time: '10분 전' },
{ app: 'LMS', component: 'lms-adm-fe', branch: 'release', job: 'web image build', artifact: 'registry.local/lms-adm-fe:0.1.0', duration: '3분 18초', status: '완료', time: '9분 전' },
{ app: 'ADS IDE', component: 'ads-ide-be', branch: 'develop', job: 'image build', artifact: 'registry.local/ads-ide-be:0.1.0', duration: '진행 중', status: '실행 중', time: '3분 전' },
{ app: 'FMS', component: 'fms-api', branch: 'develop', job: 'image build', artifact: '미생성', duration: '1분 44초', status: '주의', time: '24분 전' }
];
export const appReleasePipelines = [
{ app: 'LMS', version: '1.0.0', sourceBranch: 'release', releaseBranch: 'main', commit: '3ac92ef', artifacts: 'electron 1, images 2, migrations 4', status: '배포됨', createdAt: '06.18.' },
{ app: 'ADS IDE', version: '1.1.0', sourceBranch: 'develop', releaseBranch: 'release', commit: 'b902a11', artifacts: 'electron 1, images 1', status: '카나리', createdAt: '06.16.' },
{ app: 'FMS', version: '2.3.1', sourceBranch: 'develop', releaseBranch: 'release', commit: 'c82f09d', artifacts: 'images 1', status: '초안', createdAt: '06.14.' }
];
export const appDeploymentJobs = [
{ app: 'LMS', environment: '운영', release: '1.0.0', strategy: 'rolling update', target: 'stdo-lms', status: '완료', requestedBy: 'kim.admin', time: '8분 전' },
{ app: 'ADS IDE', environment: '개발', release: '1.1.0-canary', strategy: 'redeploy', target: 'stdo-ads-ide', status: '실행 중', requestedBy: 'park.ops', time: '2분 전' },
{ app: 'FMS', environment: '개발', release: '2.3.1-dev', strategy: 'deploy', target: 'stdo-fms', status: '주의', requestedBy: 'choi.dev', time: '27분 전' }
];
export const appMigrationJobs = [
{ app: 'LMS', component: 'lms-db', branch: 'release', path: 'prisma/migrations', version: '20260618091000_add_course_indexes', status: '완료', time: '7분 전' },
{ app: 'LMS', component: 'lms-db', branch: 'release', path: 'prisma/migrations', version: '20260617083000_add_assignment_status', status: '완료', time: '1일 전' },
{ app: 'ADS IDE', component: 'ads-ide-db', branch: 'develop', path: 'migrations', version: '20260616070000_workspace_schema', status: '대기', time: '대기 중' }
];
export const containers = [
{ name: 'launcher-api', app: 'Autonomy Studio Launcher', image: 'atnmy-stdo-v2-be:local', cpu: 43, memory: 62, status: '실행 중' },
{ name: 'launcher-postgres', app: 'Autonomy Studio Launcher', image: 'postgres:launcher', cpu: 24, memory: 39, status: '실행 중' },
{ name: 'lms-api', app: 'LMS', image: 'lms-be:local', cpu: 67, memory: 59, status: '실행 중' },
{ name: 'ads-ide-api', app: 'ADS IDE', image: 'ads-ide-be:local', cpu: 89, memory: 84, status: '주의' }
];
export const k3sWorkloads = [
{
namespace: 'stdo-launcher',
app: 'Autonomy Studio Launcher',
workload: 'Deployment/launcher-api',
pod: 'launcher-api-7c9d85f9b7-q2x4m',
image: 'registry.local/atnmy-stdo-v2-be:1.0.1',
replicas: '2/2',
node: 'cluster-master-01',
cpu: 43,
memory: 62,
restarts: 0,
age: '3d',
status: '실행 중'
},
{
namespace: 'stdo-launcher',
app: 'Autonomy Studio Launcher',
workload: 'StatefulSet/launcher-postgres',
pod: 'launcher-postgres-0',
image: 'postgres:16',
replicas: '1/1',
node: 'cluster-master-01',
cpu: 24,
memory: 39,
restarts: 0,
age: '3d',
status: '실행 중'
},
{
namespace: 'stdo-lms',
app: 'LMS',
workload: 'Deployment/lms-api',
pod: 'lms-api-5f6db8d675-jt2xk',
image: 'registry.local/lms-be:1.0.0',
replicas: '2/2',
node: 'cluster-worker-01',
cpu: 67,
memory: 59,
restarts: 1,
age: '18h',
status: '실행 중'
},
{
namespace: 'stdo-lms',
app: 'LMS',
workload: 'Deployment/lms-adm-web',
pod: 'lms-adm-web-778b4d4f9b-bxz92',
image: 'registry.local/lms-adm-fe:0.1.0',
replicas: '1/1',
node: 'cluster-worker-02',
cpu: 31,
memory: 44,
restarts: 0,
age: '18h',
status: '실행 중'
},
{
namespace: 'stdo-lms',
app: 'LMS',
workload: 'StatefulSet/lms-postgres',
pod: 'lms-postgres-0',
image: 'postgres:16',
replicas: '1/1',
node: 'cluster-worker-01',
cpu: 18,
memory: 71,
restarts: 0,
age: '18h',
status: '실행 중'
},
{
namespace: 'stdo-ads-ide',
app: 'ADS IDE',
workload: 'Deployment/ads-ide-api',
pod: 'ads-ide-api-84b8787d7d-r8qkp',
image: 'registry.local/ads-ide-be:0.1.0',
replicas: '1/1',
node: 'cluster-worker-02',
cpu: 89,
memory: 84,
restarts: 4,
age: '7h',
status: '주의'
}
];
export const containerBlueprints = [
{
app: 'LMS',
namespace: 'stdo-lms',
release: 'lms-1.0.0',
resources: [
{
name: 'lms-api',
kind: 'Deployment',
image: 'registry.local/lms-be:1.0.0',
replicas: 2,
ports: '4000/TCP',
env: 14,
secrets: 5,
storage: '-',
ingress: 'api.lms.apps.local',
status: '구성완료'
},
{
name: 'lms-adm-web',
kind: 'Deployment',
image: 'registry.local/lms-adm-fe:0.1.0',
replicas: 1,
ports: '80/TCP',
env: 6,
secrets: 2,
storage: '-',
ingress: 'admin.lms.apps.local',
status: '구성완료'
},
{
name: 'lms-postgres',
kind: 'StatefulSet',
image: 'postgres:16',
replicas: 1,
ports: '5432/TCP',
env: 8,
secrets: 3,
storage: '20Gi / RWO',
ingress: '-',
status: '구성완료'
}
]
},
{
app: 'ADS IDE',
namespace: 'stdo-ads-ide',
release: 'ads-ide-1.1.0',
resources: [
{
name: 'ads-ide-api',
kind: 'Deployment',
image: 'registry.local/ads-ide-be:0.1.0',
replicas: 1,
ports: '4300/TCP',
env: 9,
secrets: 4,
storage: '-',
ingress: 'api.ads-ide.apps.local',
status: '검토필요'
}
]
}
];
export const tailscaleNodes = [
{
name: 'cluster-master-01',
ip: '100.64.0.10',
role: 'control-plane',
user: 'ops@autonomystudio.local',
routes: '10.42.0.0/16, 10.43.0.0/16',
lastSeen: '1분 전',
status: '활성'
},
{
name: 'cluster-worker-01',
ip: '100.64.0.11',
role: 'worker',
user: 'ops@autonomystudio.local',
routes: '-',
lastSeen: '3분 전',
status: '활성'
},
{
name: 'gpu-runner-02',
ip: '100.64.20.2',
role: 'gpu-runner',
user: 'mlops@autonomystudio.local',
routes: '-',
lastSeen: '오프라인',
status: '주의'
}
];
export const tailscaleSettings = [
{
name: 'Tailnet',
key: 'TAILSCALE_TAILNET',
value: 'autonomy-studio.ts.net',
status: '활성',
description: '런처와 클러스터 운영 노드가 연결되는 tailnet'
},
{
name: 'Subnet Routes',
key: 'TAILSCALE_ADVERTISE_ROUTES',
value: '10.42.0.0/16,10.43.0.0/16',
status: '활성',
description: 'Pod/Service CIDR 접근용 광고 라우트'
},
{
name: 'Platform Gateway 연동',
key: 'TAILSCALE_GATEWAY_PROVIDER',
value: 'platform-gateway',
status: '활성',
description: '런처에는 연결 상태만 제공하고 세부 조회는 플랫폼 게이트웨이가 담당'
}
];
export const gatewayConnections = [
{ name: 'Headscale Server', endpoint: 'https://headscale.autonomystudio.local', role: '노드/ACL 동기화', status: '활성', lastSync: '1분 전' },
{ name: 'Autonomy Agent', endpoint: 'agent heartbeat stream', role: 'Agent 등록/상태 집계', status: '활성', lastSync: '30초 전' },
{ name: 'Platform Gitea', endpoint: 'https://gitea.autonomystudio.local', role: '런처/앱 소스 버전 저장소', status: '활성', lastSync: '5분 전' },
{ name: 'Platform Runtime', endpoint: 'runtime command bus', role: '원격 명령/로그/이벤트', status: '주의', lastSync: '12분 전' }
];
export const agentDevices = [
{ name: 'lab-mkmini-01', account: 'student01@example.com', status: '활성', workspace: '~/autonomy-studio/workspaces', sshKey: '배포됨', lastSeen: '2분 전' },
{ name: 'lab-f1tenth-03', account: 'student03@example.com', status: '활성', workspace: '~/autonomy-studio/workspaces', sshKey: '배포됨', lastSeen: '4분 전' },
{ name: 'sim-runner-02', account: 'instructor@example.com', status: '주의', workspace: '/opt/studio/workspaces', sshKey: '대기', lastSeen: '35분 전' }
];
export const runtimeCommands = [
{ target: 'lab-mkmini-01', command: 'workspace sync', status: '완료', requestedBy: 'park.ops', time: '8분 전' },
{ target: 'lab-f1tenth-03', command: 'build module', status: '실행 중', requestedBy: 'kim.admin', time: '3분 전' },
{ target: 'sim-runner-02', command: 'collect logs', status: '주의', requestedBy: 'choi.dev', time: '22분 전' }
];
export const notices = [
{ scope: '런처', title: 'v1.0.1 업데이트 안내', audience: '전체 사용자', status: '게시됨', date: '04.23.' },
{ scope: 'ADS IDE', title: '정기 점검 안내', audience: 'ADS IDE 사용자', status: '게시됨', date: '04.10.' },
{ scope: 'LMS', title: '신규 과제 검토 요청', audience: '강사', status: '게시됨', date: '06.02.' },
{ scope: '런처', title: '로그인 화면 점검 배너', audience: '전체 사용자', status: '예약됨', date: '06.24.' },
{ scope: 'FMS', title: 'FMS 릴리즈 사전 안내', audience: 'FMS 사용자', status: '초안', date: '06.25.' },
{ scope: 'ADS Education', title: '교육 콘텐츠 업데이트', audience: 'ADS Education 사용자', status: '게시됨', date: '06.12.' },
{ scope: 'Data Management', title: '베타 신청 접수', audience: '운영자', status: '초안', date: '06.18.' },
{ scope: '런처', title: '구버전 런처 지원 종료 안내', audience: '전체 사용자', status: '예약됨', date: '07.01.' },
{ scope: 'Calibration', title: '캘리브레이션 템플릿 변경', audience: 'Calibration 사용자', status: '게시됨', date: '06.09.' },
{ scope: 'HDMAP Builder', title: 'HDMAP Builder 등록 예정', audience: '운영자', status: '초안', date: '06.28.' },
{ scope: '런처', title: '파일 서버 점검 공지', audience: '전체 사용자', status: '게시됨', date: '06.15.' },
{ scope: 'ADS IDE', title: 'IDE 확장 기능 업데이트', audience: 'ADS IDE 사용자', status: '예약됨', date: '06.30.' }
];
export const alerts = [
{ icon: Bell, label: '확인이 필요한 워크로드 3개' },
{ icon: FileKey, label: '14일 내 만료되는 라이센스 42개' },
{ icon: KeyRound, label: '이번 주 교체된 시크릿 5개' }
];