Refactor documentation for reverse proxy and routing guides
Deploy to Production / deploy (push) Successful in 5s
Deploy to Production / deploy (push) Successful in 5s
This commit is contained in:
@@ -41,7 +41,7 @@
|
||||
</ul>
|
||||
|
||||
<h3>Architecture</h3>
|
||||
<pre>
|
||||
<pre><code class="language-bash">
|
||||
PyServe Gateway (:8000)
|
||||
│
|
||||
┌────────────────┼────────────────┐
|
||||
@@ -49,25 +49,25 @@
|
||||
FastAPI Flask Starlette
|
||||
:9001 :9002 :9003
|
||||
/api/* /admin/* /ws/*
|
||||
</pre>
|
||||
</code></pre>
|
||||
<p>PyServe acts as a gateway, routing requests to the appropriate subprocess based on URL path.</p>
|
||||
|
||||
<h3>Basic Configuration</h3>
|
||||
<pre><span class="directive">server:</span>
|
||||
<span class="directive">host:</span> <span class="value">0.0.0.0</span>
|
||||
<span class="directive">port:</span> <span class="value">8000</span>
|
||||
<pre><code class="language-yaml">server:
|
||||
host: 0.0.0.0
|
||||
port: 8000
|
||||
|
||||
<span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">process_orchestration</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">apps:</span>
|
||||
- <span class="directive">name:</span> <span class="value">api</span>
|
||||
<span class="directive">path:</span> <span class="value">/api</span>
|
||||
<span class="directive">app_path:</span> <span class="value">myapp.api:app</span>
|
||||
extensions:
|
||||
- type: process_orchestration
|
||||
config:
|
||||
apps:
|
||||
- name: api
|
||||
path: /api
|
||||
app_path: myapp.api:app
|
||||
|
||||
- <span class="directive">name:</span> <span class="value">admin</span>
|
||||
<span class="directive">path:</span> <span class="value">/admin</span>
|
||||
<span class="directive">app_path:</span> <span class="value">myapp.admin:app</span></pre>
|
||||
- name: admin
|
||||
path: /admin
|
||||
app_path: myapp.admin:app</code></pre>
|
||||
|
||||
<h3>App Configuration Options</h3>
|
||||
<dl>
|
||||
@@ -130,18 +130,18 @@
|
||||
</dl>
|
||||
|
||||
<h3>Global Configuration</h3>
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">process_orchestration</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">port_range:</span> <span class="value">[9000, 9999]</span>
|
||||
<span class="directive">health_check_enabled:</span> <span class="value">true</span>
|
||||
<span class="directive">proxy_timeout:</span> <span class="value">60.0</span>
|
||||
<span class="directive">logging:</span>
|
||||
<span class="directive">httpx_level:</span> <span class="value">warning</span>
|
||||
<span class="directive">proxy_logs:</span> <span class="value">true</span>
|
||||
<span class="directive">health_check_logs:</span> <span class="value">false</span>
|
||||
<span class="directive">apps:</span>
|
||||
<span class="comment"># ...</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: process_orchestration
|
||||
config:
|
||||
port_range: [9000, 9999]
|
||||
health_check_enabled: true
|
||||
proxy_timeout: 60.0
|
||||
logging:
|
||||
httpx_level: warning
|
||||
proxy_logs: true
|
||||
health_check_logs: false
|
||||
apps:
|
||||
# ...</code></pre>
|
||||
|
||||
<dl>
|
||||
<dt>port_range</dt>
|
||||
@@ -161,7 +161,7 @@
|
||||
</dl>
|
||||
|
||||
<h3>FastAPI Example</h3>
|
||||
<pre><span class="comment"># myapp/api.py</span>
|
||||
<pre><code class="language-python"># myapp/api.py
|
||||
from fastapi import FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
@@ -172,22 +172,22 @@ async def health():
|
||||
|
||||
@app.get("/users")
|
||||
async def get_users():
|
||||
return [{"id": 1, "name": "Alice"}]</pre>
|
||||
return [{"id": 1, "name": "Alice"}]</code></pre>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">process_orchestration</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">apps:</span>
|
||||
- <span class="directive">name:</span> <span class="value">api</span>
|
||||
<span class="directive">path:</span> <span class="value">/api</span>
|
||||
<span class="directive">app_path:</span> <span class="value">myapp.api:app</span>
|
||||
<span class="directive">workers:</span> <span class="value">4</span>
|
||||
<span class="directive">health_check_path:</span> <span class="value">/health</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: process_orchestration
|
||||
config:
|
||||
apps:
|
||||
- name: api
|
||||
path: /api
|
||||
app_path: myapp.api:app
|
||||
workers: 4
|
||||
health_check_path: /health</code></pre>
|
||||
|
||||
<p>Requests to <code>/api/users</code> are proxied to the FastAPI process as <code>/users</code>.</p>
|
||||
|
||||
<h3>Flask Example (WSGI)</h3>
|
||||
<pre><span class="comment"># myapp/admin.py</span>
|
||||
<pre><code class="language-python"># myapp/admin.py
|
||||
from flask import Flask
|
||||
|
||||
app = Flask(__name__)
|
||||
@@ -198,17 +198,17 @@ def health():
|
||||
|
||||
@app.route("/dashboard")
|
||||
def dashboard():
|
||||
return {"page": "dashboard"}</pre>
|
||||
return {"page": "dashboard"}</code></pre>
|
||||
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">process_orchestration</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">apps:</span>
|
||||
- <span class="directive">name:</span> <span class="value">admin</span>
|
||||
<span class="directive">path:</span> <span class="value">/admin</span>
|
||||
<span class="directive">app_path:</span> <span class="value">myapp.admin:app</span>
|
||||
<span class="directive">app_type:</span> <span class="value">wsgi</span>
|
||||
<span class="directive">workers:</span> <span class="value">2</span></pre>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: process_orchestration
|
||||
config:
|
||||
apps:
|
||||
- name: admin
|
||||
path: /admin
|
||||
app_path: myapp.admin:app
|
||||
app_type: wsgi
|
||||
workers: 2</code></pre>
|
||||
|
||||
<div class="note">
|
||||
<strong>Note:</strong> WSGI support requires <code>a2wsgi</code> package:
|
||||
@@ -216,7 +216,7 @@ def dashboard():
|
||||
</div>
|
||||
|
||||
<h3>Factory Pattern</h3>
|
||||
<pre><span class="comment"># myapp/api.py</span>
|
||||
<pre><code class="language-python"># myapp/api.py
|
||||
from fastapi import FastAPI
|
||||
|
||||
def create_app(debug: bool = False) -> FastAPI:
|
||||
@@ -226,49 +226,49 @@ def create_app(debug: bool = False) -> FastAPI:
|
||||
async def health():
|
||||
return {"status": "ok", "debug": debug}
|
||||
|
||||
return app</pre>
|
||||
return app</code></pre>
|
||||
|
||||
<pre><span class="directive">apps:</span>
|
||||
- <span class="directive">name:</span> <span class="value">api</span>
|
||||
<span class="directive">path:</span> <span class="value">/api</span>
|
||||
<span class="directive">app_path:</span> <span class="value">myapp.api:create_app</span>
|
||||
<span class="directive">factory:</span> <span class="value">true</span></pre>
|
||||
<pre><code class="language-bash">apps:
|
||||
- name: api
|
||||
path: /api
|
||||
app_path: myapp.api:create_app
|
||||
factory: true</code></pre>
|
||||
|
||||
<h3>Environment Variables</h3>
|
||||
<p>Pass environment variables to subprocesses:</p>
|
||||
<pre><span class="directive">apps:</span>
|
||||
- <span class="directive">name:</span> <span class="value">api</span>
|
||||
<span class="directive">path:</span> <span class="value">/api</span>
|
||||
<span class="directive">app_path:</span> <span class="value">myapp.api:app</span>
|
||||
<span class="directive">env:</span>
|
||||
<span class="directive">DATABASE_URL:</span> <span class="value">"postgresql://localhost/mydb"</span>
|
||||
<span class="directive">REDIS_URL:</span> <span class="value">"redis://localhost:6379"</span>
|
||||
<span class="directive">DEBUG:</span> <span class="value">"false"</span></pre>
|
||||
<pre><code class="language-bash">apps:
|
||||
- name: api
|
||||
path: /api
|
||||
app_path: myapp.api:app
|
||||
env:
|
||||
DATABASE_URL: "postgresql://localhost/mydb"
|
||||
REDIS_URL: "redis://localhost:6379"
|
||||
DEBUG: "false"</code></pre>
|
||||
|
||||
<h3>Multiple Applications</h3>
|
||||
<pre><span class="directive">extensions:</span>
|
||||
- <span class="directive">type:</span> <span class="value">process_orchestration</span>
|
||||
<span class="directive">config:</span>
|
||||
<span class="directive">port_range:</span> <span class="value">[9000, 9999]</span>
|
||||
<span class="directive">apps:</span>
|
||||
<span class="comment"># FastAPI REST API</span>
|
||||
- <span class="directive">name:</span> <span class="value">api</span>
|
||||
<span class="directive">path:</span> <span class="value">/api</span>
|
||||
<span class="directive">app_path:</span> <span class="value">apps.api:app</span>
|
||||
<span class="directive">workers:</span> <span class="value">4</span>
|
||||
<pre><code class="language-yaml">extensions:
|
||||
- type: process_orchestration
|
||||
config:
|
||||
port_range: [9000, 9999]
|
||||
apps:
|
||||
# FastAPI REST API
|
||||
- name: api
|
||||
path: /api
|
||||
app_path: apps.api:app
|
||||
workers: 4
|
||||
|
||||
<span class="comment"># Flask Admin Panel</span>
|
||||
- <span class="directive">name:</span> <span class="value">admin</span>
|
||||
<span class="directive">path:</span> <span class="value">/admin</span>
|
||||
<span class="directive">app_path:</span> <span class="value">apps.admin:app</span>
|
||||
<span class="directive">app_type:</span> <span class="value">wsgi</span>
|
||||
<span class="directive">workers:</span> <span class="value">2</span>
|
||||
# Flask Admin Panel
|
||||
- name: admin
|
||||
path: /admin
|
||||
app_path: apps.admin:app
|
||||
app_type: wsgi
|
||||
workers: 2
|
||||
|
||||
<span class="comment"># Starlette WebSocket Handler</span>
|
||||
- <span class="directive">name:</span> <span class="value">websocket</span>
|
||||
<span class="directive">path:</span> <span class="value">/ws</span>
|
||||
<span class="directive">app_path:</span> <span class="value">apps.websocket:app</span>
|
||||
<span class="directive">workers:</span> <span class="value">1</span></pre>
|
||||
# Starlette WebSocket Handler
|
||||
- name: websocket
|
||||
path: /ws
|
||||
app_path: apps.websocket:app
|
||||
workers: 1</code></pre>
|
||||
|
||||
<h3>Request Tracing</h3>
|
||||
<p>PyServe automatically generates and propagates <code>X-Request-ID</code> headers:</p>
|
||||
|
||||
Reference in New Issue
Block a user