uVersion
한국어
다운로드 →

Wiki

Windows에 설치

PowerShell 한 줄: 활성화 코드, winget으로 PostgreSQL 설치, Windows 서비스, 방화벽, TLS 인증서.

Windows 10, 11 또는 Windows Server 2019+ (x64). PowerShell 한 줄로 설치합니다.

설치

1. PowerShell을 관리자 권한으로 열기

PowerShell 아이콘을 마우스 오른쪽 버튼으로 클릭 → 관리자 권한으로 실행. 그렇지 않으면 스크립트는 실행을 거부하고, 그 사실을 알려 줍니다.

2. 설치 명령 붙여넣기

방금 연 창에 그대로 붙여넣을 한 줄입니다:

iwr https://uversion.io/downloads/server/install.ps1 -UseBasicParsing | iex

그러면 스크립트가 눈앞에서 다음을 차례로 수행합니다:

  • 활성화 코드 입력 요청. 유일하게 묻는 질문입니다: 다음 단계를 참조하세요
  • 바이너리 다운로드 및 아카이브 검증
  • PostgreSQL이 없으면 winget으로 설치(약 2분)
  • 데이터베이스, 역할, Windows 서비스 생성 및 방화벽 개방 (8443, 그리고 폴백으로 8080)
  • 프로그램 및 기능 항목 등록
  • 서비스 시작, 자체 서명 TLS 인증서 생성, 이어서 관리자 비밀번호 인증서의 SHA-256 지문 표시

모든 작업은 PowerShell 창에서 이루어지며 각 단계를 볼 수 있습니다. Linux의 sudo apt install에 해당하는 Windows 방식입니다.

3. 활성화 코드 입력

유일하게 묻는 질문입니다: 다른 모든 선택은 아래에 설명된 매개변수로 이루어집니다. 이 필드는 세 가지 형식을 받습니다: 짧은 코드 UV-XXXX-XXXX-XXXX, 전체 라이선스 키가 담긴 파일 경로, 또는 그 키를 직접 붙여넣은 것. 첫 번째 형식일 때만 스크립트가 licence.uversion.io에 접속해 코드를 키로 교환합니다.

4. 마지막 요약 기록

설치는 상자로 끝납니다: admin 사용자명, 임시 비밀번호, 서버 주소, 인증서 지문. 이것들을 기록해 두세요.

설치 종료 시 표시되는 요약: admin 사용자명, 임시 비밀번호, 서버 주소.

창을 너무 빨리 닫았더라도, 비밀번호를 바꾸지 않은 한 아직 디스크에 남아 있습니다:

Get-Content "C:\ProgramData\uVersion\initial-admin-password"

이 파일은 비밀번호를 바꾸는 즉시 사라집니다: 따라서 "Cannot find path" 오류는 변경이 이미 이루어졌음을 의미합니다.

그런 다음 첫 로그인을 따라 진행할 수 있습니다.

Windows Server 2019 및 2022: PostgreSQL 먼저

winget은 Windows Server 2019에도 Windows Server 2022에도 없습니다. 그러면 스크립트는 그 자리에서 멈추고, 그 사실을 명확히 알려 주는 메시지를 표시합니다. 이것은 고장이 아닙니다: 먼저 PostgreSQL 16을 수동으로 설치한 다음 같은 명령을 다시 실행하세요. 스크립트는 기존 PostgreSQL 서비스를 감지해 새로 설치하는 대신 그것을 사용합니다.

비대화형 변형(CI, 스크립트 배포)

짧은 형식 iwr ... | iex어떤 매개변수도 받을 수 없습니다: 인수를 전달하지 않고 스크립트를 실행하므로, 끝에 붙인 -DataDir은 조용히 무시됩니다. 옵션을 전달하려면 명시적인 스크립트 블록을 구성하는 아래 형식을 사용하세요.

& ([scriptblock]::Create((iwr https://uversion.io/downloads/server/install.ps1 -UseBasicParsing).Content)) `
    -LicenceKey "UV-XXXX-XXXX-XXXX" -DataDir "D:\uVersion" -DbOnDataDir

허용되는 아홉 개의 매개변수:

매개변수기본값역할
-LicenceKey(입력받음) 활성화 코드 또는 전체 라이선스 키. 질문을 건너뜁니다.
-InstallDirC:\Program Files\uVersion 바이너리가 놓이는 위치.
-DataDirC:\ProgramData\uVersion 데이터, 구성, 시크릿이 놓이는 위치. 용량이 커지는 폴더이므로 큰 디스크에 두어야 하는 폴더입니다.
-DbOnDataDir비활성 PostgreSQL 데이터베이스도 데이터 폴더에 두어, 살아남은 디스크 한 개만으로 서버를 재구성할 수 있게 합니다. 아래 상자를 참조하세요.
-Port8080 일반 HTTP 폴백 포트. 구성에서 TLS를 비활성화한 경우에만 사용됩니다. 정상 HTTPS 포트는 8443입니다.
-BindAddress0.0.0.0 수신 인터페이스. 기본값은 모든 인터페이스에서 수신합니다.
-DownloadUrluversion.io 아카이브의 출처. 내부 미러에서 설치하려면 변경합니다.
-Reconfigure비활성 이미 존재하더라도 config.toml을 다시 씁니다.
-Update비활성 기존 설치의 바이너리를 업데이트하고 서비스를 다시 시작합니다. PostgreSQL, 라이선스, 구성은 건드리지 않습니다. 관리 패널의 "업데이트" 버튼이 실행하는 것이 이것입니다.

-DbOnDataDir은 디스크 한 개만으로 서버를 되살릴 수 있는지를 결정합니다. 이것이 없으면 PostgreSQL 데이터베이스는 별도로 남습니다: 머신이 죽으면 살아남은 데이터 디스크에는 파일 내용은 들어 있지만, 리비전도, 계정도, 잠금도, 권한도 더 이상 없습니다. 이것이 있으면 디스크 한 개에 PostgreSQL과 이 스크립트만 있으면 다른 곳에서 서버를 재구성할 수 있습니다. 대가로: 그 디스크는 그때 라이선스 키와 비밀번호도 지니게 되며, 데이터베이스는 그것을 만든 PostgreSQL의 메이저 버전으로만 다시 열 수 있습니다.

파일이 저장되는 위치

모든 것은 기본적으로 데이터 폴더 C:\ProgramData\uVersion에 있습니다: 구성(config.toml), 버전 관리되는 파일의 내용 (data\chunks), TLS 인증서와 그 지문 (data\tls), 그리고 초기 관리자 비밀번호입니다.

이 폴더에는 평문으로 된 세 개의 시크릿도 들어 있습니다: licence-key(라이선스 키), db-password(uVersion 데이터베이스의 비밀번호), postgres-superuser-password(PostgreSQL 관리자 계정의 비밀번호). 이들은 관리자 전용 권한으로 보호됩니다. 이 폴더를 금고처럼 다루세요: 공개된 네트워크 공유에 복사하지 말고, 디스크가 당신의 통제를 벗어나기 전에 이 파일들을 삭제하세요.

config.toml을 수동으로 변경한 뒤에는 반영되도록 서비스를 다시 시작하세요:

Restart-Service uVersionServer

설치 확인

독립적인 네 가지 검사입니다. 다른 데이터 폴더를 선택했다면 C:\ProgramData\uVersion을 그것으로 바꾸세요.

1. 서비스가 실행 중

Get-Service uVersionServer

예상 결과: Status: Running.

2. 서버가 8443에서 HTTPS로 수신 중

Get-NetTCPConnection -LocalPort 8443 -State Listen

한 줄이 나타나야 합니다. 서비스가 실행 중인데도 아무것도 없다면 대개 구성에서 TLS가 비활성화된 것입니다: 그러면 서버는 일반 HTTP로 전환되고 8443은 더 이상 수신하지 않습니다.

3. 인증서 지문 다시 표시

Get-Content "C:\ProgramData\uVersion\data\tls\fingerprint"

이것은 각 워크스테이션이 첫 연결 시 확인하는 지문입니다.

4. 활성 구성 다시 읽기

Get-Content "C:\ProgramData\uVersion\config.toml"

서비스가 시작을 거부하면, 이유를 보는 가장 직접적인 방법은 바이너리를 포그라운드에서 실행하는 것입니다: 그러면 시작 오류가 창에 바로 표시됩니다. 실제로 이것은 실패를 감지했을 때 설치 스크립트가 스스로 제안하는 명령이기도 합니다.

$env:CONFIG_PATH = 'C:\ProgramData\uVersion\config'
& 'C:\Program Files\uVersion\uversion-server.exe'

그런 다음 Ctrl+C로 중지한 뒤 Start-Service uVersionServer를 실행하세요. 서비스가 오류를 낼 만큼도 시작하지 못한다면, Windows 이벤트 뷰어 (eventvwr.msc)가 시스템 로그의 소스 Service Control Manager에 기록합니다. 거기서 uVersion이라는 이름의 응용 프로그램 로그를 찾지 마세요: 서버는 표준 출력에 기록할 뿐 Windows 이벤트 소스를 등록하지 않으므로, Get-EventLog -Source uVersionServer 같은 명령은 아무것도 반환하지 않습니다.

제거

주의: 아래 명령은 저장소, 기록, 사용자 계정, 구성을 삭제합니다. 되돌릴 수 있으려면 데이터베이스를 백업하고 데이터 폴더를 복사해 두세요.

동등한 두 가지 방법이 있습니다. 둘 다 동일한 스크립트(uninstall.ps1)를 실행하며, 이는 서비스, 방화벽, 시스템 환경 변수, 데이터 폴더, 바이너리, 프로그램 및 기능 항목, PostgreSQL 데이터베이스를 처리합니다.

방법 1: 프로그램 및 기능을 통해

  1. Win+R → appwiz.cpl → Enter
  2. 목록에서 uVersion Server를 찾습니다
  3. 마우스 오른쪽 버튼 클릭 → 제거
  4. 관리자 권한 PowerShell 창이 열리고 스크립트가 표시되면서 실행됩니다

방법 2: PowerShell을 관리자 권한으로 실행

iwr https://uversion.io/downloads/server/uninstall.ps1 -UseBasicParsing | iex

스크립트는 시작할 때 두 경로를 표시하고, 마지막에 검증 블록을 표시합니다: 서비스, 설치 폴더, 데이터 폴더, 프로그램 및 기능 항목에 대해 녹색으로 "OK absent"가 표시되어야 합니다.

2026년 8월 이전에 만든 사용자 지정 설치의 경우. 제거 스크립트는 이제 실제로 사용된 경로를 스스로 찾아냅니다: 설치가 그것들을 프로그램 및 기능 항목 옆에 기록하고, 제거가 그것을 다시 읽습니다. 따라서 사용자 지정 -DataDir을 선택했더라도 아무것도 지정할 필요가 없습니다.

항상 그랬던 것은 아닙니다: 이 수정 이전의 설치는 경로를 기록하지 않았고, 그 경우 제거는 기본값으로 되돌아갑니다. 이 경우에 해당하고또한 경로를 사용자 지정했다면, 그것들을 명시적으로 전달하세요. 그러지 않으면 -DbOnDataDir이 보존하려던 데이터베이스가 삭제되는 한편, 시크릿은 그대로 남을 수 있습니다:

$body = (iwr "https://uversion.io/downloads/server/uninstall.ps1" -UseBasicParsing).Content
if ($body -is [byte[]]) { $body = [Text.Encoding]::UTF8.GetString($body) }
& ([scriptblock]::Create($body)) -InstallDir "D:\uVersion\bin" -DataDir "D:\uVersion"

PostgreSQL도 제거할까요?

기본적으로 uninstall.ps1은 PostgreSQL을 건드리지 않습니다: 다른 앱이 사용할 수 있습니다. 함께 제거하려면:

$body = (iwr "https://uversion.io/downloads/server/uninstall.ps1" -UseBasicParsing).Content
if ($body -is [byte[]]) { $body = [Text.Encoding]::UTF8.GetString($body) }
& ([scriptblock]::Create($body)) -RemovePostgreSQL

[byte[]] 확인이 필요합니다: 제공되는 콘텐츠 종류에 따라 Invoke-WebRequest -UseBasicParsing이 응답 본문을 바이트 배열 또는 문자열로 반환할 수 있습니다. 위 패턴은 두 경우 모두에서 작동합니다.

주의: -RemovePostgreSQL은 uVersion 데이터베이스뿐만 아니라 머신의 모든 PostgreSQL 설치를 제거합니다. 다른 것이 이를 사용하지 않는다고 확신하는 경우에만 사용하세요.