init studio admin frontend
This commit is contained in:
@@ -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개' }
|
||||
];
|
||||
Reference in New Issue
Block a user