본문으로 건너뛰기

자체 호스팅

AISCouncil는 단일하고 자체 포함된 HTML 파일입니다. 모든 정적 파일 서버에서 호스팅하거나, USB 드라이브에서 실행하거나, 파일 시스템에서 직접 열 수도 있습니다. 백엔드 없음, 데이터베이스 없음, 런타임 없음 -- 파일 하나뿐입니다.

가장 간단한 방법

index.html을 다운로드하고 브라우저에서 엽니다:

# 그게 다입니다. 파일을 여세요.
open index.html # macOS
xdg-open index.html # Linux
start index.html # Windows

앱은 file:// 프로토콜에서 즉시 작동합니다. HTTPS가 필요하지 않은 모든 기능(PWA 설치 및 클립보드 API 제외)이 정상적으로 작동합니다.

PWA 설치 및 클립보드 액세스를 포함한 전체 경험을 위해 모든 정적 파일 서버를 사용하여 HTTPS를 통해 파일을 제공하세요.

정적 파일 서버

모든 웹 서버에 업로드. 서버 측 구성 필요 없음.

Python (빠른 로컬 테스트)

python3 -m http.server 8000
# http://localhost:8000 열기

Caddy (자동 인증서로 HTTPS)

caddy file-server --root /path/to/aiscouncil --listen :8080

Nginx

server {
listen 443 ssl;
server_name aiscouncil.example.com;

ssl_certificate /etc/ssl/certs/example.com.pem;
ssl_certificate_key /etc/ssl/private/example.com.key;

root /var/www/aiscouncil;
index index.html;

location / {
try_files $uri $uri/ /index.html;
}
}

클라우드 호스팅

앱은 구성 없이 모든 정적 호스팅 플랫폼에서 작동합니다:

플랫폼배포 방법
Cloudflare PagesGit 리포지토리 연결 또는 드래그 앤 드롭
NetlifyGit 리포지토리 연결 또는 드래그 앤 드롭
VercelGit 리포지토리 연결 또는 vercel deploy
GitHub Pagesgh-pages 브랜치로 푸시
AWS S3 + CloudFrontS3에 파일 업로드, CloudFront를 통해 제공
Firebase Hostingfirebase deploy

배포에 권장되는 파일

index.html만 엄격히 필요하지만 이 추가 파일들을 배포하면 PWA 기능이 활성화됩니다:

your-server/
index.html # 완전한 애플리케이션 (필수)
sw.js # 오프라인 지원용 서비스 워커
manifest.webmanifest # PWA 매니페스트 (이름, 아이콘, 테마)
icon.svg # 벡터 아이콘
icon-192.png # Android 홈 화면 아이콘
icon-512.png # 스플래시 화면 / 마스크 가능 아이콘
favicon.ico # 브라우저 탭 아이콘

선택적 추가 사항:

  s/
index.html # 웹 에디터 (에디터도 원하는 경우)
registry/
models.json # 로컬 모델 레지스트리 (오프라인 모델 데이터를 원하는 경우)
ads.json # 광고 구성 (무료 티어 광고 시스템을 사용하는 경우에만)

Docker 배포

Nginx를 사용한 최소 Docker 배포:

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/
COPY sw.js /usr/share/nginx/html/
COPY manifest.webmanifest /usr/share/nginx/html/
COPY icon.svg /usr/share/nginx/html/
COPY icon-192.png /usr/share/nginx/html/
COPY icon-512.png /usr/share/nginx/html/
COPY favicon.ico /usr/share/nginx/html/
EXPOSE 80

빌드 및 실행:

docker build -t aiscouncil .
docker run -d -p 8080:80 aiscouncil
# http://localhost:8080 열기

Docker로 HTTPS를 사용하려면 Nginx 컨테이너 앞에 Traefik이나 Caddy와 같은 리버스 프록시를 사용하세요.

로컬에서 실행되는 것

모든 것. HTML 파일에는 모든 CSS, JavaScript 및 모듈 코드가 인라인으로 포함되어 있습니다. 사용자가 페이지를 열면:

  • UI가 완전히 클라이언트 측에서 렌더링됨
  • API 키가 사용자의 브라우저(localStorage)에 저장됨
  • 채팅 기록 및 봇 구성이 사용자의 브라우저(IndexedDB)에 저장됨
  • LLM API 호출이 브라우저에서 제공업체(Anthropic, OpenAI, xAI 등)로 직접 이동
  • 데이터가 서버를 통과하지 않음

서버는 정적 파일을 제공합니다. 그것이 유일한 작업입니다.

게스트 모드

사용자 정의 도메인(aiscouncil.net이 아님)에서 호스팅되면 앱은 게스트 모드로 작동합니다:

  • Google 로그인 필요 없음 -- 로그인 게이트 건너뜀
  • 인증 없이 모든 기능 작동
  • 사용자는 채팅 인터페이스로 직접 이동
  • 설정, 저장소 및 모든 기능이 완전히 작동
정보

게스트 모드는 앱이 localhost, .pages.dev 도메인 또는 aiscouncil.net 이외의 도메인에서 실행 중임을 감지하면 자동으로 활성화됩니다. 구성 필요 없음.

사용자 정의 API 베이스

기본적으로 앱은 인증, 결제 및 사용량 추적 요청을 https://api.aiscouncil.net/v1로 보냅니다. 자체 호스팅 배포의 경우 이것을 재정의할 수 있습니다:

localStorage.setItem("ais-api-base", "https://your-api.example.com/v1");

이것은 선택사항입니다. 관리형 결제/인증 기능을 사용하지 않는 경우 앱은 API 베이스 없이 작동합니다 -- 모든 LLM 호출이 브라우저에서 제공업체로 직접 이동합니다.

로컬 프록시 (aiscouncil-serve)

브라우저에서 API 키 노출을 피하고 싶은 경우(예: 공유 사무실 환경) aiscouncil-serve 로컬 프록시를 실행할 수 있습니다:

ANTHROPIC_API_KEY=sk-ant-... \
OPENAI_API_KEY=sk-... \
XAI_API_KEY=xai-... \
./aiscouncil-serve --port 8741

프록시는 모델 접두사로 요청을 올바른 제공업체로 라우팅합니다:

모델 접두사제공업체인증
claude-*Anthropicx-api-key 헤더
gpt-*, o1*, o3*OpenAIBearer 토큰
grok-*xAIBearer 토큰
meta-llama/, deepseek/, qwen/, mistralai/, google/OpenRouterBearer 토큰
그 외 모든 것Ollama (localhost)없음

프록시는 모델 접두사에 관계없이 특정 제공업체를 강제하는 X-Provider 헤더도 지원합니다.

소스에서 빌드:

cd serve
../tools/zig/zig build -Doptimize=ReleaseSmall
# 바이너리 위치: zig-out/bin/aiscouncil-serve (~2.3 MB)

오프라인 배포

에어갭 환경의 경우:

  1. 내부 웹 서버에 파일 배포
  2. 첫 방문 시 서비스 워커가 모든 것을 캐시
  3. 캐싱 후 앱은 네트워크 액세스 없이 작동
  4. 사용자는 동일한 네트워크에서 실행되는 Ollama 또는 로컬 LLM과 채팅 가능

registry/models.jsonindex.html 옆에 배치하여 모델 레지스트리를 미리 로드합니다. 앱은 GitHub에서 가져오기를 시도하기 전에 로컬 복사본을 확인합니다.

CORS 고려사항

로컬 추론 서버(Ollama, vLLM 등)를 사용할 때 브라우저는 CORS(교차 출처 리소스 공유)를 적용합니다. 추론 서버는 호스팅 출처의 요청을 허용해야 합니다.

Ollama:

# Ollama 시작 전 설정
OLLAMA_ORIGINS=* ollama serve

vLLM:

vllm serve model-name --allowed-origins '*'

일반 (Nginx 뒤의 모든 서버):

add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
add_header 'Access-Control-Allow-Methods' 'POST, OPTIONS' always;
경고

Access-Control-Allow-Origin*를 사용하는 것은 로컬 개발에는 괜찮지만 프로덕션 배포에서는 특정 출처로 제한해야 합니다.

소스에서 빌드

앱을 수정하고 다시 빌드하려면:

# 리포지토리 클론
git clone https://github.com/nicholasgasior/aiscouncil.net.git
cd aiscouncil.net

# src/의 소스 파일 편집 (index.html 직접 편집하지 마세요)
# 앱은 연결되는 ~35개의 소스 파일로 분할됨

# 단일 파일 출력 빌드
./build.sh

# 빌드가 일치하는지 확인
./build.sh --check

빌드 프로세스는 모든 src/ 파일을 순서대로 단일 index.html로 연결합니다. 번들러 없음, 트랜스파일러 없음, npm 없음 -- 셸 연결만.

웹 에디터

웹 에디터도 호스팅하려면 s/ 디렉토리를 포함하세요:

your-server/
index.html # 봇 플랫폼
s/
index.html # 웹 에디터 (aiscouncil.net/s/)

에디터는 동일한 압축 코덱을 사용하지만 버전 접두사 A 대신 B를 사용합니다. 자체 기능 세트(WYSIWYG 편집, 다중 형식 지원, 압축 알고리즘)가 있는 별도의 자체 포함 HTML 파일입니다.

데이터 이식성

사용자는 설정 > 개인정보 > 모든 데이터 내보내기를 통해 모든 데이터를 내보낼 수 있습니다. 내보내기는 모든 봇 프로필, 채팅 기록 및 설정이 포함된 JSON 파일입니다. API 키는 내보내기에서 제외됩니다. 내보내기는 AISCouncil의 다른 인스턴스로 가져올 수 있습니다.

이것은 사용자가 특정 배포에 결코 묶이지 않음을 의미합니다. 언제든지 자체 호스팅 인스턴스, 공식 사이트 또는 다른 호스트 간에 이동할 수 있습니다.