사무실 스택 설치
회사 서버 한 대에 DAIOps 를 설치하는 순서입니다. 인터넷 없이 사내망에서만 돕니다. 이 문서를 따라 하는 분이 이 설치의 관리자가 됩니다.
단계마다 끝에 「끝」 줄이 있습니다. 관리자 화면 관리자 › 시스템 상태 › 설치 구성 · 연결 상태에서 그 줄이 녹색이면 그 단계가 끝난 것입니다. 녹색이 아니면 사무실 스택 운영의 「빨강 · 노랑일 때」 표를 봅니다.
준비물
| 무엇 | 예 |
|---|---|
| 리눅스 서버 한 대 | Docker · docker compose 가 깔려 있고 이 계정이 Docker 를 쓸 수 있음 |
| DAIOps 배포 묶음 | 공급사가 준 폴더(이하 「설치 폴더」) |
| 모델 서버 주소 · 접속 키 | http://192.168.0.101:8000, 키는 공급사 · 모델 서버 담당이 줌 |
| 회사 메일 서버(SMTP) | 주소 · 포트 · 계정 · 비밀번호 · 보내는 주소 |
| 사내 Zulip | Zulip 서버 이름과 IP, Zulip 관리자 계정 |
| 백업을 둘 디스크 | 서버 디스크와 다른 디스크 또는 외부 매체 |
명령은 모두 설치 폴더에서 칩니다.
1. Supabase(데이터베이스 · 로그인 · 파일 저장소)
SUPABASE_SUBNET=172.30.54.0/24 sh deploy/onprem/supabase/init.sh
(cd deploy/onprem/supabase/upstream && docker compose up -d --wait)
sh deploy/onprem/supabase/schema/restore.sh
172.30.54.0/24 는 Supabase 망의 주소 대역입니다. 사내망과 겹치면 다른 대역을 고릅니다. 처음부터 고정해 두어야 나중에
바깥 접속 규칙이 빗나가지 않습니다. --wait 가 「unhealthy」로 끝나도 1분쯤 뒤 docker compose ps 가 모두 healthy 면
정상입니다(파일 저장소는 시작에 20초 넘게 걸립니다).
끝: 앱을 띄운 뒤(3단계) 연결 상태의 데이터베이스 · 로그인 서비스 · 파일 저장소가 녹색.
2. 앱 설정
모델 서버 · 메일 서버 · Zulip 값을 한 번에 줍니다.
LLM_LOCAL_BASE_URL=http://192.168.0.101:8000 LLM_LOCAL_MODELS=<모델 이름> \
SMTP_HOST=mail.example.co.kr SMTP_PORT=587 SMTP_USER=daiops@example.co.kr SMTP_PASS='<메일 비밀번호>' \
EMAIL_FROM_ADDRESS=daiops@example.co.kr \
ZULIP_HOSTNAME=zulip.example.local ZULIP_IP=192.168.0.103 \
sh deploy/onprem/init-app.sh
그다음 모델 서버 접속 키를 비밀 파일 deploy/onprem/app.secrets.env 맨 끝에 한 줄로 넣습니다.
LLM_LOCAL_API_KEY=<모델 서버 접속 키>
- 이 스크립트를 다시 돌릴 때는 앞서 준 값을 모두 다시 줍니다. 설정 파일을 그때 받은 값으로 새로 씁니다. 비밀 파일은 그대로 둡니다
SMTP_HOST를 빼면 메일이 시험 메일함으로만 가고 실제로는 아무에게도 가지 않습니다. 스크립트가 경고를 찍습니다- 판정 · 요약을 다른 모델 서버로 보내려면
LLM_LOCAL_JUDGE_BASE_URL·LLM_LOCAL_JUDGE_MODELS를 함께 줍니다
끝: 3단계 뒤 설치 구성의 확인할 것에 빨강이 없음.
3. 앱 띄우기
APP_GIT_SHA=$(git rev-parse HEAD) docker compose --env-file deploy/onprem/compose.env -f deploy/onprem/compose.yml up -d --build
APP_GIT_SHA 를 붙여야 화면 · 백업 기록에 설치한 버전이 남습니다. 배포 묶음에 git 이 없으면 공급사가 알려 준 버전 값을 넣습니다.
앱 주소는 http://<서버 IP>:3000 입니다.
첫 관리자 계정
관리자로 쓸 메일 주소로 계정을 만듭니다. 비밀번호는 없고, 로그인할 때마다 그 메일로 6자리 코드가 옵니다.
ADMIN_EMAIL=it@example.co.kr sh deploy/onprem/supabase/create-admin.sh
다시 돌려도 됩니다. 이미 있는 계정이면 관리자로만 올립니다. 관리자를 더 두려면 메일을 바꿔 다시 돌립니다.
- 앱 주소에서 그 메일로 로그인합니다
- 코드 메일을 엽니다. 2단계에서 메일 서버를 넣었으면 그 메일함으로 옵니다. 아직 넣지 않았으면 시험 메일함으로 옵니다.
시험 메일함은 서버 자신에서만 열립니다(
http://127.0.0.1:8025). 다른 PC 에서 보려면ssh -L 8025:127.0.0.1:8025 <서버>로 연결한 뒤 그 PC 브라우저에서 같은 주소를 엽니다 - 처음 로그인하면 약관 동의 · 첫 직원 만들기 화면이 나옵니다. 약관은 본인이 동의합니다. 직원 만들기는 나중에 해도 되고,
주소창에
/admin?view=ops를 넣으면 바로 관리자 화면으로 갑니다
끝: 관리자 › 시스템 상태에 「설치 구성 · 연결 상태」 카드가 보임. 이 카드는 관리자에게만 보이므로 보이면 관리자 계정이 된 것입니다. 이어서 카드의 연결 확인을 누릅니다.
4. 모델 서버
카드의 연결 확인에서 대화 모델 서버(판정 서버를 따로 두었으면 보조 모델 서버도)를 봅니다.
끝: 대화 모델 서버 「응답하고 설정한 모델이 모두 있습니다」 녹색.
5. 메일
2단계에서 메일 서버 값을 넣었다면 이미 됩니다. 나중에 바꾸려면 2단계 명령을 새 값으로 다시 돌린 뒤 앱만 다시 띄웁니다.
docker compose --env-file deploy/onprem/compose.env -f deploy/onprem/compose.yml up -d app
메일 서버를 바깥 접속 허용 목록에도 넣습니다.
끝: 연결 상태 메일 서버 「메일 서버에 로그인했습니다」 녹색. 노랑 「시험 메일함」이면 아직 실제 메일 서버가 아닙니다.
6. Zulip
- Zulip 이 사내 인증서로 HTTPS 를 쓰면 2단계 명령에
ZULIP_CA_FILE=<루트 인증서 파일>을 더해 다시 돌리고 앱을 다시 띄웁니다(공개 인증서만, 비밀 키는 넣지 않습니다) Zulip 을 쓰는 사람의 PC 도 같은 루트 인증서를 믿어야 합니다. 브라우저와 Zulip 데스크톱 앱은 운영체제 인증서 저장소를 쓰므로 회사 IT 가 그곳에 배포합니다. Zulip 휴대폰 앱은 인증서를 확인하지 못하면 연결하지 않으니 먼저 시험합니다 - 수신기를 띄웁니다.
docker compose --env-file deploy/onprem/compose.env -f deploy/onprem/compose.yml up -d zulip-receiver
- Zulip 에서 직원마다 일반 봇을 만들고, 직원이 일할 스트림에 넣습니다
- DAIOps 에서 직원 설정 › 연동 서비스 › Zulip 봇에 서버 주소 · 봇 이메일 · API 키를 넣습니다
- 매니저는 Zulip 개인 설정 › 계정 및 개인정보 › 「내 메일 주소를 볼 수 있는 사람」을 조직의 모든 사람으로 둡니다. 받을 곳을 비운 반복 업무의 결과가 매니저에게 Zulip 1:1 로 가는데, 봇이 이 메일로 매니저를 찾습니다
끝: 연결 상태 Zulip 수신기 녹색, Zulip 에서 매니저 찾기 녹색. Zulip 에서 봇에게 1:1 로 말을 걸어 답이 오면 끝입니다.
7. 바깥 접속 막기
서버가 인터넷이나 다른 사내 장비로 나가지 못하게 하고, 허용 목록(모델 서버 · Zulip · 메일 서버)만 엽니다. sudo 가 필요합니다.
cp deploy/onprem/egress-check/egress-allow.conf.example deploy/onprem/egress-check/egress-allow.conf
# egress-allow.conf 에 「IP 포트 설명」을 한 줄씩: 모델 서버, Zulip(443), 메일 서버(587 등)
sudo sh deploy/onprem/egress-check/egress-block.sh --log
sed "s#@ONPREM_DIR@#$(pwd)/deploy/onprem#" deploy/onprem/egress-check/daiops-egress.service \
| sudo tee /etc/systemd/system/daiops-egress.service
sudo systemctl daemon-reload && sudo systemctl enable daiops-egress.service
처음 7일은 기록만 합니다(--log). 7일 뒤 sudo sh deploy/onprem/egress-check/report.sh 7d 로 막힐 시도를 보고,
정당한 상대를 허용 목록에 넣은 뒤 차단으로 바꿉니다(--block). 공급사와 함께 정합니다.
끝: sudo sh deploy/onprem/egress-check/verify.sh 에서 허용 목록 줄이 「열림」. 이 줄은 화면에 없습니다(앱이 서버 방화벽을 볼 수 없습니다).
8. 백업
sh deploy/onprem/backup/backup-secrets.sh /media/usb/daiops-secrets # 비밀 묶음. 암호문구를 묻습니다
BACKUP_DIR=/mnt/backup/daiops sh deploy/onprem/backup/backup.sh # 첫 백업
매일 02:30 예약과 복원 리허설은 deploy/onprem/backup/README.md 의 「예약」 · 「설치 날 순서」를 따릅니다. 비밀 묶음과 암호문구는
데이터 백업과 다른 매체 · 다른 곳에 둡니다. 둘 중 하나만 있으면 복원할 수 없습니다.
끝: cat /mnt/backup/daiops/last-result.txt 가 「성공」이고 날짜가 오늘.
다 끝나면
- 설치 구성의 확인할 것에 빨강 · 노랑이 없고, 연결 상태가 모두 녹색입니다
- 직원 하나를 채용해 웹 대화와 Zulip 1:1 에서 한 번씩 말을 걸어 봅니다
- 운영 중 볼 것은 사무실 스택 운영에 있습니다