최근에는 AI를 이용해서 각각의 서비스를 셀프호스팅하는데요.

오늘은 이북 관리를 하는 Bookorbit을 설정해봤습니다.
BookOrbit – Your reading space
1. 폴더 만들기
cd ~/docker
mkdir -p bookorbit/{books,data/app,data/postgres}
cd bookorbit
id
id 결과의 uid/gid 숫자를 확인하세요(OCI 우분투는 보통 1001). 아래는 1001로 가정했어요. 다르면 이 명령과 compose의 PUID/PGID를 같이 바꾸세요.
sudo chown -R 1001:1001 books data/app
2. 비밀값 생성
echo "DB: $(openssl rand -hex 24)"
echo "JWT: $(openssl rand -hex 32)"
echo "TOKEN: $(openssl rand -hex 16)"
3. .env
nano .env
env
POSTGRES_USER=bookorbit
POSTGRES_PASSWORD=위의_DB값
POSTGRES_DB=bookorbit
JWT_SECRET=위의_JWT값
SETUP_BOOTSTRAP_TOKEN=위의_TOKEN값
YES24_API_KEY=발급받은_키
그리고 권한 설정합니다.
chmod 600 .env
4. docker-compose.yml
nano docker-compose.yml
도커 설정
services:
bookorbit:
image: ghcr.io/bookorbit/bookorbit:latest
container_name: bookorbit
restart: unless-stopped
depends_on:
bookorbit-db:
condition: service_healthy
ports:
- 127.0.0.1:3123:3000
networks:
- bookorbit
environment:
- NODE_ENV=production
- PORT=3000
- DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@bookorbit-db:5432/${POSTGRES_DB}
- JWT_SECRET=${JWT_SECRET}
- SETUP_BOOTSTRAP_TOKEN=${SETUP_BOOTSTRAP_TOKEN}
- APP_URL=https://bo.dorulog.com
- TZ=Asia/Seoul
- PUID=1001
- PGID=1001
- NODE_MAX_OLD_SPACE_SIZE=2048
- LIBRARY_BROWSE_ROOT=/books
volumes:
- ./books:/books
- ./data/app:/data
init: true
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_OVERRIDE
- FOWNER
- SETGID
- SETUID
security_opt:
- no-new-privileges:true
stop_grace_period: 30s
bookorbit-db:
image: pgvector/pgvector:pg18
container_name: bookorbit-db
restart: unless-stopped
networks:
- bookorbit
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- ./data/postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", 'pg_isready -U "$${POSTGRES_USER}" -d "$${POSTGRES_DB}"']
interval: 10s
timeout: 5s
retries: 10
start_period: 20s
yes24-provider:
image: onevl/bookorbit-yes24-provider:latest
container_name: bookorbit-yes24-provider
restart: unless-stopped
networks:
- bookorbit
environment:
YES24_API_KEY: ${YES24_API_KEY}
networks:
bookorbit: {}
5. 실행 확인
설치가 끝나면 실행을 확인해봅니다
docker compose up -d
docker compose ps
curl -I http://127.0.0.1:3123

6. nginx 설정
예를 들어
sudo nano /etc/nginx/sites-available/text.dorulog.com
nginx
server {
listen 80;
server_name text.dorulog.com;
client_max_body_size 400M;
location / {
proxy_pass http://127.0.0.1:3123;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
}
}
이후 nginx 설정을 마무리 합니다.
sudo ln -s /etc/nginx/sites-available/text.dorulog.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
7. HTTPS
인증서 발급해주구요.
sudo certbot --nginx -d text.dorulog.com
8. 관리자 계정
사이트에 최초 접속후 마지막 토큰을 넣고 계정을 생성합니다.
9. 라이브러리
책 파일을 ~/docker/bookorbit/books에 넣고, 웹에서 Settings → Libraries에서 /books 폴더로 라이브러리를 만드세요.
| 항목 | 값 |
|---|---|
| Address | http://yes24-provider:8080 |
| Authorization header | 비워두기 |
| Allow private address | 켜기 |
| Timeout | 10 정도 (기본값 그대로도 괜찮아요) |