Appearance
Windows에서 추가 운영 서버 배포
Windows PowerShell에서 사내 Ubuntu 서버 IP로 배포하는 절차입니다. WSL은 사용하지 않습니다. GitHub Actions의 기존 cicd/dev/deploy.sh는 현재 운영 서버 배포에 그대로 사용되며, 이 절차는 추가 서버에 현재 Git 커밋을 전송해 서버에서 빌드합니다. 전체 명령과 파일 전송 예시는 저장소의 deploy/secondary-production/README.md에 있습니다.
서버와 접속 포트 준비
PowerShell의 scp와 ssh로 deploy/secondary-production/install-prereqs.sh를 대상 서버에 전송합니다. 서버에서 다음처럼 실행합니다.
bash
sudo ss -ltnp
sudo APP_USER=ubuntu APP_DIR=/opt/intellidesk-app APP_HTTP_PORT=8080 \
bash /tmp/install-prereqs.sh설치 스크립트는 Node.js 22, PM2, PostgreSQL 16, pgvector, Redis와 Nginx를 준비합니다. 기본 앱 포트는 8080입니다. 80번 포트를 다른 앱이 사용해도 기존 Nginx 사이트를 삭제하지 않으며, 선택한 앱 포트가 이미 사용 중이면 설치 전에 중단합니다. 다른 포트를 쓰려면 APP_HTTP_PORT 값을 바꾸고 아래 접속 URL과 환경파일에도 같은 포트를 사용합니다. API 기본 포트 3001이 사용 중이면 APP_API_PORT와 server.env.production의 PORT를 함께 변경합니다.
새 DB에는 설치용 덤프가 필요하지 않습니다. 첫 배포가 server/database/create_tables_tenant.sql과 server/database/seeds/*.sql을 적용하고, 서버 IP를 호스트로 사용하는 internal 테넌트를 등록합니다. 기존 DB는 다시 초기화하지 않으며, 활성 테넌트의 DB 연결정보와 IP 호스트 매핑이 서버 설정과 다르면 배포가 중단됩니다. 한 IP로 여러 테넌트를 자동 구분할 수 없으므로 이 가이드는 단일 테넌트 구성입니다.
Windows 환경파일 준비
Windows의 %USERPROFILE%\.config\intellidesk-secondary 같은 저장소 외부 폴더에 대상 서버 전용 환경파일 네 개를 준비합니다.
client.env.production.server.env.production.intellidesk-agent.env.production.mcp-server.env.production.
서버 IP가 10.20.30.40이고 앱 포트가 8080이면 client.env.production에 VITE_API_URL=/api/v1, server.env.production에 PORT=3001, FRONTEND_URL=http://10.20.30.40:8080, CORS_ALLOWED_ORIGINS=http://10.20.30.40:8080과 새 서버 전용 ENCRYPTION_KEY를 설정합니다. DB는 127.0.0.1:5432, Redis는 127.0.0.1:6379와 설치 시 입력한 비밀번호를 사용합니다. 새 DB의 기본 FRONTEND_URL은 배포 중 이 값으로 설정됩니다. SSO·MCP의 기존 운영 URL은 대상 환경에 맞게 별도로 점검합니다.
Resend를 사용하지 않으면 server.env.production에 다음 값을 설정합니다.
dotenv
EMAIL_VERIFICATION_REQUIRED=false
RESEND_API=이 설정은 이메일과 비밀번호 로그인을 유지하면서 신규 가입자의 이메일 확인 절차만 생략합니다. 비밀번호 찾기 메일은 별도 메일 발송 서비스가 필요하고 기존 비활성 계정은 자동으로 활성화되지 않습니다.
Windows에서 배포
Windows OpenSSH 클라이언트, Git for Windows와 tar.exe가 필요합니다. 서버 호스트 키 지문을 별도 경로로 확인한 뒤 Windows PowerShell에서 실행합니다. .cmd 진입점은 해당 프로세스의 PowerShell 실행 정책만 우회하며, 회사 그룹 정책이 스크립트 서명을 강제하면 승인된 서명 절차가 필요합니다.
PM2 프로세스 이름은 server-intellidesk, agent-intellidesk, mcp-intellidesk입니다. 전체 배포는 기존 intellidesk-server, intellidesk-agent, intellidesk-mcp를 중지한 뒤 새 이름으로 시작합니다. 시작 명령이 실패하면 기존 프로세스를 복구하며, 성공하면 이전 이름을 제거하고 PM2 상태를 저장합니다.
powershell
cd C:\Work\intellidesk
$envDir = "$env:USERPROFILE\.config\intellidesk-secondary"
$key = "$env:USERPROFILE\.ssh\intellidesk-secondary"
.\deploy\secondary-production\Deploy-SecondaryProduction.cmd `
-Action Check -ServerIp 10.20.30.40 -SshUser ubuntu -KeyPath $key -EnvDir $envDir
.\deploy\secondary-production\Deploy-SecondaryProduction.cmd `
-Action All -ServerIp 10.20.30.40 -SshUser ubuntu -KeyPath $key -EnvDir $envDirSSH 비밀번호를 사용할 때는 -KeyPath $key를 생략합니다. 배포는 커밋된 Git HEAD를 사용하므로 먼저 변경사항을 커밋합니다. 릴리스 아카이브에서 저장소의 환경파일과 SSO 개인키를 제외하고 대상 서버 전용 환경파일을 별도로 전달합니다. 앱은 http://10.20.30.40:8080에서, API는 http://10.20.30.40:8080/api/v1/auth/desktop-info에서 확인합니다.
사내 방화벽에는 SSH 22와 선택한 앱 포트만 필요한 클라이언트에 허용합니다. HTTP 로그인 정보는 암호화되지 않으므로 운영 정책에 따라 사내 TLS 프록시와 IP 인증서를 구성합니다. SSO를 사용한다면 별도 접속 포트와 인증서도 점검해야 합니다.
맥·리눅스에서 배포
맥이나 리눅스에서는 deploy/secondary-production/onprem-deploy.sh로 같은 절차를 진행합니다. 서버 IP, SSH 사용자, 배포 폴더, 환경파일 폴더를 대상 서버마다 설정 파일 하나에 적어 두고 이름으로 골라 실행합니다. 설정 항목은 저장소의 deploy/secondary-production/target.env.example을 참고합니다.
bash
mkdir -p ~/.config/intellidesk/targets ~/.config/intellidesk/env
cp deploy/secondary-production/target.env.example ~/.config/intellidesk/targets/customer-a.env
cp -R deploy/secondary-production/env-template ~/.config/intellidesk/env/customer-aenv-template은 운영 환경파일을 기본값으로 한 템플릿이며, 서버별 비밀값과 외부 서비스 키는 비어 있습니다. 복사한 폴더에서 [필수] 표시 항목을 채웁니다. ENCRYPTION_KEY, INTERNAL_API_KEY, SAP_MCP_CONNECTION_SECRET은 서버마다 새로 만들고 server와 mcp-server에 같은 값을 넣습니다. JWT_SECRET은 앱 서버에서만 보유하며 MCP에 복사하지 않습니다. 외부 MCP OAuth를 사용할 때는 MCP 연결 설정에 따라 공개키·발급자·대상 서비스를 지정합니다. 배포 명령은 시작 전에 필수 값이 비었거나 두 파일의 공유 값이 다르면 중단합니다.
SSH는 비밀번호 방식과 키 방식을 모두 지원합니다. 비밀번호 방식이면 설정 파일의 SSH_KEY를 비워 두며, 비밀번호는 명령을 실행할 때마다 한 번만 입력합니다. 처음 접속하는 서버는 화면에 나온 호스트 키 지문을 서버 관리자에게 받은 값과 비교한 뒤 승인합니다.
처음 배포할 때는 install을 실행합니다. 서버 필수 구성 설치, 빈 DB 초기화, 첫 배포를 이어서 진행하며, 서버 설치 단계에서 sudo 비밀번호를 한 번 더 묻습니다. PostgreSQL과 Redis 비밀번호는 server.env.production의 PGPASSWORD, REDIS_PASSWORD 값을 그대로 사용하므로 환경파일에 먼저 지정합니다. install은 서버마다 한 번만 실행합니다.
bash
bash deploy/secondary-production/onprem-deploy.sh install --target customer-a
bash deploy/secondary-production/onprem-deploy.sh admin --target customer-a이후 추가 배포는 deploy를 실행합니다. 커밋된 Git HEAD를 전송하고 의존성 설치, 마이그레이션, 클라이언트 빌드, PM2 재시작을 진행합니다. 커밋하지 않은 변경이 있으면 목록을 보여 주고 배포에서 제외합니다.
bash
bash deploy/secondary-production/onprem-deploy.sh check --target customer-a
bash deploy/secondary-production/onprem-deploy.sh deploy --target customer-a기존 계정의 비밀번호를 재설정할 때는 admin에 --reset을 붙입니다.
이메일 인증과 슈퍼 관리자
첫 배포 후 Windows PowerShell에서 이메일 인증 설정을 적용하고 슈퍼 관리자 계정을 생성합니다.
powershell
.\deploy\secondary-production\Deploy-SecondaryProduction.cmd `
-Action EmailVerification -Mode Disable -ServerIp 10.20.30.40 -SshUser ubuntu -KeyPath $key -EnvDir $envDir
.\deploy\secondary-production\Deploy-SecondaryProduction.cmd `
-Action SuperAdmin -ServerIp 10.20.30.40 -SshUser ubuntu -KeyPath $key슈퍼 관리자 명령은 테넌트 ID, 이메일, 사용자 ID, 이름과 초기 비밀번호를 대화형으로 받습니다. 새 DB의 테넌트 ID는 internal입니다. 계정은 활성·이메일 인증 완료 상태와 SUPER_ADMIN·ADMIN 권한으로 생성되고 첫 로그인 후 비밀번호 변경이 강제됩니다. 기존 계정을 복구할 때만 -ResetExisting을 추가합니다. 이메일 인증을 다시 켜려면 Resend 값을 설정한 뒤 -Mode Enable을 실행합니다.
독립 SSO 운영
IntelliConnect는 이 배포에 포함되지 않습니다. 별도 intelli-sso 저장소에서 배포하며, 기존 서비스의 DB·인증서·환경 파일을 유지합니다. 앱과 MCP의 SSO URL을 독립 서비스 주소로 지정하고 MCP의 OAUTH_PUBLIC_KEY_PATH를 배포한 인증서 경로로 설정합니다. 기존 SSO가 실행 중인 서버에서는 IntelliDesk 배포가 해당 프로세스를 중지하지 않습니다.
기본 운영 경로는 /home/ubuntu/apps/intelliconnect입니다. 서버의 .env.production에는 SSO_LOG_DIR=/home/ubuntu/apps/intelliconnect/service/logs를, MCP의 .env.production에는 OAUTH_PUBLIC_KEY_PATH=/home/ubuntu/apps/intelliconnect/service/certs/idp-certificate.pem을 설정합니다. 다른 경로에 배포하면 두 값을 해당 위치로 바꿉니다. 인증서 검증과 SSO 로그 조회가 새 경로에서 동작하고 기존 폴더를 사용하는 프로세스가 없음을 확인한 뒤 IntelliDesk 내부의 intelli-sso와 sap-sso 폴더를 백업 위치로 옮깁니다.
SAP 공용 패키지
SAP 연결과 ABAP 공통 처리는 별도 intelli-packages 저장소에서 관리합니다. IntelliDesk에는 버전이 고정된 두 패키지 배포물이 포함되며 배포 스크립트가 이를 먼저 전송합니다. 운영 서버에 원본 저장소를 설치할 필요는 없습니다. abap-analysis는 기존 공용 패키지 경로를 사용합니다.
