mirror of
https://github.com/NexVeridian/ark-invest-api-rust.git
synced 2025-09-02 09:59:11 +00:00
nginx
This commit is contained in:
parent
4e3dedf7ab
commit
85294d5983
5 changed files with 31 additions and 10 deletions
|
@ -24,3 +24,4 @@ strum_macros = "0.25"
|
||||||
tower = { version = "0.4", features = ["limit", "buffer"] }
|
tower = { version = "0.4", features = ["limit", "buffer"] }
|
||||||
tower-http = { version = "0.4", features = ["compression-zstd", "cors"] }
|
tower-http = { version = "0.4", features = ["compression-zstd", "cors"] }
|
||||||
tower_governor = "0.1"
|
tower_governor = "0.1"
|
||||||
|
lazy_static = "1.4"
|
||||||
|
|
|
@ -18,6 +18,8 @@ Create data folder next to docker-compose.yml, `data\parquet\*.parquet` with the
|
||||||
|
|
||||||
`docker compose up --pull always`
|
`docker compose up --pull always`
|
||||||
|
|
||||||
|
If not using nginx, set environment NGINX = false in docker compose
|
||||||
|
|
||||||
# Dev Install
|
# Dev Install
|
||||||
## Dev Containers
|
## Dev Containers
|
||||||
Install docker, vscode and the [Dev Containers Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
|
Install docker, vscode and the [Dev Containers Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)
|
||||||
|
|
|
@ -8,6 +8,8 @@ services:
|
||||||
DOCKER_BUILDKIT: 1
|
DOCKER_BUILDKIT: 1
|
||||||
container_name: ark-invest-api-rust
|
container_name: ark-invest-api-rust
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# environment:
|
||||||
|
# - NGINX = false
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/ark-invest-api-rust/data
|
- ./data:/ark-invest-api-rust/data
|
||||||
ports:
|
ports:
|
||||||
|
|
|
@ -4,6 +4,8 @@ services:
|
||||||
image: ghcr.io/nexveridian/ark-invest-api-rust:latest
|
image: ghcr.io/nexveridian/ark-invest-api-rust:latest
|
||||||
container_name: ark-invest-api-rust
|
container_name: ark-invest-api-rust
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# environment:
|
||||||
|
# - NGINX = false
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/ark-invest-api-rust/data
|
- ./data:/ark-invest-api-rust/data
|
||||||
ports:
|
ports:
|
||||||
|
|
34
src/main.rs
34
src/main.rs
|
@ -12,7 +12,8 @@ use axum::{
|
||||||
http::{Method, StatusCode},
|
http::{Method, StatusCode},
|
||||||
BoxError, Extension, Json,
|
BoxError, Extension, Json,
|
||||||
};
|
};
|
||||||
use std::{net::SocketAddr, time::Duration};
|
use lazy_static::lazy_static;
|
||||||
|
use std::{env, net::SocketAddr, time::Duration};
|
||||||
use tower::{buffer::BufferLayer, limit::RateLimitLayer, ServiceBuilder};
|
use tower::{buffer::BufferLayer, limit::RateLimitLayer, ServiceBuilder};
|
||||||
use tower_governor::{
|
use tower_governor::{
|
||||||
governor::GovernorConfigBuilder, key_extractor::SmartIpKeyExtractor, GovernorLayer,
|
governor::GovernorConfigBuilder, key_extractor::SmartIpKeyExtractor, GovernorLayer,
|
||||||
|
@ -24,6 +25,16 @@ use tower_http::{
|
||||||
|
|
||||||
mod routes;
|
mod routes;
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref NGINX: bool = match env::var("NGINX") {
|
||||||
|
Ok(val) => val
|
||||||
|
.to_lowercase()
|
||||||
|
.parse::<bool>()
|
||||||
|
.expect("Env string NGINX must be bool"),
|
||||||
|
Err(_) => true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
async fn serve_api(Extension(api): Extension<OpenApi>) -> impl IntoApiResponse {
|
async fn serve_api(Extension(api): Extension<OpenApi>) -> impl IntoApiResponse {
|
||||||
Json(api)
|
Json(api)
|
||||||
}
|
}
|
||||||
|
@ -58,8 +69,8 @@ async fn main() {
|
||||||
let rate_limit_ip = || {
|
let rate_limit_ip = || {
|
||||||
let config = Box::new(
|
let config = Box::new(
|
||||||
GovernorConfigBuilder::default()
|
GovernorConfigBuilder::default()
|
||||||
.per_second(2)
|
.per_millisecond(500)
|
||||||
.burst_size(10)
|
.burst_size(25)
|
||||||
.use_headers()
|
.use_headers()
|
||||||
.key_extractor(SmartIpKeyExtractor)
|
.key_extractor(SmartIpKeyExtractor)
|
||||||
.finish()
|
.finish()
|
||||||
|
@ -81,6 +92,13 @@ async fn main() {
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let route_layer = {
|
||||||
|
rate_limit_global(1_000)
|
||||||
|
.layer(cors())
|
||||||
|
.layer(CompressionLayer::new().zstd(true))
|
||||||
|
.option_layer(if *NGINX { Some(rate_limit_ip()) } else { None })
|
||||||
|
};
|
||||||
|
|
||||||
let app = ApiRouter::new()
|
let app = ApiRouter::new()
|
||||||
.route("/", Redoc::new("/api.json").axum_route())
|
.route("/", Redoc::new("/api.json").axum_route())
|
||||||
.layer(CompressionLayer::new().zstd(true))
|
.layer(CompressionLayer::new().zstd(true))
|
||||||
|
@ -96,17 +114,12 @@ async fn main() {
|
||||||
| date | str | str | str | i64 | f64 | f64 | f64 |
|
| date | str | str | str | i64 | f64 | f64 | f64 |
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
`/ark_holdings?ticker=ARKK&start=2023-01-01&end=2023-03-01`",
|
`/ark_holdings?ticker=ARKK&start=2023-10-01&end=2023-11-01`",
|
||||||
);
|
);
|
||||||
description_date(o)
|
description_date(o)
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
.layer(
|
.layer(route_layer);
|
||||||
rate_limit_global(1000)
|
|
||||||
.layer(rate_limit_ip())
|
|
||||||
.layer(cors())
|
|
||||||
.layer(CompressionLayer::new().zstd(true)),
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut api = OpenApi {
|
let mut api = OpenApi {
|
||||||
info: Info {
|
info: Info {
|
||||||
|
@ -130,6 +143,7 @@ async fn main() {
|
||||||
.serve(
|
.serve(
|
||||||
app.finish_api(&mut api)
|
app.finish_api(&mut api)
|
||||||
.layer(Extension(api))
|
.layer(Extension(api))
|
||||||
|
.layer(CompressionLayer::new().zstd(true))
|
||||||
.into_make_service(),
|
.into_make_service(),
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue