feat(ssh): rework remote instance setup and fix remote installs
Adding an SSH connection now starts from the hosts in the SSH config instead of a blank command field, ports and install options sit behind Advanced settings, and each connection reports one of three states with the failure text and an action that resolves it. Remote installs no longer touch the root-owned global npm prefix: npm is pinned to a prefix under $HOME and bun is resolved at its known location, because an SSH login shell exposes neither on PATH. The opencode CLI is resolved the same way and handed to the remote server through OPENCODE_BINARY, and the server is started and stopped through the resolved binary rather than PATH — the HTTP shutdown route sits behind UI authentication and never stopped anything. A managed remote server can also be published to the remote machine's own network. That requires a UI password, enforced in the form and again in the SSH manager.
This commit is contained in:
@@ -374,14 +374,14 @@ export const settingsDict = {
|
||||
'settings.remoteInstances.page.field.modePlaceholder': '모드 선택',
|
||||
'settings.remoteInstances.page.field.modeManaged': '대신 시작하기',
|
||||
'settings.remoteInstances.page.field.modeExternal': '이미 실행 중',
|
||||
'settings.remoteInstances.page.field.preferredRemotePort': '기본 원격 포트',
|
||||
'settings.remoteInstances.page.field.preferredRemotePortHint': '원격 컴퓨터에서 사용할 포트입니다. 비워 두면 자동으로 선택합니다.',
|
||||
'settings.remoteInstances.page.field.preferredRemotePort': '원격 머신의 포트',
|
||||
'settings.remoteInstances.page.field.preferredRemotePortHint': 'OpenChamber가 원격 머신에서 사용할 포트. 비워 두면 자동으로 선택됩니다.',
|
||||
'settings.remoteInstances.page.field.keepServerRunning': '서버 유지',
|
||||
'settings.remoteInstances.page.field.keepServerRunningHint': '연결을 끊은 뒤에도 원격 컴퓨터에서 OpenChamber를 계속 실행합니다.',
|
||||
'settings.remoteInstances.page.field.bindHost': 'Bind host',
|
||||
'settings.remoteInstances.page.field.bindHostHint': '로컬 연결이 대기할 주소입니다. LAN 접근이 필요하지 않으면 127.0.0.1 또는 localhost를 사용하세요.',
|
||||
'settings.remoteInstances.page.field.preferredLocalPort': '기본 로컬 포트',
|
||||
'settings.remoteInstances.page.field.preferredLocalPortHint': '이 연결에 열 로컬 포트입니다. 비워 두면 자동으로 선택합니다.',
|
||||
'settings.remoteInstances.page.field.keepServerRunningHint': '연결을 끊은 뒤에도 원격 서버를 계속 실행합니다. 끄면 연결 해제 시 중지되고 다음 연결 때 다시 시작됩니다.',
|
||||
'settings.remoteInstances.page.field.bindHost': '접근 가능 범위',
|
||||
'settings.remoteInstances.page.field.bindHostHint': '이 컴퓨터의 전달된 주소를 누가 열 수 있는지. 원격 머신 자체는 어느 경우든 SSH 터널로만 접근할 수 있습니다.',
|
||||
'settings.remoteInstances.page.field.preferredLocalPort': '이 컴퓨터의 포트',
|
||||
'settings.remoteInstances.page.field.preferredLocalPortHint': '터널을 위해 이 컴퓨터에서 여는 포트. 비워 두면 자동으로 선택됩니다.',
|
||||
'settings.remoteInstances.page.field.forwardType': '포워딩 유형',
|
||||
'settings.remoteInstances.page.field.localHostPlaceholder': '127.0.0.1',
|
||||
'settings.remoteInstances.page.field.remoteHostPlaceholder': '127.0.0.1',
|
||||
@@ -1203,8 +1203,8 @@ export const settingsDict = {
|
||||
'settings.remoteInstances.page.section.actionsDescription': '연결, 재연결, 로그 보기 또는 이 연결 삭제를 할 수 있습니다.',
|
||||
'settings.remoteInstances.page.section.remoteServer': '원격 컴퓨터의 OpenChamber',
|
||||
'settings.remoteInstances.page.section.remoteServerDescription': 'SSH 연결 후 OpenChamber를 어떻게 실행할지 선택하세요.',
|
||||
'settings.remoteInstances.page.section.mainTunnel': '로컬 접근',
|
||||
'settings.remoteInstances.page.section.mainTunnelDescription': '이 원격 OpenChamber 서버를 열 때 사용할 로컬 주소를 선택하세요.',
|
||||
'settings.remoteInstances.page.section.mainTunnel': '이 컴퓨터에서의 접근',
|
||||
'settings.remoteInstances.page.section.mainTunnelDescription': 'OpenChamber는 원격 머신에서 실행됩니다. 이 설정은 SSH 터널을 통해 그곳으로 연결되는 이 컴퓨터의 주소만 제어합니다.',
|
||||
'settings.remoteInstances.page.section.authentication': '인증',
|
||||
'settings.remoteInstances.page.section.authenticationDescription': 'SSH와 원격 OpenChamber UI를 위한 인증 정보입니다.',
|
||||
'settings.remoteInstances.page.section.portForwards': '포트 포워딩',
|
||||
@@ -1217,8 +1217,6 @@ export const settingsDict = {
|
||||
'settings.remoteInstances.page.field.installMethod': '설치 방식',
|
||||
'settings.remoteInstances.page.field.installMethodHint': '이 앱이 대신 시작할 때 OpenChamber를 원격 컴퓨터에 배치하는 방법입니다.',
|
||||
'settings.remoteInstances.page.field.selectInstallMethodPlaceholder': '설치 방식 선택',
|
||||
'settings.remoteInstances.page.field.installMethodDownloadRelease': '릴리스 다운로드',
|
||||
'settings.remoteInstances.page.field.installMethodUploadBundle': '번들 업로드',
|
||||
'settings.remoteInstances.page.field.selectBindHostPlaceholder': 'bind host 선택',
|
||||
'settings.remoteInstances.page.field.sshPasswordOptional': 'SSH 비밀번호(선택 사항)',
|
||||
'settings.remoteInstances.page.field.sshPasswordPlaceholder': 'SSH 비밀번호 입력',
|
||||
@@ -1242,7 +1240,44 @@ export const settingsDict = {
|
||||
'settings.remoteInstances.page.actions.enableForwardAria': '포워딩 활성화',
|
||||
'settings.remoteInstances.page.actions.openLocal': '로컬 열기',
|
||||
'settings.remoteInstances.page.actions.addForward': '포워딩 추가',
|
||||
'settings.remoteInstances.page.import.sectionTitle': '저장된 SSH 호스트',
|
||||
'settings.remoteInstances.page.addDialog.description': 'SSH 설정에서 호스트를 고르거나 연결을 직접 입력하세요.',
|
||||
'settings.remoteInstances.page.addDialog.sourceLabel': '연결을 가져오는 위치',
|
||||
'settings.remoteInstances.page.addDialog.tab.saved': 'SSH 설정에서',
|
||||
'settings.remoteInstances.page.addDialog.tab.manual': '직접 입력',
|
||||
'settings.remoteInstances.page.addDialog.searchPlaceholder': '호스트 검색',
|
||||
'settings.remoteInstances.page.addDialog.emptySaved': 'SSH 설정에서 호스트를 찾지 못했습니다. 연결을 직접 입력하세요.',
|
||||
'settings.remoteInstances.page.addDialog.searchEmpty': '검색과 일치하는 호스트가 없습니다.',
|
||||
'settings.remoteInstances.page.addDialog.use': '사용',
|
||||
'settings.remoteInstances.page.state.notConnected': '연결 안 됨',
|
||||
'settings.remoteInstances.page.state.connecting': '연결 중',
|
||||
'settings.remoteInstances.page.state.ready': '연결됨',
|
||||
'settings.remoteInstances.page.state.problem': '조치 필요',
|
||||
'settings.remoteInstances.page.section.advanced': '고급 설정',
|
||||
'settings.remoteInstances.page.section.advancedHint': '포트, 설치 방법, 비밀번호, 추가 포워딩. 대부분의 연결은 기본값으로 충분합니다.',
|
||||
'settings.remoteInstances.page.field.installMethodAuto': '자동',
|
||||
'settings.remoteInstances.page.error.hint.noRuntime': '원격 머신에 bun도 npm도 없습니다. 그곳에 하나를 설치하거나 이 연결을 "이미 실행 중"으로 바꾸세요.',
|
||||
'settings.remoteInstances.page.error.hint.noOpencode': '원격 머신에 opencode CLI가 설치되어 있지 않습니다. 그곳에 설치한 뒤(opencode.ai 참고) 다시 연결하세요.',
|
||||
'settings.remoteInstances.page.error.action.setUiPassword': 'UI 비밀번호 설정',
|
||||
'settings.remoteInstances.page.error.action.pickRandomPort': '다른 로컬 포트 사용',
|
||||
'settings.remoteInstances.page.error.action.setRemotePort': '원격 포트 설정',
|
||||
'settings.remoteInstances.page.validation.externalPortRequired': '먼저 원격 포트를 지정하세요. "이미 실행 중" 모드에서는 서버가 어떤 포트에서 대기하는지 OpenChamber가 알아야 합니다.',
|
||||
'settings.remoteInstances.page.empty.noInstances': '아직 SSH 연결이 없습니다.',
|
||||
'settings.remoteInstances.page.field.uiPasswordRequired': 'UI 비밀번호(필수)',
|
||||
'settings.remoteInstances.page.field.uiPasswordMissingForLan': '원격 서버가 자기 네트워크에서 접근 가능한 동안에는 필수입니다.',
|
||||
'settings.remoteInstances.page.field.remoteLanAccess': '원격 네트워크에서 접근 가능',
|
||||
'settings.remoteInstances.page.field.remoteLanAccessHint': '원격 머신 네트워크의 다른 기기가 SSH 터널 없이 이 OpenChamber를 직접 열 수 있게 합니다. UI 비밀번호가 필요합니다.',
|
||||
'settings.remoteInstances.page.field.remoteLanAccessWarning': '그 네트워크의 누구나 원격 OpenChamber에 접근할 수 있습니다. 아래 UI 비밀번호만이 이를 보호합니다.',
|
||||
'settings.remoteInstances.page.validation.remoteLanNeedsPassword': '먼저 UI 비밀번호를 설정하세요. 없으면 원격 OpenChamber가 그 네트워크의 모든 기기에 열리게 됩니다.',
|
||||
'settings.remoteInstances.page.field.bindHostOption.loopback': '이 컴퓨터만 (127.0.0.1)',
|
||||
'settings.remoteInstances.page.field.bindHostOption.localhost': '이 컴퓨터만 (localhost)',
|
||||
'settings.remoteInstances.page.field.bindHostOption.lan': '내 네트워크의 모든 기기 (0.0.0.0)',
|
||||
'settings.remoteInstances.page.field.sshPasswordHint': 'SSH 키 대신 비밀번호를 요구하는 호스트에서만 필요합니다.',
|
||||
'settings.remoteInstances.page.field.uiPasswordHintManaged': '원격 OpenChamber 화면을 보호할 비밀번호. OpenChamber가 대신 시작하는 서버에 이 값을 설정합니다.',
|
||||
'settings.remoteInstances.page.field.uiPasswordHintExternal': '원격 머신에서 이미 실행 중인 OpenChamber 서버에 로그인할 때 쓰는 비밀번호.',
|
||||
'settings.remoteInstances.page.tunnelPreview.caption': '이 연결의 전달 경로:',
|
||||
'settings.remoteInstances.page.empty.noInstancesWithOneImport': '아직 SSH 연결이 없습니다. SSH 설정에서 호스트 1개를 가져올 수 있습니다.',
|
||||
'settings.remoteInstances.page.empty.noInstancesWithImports': '아직 SSH 연결이 없습니다. SSH 설정에서 호스트 {count}개를 가져올 수 있습니다.',
|
||||
'settings.remoteInstances.page.state.loadingInstances': '연결을 불러오는 중...',
|
||||
'settings.remoteInstances.page.import.loading': 'SSH host 로딩 중...',
|
||||
'settings.remoteInstances.page.import.noneFound': 'SSH host를 찾을 수 없습니다.',
|
||||
'settings.remoteInstances.page.import.noneAvailable': '가져올 수 있는 SSH host가 없습니다.',
|
||||
|
||||
Reference in New Issue
Block a user