Skip to content

Commit 10aeaea

Browse files
committed
feat: rg prod (#2281)
<!-- Please make sure there is an issue that this PR is correlated to. --> ## Changes <!-- If there are frontend changes, please include screenshots. -->
1 parent bc0582f commit 10aeaea

File tree

54 files changed

+1378
-587
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1378
-587
lines changed

Diff for: examples/system-test/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"devDependencies": {
1212
"@rivet-gg/actor-core": "^5.1.2",
1313
"@rivet-gg/api": "^24.6.2",
14+
"@types/deno": "^2.2.0",
1415
"@types/node": "^22.13.9",
1516
"@types/ws": "^8.18.0",
1617
"node-fetch": "^3.3.2",

Diff for: examples/system-test/yarn.lock

+8
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,13 @@ __metadata:
277277
languageName: node
278278
linkType: hard
279279

280+
"@types/deno@npm:^2.2.0":
281+
version: 2.2.0
282+
resolution: "@types/deno@npm:2.2.0"
283+
checksum: 10c0/cb45bbffe66a3008224a509c6bcb338921cc68b9045363f77ba5d84650d879b8fd4c810db24369a93fbce4a8e2855808bb141c0447feb47d911a7512ba374bde
284+
languageName: node
285+
linkType: hard
286+
280287
"@types/node@npm:*, @types/node@npm:^22.13.9":
281288
version: 22.13.9
282289
resolution: "@types/node@npm:22.13.9"
@@ -1519,6 +1526,7 @@ __metadata:
15191526
"@hono/node-ws": "npm:^1.1.0"
15201527
"@rivet-gg/actor-core": "npm:^5.1.2"
15211528
"@rivet-gg/api": "npm:^24.6.2"
1529+
"@types/deno": "npm:^2.2.0"
15221530
"@types/node": "npm:^22.13.9"
15231531
"@types/ws": "npm:^8.18.0"
15241532
hono: "npm:^4.6.17"

Diff for: frontend/apps/hub/vendor/rivet-gg-api.tgz

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:2b4cedaff70a26f081fc0d58a41f072518e9679461a19a35dae9a56c70ea1830
3-
size 545765
2+
oid sha256:33f122a17701fd66c37418c5a467ab386559bfce63b3859f587bac2ce63339e6
3+
size 545789

Diff for: packages/common/config/src/config/guard/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ use std::path::PathBuf;
77
#[serde(deny_unknown_fields)]
88
#[derive(Default)]
99
pub struct Guard {
10-
pub http_port: u16, // Port for HTTP traffic
10+
pub http_port: u16, // Port for HTTP traffic
1111
pub https: Option<Https>, // Optional HTTPS configuration
1212
}
1313

1414
#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)]
1515
#[serde(deny_unknown_fields)]
1616
#[derive(Default)]
1717
pub struct Https {
18-
pub port: u16, // Port for HTTPS traffic
19-
pub tls: Tls, // TLS configuration
18+
pub port: u16, // Port for HTTPS traffic
19+
pub tls: Tls, // TLS configuration
2020
}
2121

2222
#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)]

Diff for: packages/common/config/src/config/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ use global_error::prelude::*;
22
use schemars::JsonSchema;
33
use serde::{Deserialize, Serialize};
44

5-
pub mod server;
65
pub mod guard;
6+
pub mod server;
77

8-
pub use server::*;
98
pub use guard::*;
9+
pub use server::*;
1010

1111
// IMPORTANT:
1212
//

Diff for: packages/common/config/src/config/server/rivet/cluster_provision.rs

+86
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ pub struct ClusterProvision {
2525

2626
// The URL for the rivet edge server binary.
2727
pub edge_server_binary_url: Url,
28+
29+
// The URL for the rivet guard binary.
30+
pub guard_binary_url: Url,
2831
}
2932

3033
impl ClusterProvision {
@@ -44,6 +47,7 @@ pub struct ClusterPools {
4447
pub fdb: ClusterPoolFdb,
4548
pub worker: ClusterPoolWorker,
4649
pub nats: ClusterPoolNats,
50+
pub guard: ClusterPoolGuard,
4751
}
4852

4953
#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)]
@@ -303,6 +307,88 @@ impl ClusterPoolNats {
303307
}
304308
}
305309

310+
#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)]
311+
#[serde(rename_all = "snake_case", deny_unknown_fields)]
312+
pub struct ClusterPoolGuard {
313+
pub autoscale_margin: u32,
314+
315+
#[schemars(with = "Option<String>")]
316+
pub vlan_ip_net: Option<Ipv4Net>,
317+
pub firewall_rules: Option<Vec<FirewallRule>>,
318+
}
319+
320+
impl ClusterPoolGuard {
321+
pub fn vlan_ip_net(&self) -> Ipv4Net {
322+
Ipv4Net::new(Ipv4Addr::new(10, 0, 0, 0), 26).unwrap()
323+
}
324+
325+
pub fn vlan_addr_range(&self) -> Ipv4AddrRange {
326+
self.vlan_ip_net().hosts()
327+
}
328+
329+
pub fn firewall_rules(&self, rg: &super::Guard) -> Vec<FirewallRule> {
330+
[
331+
FirewallRule::base_rules(),
332+
vec![
333+
// HTTP(S)
334+
FirewallRule {
335+
label: "http-tcp".into(),
336+
ports: "80".into(),
337+
protocol: "tcp".into(),
338+
inbound_ipv4_cidr: vec!["0.0.0.0/0".into()],
339+
inbound_ipv6_cidr: vec!["::/0".into()],
340+
},
341+
FirewallRule {
342+
label: "http-udp".into(),
343+
ports: "80".into(),
344+
protocol: "udp".into(),
345+
inbound_ipv4_cidr: vec!["0.0.0.0/0".into()],
346+
inbound_ipv6_cidr: vec!["::/0".into()],
347+
},
348+
FirewallRule {
349+
label: "https-tcp".into(),
350+
ports: "443".into(),
351+
protocol: "tcp".into(),
352+
inbound_ipv4_cidr: vec!["0.0.0.0/0".into()],
353+
inbound_ipv6_cidr: vec!["::/0".into()],
354+
},
355+
FirewallRule {
356+
label: "https-udp".into(),
357+
ports: "443".into(),
358+
protocol: "udp".into(),
359+
inbound_ipv4_cidr: vec!["0.0.0.0/0".into()],
360+
inbound_ipv6_cidr: vec!["::/0".into()],
361+
},
362+
// Dynamic TCP
363+
FirewallRule {
364+
label: "dynamic-tcp".into(),
365+
ports: format!(
366+
"{}-{}",
367+
rg.min_ingress_port_tcp(),
368+
rg.max_ingress_port_tcp()
369+
),
370+
protocol: "tcp".into(),
371+
inbound_ipv4_cidr: vec!["0.0.0.0/0".into()],
372+
inbound_ipv6_cidr: vec!["::/0".into()],
373+
},
374+
// Dynamic UDP
375+
FirewallRule {
376+
label: "dynamic-udp".into(),
377+
ports: format!(
378+
"{}-{}",
379+
rg.min_ingress_port_udp(),
380+
rg.max_ingress_port_udp()
381+
),
382+
protocol: "udp".into(),
383+
inbound_ipv4_cidr: vec!["0.0.0.0/0".into()],
384+
inbound_ipv6_cidr: vec!["::/0".into()],
385+
},
386+
],
387+
]
388+
.concat()
389+
}
390+
}
391+
306392
#[derive(Debug, Serialize, Deserialize, Clone, JsonSchema)]
307393
pub struct FirewallRule {
308394
pub label: String,

Diff for: packages/common/config/src/config/server/rivet/mod.rs

+6-8
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub mod default_dev_cluster {
2929

3030
// In dev, there are no servers to pull the addresses from. We need to have a fallback address.
3131
pub const DEV_EDGE_API_FALLBACK_ADDR_LAN_HOST: &str = "rivet-edge-server";
32-
pub const DEV_EDGE_API_FALLBACK_ADDR_LAN_PORT: u16 = 8080;
32+
pub const DEV_EDGE_API_FALLBACK_ADDR_LAN_PORT: u16 = 8080;
3333
}
3434

3535
pub mod default_hosts {
@@ -287,12 +287,10 @@ impl Rivet {
287287
Some(lan_addr.clone())
288288
} else {
289289
match self.auth.access_kind {
290-
AccessKind::Development => {
291-
Some((
292-
default_dev_cluster::DEV_EDGE_API_FALLBACK_ADDR_LAN_HOST.to_string(),
293-
default_dev_cluster::DEV_EDGE_API_FALLBACK_ADDR_LAN_PORT
294-
))
295-
}
290+
AccessKind::Development => Some((
291+
default_dev_cluster::DEV_EDGE_API_FALLBACK_ADDR_LAN_HOST.to_string(),
292+
default_dev_cluster::DEV_EDGE_API_FALLBACK_ADDR_LAN_PORT,
293+
)),
296294
AccessKind::Public | AccessKind::Private => None,
297295
}
298296
}
@@ -811,5 +809,5 @@ pub struct Edge {
811809
#[serde(default)]
812810
pub api_lan_address: Option<(String, u16)>,
813811
#[serde(default)]
814-
pub redirect_logs: Option<bool>,
812+
pub redirect_logs_dir: Option<PathBuf>,
815813
}

Diff for: packages/common/convert/src/impls/provision.rs

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ impl ApiFrom<models::ProvisionPoolType> for cluster::types::PoolType {
1313
models::ProvisionPoolType::Fdb => cluster::types::PoolType::Fdb,
1414
models::ProvisionPoolType::Worker => cluster::types::PoolType::Worker,
1515
models::ProvisionPoolType::Nats => cluster::types::PoolType::Nats,
16+
models::ProvisionPoolType::Guard => cluster::types::PoolType::Guard,
1617
}
1718
}
1819
}
@@ -28,6 +29,7 @@ impl ApiFrom<cluster::types::PoolType> for models::ProvisionPoolType {
2829
cluster::types::PoolType::Fdb => models::ProvisionPoolType::Fdb,
2930
cluster::types::PoolType::Worker => models::ProvisionPoolType::Worker,
3031
cluster::types::PoolType::Nats => models::ProvisionPoolType::Nats,
32+
cluster::types::PoolType::Guard => models::ProvisionPoolType::Guard,
3133
}
3234
}
3335
}

Diff for: packages/common/runtime/src/otel.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Based off of https://github.com/tokio-rs/tracing-opentelemetry/blob/v0.1.x/examples/opentelemetry-otlp.rs
22

3+
use console_subscriber;
34
use opentelemetry::{global, trace::TracerProvider as _, KeyValue};
45
use opentelemetry_otlp::WithExportConfig;
56
use opentelemetry_sdk::{
@@ -11,7 +12,6 @@ use opentelemetry_sdk::{
1112
use opentelemetry_semantic_conventions::{attribute::SERVICE_VERSION, SCHEMA_URL};
1213
use tracing_opentelemetry::{MetricsLayer, OpenTelemetryLayer};
1314
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Layer};
14-
use console_subscriber;
1515

1616
fn resource() -> Resource {
1717
Resource::builder()
@@ -119,7 +119,6 @@ pub fn init_tracing_subscriber() -> OtelGuard {
119119
// opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge::new(&logger_provider)
120120
// .with_filter(filter_otel);
121121

122-
123122
// Create env filter
124123
let mut env_filter = EnvFilter::default()
125124
// Default filter

Diff for: packages/common/server-cli/src/commands/start.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::{path::Path, time::Duration};
1+
use std::time::Duration;
22

33
use anyhow::*;
44
use clap::Parser;
@@ -48,16 +48,14 @@ impl Opts {
4848
run_config: &RunConfig,
4949
) -> Result<()> {
5050
// Redirect logs if enabled on the edge
51-
if config
51+
if let Some(logs_dir) = config
5252
.server()
5353
.ok()
5454
.and_then(|x| x.rivet.edge.as_ref())
55-
.and_then(|x| x.redirect_logs)
56-
.unwrap_or_default()
55+
.and_then(|x| x.redirect_logs_dir.as_ref())
5756
{
58-
let logs_path = Path::new("/var/log/rivet-edge-server");
59-
std::fs::create_dir_all(logs_path)?;
60-
rivet_logs::Logs::new(logs_path.to_path_buf(), LOGS_RETENTION)
57+
std::fs::create_dir_all(logs_dir)?;
58+
rivet_logs::Logs::new(logs_dir.clone(), LOGS_RETENTION)
6159
.start()
6260
.await?;
6361
}

Diff for: packages/core/api/traefik-provider/src/route/tunnel.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ pub async fn build_ip_allowlist(
4545
let servers_res = ctx
4646
.op(cluster::ops::server::list::Input {
4747
filter: cluster::types::Filter {
48-
pool_types: Some(vec![cluster::types::PoolType::Gg]),
48+
pool_types: Some(vec![
49+
cluster::types::PoolType::Gg,
50+
cluster::types::PoolType::Guard,
51+
]),
4952
..Default::default()
5053
},
5154
include_destroyed: false,

Diff for: packages/core/services/cluster/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ pub fn registry() -> WorkflowResult<Registry> {
1818
registry.register_workflow::<server::drain::Workflow>()?;
1919
registry.register_workflow::<server::gg_dns_create::Workflow>()?;
2020
registry.register_workflow::<server::gg_dns_delete::Workflow>()?;
21+
registry.register_workflow::<server::guard_dns_create::Workflow>()?;
22+
registry.register_workflow::<server::guard_dns_delete::Workflow>()?;
2123
registry.register_workflow::<server::install::Workflow>()?;
2224
registry.register_workflow::<server::undrain::Workflow>()?;
2325
registry.register_workflow::<server::Workflow>()?;

Diff for: packages/core/services/cluster/src/ops/datacenter/location_get.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ pub async fn cluster_datacenter_location_get(
6161
}
6262

6363
async fn query_dcs(ctx: OperationCtx, datacenter_ids: Vec<Uuid>) -> GlobalResult<Vec<Datacenter>> {
64-
// NOTE: if there is no active GG node in a datacenter, we cannot retrieve its location
64+
// NOTE: if there is no active guard node in a datacenter, we cannot retrieve its location
6565
// Fetch the gg node public ip for each datacenter (there may be more than one, hence `DISTINCT`)
6666
let server_rows = sql_fetch_all!(
6767
[ctx, (Uuid, IpAddr)]
@@ -71,14 +71,14 @@ async fn query_dcs(ctx: OperationCtx, datacenter_ids: Vec<Uuid>) -> GlobalResult
7171
FROM db_cluster.servers
7272
WHERE
7373
datacenter_id = ANY($1) AND
74-
pool_type = $2 AND
74+
pool_type = ANY($2) AND
7575
public_ip IS NOT NULL AND
7676
cloud_destroy_ts IS NULL
7777
-- For consistency
7878
ORDER BY public_ip DESC
7979
",
8080
&datacenter_ids,
81-
PoolType::Gg as i64,
81+
[PoolType::Gg as i64, PoolType::Guard as i64],
8282
)
8383
.await?;
8484

Diff for: packages/core/services/cluster/src/ops/datacenter/topology_get/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ pub async fn cluster_datacenter_topology_get(
200200
PoolType::Gg
201201
| PoolType::Ats | PoolType::PegboardIsolate
202202
| PoolType::Fdb | PoolType::Worker
203-
| PoolType::Nats
203+
| PoolType::Nats | PoolType::Guard
204204
)
205205
})
206206
.collect::<Vec<_>>();

Diff for: packages/core/services/cluster/src/types.rs

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ pub enum PoolType {
8585
Fdb = 5,
8686
Worker = 6,
8787
Nats = 7,
88+
Guard = 8,
8889
}
8990

9091
impl std::fmt::Display for PoolType {
@@ -98,6 +99,7 @@ impl std::fmt::Display for PoolType {
9899
PoolType::Fdb => write!(f, "fdb"),
99100
PoolType::Worker => write!(f, "worker"),
100101
PoolType::Nats => write!(f, "nats"),
102+
PoolType::Guard => write!(f, "guard"),
101103
}
102104
}
103105
}

Diff for: packages/core/services/cluster/src/workflows/datacenter/scale.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,12 @@ async fn scale_servers(
348348
.await?;
349349
}
350350
}
351-
PoolType::Gg | PoolType::Ats | PoolType::Fdb | PoolType::Worker | PoolType::Nats => {
351+
PoolType::Gg
352+
| PoolType::Ats
353+
| PoolType::Fdb
354+
| PoolType::Worker
355+
| PoolType::Nats
356+
| PoolType::Guard => {
352357
let installed_servers = active_servers.filter(|server| server.is_installed);
353358
let installed_count = installed_servers.clone().count();
354359

Diff for: packages/core/services/cluster/src/workflows/prebake.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ pub async fn cluster_prebake(ctx: &mut WorkflowCtx, input: &Input) -> GlobalResu
4444
PoolType::Job | PoolType::Pegboard | PoolType::PegboardIsolate => {
4545
linode::types::FirewallPreset::Job
4646
}
47-
PoolType::Gg => linode::types::FirewallPreset::Gg,
47+
PoolType::Gg | PoolType::Guard => linode::types::FirewallPreset::Gg,
4848
PoolType::Ats => linode::types::FirewallPreset::Ats,
4949
PoolType::Fdb => linode::types::FirewallPreset::Fdb,
5050
PoolType::Worker => linode::types::FirewallPreset::Worker,

Diff for: packages/core/services/cluster/src/workflows/server/drain.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub(crate) async fn cluster_server_drain(ctx: &mut WorkflowCtx, input: &Input) -
3636
})
3737
.await?;
3838
}
39-
PoolType::Gg => {
39+
PoolType::Gg | PoolType::Guard => {
4040
ctx.signal(crate::workflows::server::DnsDelete {})
4141
.tag("server_id", input.server_id)
4242
.send()

0 commit comments

Comments
 (0)