한눈에
Automated Unified Reproducible Omics Reporting Architecture. FASTQ 원자료에서 품질검사·정렬·변이 검출·발현 정량까지 돌리고 리포트를 낸다.
| 항목 | 값 |
|---|---|
| 저장소 | contextBio/AURORA (bare ContextBio/AURORA.git) |
| 호스트 | c3.sysmed.kr (공인 203.230.6.180, 내부 10.10.1.180) |
| 운영 워크트리 | ContextBio/AURORA — main. 백엔드 https://c3.sysmed.kr:6443/, 워커 127.0.0.1:6081~6084 |
| 개발 워크트리 | dev/AURORA — dev. 백엔드 …:6443/dev, 워커 6091 |
| 프론트 | contextbio.ai/aurora — Firebase Hosting 이 낸다 (아래 참조) |
| 언어·틀 | R · plumber API + 정적 화면 (public/) |
| 작업 기록 | /data/workbench/AURORA/jobs/<id>/job.json (857T, NFS 10.10.1.200:/sdata) |
| 원자료 탐색 루트 | /data/rawdata/AURORA (실경로 /mnt/S1/data/rawdata/AURORA, 230T) |
| 로그인 | contextBio 통합계정(Firebase) — AURORA_AUTH=on |
| 로그 | service.log |
화면은 이 서버가 아니라 Firebase 가 낸다
contextbio.ai/aurora 는 리다이렉트도 iframe 도 아니다. 저장소 public/ 의 사본을
Firebase Hosting 이 직접 낸다. 사본은 사이트 저장소의 build_subapp.py 가 굽고, 사이트
저장소의 워크플로가 GitHub 에서 AURORA 를 체크아웃해 빌드한다.
contextBio/ContextBio .github/workflows/
deploy.yml ← contextBio/AURORA @ main → contextbio.ai/aurora
deploy-dev.yml ← contextBio/AURORA @ dev → dev-contextbio.web.app/aurora
c3 의 파일을 고치는 것만으로는 그 화면이 바뀌지 않는다. git push 로 GitHub 에
올라가고 사이트 워크플로가 돌아야 한다. 2026-09-02 에 public/app.js 를 고쳐 놓고
반영을 기다리다 한참 헤맸다 — 접근 로그에 app.js 요청이 아예 없는 것이 단서였다
(브라우저는 c3 가 아니라 Firebase 에서 받는다).
정적 파일을 c3 가 직접 낼 때도 있다 — https://c3.sysmed.kr:6443/(운영)와 /dev/
(apache ProxyPass /dev/ → 6091)로 열면 워커가 자기 public/ 을 낸다. 백엔드만
확인할 때 쓴다.
왜 Shiny 가 아니라 plumber 인가
2026-08-19 에 Shiny 를 걷어냈다. 이유는 속도다 — Shiny 는 프로세스 하나·스레드 하나로
접속자 전원을 받아서, 누군가의 느린 호출이 전원의 멈춤이 됐다. 대표적으로
aurora_load_config_values() 가 7.13초 걸리는데 세션마다 캐시 없이 불렸고
callr::r() 이 부른 세션을 붙잡았다. 셋이 같이 들어오면 20초가 멈췄다.
브라우저 ──TLS 6443──> apache ──balancer──> plumber 워커 6081~6084 (감시자 1 + 워커 4)
(vhost) └ 정적 화면(public/)도 워커가 낸다
bootstrap.R이 앱을 올린다(R/.R · 상수 · 인증서 예열). 설정값 프로세스 캐시가 여기 있다 — 6.93초 → 0.009초.* 설정 파일과 덮어쓰기 문서의 mtime 이 바뀌면 다시 읽는다.api.R이 JSON 을 내고public/이 화면을 그린다. 프리셋 규칙은 서버에 남겼다 — SEQprocess 분기를 그대로 옮긴 것이라 JS 로 복제하면 갈라지기 시작한다.exec/serve_api.R이 감시자다. 워커가 죽으면 다시 띄우고, 감시자가 죽으면 워커가 스스로 물러난다(고아 워커가 포트를 쥐면 다음 감시자가 영원히 헛돈다).- 상태는 전부 디스크(
jobs/<id>/job.json)에 있고 토큰이 매 요청에 실려 오므로 워커는 서로 교체 가능하다. sticky session 을 걸지 않는 이유다. - apache 는 정적 파일을 직접 내지 못한다 —
public/이 NFS 이고 export 가 root 를 squash 해서 root 로 뜨는 apache 에게는 폴더가 보이지 않는다. vhost 정본은apache-aurora-api.conf.example.
TLS 는 6443 으로 나간다(*.sysmed.kr 와일드카드 인증서). 443 은 apache 가 잡고 그
뒤에 RStudio 가 붙어 있다.
저장소 배치
api.R plumber 엔드포인트
bootstrap.R 앱 로드 · 상수 · 설정 캐시
config/aurora_config.R SEQprocess 설정 정본 (도구 경로·참조 파일·R 패키지)
exec/serve_api.R 감시자 (워커 기동·감독)
exec/run_job.R 작업 실행 — 설치된 R 패키지를 부른다
exec/make_report.R 리포트 생성
R/00_util.R … 15_deg.R 기능별 모듈 (아래)
public/ 화면 (Firebase 가 사본을 낸다)
report/aurora_report.Rmd 리포트 템플릿
ensure-aurora-api.sh cron 이 5분마다 부르는 기동 보증 스크립트 (dev 판 별도)
release.sh 머지·태그·재기동·검증
install-seqprocess.sh 파이프라인 패키지 설치 (prod/dev)
R/ 모듈은 번호가 곧 층이다 — 01_options(파이프라인 선택지) · 02_preflight(도구·참조
파일 사전점검) · 03_jobs(작업 생성·취소) · 04_results · 05_report · 06_handoff
· 07_qcmetrics · 08_qcplots · 09_reportmeta · 10_reportform · 11_auth ·
12_i18n · 13_uploads · 14_readme · 15_deg(DESeq2).
파이프라인 패키지 — 라이브러리 경로로 dev·prod 를 가른다
AURORA 는 파이프라인을 직접 돌리지 않는다. exec/run_job.R 이 설치된 R 패키지를
부르므로 /data/Rpackage/SEQprocess 소스를 고쳐도 재설치 전에는 반영되지 않는다.
운영 패키지는 /data/workbench/AURORA/runtime/rlib/<커밋>/SEQprocess2에 버전별로 설치한다.
current 링크와 AURORA_SEQPROCESS_RLIB으로 새 작업의 라이브러리를 지정하며,
진행 중인 작업은 시작 시 고정한 실제 런타임 경로를 유지한다. 기존 /usr/lib/R/library의
과거 패키지는 덮어쓰지 않는다. 개발용 <dev>/rlib도 운영과 분리한다.
소스 원격은 contextBio/SEQprocess이며 소스 수정만으로 설치된 패키지가 갱신되지는 않는다.
새 커밋별 경로에 설치·검증한 후 current를 전환하고 서비스 및 새 작업의 실제 버전을 확인한다.
2026-09-12 배포 버전과 Slurm 자원 정책, g1 CPU/GPU 실측은
운영 소스·실행 관리에 기록한다.
/data/Rpackage/SEQprocess/inst/webapp/ 는 낡은 사본이다. 그쪽 deploy.sh 를 부르면
낡은 판이 배포된다. 부르지 않는다. runAURORA() 의 app.dir 기본값도 그 사본을
가리키므로, 손으로 띄울 때는 --app-dir 로 이 저장소를 지정한다.
데이터 경로 규칙
입력 폴더는 <탐색 루트>/<사용자>/<프로젝트>/… 다. 사용자 폴더 자체는 입력으로 쓸 수
없다 — 프로젝트를 가로질러 통째로 스캔하는 실행을 막기 위해서다. 강제는 세 겹이다:
탐색 창이 본인 폴더 밖으로 못 나가고, 규칙 밖 경로면 실행 단추가 꺼지고, 실행 직전에
한 번 더 검사한다.
폴더 이름은 이메일 앞부분이다 (hyun.goo.woo@gmail.com → hyun.goo.woo). 통합인증의
정본 키는 users/{uid} 의 uid 지만, 폴더는 사람이 셸에서 읽고 후속 분석에 쓰이므로
읽히는 쪽을 택했다. 대가는 알고 택한 것이다 — 도메인만 다른 동명이인은 같은 폴더를 쓰고,
이메일을 바꾸면 폴더가 갈라진다.
프로젝트 폴더를 만들 때 세 칸을 함께 만든다(aurora_create_project() 가
AURORA_PROJECT_DIRS 를 돈다). 나중에 만들게 두면 사람마다 다른 이름을 쓰기 시작한다.
규칙 이전에 만들어진 프로젝트에는 세 칸이 없고, 그런 폴더도 그대로 동작한다(훑기가
재귀라 어디에 있든 FASTQ 를 찾는다).
report/README.md 는 영어로 쓴다 (R/14_readme.R). 이 폴더는 AURORA 를 거치지 않고도
읽힌다 — 셸에서 열고, 후속 분석에 쓰이고, 몇 달 뒤 다른 사람이 연다. 작업 기록
jobs/<id> 는 실행한 사람만 찾을 수 있고 폴더를 따라다니지 않으므로, "이게 무슨
데이터였더라"에 답하는 것이 여기 말고는 없다. 화면은 한국어·영어를 오가지만 파일은 한
언어로 고정한다.
인증
AURORA_AUTH=on 이 전제다 — 끄면 <사용자> 를 알 수 없어 모두가 탐색 루트 하나를
공유하던 예전 동작으로 돌아간다.
Google 로그인은 Firebase 콘솔의 Authorized domains 에 호스트가 있어야 뜬다.
signInWithPopup 은 호출 오리진을 보고, 없으면 auth/unauthorized-domain 으로 실패한다
(authDomain 을 정본으로 두는 것과는 별개다). c3.sysmed.kr·g2.sysmed.kr 이 둘 다
등록돼 있어 서버를 되돌려도 된다. 승인 검사는 호스트명만 보므로 포트는 상관없다.
기동과 배포
root 권한이 없어 systemd 를 쓸 수 없다. cron 이 유지한다.
@reboot /data/agents/ContextBio/AURORA/ensure-aurora-api.sh
*/5 * * * * /data/agents/ContextBio/AURORA/ensure-aurora-api.sh >/dev/null 2>&1
재기동은 스크립트 파일로 부른다. ssh c3 'pkill -f …' 는 자기 셸의 cmdline 에 패턴이
들어 있어 자신을 먼저 죽인다(git 워크트리 참조).
릴리즈는 release.sh 가 머지·태그·재기동·/api/version 검증을 일괄로 한다. 배포 확인은
반드시 /api/version 으로 — 프로세스가 옛 inode 를 물고 사는 좀비는 git log 로 보이지
않는다.
화면까지 새로 내보내려면 사이트 저장소의 워크플로를 깨워야 한다. c3 에는 gh 가 없고
c1 에 ssh 도 되지 않지만, 사이트 저장소 배포 키가 c3 에 있어 빈 커밋으로 깨울 수 있다.
사이트 저장소 체크아웃은 작업이 쌓여 있으므로 건드리지 않고 임시 클론에서 한다.
자주 막히는 곳
| 증상 | 원인 | 할 일 |
|---|---|---|
public/ 을 고쳤는데 화면이 그대로 |
화면은 Firebase 사본이다 | push 후 사이트 워크플로 실행 |
| 화면에서 고를 수 있는데 실행이 죽는다 | 설치된 파이프라인 패키지가 낡았다 | install-seqprocess.sh --check |
| 배포한 것 같은데 동작이 옛것 | 프로세스가 옛 inode 를 물고 있다 | /api/version 확인 후 ensure 스크립트로 재기동 |
도구가 깔려 있는데 없음 |
설정이 가리키는 자리와 실제 자리가 다르다 | 관리자 탭의 경로 덮어쓰기 |
| 참조 유전체·종을 못 고른다 | hg38 고정이다 | 설계상 제약 — 플레이북에 적혀 있다 |