Refactor documentation for reverse proxy and routing guides
Deploy to Production / deploy (push) Successful in 5s

This commit is contained in:
Илья Глазунов
2025-12-08 01:05:52 +03:00
parent 58660ec8d4
commit 00119ce463
12 changed files with 521 additions and 517 deletions
+85 -85
View File
@@ -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>