From ea1d345147759a4e2822c4145a87485f10d56a69 Mon Sep 17 00:00:00 2001 From: Matthieu Pignolet Date: Fri, 20 Jan 2023 16:38:10 +0400 Subject: [PATCH] Draft: New cross building for docker images (#37) * Add .circleci/config.yml * base * base * add architectures and cross build * fix clippy warnings --- .dockerignore | 3 +- .gitignore | 1 + Cargo.lock | 31 - Cargo.toml | 1 - Dockerfile | 46 +- docker-compose.yaml | 20 +- exes/gateway/Cargo.toml | 3 - exes/gateway/src/main.rs | 7 - exes/ratelimit/Cargo.toml | 3 - exes/ratelimit/src/main.rs | 7 - exes/rest/Cargo.toml | 3 - exes/rest/src/handler.rs | 12 +- exes/rest/src/main.rs | 7 - exes/webhook/Cargo.toml | 3 - exes/webhook/src/main.rs | 7 - otel/grafana/grafana.ini | 1170 ------------- .../provisioning/dashboards/general.yaml | 10 - .../dashboards/general/demo-dashboard.json | 693 -------- .../general/opentelemetry-collector.json | 1554 ----------------- .../provisioning/datasources/default.yaml | 9 - .../provisioning/datasources/jaeger.yaml | 9 - otel/otelcollector/otelcol-config-extras.yml | 2 - otel/otelcollector/otelcol-config.yml | 34 - otel/prometheus/prometheus-config.yaml | 12 - shell.nix | 2 +- 25 files changed, 46 insertions(+), 3603 deletions(-) delete mode 100644 otel/grafana/grafana.ini delete mode 100644 otel/grafana/provisioning/dashboards/general.yaml delete mode 100644 otel/grafana/provisioning/dashboards/general/demo-dashboard.json delete mode 100644 otel/grafana/provisioning/dashboards/general/opentelemetry-collector.json delete mode 100644 otel/grafana/provisioning/datasources/default.yaml delete mode 100644 otel/grafana/provisioning/datasources/jaeger.yaml delete mode 100644 otel/otelcollector/otelcol-config-extras.yml delete mode 100644 otel/otelcollector/otelcol-config.yml delete mode 100644 otel/prometheus/prometheus-config.yaml diff --git a/.dockerignore b/.dockerignore index 27cfb9a..924efbb 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,3 @@ target/ -docs/ \ No newline at end of file +docs/ +bin/ \ No newline at end of file diff --git a/.gitignore b/.gitignore index bce375a..056ef90 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ config.yml config/* build/ *.yml +bin/ \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 0552186..da521bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -776,12 +776,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs_extra" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" - [[package]] name = "futures" version = "0.3.25" @@ -885,7 +879,6 @@ dependencies = [ "serde", "serde_json", "shared", - "tikv-jemallocator", "tokio", "tokio-stream", "tracing", @@ -1953,7 +1946,6 @@ dependencies = [ "serde_json", "shared", "test-log", - "tikv-jemallocator", "tokio", "tokio-stream", "tokio-test", @@ -2074,7 +2066,6 @@ dependencies = [ "serde", "serde_json", "shared", - "tikv-jemallocator", "tokio", "tokio-stream", "tonic", @@ -2569,27 +2560,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tikv-jemalloc-sys" -version = "0.5.2+5.3.0-patched" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec45c14da997d0925c7835883e4d5c181f196fa142f8c19d7643d1e9af2592c3" -dependencies = [ - "cc", - "fs_extra", - "libc", -] - -[[package]] -name = "tikv-jemallocator" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20612db8a13a6c06d57ec83953694185a367e16945f66565e8028d2c0bd76979" -dependencies = [ - "libc", - "tikv-jemalloc-sys", -] - [[package]] name = "time" version = "0.3.17" @@ -3291,7 +3261,6 @@ dependencies = [ "serde", "serde_json", "shared", - "tikv-jemallocator", "tokio", "tracing", "twilight-model", diff --git a/Cargo.toml b/Cargo.toml index cee8217..2c746fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,6 @@ tracing-futures = "0.2" tracing-opentelemetry = "0.18" opentelemetry = { version = "0.18", features = ["rt-tokio"] } opentelemetry-http = "0.7" -tikv-jemallocator = "0.5" criterion = { version = "0.4", features = ["async_tokio"] } tokio-test = "0.4.2" diff --git a/Dockerfile b/Dockerfile index 3eba9a0..3a3c34c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,33 +1,27 @@ -FROM rust AS chef -USER root -COPY .cargo .cargo -RUN cargo install cargo-chef -RUN apt-get update && apt-get install -y protobuf-compiler -WORKDIR /app - -# Planning install -FROM chef AS planner +# syntax=docker/dockerfile:1 +FROM --platform=$BUILDPLATFORM tonistiigi/xx:master AS xx +FROM --platform=$BUILDPLATFORM rust:alpine as alpine_rbuild +RUN apk add clang lld protobuf-dev build-base git +# Copy the xx scripts +COPY --from=xx / / +# Copy source code COPY . . -RUN cargo chef prepare --recipe-path recipe.json - -# Building all targets -FROM chef AS builder -COPY --from=planner /app/recipe.json recipe.json -# Notice that we are specifying the --target flag! -RUN cargo chef cook --release --recipe-path recipe.json -COPY . . -RUN cargo build --release +RUN --mount=type=cache,target=/root/.cargo/git/db \ + --mount=type=cache,target=/root/.cargo/registry/cache \ + --mount=type=cache,target=/root/.cargo/registry/index \ + cargo fetch +ARG TARGETPLATFORM +RUN --mount=type=cache,target=/root/.cargo/git/db \ + --mount=type=cache,target=/root/.cargo/registry/cache \ + --mount=type=cache,target=/root/.cargo/registry/index \ + xx-cargo build --release --target-dir ./build -# Base os -FROM debian:latest AS runtime-base -# RUN addgroup -S nova && adduser -S nova -G nova -RUN apt-get update && apt-get install ca-certificates -y +#Copy from the build//release folder to the out folder +RUN mkdir ./out && cp ./build/*/release/* ./out || true -# Final os -FROM runtime-base AS runtime +FROM alpine AS runtime ARG COMPONENT ENV COMPONENT=${COMPONENT} -COPY --from=builder /app/target/release/${COMPONENT} /usr/local/bin/ -# USER nova +COPY --from=alpine_rbuild /out/${COMPONENT} /usr/local/bin/ ENTRYPOINT /usr/local/bin/${COMPONENT} diff --git a/docker-compose.yaml b/docker-compose.yaml index 04ec54d..e222c20 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -21,7 +21,9 @@ services: x-bake: platforms: - linux/amd64 - - linux/arm64 + - linux/arm64/v8 + - linux/arm/v7 + - linux/arm/v6 args: - COMPONENT=cache volumes: @@ -43,7 +45,9 @@ services: x-bake: platforms: - linux/amd64 - - linux/arm64 + - linux/arm64/v8 + - linux/arm/v7 + - linux/arm/v6 volumes: - ./config/default.yml:/config/default.yml environment: @@ -62,7 +66,9 @@ services: x-bake: platforms: - linux/amd64 - - linux/arm64 + - linux/arm64/v8 + - linux/arm/v7 + - linux/arm/v6 volumes: - ./config/default.yml:/config/default.yml environment: @@ -85,7 +91,9 @@ services: x-bake: platforms: - linux/amd64 - - linux/arm64 + - linux/arm64/v8 + - linux/arm/v7 + - linux/arm/v6 volumes: - ./config/default.yml:/config/default.yml environment: @@ -106,7 +114,9 @@ services: x-bake: platforms: - linux/amd64 - - linux/arm64 + - linux/arm64/v8 + - linux/arm/v7 + - linux/arm/v6 volumes: - ./config/default.yml:/config/default.yml environment: diff --git a/exes/gateway/Cargo.toml b/exes/gateway/Cargo.toml index 375a020..3916138 100644 --- a/exes/gateway/Cargo.toml +++ b/exes/gateway/Cargo.toml @@ -22,6 +22,3 @@ twilight-gateway = { version = "0.14" } twilight-model = "0.14" bytes = "1.3.0" async-nats = "0.26.0" - -[target.'cfg(not(target_os = "windows"))'.dependencies] -tikv-jemallocator = { workspace = true } \ No newline at end of file diff --git a/exes/gateway/src/main.rs b/exes/gateway/src/main.rs index 900171c..f1b0298 100644 --- a/exes/gateway/src/main.rs +++ b/exes/gateway/src/main.rs @@ -1,11 +1,4 @@ use gateway::GatewayServer; use leash::ignite; -#[cfg(not(target_os = "windows"))] -use tikv_jemallocator::Jemalloc; - -#[cfg(not(target_os = "windows"))] -#[global_allocator] -static GLOBAL: Jemalloc = Jemalloc; - ignite!(GatewayServer); diff --git a/exes/ratelimit/Cargo.toml b/exes/ratelimit/Cargo.toml index d7dc554..5be1a34 100644 --- a/exes/ratelimit/Cargo.toml +++ b/exes/ratelimit/Cargo.toml @@ -33,9 +33,6 @@ tracing-subscriber = { workspace = true } test-log = { workspace = true } env_logger = { workspace = true } -[target.'cfg(not(target_os = "windows"))'.dependencies] -tikv-jemallocator = { workspace = true } - [[bench]] name = "bucket" harness = false diff --git a/exes/ratelimit/src/main.rs b/exes/ratelimit/src/main.rs index b764367..2de812b 100644 --- a/exes/ratelimit/src/main.rs +++ b/exes/ratelimit/src/main.rs @@ -1,11 +1,4 @@ use leash::ignite; use ratelimit::RatelimiterServerComponent; -#[cfg(not(target_os = "windows"))] -use tikv_jemallocator::Jemalloc; - -#[cfg(not(target_os = "windows"))] -#[global_allocator] -static GLOBAL: Jemalloc = Jemalloc; - ignite!(RatelimiterServerComponent); diff --git a/exes/rest/Cargo.toml b/exes/rest/Cargo.toml index d37da95..aed205f 100644 --- a/exes/rest/Cargo.toml +++ b/exes/rest/Cargo.toml @@ -30,6 +30,3 @@ hashring = "0.3.0" tonic = "0.8.3" tokio-stream = "0.1.11" dns-lookup = "1.0.8" - -[target.'cfg(not(target_os = "windows"))'.dependencies] -tikv-jemallocator = { workspace = true } \ No newline at end of file diff --git a/exes/rest/src/handler.rs b/exes/rest/src/handler.rs index 0070081..259ac1a 100644 --- a/exes/rest/src/handler.rs +++ b/exes/rest/src/handler.rs @@ -89,7 +89,7 @@ fn normalize_path(request_path: &str) -> (&str, &str) { ("/api", request_path) } } -fn path_name(path: &Path) -> &'static str { +const fn path_name(path: &Path) -> &'static str { match path { Path::ApplicationCommand(..) => "Application commands", Path::ApplicationCommandId(..) => "Application command", @@ -112,7 +112,9 @@ fn path_name(path: &Path) -> &'static str { Path::ChannelsIdThreadMembersId(..) => "Thread member", Path::ChannelsIdThreads(..) => "Channel threads", Path::ChannelsIdTyping(..) => "Typing indicator", - Path::ChannelsIdWebhooks(..) | Path::WebhooksId(..) => "Webhook", + Path::ChannelsIdWebhooks(..) | Path::WebhooksId(..) | Path::WebhooksIdToken(..) => { + "Webhook" + } Path::Gateway => "Gateway", Path::GatewayBot => "Gateway bot info", Path::Guilds => "Guilds", @@ -146,14 +148,15 @@ fn path_name(path: &Path) -> &'static str { Path::GuildsIdScheduledEventsIdUsers(..) => "Users of a scheduled event", Path::GuildsIdStickers(..) => "Guild stickers", Path::GuildsIdTemplates(..) => "Guild templates", - Path::GuildsIdTemplatesCode(..) => "Specific guild template", + Path::GuildsIdTemplatesCode(..) | Path::GuildsTemplatesCode(..) => { + "Specific guild template" + } Path::GuildsIdThreads(..) => "Guild threads", Path::GuildsIdVanityUrl(..) => "Guild vanity invite", Path::GuildsIdVoiceStates(..) => "Guild voice states", Path::GuildsIdWebhooks(..) => "Guild webhooks", Path::GuildsIdWelcomeScreen(..) => "Guild welcome screen", Path::GuildsIdWidget(..) => "Guild widget", - Path::GuildsTemplatesCode(..) => "Specific guild template", Path::InteractionCallback(..) => "Interaction callback", Path::InvitesCode => "Invite info", Path::OauthApplicationsMe => "Current application info", @@ -167,7 +170,6 @@ fn path_name(path: &Path) -> &'static str { Path::UsersIdGuildsId => "Guild from user", Path::UsersIdGuildsIdMember => "Member of a guild", Path::VoiceRegions => "Voice region list", - Path::WebhooksIdToken(..) => "Webhook", Path::WebhooksIdTokenMessagesId(..) => "Specific webhook message", _ => "Unknown path!", } diff --git a/exes/rest/src/main.rs b/exes/rest/src/main.rs index 1e73e09..fe8ada7 100644 --- a/exes/rest/src/main.rs +++ b/exes/rest/src/main.rs @@ -1,11 +1,4 @@ use leash::ignite; use rest::ReverseProxyServer; -#[cfg(not(target_os = "windows"))] -use tikv_jemallocator::Jemalloc; - -#[cfg(not(target_os = "windows"))] -#[global_allocator] -static GLOBAL: Jemalloc = Jemalloc; - ignite!(ReverseProxyServer); diff --git a/exes/webhook/Cargo.toml b/exes/webhook/Cargo.toml index 7b4a185..0078a70 100644 --- a/exes/webhook/Cargo.toml +++ b/exes/webhook/Cargo.toml @@ -19,6 +19,3 @@ ed25519-dalek = "1" twilight-model = { version = "0.14" } async-nats = "0.26.0" - -[target.'cfg(not(target_os = "windows"))'.dependencies] -tikv-jemallocator = "0.5" \ No newline at end of file diff --git a/exes/webhook/src/main.rs b/exes/webhook/src/main.rs index bbacda7..f531725 100644 --- a/exes/webhook/src/main.rs +++ b/exes/webhook/src/main.rs @@ -1,11 +1,4 @@ use leash::ignite; use webhook::WebhookServer; -#[cfg(not(target_os = "windows"))] -use tikv_jemallocator::Jemalloc; - -#[cfg(not(target_os = "windows"))] -#[global_allocator] -static GLOBAL: Jemalloc = Jemalloc; - ignite!(WebhookServer); diff --git a/otel/grafana/grafana.ini b/otel/grafana/grafana.ini deleted file mode 100644 index e9c5b16..0000000 --- a/otel/grafana/grafana.ini +++ /dev/null @@ -1,1170 +0,0 @@ -##################### Grafana Configuration Example ##################### -# -# Everything has defaults so you only need to uncomment things you want to -# change - -# possible values : production, development -;app_mode = production - -# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty -;instance_name = ${HOSTNAME} - -# force migration will run migrations that might cause dataloss -;force_migration = false - -#################################### Paths #################################### -[paths] -# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) -;data = /var/lib/grafana - -# Temporary files in `data` directory older than given duration will be removed -;temp_data_lifetime = 24h - -# Directory where grafana can store logs -;logs = /var/log/grafana - -# Directory where grafana will automatically scan and look for plugins -;plugins = /var/lib/grafana/plugins - -# folder that contains provisioning config files that grafana will apply on startup and while running. -provisioning = /etc/grafana/provisioning - -#################################### Server #################################### -[server] -# Protocol (http, https, h2, socket) -protocol = http - -# The ip address to bind to, empty will bind to all interfaces -;http_addr = - -# The http port to use -http_port = 3000 - -# The public facing domain name used to access grafana from a browser -domain = localhost - -# Redirect to correct domain if host header does not match domain -# Prevents DNS rebinding attacks -;enforce_domain = false - -# The full public facing url you use in browser, used for redirects and emails -# If you use reverse proxy and sub path specify full url (with sub path) -root_url = %(protocol)s://%(domain)s/grafana/ - -# Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons. -serve_from_sub_path = true - -# Log web requests -;router_logging = false - -# the path relative working path -;static_root_path = public - -# enable gzip -;enable_gzip = false - -# https certs & key file -;cert_file = -;cert_key = - -# Unix socket path -;socket = - -# CDN Url -;cdn_url = - -# Sets the maximum time using a duration format (5s/5m/5ms) before timing out read of an incoming request and closing idle connections. -# `0` means there is no timeout for reading the request. -;read_timeout = 0 - -#################################### Database #################################### -[database] -# You can configure the database connection by specifying type, host, name, user and password -# as separate properties or as on string using the url properties. - -# Either "mysql", "postgres" or "sqlite3", it's your choice -;type = sqlite3 -;host = 127.0.0.1:3306 -;name = grafana -;user = root -# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" -;password = - -# Use either URL or the previous fields to configure the database -# Example: mysql://user:secret@host:port/database -;url = - -# For "postgres" only, either "disable", "require" or "verify-full" -;ssl_mode = disable - -# Database drivers may support different transaction isolation levels. -# Currently, only "mysql" driver supports isolation levels. -# If the value is empty - driver's default isolation level is applied. -# For "mysql" use "READ-UNCOMMITTED", "READ-COMMITTED", "REPEATABLE-READ" or "SERIALIZABLE". -;isolation_level = - -;ca_cert_path = -;client_key_path = -;client_cert_path = -;server_cert_name = - -# For "sqlite3" only, path relative to data_path setting -;path = grafana.db - -# Max idle conn setting default is 2 -;max_idle_conn = 2 - -# Max conn setting default is 0 (mean not set) -;max_open_conn = - -# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours) -;conn_max_lifetime = 14400 - -# Set to true to log the sql calls and execution times. -;log_queries = - -# For "sqlite3" only. cache mode setting used for connecting to the database. (private, shared) -;cache_mode = private - -# For "mysql" only if lockingMigration feature toggle is set. How many seconds to wait before failing to lock the database for the migrations, default is 0. -;locking_attempt_timeout_sec = 0 - -################################### Data sources ######################### -[datasources] -# Upper limit of data sources that Grafana will return. This limit is a temporary configuration and it will be deprecated when pagination will be introduced on the list data sources API. -;datasource_limit = 5000 - -#################################### Cache server ############################# -[remote_cache] -# Either "redis", "memcached" or "database" default is "database" -;type = database - -# cache connectionstring options -# database: will use Grafana primary database. -# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'. -# memcache: 127.0.0.1:11211 -;connstr = - -#################################### Data proxy ########################### -[dataproxy] - -# This enables data proxy logging, default is false -;logging = false - -# How long the data proxy waits to read the headers of the response before timing out, default is 30 seconds. -# This setting also applies to core backend HTTP data sources where query requests use an HTTP client with timeout set. -;timeout = 30 - -# How long the data proxy waits to establish a TCP connection before timing out, default is 10 seconds. -;dialTimeout = 10 - -# How many seconds the data proxy waits before sending a keepalive probe request. -;keep_alive_seconds = 30 - -# How many seconds the data proxy waits for a successful TLS Handshake before timing out. -;tls_handshake_timeout_seconds = 10 - -# How many seconds the data proxy will wait for a server's first response headers after -# fully writing the request headers if the request has an "Expect: 100-continue" -# header. A value of 0 will result in the body being sent immediately, without -# waiting for the server to approve. -;expect_continue_timeout_seconds = 1 - -# Optionally limits the total number of connections per host, including connections in the dialing, -# active, and idle states. On limit violation, dials will block. -# A value of zero (0) means no limit. -;max_conns_per_host = 0 - -# The maximum number of idle connections that Grafana will keep alive. -;max_idle_connections = 100 - -# How many seconds the data proxy keeps an idle connection open before timing out. -;idle_conn_timeout_seconds = 90 - -# If enabled and user is not anonymous, data proxy will add X-Grafana-User header with username into the request, default is false. -;send_user_header = false - -# Limit the amount of bytes that will be read/accepted from responses of outgoing HTTP requests. -;response_limit = 0 - -# Limits the number of rows that Grafana will process from SQL data sources. -;row_limit = 1000000 - -#################################### Analytics #################################### -[analytics] -# Server reporting, sends usage counters to stats.grafana.org every 24 hours. -# No ip addresses are being tracked, only simple counters to track -# running instances, dashboard and error counts. It is very helpful to us. -# Change this option to false to disable reporting. -;reporting_enabled = true - -# The name of the distributor of the Grafana instance. Ex hosted-grafana, grafana-labs -;reporting_distributor = grafana-labs - -# Set to false to disable all checks to https://grafana.com -# for new versions of grafana. The check is used -# in some UI views to notify that a grafana update exists. -# This option does not cause any auto updates, nor send any information -# only a GET request to https://raw.githubusercontent.com/grafana/grafana/main/latest.json to get the latest version. -;check_for_updates = true - -# Set to false to disable all checks to https://grafana.com -# for new versions of plugins. The check is used -# in some UI views to notify that a plugin update exists. -# This option does not cause any auto updates, nor send any information -# only a GET request to https://grafana.com to get the latest versions. -;check_for_plugin_updates = true - -# Google Analytics universal tracking code, only enabled if you specify an id here -;google_analytics_ua_id = - -# Google Tag Manager ID, only enabled if you specify an id here -;google_tag_manager_id = - -# Rudderstack write key, enabled only if rudderstack_data_plane_url is also set -;rudderstack_write_key = - -# Rudderstack data plane url, enabled only if rudderstack_write_key is also set -;rudderstack_data_plane_url = - -# Rudderstack SDK url, optional, only valid if rudderstack_write_key and rudderstack_data_plane_url is also set -;rudderstack_sdk_url = - -# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config -;rudderstack_config_url = - -# Controls if the UI contains any links to user feedback forms -;feedback_links_enabled = true - -#################################### Security #################################### -[security] -# disable creation of admin user on first start of grafana -;disable_initial_admin_creation = false - -# default admin user, created on startup -;admin_user = admin - -# default admin password, can be changed before first start of grafana, or in profile settings -;admin_password = admin - -# used for signing -;secret_key = SW2YcwTIb9zpOOhoPsMm - -# current key provider used for envelope encryption, default to static value specified by secret_key -;encryption_provider = secretKey.v1 - -# list of configured key providers, space separated (Enterprise only): e.g., awskms.v1 azurekv.v1 -;available_encryption_providers = - -# disable gravatar profile images -;disable_gravatar = false - -# data source proxy whitelist (ip_or_domain:port separated by spaces) -;data_source_proxy_whitelist = - -# disable protection against brute force login attempts -;disable_brute_force_login_protection = false - -# set to true if you host Grafana behind HTTPS. default is false. -;cookie_secure = false - -# set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict", "none" and "disabled" -;cookie_samesite = lax - -# set to true if you want to allow browsers to render Grafana in a ,