English Version (README_EN.md)
λΆ μ€μμμ€λ ZIP/CBZ μμΆ νμΌ ννμ λμ λ° λ§νμ± μ μΉ νκ²½μμ μ§μ° μμ΄ κ°μν μ μλλ‘ μ€κ³λ μ΄κ²½λ, κ³ μ±λ₯ κ°μΈ λ―Έλμ΄ μλ²μ λλ€.
μλνν° μ’ μμ±μ κ·Ήλλ‘ μ΅μννκ³ νμ΄μ¬ νμ€ λΌμ΄λΈλ¬λ¦¬μ μ μ¬λ ₯μ νμ©νμ¬ κ°λ³κ³ λΉ λ₯Έ ꡬλ νκ²½μ μ 곡ν©λλ€.
-
νμΌ λ¬΄ν΄μ μ€μκ° μ€νΈλ¦¬λ°
- λμ©λ μμΆ νμΌ(ZIP/CBZ)μ μλ² λλ ν°λ¦¬μ 미리 μμΆ ν΄μ νμ§ μμ΅λλ€.
- λ΄μ₯ zipfile λͺ¨λμ μ μ΄νμ¬ νμν νμ΄μ§μ 물리μ λ°μ΄νΈ μμ μ€νμ λ§ μ½μ΄ μ€νΈλ¦¬λ° μ μ‘νλ―λ‘ λμ€ν¬ I/Oμ CPU μλͺ¨λ₯Ό νμ μ μΌλ‘ μ κ°ν©λλ€.
-
λ―Έλλ©ν μ’ μμ±
- Flask νλ μμν¬ μΈμ λ¬΄κ±°μ΄ ORMμ΄λ μλνν° λͺ¨λμ λ°°μ νμ΅λλ€.
- λ΄μ₯ SQLite λͺ¨λμ κ³ μ±λ₯ 컀λ₯μ νλ§κ³Ό μ λ° μΏΌλ¦¬λ₯Ό μ ν μ±λ₯ μ ν μλ μ΄κ²½λ μν€ν μ²λ₯Ό μ€ννμ΅λλ€.
-
μ΅μ νλ νλ‘ νΈμλ νμ΄νλΌμΈ
- λ·°ν¬νΈ λ΄ μΉ΄λλ§ λ‘λνλ μ§μ° λ‘λ©(Lazy Loading) λ° λ€μ νμ΄μ§ ν리λ‘λ©(Preloading)μ μ§μνμ¬ λκΉ μλ λ μ κ²½νμ 보μ₯ν©λλ€.
-
μ μ°ν λ©νλ°μ΄ν° νλ¬κ·ΈμΈ
- νλ¬κ·ΈμΈ μν€ν μ²λ₯Ό λ΄μ₯νμ¬ κ΅λ΄ νκ²½μ νΉνλ μλΌλ Open API λ±μ μΈλΆ μ 보 μκΈ μ±λμ νλ¬κ·ΈμΈ ννλ‘ μ μ΄ν©λλ€.
- μ± μκ°κΈ, μκ° μ 보, κ³ νμ§ μ»€λ²λ₯Ό μν΄λ¦μΌλ‘ ν΅ν© λ°μνλ©° μλ λ©νλ°μ΄ν° νΈμ§κΈ° λ° νμ§ κ΅μ²΄λ₯Ό μ§μν©λλ€.
-
λͺ¨λ°μΌ λ·°μ΄ νΈν
- μΈλΆ λ·°μ΄ μ ν리μΌμ΄μ μ°λμ μν OPDS κ·κ²©μ μ§μνλ©°, λ°μ΄ν°λ² μ΄μ€ μΈμ¦μ 보 κΈ°λ°μ Basic Authentication 보μ μ²λ¦¬λ₯Ό μ μ©νμ΅λλ€.
BookOasisκ° λμ©λ(10λ§ κΆ μ΄μ) νκ²½μμλ λ²λ² μ μμ΄ μ΄κ΄μμΌλ‘ λμνλ λΉλ°μ λλ€!
- μ΄κ³ μ μ€μΊλ: λμμ μμΆνμΌμ ν΄μ νμ§ μκ³ μ΅μ μ€νμ λ§ μ½μ΄ μμκ°μ λ©νλ°μ΄ν°λ₯Ό μΆμΆν΄ DBμ μλ©ν©λλ€.
- μ§μ°(Lazy) μ€μΊλ: μ©λμ΄ ν° λ§νμ± ZIP νμΌ λ±μ 무리νκ² μ¦μ νμ±νμ§ μκ³ λ°±κ·ΈλΌμ΄λμμ λλ₯Ένκ² λΉλκΈ° μ²λ¦¬νμ¬ λ©μΈ λμμ λ μ μ°¨λ¨ν©λλ€.
μμΈν νκ²½ κ΅¬μ± λ° μ€μΉ λ°©λ²μ κΈ°μ λ¬Έμλ₯Ό μ°Έμ‘°νμμμ€.
- μ€μΉ μλ΄: μ€μΉ κ°μ΄λ (docs/guide_installation.md)
- μΉ΄λΉν μ΄μ¬νκΈ°: λ§μ΄κ·Έλ μ΄μ κ°μ΄λ (docs/migration_guide.md)
- κ΄λ¦¬ λ° κ΄λ¦¬μ μ€μ : κ΄λ¦¬μ κ°μ΄λ (docs/guide_admin.md)
- λͺ¨λ°μΌ λ·°μ΄ μ°λ: OPDS μ°λ κ°μ΄λ (docs/guide_opds.md)
- μν€ν μ² λ° μμ€ κ΅¬μ‘°: μν€ν μ² κ°μ΄λ (docs/guide_architecture.md)
- νλ¬κ·ΈμΈ κ°λ° μ 보: νλ¬κ·ΈμΈ κ°λ° κ°μ΄λ (docs/guide_plugins.md)
- νμ€ μ΄λ²€νΈ μΉν λͺ μΈ: API μλν¬μΈνΈ λͺ μΈ (docs/api_endpoints.md)
- μν€ ν¬νΈ: κΈ°μ μν€ ν (docs/index.md)
μ΄λ²€νΈ μΉν (
book.new,book.read,book.finish)μ ν¬λ§·λ³ μ§νλ₯ μ μ½μ λ°μν©λλ€. EPUB/TXTλ 물리 νμ΄μ§κ° κ³ μ λμ§ μμtotalPagesκ°nullμΌ μ μμΌλ©°, μμ μΈ‘μμλprogress(0~100)λ₯Ό μ°μ μ²λ¦¬νλ κ²μ κΆμ₯ν©λλ€.
-
μ€μ ν νλ¦Ώ λ³΅μ¬ λ‘컬 νκ²½ κ³ μ μ€μ μ μν΄ μ 곡λλ μ€λ²λΌμ΄λ ν νλ¦Ώ νμΌμ 볡μ¬ν©λλ€.
cp docker-compose.override.example.yml docker-compose.override.yml
-
λ³Όλ₯¨ κ²½λ‘ μμ μμ±λ
docker-compose.override.ymlνμΌμ μ΄μ΄ λ³ΈμΈμ μ€μ μ± /λ§νμ± λΌμ΄λΈλ¬λ¦¬ λλ ν 리 κ²½λ‘λ‘ μμ ν©λλ€.services: bookoasis: volumes: - /μ€μ /μ± /μ μ₯/κ²½λ‘:/data/comics:ro
-
컨ν μ΄λ μ€ν
docker compose up -d --build
Tip:
docker-compose.override.ymlμ.gitignoreμ λ±λ‘λμ΄ μμΌλ―λ‘ ν₯ν νλ‘μ νΈ μμ€κ° μ λ°μ΄νΈλμ΄git pullμ λ°μλ μ¬μ©μμ κ°μΈ κ²½λ‘ μ€μ νμΌμ΄ μΆ©λμ μΌμΌν€κ±°λ μ μ€λμ§ μμ΅λλ€.
보μ μ μ± μ λ°λΌ μ΄μμμ© λ°°ν¬/μ λ°μ΄νΈ μ μ°¨λ λΉκ³΅κ° λ΄λΆ λ¬Έμλ‘ κ΄λ¦¬ν©λλ€.
# κ°μνκ²½ νμ±ν λ° μ’
μμ± μ€μΉ
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# μ€μ νμΌ κ΅¬μ±
# .env λ΄ SECRET_KEY νλͺ©μ μμ λ§μ μμμ κΈ΄ λ¬Έμμ΄μ μ
λ ₯νμ¬ λ³΄μ κ³ μ ν€λ₯Ό μμ±ν©λλ€.
# μ΄ ν€λ₯Ό κ³ μ ν΄ μ£Όμλ©΄ μλ² κΈ°λ νλ‘μΈμ€κ° μ¬μμλλλΌλ μ¬μ©μ μΈμ
(λ‘κ·ΈμΈ μν)μ΄ νλ¦¬μ§ μκ³ μμ νκ² μ μ§λ©λλ€.
# μλ² κΈ°λ
python core.py- κΈ°λ³Έ λμ: λ컀 μΈ νκ²½μμλ μ€μΊλ μμ»€κ° μλμΌλ‘ ν¨κ» κΈ°λλμ΄ ν λκΈ°μ΄(
pending)μ μ²λ¦¬ν©λλ€. - νμ μ λΉνμ±ν:
BOOKOASIS_ENABLE_EMBEDDED_WORKER=0 python core.py
μλμ° νκ²½μμλ λ§μ°μ€ λλΈν΄λ¦ ν λ²μΌλ‘ ꡬλ λλ ν 리 μμ± λ° ν¨ν€μ§ μ€μΉλΆν° νλ‘λμ
μμ€μ μΉ μλ²(waitress) μ€νκΉμ§ μλμΌλ‘ μν΄λ¦ μ
μ
ν΄ μ£Όλ λ°°μΉ νμΌμ μ 곡ν©λλ€.
.env.exampleνμΌμ 볡μ¬νμ¬.envνμΌλ‘ μ΄λ¦ λ³κ²½ ν νμν μ€μ μ λ ₯.(SECURITY_KEY)- νλ‘μ νΈ λ£¨νΈμ
run_windows.batνμΌμ λ§μ°μ€ λλΈν΄λ¦νμ¬ κΈ°λ.
-
run_windows.batλ μΉ μλ²μ μ€μΊλ μ컀λ₯Ό ν¨κ» κΈ°λνλλ‘ κ΅¬μ±λμ΄ μμ΅λλ€. -
λ‘컬 ν¬νΈ:
http://localhost:5930
BookOasisλ μ€μκ° λ μ μ§νλ μ μ₯ μ SQLite νμΌμ λ°λ‘ μ κ·Όνμ§ μκ³ μΈλ©λͺ¨λ¦¬(RAM) μΊμλ‘ μμΆ©ν΄ μ£Όλ Redis νμ΄λΈλ¦¬λ μΊμ λͺ¨λλ₯Ό μ§μν©λλ€. μ΄λ₯Ό ν΅ν΄ λμ€ν¬ μ°κΈ° λ³λͺ©μ΄ 격κ°νκ³ μ€μΊ μ€μ DB μμ(Malformed) νμμ΄ μλ²½ν λ°©μ§λ©λλ€.
docker-compose.ymlν νλ¦Ώμredis:7-alpineμ΄λ―Έμ§ μ°λμ΄ λ΄μ₯λμ΄ μμ΅λλ€..envνμΌμ μμ ν νμ μμ΄docker compose up -dλͺ λ Ήμ΄ νλλ‘ μ μ© λ λμ€κ° μΌμ§κ³ 격리 λ€νΈμν¬ μμμ μμ ν μλμΌλ‘ ν΅ν© μ°λλ©λλ€.- 컨ν
μ΄λ μ’
λ£ μ μΊμκ° μ μ€λμ§ μλλ‘
stop_grace_periodμ΄1m(1λΆ)μΌλ‘ μν₯ μ§μ λμ΄ μμ΅λλ€.
- νΈμ€νΈ OSμ λ λμ€ μλ²λ₯Ό μ€μΉ λ° κΈ°λν©λλ€. (Ubuntu μμ:
sudo apt install redis-server -y) .envνμΌ νλ¨μ μ μ URLμ κΈ°μ¬ν΄ μ€λλ€.REDIS_URL=redis://127.0.0.1:6379/9
- Tip: λ€λ₯Έ κΈ°μ‘΄ μλΉμ€μ λ λμ€λ₯Ό 곡μ νλ κ²½μ°, DB λ²νΈλ₯Ό
/9λ² λ± λ€λ₯Έ μΈλ±μ€λ‘ μ§μ νλ©΄ μΆ©λμ΄ μ ν μμ΅λλ€. λͺ¨λ λ°μ΄ν° ν€ μμbookoasis:λ€μμ€νμ΄μ€κ° κ°μ μ§μ λ©λλ€.
- Tip: λ€λ₯Έ κΈ°μ‘΄ μλΉμ€μ λ λμ€λ₯Ό 곡μ νλ κ²½μ°, DB λ²νΈλ₯Ό
- λ λμ€κ° μ€λΉλμ§ μμκ±°λ μ μμ μ€ν¨νλ©΄ μλμΌλ‘ κΈ°μ‘΄μ SQLite μ§μ μ°κΈ° λͺ¨λλ‘ μ°ν(Fallback) νλ―λ‘ μμ¬νκ³ μ¬μ©νμ λ λ©λλ€.
- μ΅μ΄ μλ² κ΅¬λ ν λ‘κ·ΈμΈ μ μλμ κ΄λ¦¬μ κ³μ μ μ¬μ©νμ¬ μ μν μ μμ΅λλ€.
- μ¬μ©μ μ΄λ¦(ID):
admin - λΉλ°λ²νΈ:
admin
- μ¬μ©μ μ΄λ¦(ID):
- 보μ κΆμ₯: 첫 λ‘κ·ΈμΈ ν μ¦μ [μ€μ ] > [κ³μ κ΄λ¦¬] νμμ κ΄λ¦¬μ λΉλ°λ²νΈλ₯Ό λ³κ²½ν΄ μ£ΌμΈμ.
ν΄μΈ νλ© μ μ λ° OIDC μ°λμ μν΄ Proxy Header Auth (리λ²μ€ νλ‘μ μλ λ‘κ·ΈμΈ) κΈ°λ₯μ μ§μν©λλ€.
Authelia, Authentik λ± μλ¨μ 리λ²μ€ νλ‘μ μΈμ¦ μλ²κ° κ²μ¦μ λ§μΉκ³ μ λ¬νλ HTTP ν€λ(Remote-User λλ X-Forwarded-User) κ°μ μ λ’°νμ¬ μλμΌλ‘ BookOasisμ λ‘κ·ΈμΈ(SSO)μν¬ μ μμ΅λλ€.
Caution
μ¬κ°ν 보μ κ²½κ³
μ΄ κΈ°λ₯μ λ°λμ Nginx, Authelia λ± λ¦¬λ²μ€ νλ‘μκ° ν€λλ₯Ό λ³μ‘° λ° λ³΄νΈνλ νμλ§ νκ²½μμλ§ νμ±νν΄μΌ ν©λλ€!
νλ‘μ μμ΄ μΈν°λ·μ κ°λ°©λ μνμμ μ΄ μ΅μ
μ μΌ€ κ²½μ°, μ
μμ μΈ μ¬μ©μκ° ν€λ μ‘°μ(μ: Remote-User: admin)λ§μΌλ‘ κ΄λ¦¬μ κΆνμ νμ·¨ν μ μλ μ¬κ°ν μ·¨μ½μ μ΄ λ©λλ€. μνμ±μ μΆ©λΆν μΈμ§ν λΆλ§ μ¬μ©νμΈμ.
μ€μ λ°©λ²:
- μ΄λλ―Ό κ³μ μΌλ‘ λ‘κ·ΈμΈ ν μΌλ° μ€μ λ©λ΄μ μ§μ ν©λλ€.
- μ€ν¬λ‘€μ λ΄λ € Proxy Header Auth (리λ²μ€ νλ‘μ μλ λ‘κ·ΈμΈ) νλͺ©μ μ°Ύμ ν κΈν©λλ€.
- μ€μ μ μ μ₯ν λ€, μλ¨μ Nginx/νλ‘μ μλ²κ° μ¬λ°λ₯Έ μ¬μ©μλͺ ν€λλ₯Ό BookOasis λ‘ λ겨주λλ‘ κ΅¬μ±νμμμ€.
μ ν 보μ μ΅μ (κΆμ₯):
PROXY_HEADER_TRUSTED_IPS: νλ‘μ μλ³Έ IP/CIDR νμ΄νΈλ¦¬μ€νΈ (μ:127.0.0.1,10.0.0.0/8,192.168.0.0/16)- μ΄ κ°μ΄ μ€μ λλ©΄, νμ΄νΈλ¦¬μ€νΈμ μλ μμ€ IPμμ μ λ¬λ
Remote-User/X-Forwarded-Userν€λλ 무μλ©λλ€.
- μ΄ κ°μ΄ μ€μ λλ©΄, νμ΄νΈλ¦¬μ€νΈμ μλ μμ€ IPμμ μ λ¬λ
PROXY_HEADER_DENY_DIRECT:1λ‘ μ€μ μ, νλ‘μ ν€λκ° μλ μ§μ μ μμ κ±°λΆ (reverse proxy κ²½μ κ°μ )
μ μ΅μ μ DB μ€μ (
settingsν μ΄λΈ) λλ νκ²½λ³μ(.env)λ‘ μ€μ ν μ μμ΅λλ€. DB μ€μ κ°μ΄ μ°μ μ μ©λ©λλ€.
- μ μ μ€μ (nginx.conf) μ λ°μ΄νΈ Cloudflareλ₯Ό ν΅νλ μμ²μ μΌλ°μ μΈ μμ²λ³΄λ€ ν€λ ν¬κΈ°(μΏ ν€, μΈμ¦ ν ν°, νλ‘μ ν€λ λ±)κ° ν¨μ¬ λΉλν©λλ€. Nginxμ κΈ°λ³Έ ν€λ λ²νΌ ν¬κΈ°κ° μμΌλ©΄ μλ²κ° μμ²μ κ±°λΆνκ³ 400 Bad Request λλ 414 Request-URI Too Large μλ¬λ₯Ό λ°νν©λλ€.
μ΄λ₯Ό λ°©μ§νκΈ° μν΄ /etc/nginx/nginx.conf νμΌμ http { ... } λΈλ‘ λ΄λΆμ μλ μ€μ μ λ°λμ μΆκ°νκ±°λ νμ₯ν΄ μ£ΌμΈμ.
http {
# ------------------------------------------------------------------
# [Cloudflare λ° λμ©λ ν€λ λμ] λ²νΌ ν¬κΈ° λν νμ₯
# μΏ ν€ λ° μΈμ¦ ν€λκ° κΈΈμ΄μ§ λ λ°μνλ 4XX μλ¬λ₯Ό μμ² μ°¨λ¨ν©λλ€.
# ------------------------------------------------------------------
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
# ------------------------------------------------------------------
# νλ‘μ ν€λ ν΄μ ν¬κΈ° μ΅μ ν
# λ€μμ 볡μ‘ν X-Forwarded-* ν€λκ° μ μ
λμ΄λ ν΄μ ν
μ΄λΈ μ€λ²νλ‘μ°κ° λμ§ μλλ‘ ν©λλ€.
# ------------------------------------------------------------------
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;
# (κΈ°μ‘΄μ λ€λ₯Έ μ€μ λ€...)
}
- BookOasis κ°μ νΈμ€νΈ μ€μ (sites-available) /etc/nginx/sites-available/default νμΌ(λλ κ°μ νΈμ€νΈ μ€μ λΈλ‘)μ μλ λ΄μ©μ μμ±νκ³ , sites-enabledμ μ¬λ³Όλ¦ λ§ν¬λ₯Ό κ±Έμ΄ μ μ©ν©λλ€.
# ------------------------------------------------------------------
# λ°±μλ μꡬ 컀λ₯μ
ν μ€μ (μμΌ μμ± μ§μ° 0ms)
# ------------------------------------------------------------------
upstream bookoasis_backend {
server 127.0.0.1:5930;
keepalive 64; # 64κ° λ°±μλ 컀λ₯μ
μ μꡬ μ μ§νμ¬ μ°κ²° μλͺ¨ λ°©μ§
}
server {
listen 80;
server_name your-domain.com; # <== λ³ΈμΈμ λλ©μΈμΌλ‘ λ³κ²½νμΈμ.
# HTTPλ‘ λ€μ΄μ€λ μμ²μ HTTPSλ‘ κ°μ 리λ€μ΄λ νΈ (보μ)
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri/;
}
# ------------------------------------------------------------------
# Gzip ν
μ€νΈ λ° SVG μμΆ μ€μ (UI λ° JSON API κ°μ)
# ------------------------------------------------------------------
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
# λ©νλ°μ΄ν° νλ¬κ·ΈμΈ λ° λμ©λ νμΌ μ
λ‘λλ₯Ό κ³ λ €ν λ°λ ν¬κΈ° μ ν
client_max_body_size 100M;
# ------------------------------------------------------------------
# 보μ ν€λ μ£Όμ
# ------------------------------------------------------------------
add_header X-Frame-Options "SAMEORIGIN" always; # ν΄λ¦μ¬νΉ λ°©μ§
add_header X-Content-Type-Options "nosniff" always; # MIME μ€λν λ°©μ§
add_header Referrer-Policy "no-referrer-when-downgrade" always;
# ------------------------------------------------------------------
# 1. μ»€λ² μ΄λ―Έμ§ λΌμ°ν
μ΅μ ν
# ------------------------------------------------------------------
# 1-1. λμ SVG μ»€λ² μμ± API (λ°±μλ νμ΄μ¬μΌλ‘ μ λ¬)
location /covers/fallback {
proxy_pass http://bookoasis_backend;
proxy_set_header Host $http_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 $http_x_forwarded_proto;
}
# 1-2. μ»€λ² μ΄λ―Έμ§ μ μ μλΉ μ΅μ ν (νμ΄μ¬ μ°ν λ€μ΄λ νΈ 0ms μλΉ)
location /covers/ {
alias /path/to/media_server/covers/; # <== λ³ΈμΈμ μ€μΉ κ²½λ‘/covers/ λ‘ λ³κ²½νμΈμ.
expires 1d;
add_header Cache-Control "public, max-age=86400";
sendfile on;
tcp_nopush on;
}
# ------------------------------------------------------------------
# 2. μΌλ° API λ° λ©μΈ μΉ μλΉμ€ (WebSocket μ§μ)
# ------------------------------------------------------------------
location / {
proxy_pass http://bookoasis_backend/;
# [κΈ°λ³Έ νλ‘μ ν€λ μ€μ ]
proxy_set_header Host $http_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 $http_x_forwarded_proto;
# [WebSocket λ° HTTP/1.1 νλ‘ν μ½ μ
κ·Έλ μ΄λ μ§μ]
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# [CRITICAL] λμ©λ νμΌ μ μ‘ μ΅μ ν (νλ‘μ λ²νΌλ§ λ)
proxy_buffering off;
# [νμμμ νμ₯] λμ©λ μ€μΊ νλ‘μΈμ€ λ° μ₯μκ° μμ
λμ
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
}
}Nginx λμ Caddyλ₯Ό 리λ²μ€ νλ‘μλ‘ μ¬μ©νλ κ²½μ° μλμ κ°μ΄ Caddyfileμ ꡬμ±νμ¬ μ΅μ ν λ° μ°λμ μ§νν μ μμ΅λλ€. Caddyλ μλμΌλ‘ SSL μΈμ¦μ(HTTPS)λ₯Ό λ°κΈ λ° κ΄λ¦¬ν΄μ£Όλ©°, WebSocketκ³Ό 리λ²μ€ νλ‘μ ν€λ μ²λ¦¬λ₯Ό κΈ°λ³Έ λ΄μ₯νκ³ μμ΅λλ€.
/etc/caddy/Caddyfile νμΌμ λ³ΈμΈμ λλ©μΈμ λ§€ννμ¬ λ€μκ³Ό κ°μ΄ λ΄μ©μ ꡬμ±ν©λλ€.
your-domain.com { # <== λ³ΈμΈμ λλ©μΈμΌλ‘ λ³κ²½νμΈμ.
# ------------------------------------------------------------------
# Gzip λ° Zstd ν
μ€νΈ μμΆ μ€μ (UI λ° JSON API κ°μ)
# ------------------------------------------------------------------
encode gzip zstd
# ------------------------------------------------------------------
# μ΅λ λ°λ ν¬κΈ° μ ν (Nginx client_max_body_size 100M λμ)
# μλΌλ λ©νλ°μ΄ν° νλ¬κ·ΈμΈ λ± μ»€λ² μ΄λ―Έμ§ μ
λ‘λλ₯Ό κ³ λ €ν νλμ
λλ€.
# ------------------------------------------------------------------
request_body {
max_size 100mb
}
# ------------------------------------------------------------------
# λ©μΈ μ΄ν리μΌμ΄μ
νλ‘μ λΌμ°ν
# ------------------------------------------------------------------
reverse_proxy 127.0.0.1:5930 {
# [CRITICAL] λμ©λ νμΌ μ μ‘ μ΅μ ν (νλ‘μ λ²νΌλ§ λΉνμ±ν)
# BookOasisμ ν΅μ¬ κΈ°λ₯μΈ 'μ€νμ
κΈ°λ° μ€μκ° μ€νΈλ¦¬λ°'μ΄ νλ‘μ λ²νΌμ
# κ°λ‘λ§νμ§ μκ³ μ¦μ μ μ‘λλλ‘ μ€μ ν©λλ€.
flush_interval -1
}
}λ³κ²½ μλ£ ν sudo systemctl reload caddy λͺ
λ Ήμ ν΅ν΄ Caddy μ€μ μ κ°±μ ν©λλ€.
- μ€νμμ€ λΌμ΄μ μ€: λ³Έ νλ‘μ νΈλ GNU AGPLv3 (Affero General Public License v3.0) κ·κ²©μ λ°λ¦ λλ€. λꡬλ μμ€ μ½λλ₯Ό μ΄λ, μμ , λ°°ν¬ν μ μμΌλ©°, μ΄ μννΈμ¨μ΄λ₯Ό κΈ°λ°μΌλ‘ ν μλΉμ€(λ€νΈμν¬λ₯Ό ν΅ν μλΉμ€ ν¬ν¨)λ₯Ό μ 곡ν κ²½μ° λ°λμ μμ λ μμ€ μ½λλ₯Ό λμΌν AGPLv3 λΌμ΄μ μ€λ‘ 곡κ°ν΄μΌ ν©λλ€. μμΈν μ½κ΄μ LICENSE νμΌμ μ°Έμ‘°νμμμ€.
- μνκΆ λ³΄νΈ κ°μ΄λλΌμΈ: "BookOasis" λͺ μΉ λ° κ΄λ ¨ 곡μ λ‘κ³ μ΄λ―Έμ§λ μμμμ κ³ μ μλ³ μν(Trademark)λ‘ λ³΄νΈλ©λλ€. λ³Έ νλ‘κ·Έλ¨μ ν¬ν¬(Fork) λ° λ³κ²½νμ¬ μ¬λ°°ν¬ μ μλ³Έ μμ€μ½λμ μ μκΆ νκΈ°λ μ±μ€ν μ€μνλ, λμΌν λͺ μΉ("BookOasis")κ³Ό 곡μ λ‘κ³ λ₯Ό μ νλͺ μ μ¬μ©νμ¬ μ¬λ°°ν¬ν μ μμΌλ©° λ°λμ μ΄λ¦μ λ€λ₯΄κ² λ³κ²½νμ¬ μλ³λλλ‘ ν΄μΌ ν©λλ€.
Copyright Β© 2026 leeyj (Carls, leeyj78@gmail.com). All rights reserved.

