From 459e397588120fcd0a08caa09d1312ab1bf9b0b8 Mon Sep 17 00:00:00 2001 From: c0repwn3r Date: Fri, 21 Apr 2023 18:32:53 -0400 Subject: [PATCH] infra overhaul --- ansible/deploy.yaml | 55 ++++++ ansible/inventory.yaml | 23 +++ client/index.html | 180 +++++++++++-------- client/package.json | 3 +- client/play.html | 29 ++- client/src/gateway.ts | 4 +- client/src/index.ts | 12 +- client/src/protocol/message_c2s.ts | 3 +- client/src/protocol/starkingdoms-protocol.ts | 2 +- client/static/index.css | 16 -- client/static/play.css | 21 --- client/static/root.css | 4 - client/vite.config.ts | 12 ++ docker/docker-compose.jinja.yml | 4 + docker/mime-types.conf | 4 + spacetime | 102 ++++++----- web.Dockerfile | 14 ++ 17 files changed, 313 insertions(+), 175 deletions(-) create mode 100644 ansible/deploy.yaml create mode 100644 ansible/inventory.yaml delete mode 100644 client/static/index.css delete mode 100644 client/static/play.css delete mode 100644 client/static/root.css create mode 100644 client/vite.config.ts create mode 100644 docker/mime-types.conf create mode 100644 web.Dockerfile diff --git a/ansible/deploy.yaml b/ansible/deploy.yaml new file mode 100644 index 0000000000000000000000000000000000000000..cda5783eded569a0e4daec3032673c26f69c180b --- /dev/null +++ b/ansible/deploy.yaml @@ -0,0 +1,55 @@ +- name: Deploy bleeding servers + hosts: starkingdoms_prod_servers_bleeding + vars: + api_token: "{{ lookup('community.general.random_string', length=24) }}" + jwt_signing_secret: "{{ lookup('community.general.random_string', length=24) }}" + db_user: starkingdoms-bleeding + db_pass: "{{ lookup('community.general.random_string', length=24) }}" + db_name: starkingdoms-bleeding + ws_port: 3000 + version: bleeding + api_port: 8080 + api_config_dir: /home/stk-deploy/config + db_data_dir: /home/stk-deploy/data + compose_dir: /home/stk-deploy + api_url: https://api.bleeding.starkingdoms.tk + game_url: https://bleeding.starkingdoms.tk + web_port: 8000 + tasks: + - name: Ensure host connectivity + ansible.builtin.ping: + - name: Create configuration directory + ansible.builtin.file: + path: {{ api_config_dir }} + state: directory + mode: 0755 + - name: Create data directory + ansible.builtin.file: + path: {{ db_data_dir }} + state: directory + mode: 0755 + - name: Create API config file + ansible.builtin.template: + src: ../docker/config.jinja.toml + dest: "{{ api_config_dir }}/config.toml" + - name: Create docker-compose config file + ansible.builtin.template: + src: ../docker/docker-compose.jinja.yml + dest: "{{ compose_dir }}/docker-compose.yml" + - name: Start the server + ansible.builtin.shell: + cmd: docker-compose up -d + chdir: "{{ compose_dir }}" + + +- name: Deploy beta servers + hosts: starkingdoms_prod_servers_beta + tasks: + - name: Ensure host connectivity + ansible.builtin.ping: + +- name: Deploy stable servers + hosts: starkingdoms_prod_servers_stable + tasks: + - name: Ensure host connectivity + ansible.builtin.ping: \ No newline at end of file diff --git a/ansible/inventory.yaml b/ansible/inventory.yaml new file mode 100644 index 0000000000000000000000000000000000000000..318aa36fa0b2fd5dfd7ea2ad95126a575310e723 --- /dev/null +++ b/ansible/inventory.yaml @@ -0,0 +1,23 @@ +starkingdoms_prod_servers_stable: + hosts: + ghosteast1: + ansible_host: 10.17.4.2 + ansible_user: stk-deploy + +starkingdoms_prod_servers_beta: + hosts: + east3: + ansible_host: 10.16.2.5 + ansible_user: stk-deploy + +starkingdoms_prod_servers_bleeding: + hosts: + central1: + ansible_host: 10.16.1.1 + ansible_user: stk-deploy + +starkingdoms_prod_servers: + children: + starkingdoms_prod_servers_stable: + starkingdoms_prod_servers_beta: + starkingdoms_prod_servers_bleeding: \ No newline at end of file diff --git a/client/index.html b/client/index.html index 05f6fb7c8d490ff1799fe94706a4654b5c665f73..0c2335ad39904ae8774d0deeadc9328329d8e112 100644 --- a/client/index.html +++ b/client/index.html @@ -1,80 +1,106 @@ - - - StarKingdoms.TK - - - - -

StarKingdoms

-
- Join Game -
- - -
- - -
- -
- -
- -
-

You are not logged in.

- - Click here to log in or change accounts. -
-
- - - + + + + StarKingdoms + + + +

StarKingdoms

+
+ Join Game +
+ + +
+ + +
+ +
+ +
+ +
+

You are not logged in.

+ + Click here to log in or change accounts. +
+
+ + + + + + diff --git a/client/package.json b/client/package.json index 6babf742b949857c53097cf158cd4f0d8f87008b..8f91b75a71aeacc7ccb797e7ac0fc0df7d1385a7 100644 --- a/client/package.json +++ b/client/package.json @@ -14,5 +14,6 @@ "typescript": "^4.9.3", "vite": "^4.2.0" }, - "dependencies": {} + "dependencies": {}, + "entry": ["index.html", "play.html"] } diff --git a/client/play.html b/client/play.html index f2886f544801b11b069ae830b6657a5fea0c678a..a86f026bff40fc28bfb560307419e47233905b21 100644 --- a/client/play.html +++ b/client/play.html @@ -4,7 +4,6 @@ StarKingdoms - @@ -18,4 +17,32 @@ + + diff --git a/client/src/gateway.ts b/client/src/gateway.ts index 94d37a0fae964c3c64ff0d06cbfd47f1d6c3dbb4..29c342706fcc52403777e4c1f4299a88d4127885 100644 --- a/client/src/gateway.ts +++ b/client/src/gateway.ts @@ -31,11 +31,13 @@ export interface GatewayClient { socket: WebSocket; username: string | null; version: number | null; + // @ts-ignore ping_timeout: Timeout | null; // i am aware that these types dont exist + // @ts-ignore ping_timeout_left: Timeout; // its fine } -export async function gateway_connect(gateway_url: string, username: string): GatewayClient { +export async function gateway_connect(gateway_url: string, username: string): Promise { logger.info("FAST CONNECT - Connecting to gateway socket at " + gateway_url); let ws = await _websocket_connect(gateway_url); diff --git a/client/src/index.ts b/client/src/index.ts index d4be2f5405404789a0a6a4e43deebf9ea0c3a04e..76a9d42ec67ae0aead4fbee4a7c5b5fe276c00aa 100644 --- a/client/src/index.ts +++ b/client/src/index.ts @@ -151,11 +151,7 @@ async function client_main(server: string, username: string, texture_quality: st global.client?.socket.send(encode(MessageC2SInput_packetInfo.type, msg)); } - let last_time = performance.now(); - let render = (now_time: DOMHighResTimeStamp) => { - const delta_ms = now_time - last_time; - last_time = now_time; - + let render = () => { let viewer_size_x = global.canvas.width; let viewer_size_y = global.canvas.height; @@ -169,9 +165,9 @@ async function client_main(server: string, username: string, texture_quality: st global.context.translate(viewer_size_x / 2, viewer_size_y / 2); if (global.me !== null) { - document.getElementById("pos").innerText = `Position: ${Math.trunc(global.me.x)}, ${Math.trunc(global.me.y)}`; + document.getElementById("pos")!.innerText = `Position: ${Math.trunc(global.me.x)}, ${Math.trunc(global.me.y)}`; } - document.getElementById("vel").innerText = `Velocity: ${Math.trunc(global.velocity)}`; + document.getElementById("vel")!.innerText = `Velocity: ${Math.trunc(global.velocity)}`; for (let i = 0; i < global.planets.length; i++) { let planet = global.planets[i]; @@ -196,7 +192,7 @@ async function client_main(server: string, username: string, texture_quality: st global.context.lineTo(planet.x - global.me!.x, planet.y - global.me!.y); global.context.stroke(); - document.getElementById("pos-moon").innerText = `Relative to Moon: ${Math.trunc(global.me!.x - planet.x)}, ${Math.trunc(global.me!.y - planet.y)}` + document.getElementById("pos-moon")!.innerText = `Relative to Moon: ${Math.trunc(global.me!.x - planet.x)}, ${Math.trunc(global.me!.y - planet.y)}` } } else if (planet.planetType == PlanetType.Earth) { if (global.me !== null) { diff --git a/client/src/protocol/message_c2s.ts b/client/src/protocol/message_c2s.ts index ed28d412defe95323db54125c6cbd3e48ff558c7..3b9dfc1fcf013055c3934b4fc9f62ce1e558c4d2 100644 --- a/client/src/protocol/message_c2s.ts +++ b/client/src/protocol/message_c2s.ts @@ -1,4 +1,5 @@ -/* eslint-disable */ +// @ts-nocheck + import * as _m0 from "protobufjs/minimal"; import { GoodbyeReason, goodbyeReasonFromJSON, goodbyeReasonToJSON } from "./goodbye_reason"; import { State, stateFromJSON, stateToJSON } from "./state"; diff --git a/client/src/protocol/starkingdoms-protocol.ts b/client/src/protocol/starkingdoms-protocol.ts index 8c137abc055babd86abd14295a5d14115836cde2..814564542868bca3cb52226ce30179767adc31eb 100644 --- a/client/src/protocol/starkingdoms-protocol.ts +++ b/client/src/protocol/starkingdoms-protocol.ts @@ -1,4 +1,4 @@ -/* eslint-disable */ +// @ts-nocheck import * as Long from "long"; import * as _m0 from "protobufjs/minimal"; diff --git a/client/static/index.css b/client/static/index.css deleted file mode 100644 index bf71a21f31c33ee558d25ac001c93330c2a4feb4..0000000000000000000000000000000000000000 --- a/client/static/index.css +++ /dev/null @@ -1,16 +0,0 @@ -.joingamebox { - width: min-content; - padding: 10px; -} - -.m-5px { - margin: 5px; -} - -.w-full { - width: 100%; -} - -.w-90 { - width: 90%; -} diff --git a/client/static/play.css b/client/static/play.css deleted file mode 100644 index 35e508bb40b41c136f3a82ff23f1c1483a6a9e81..0000000000000000000000000000000000000000 --- a/client/static/play.css +++ /dev/null @@ -1,21 +0,0 @@ -@import "root.css"; - -.renderbox { - position: absolute; - top: 0; - left: 0; -} - -body { - margin: 0; - padding: 0; -} - -.infobox { - position: absolute; - bottom: 0; - left: calc(50vw - 25%); - width: 50%; - background-color: var(--ui-bg-color); - padding: var(--ui-padding); -} \ No newline at end of file diff --git a/client/static/root.css b/client/static/root.css deleted file mode 100644 index 6f90db4b96ff5de67a25af8023ff58b7036083ca..0000000000000000000000000000000000000000 --- a/client/static/root.css +++ /dev/null @@ -1,4 +0,0 @@ -:root { - --ui-bg-color: gray; - --ui-padding: 5px; -} \ No newline at end of file diff --git a/client/vite.config.ts b/client/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..349e42359f2db8364c0e13e46c13be4e27df8910 --- /dev/null +++ b/client/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + lib: { + entry: { + play: "play.html", + index: "index.html", + } + }, + }, +}); diff --git a/docker/docker-compose.jinja.yml b/docker/docker-compose.jinja.yml index 961b25ab9cfc12213044aec6fcf7bf665fde86ee..1b5374fa0413c1a6e48e778ef7e802906d1f8dd3 100644 --- a/docker/docker-compose.jinja.yml +++ b/docker/docker-compose.jinja.yml @@ -19,6 +19,10 @@ services: - {{ api_port }}:8080 volumes: - {{ api_config_dir }}:/etc/starkingdoms + web: + image: registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:web-{{ version }} + ports: + - {{ web_port }}:80 postgres: # docker run --name basic-postgres --rm -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=4y7sV96vA9wv46VR -e PGDATA=/var/lib/postgresql/data/pgdata -v /tmp:/var/lib/postgresql/data -p 5432:5432 -it postgres:14.1-alpine image: postgres:14.1-alpine diff --git a/docker/mime-types.conf b/docker/mime-types.conf new file mode 100644 index 0000000000000000000000000000000000000000..f562d0e83fe5b48ea1ae2338a1ddc17951d4c6ef --- /dev/null +++ b/docker/mime-types.conf @@ -0,0 +1,4 @@ +include mime.types; +types { + application/javascript js mjs cjs; +} \ No newline at end of file diff --git a/spacetime b/spacetime index 1102a2a15993e2b9f15d0ddf0523dba99954bc9a..74c8747979f7a7373d7d4e7840fc047867dc835c 100755 --- a/spacetime +++ b/spacetime @@ -40,10 +40,12 @@ sub_help() { echo " clean - Remove all generated files" # done echo " build_docker_api - Build the API dockerfile" # done echo " build_docker_server - Build the server dockerfile" # done - echo " build_docker - Build the API and server containers" # done + echo " build_docker_web - Build the web dockerfile" # done + echo " build_docker - Build the API, web and server containers" # done echo " build_docker_api_stable - Build the API container and push it as api-stable" # done echo " build_docker_server_stable - Build the server container and push it as server-stable" # done - echo " build_docker_stable - Build the stable api and server containers" # done + echo " build_docker_web_stable - Build the web dockerfile and push it as web-stable" # done + echo " build_docker_stable - Build the stable api, web and server containers" # done } check_install_cargo() { @@ -70,48 +72,6 @@ check_all() { check atlasify } -sub_build_docker_api() { - cargo build --release --bin starkingdoms-api - docker buildx build -f api.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-$(git rev-parse --short HEAD) . - docker buildx build -f api.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-bleeding . - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-$(git rev-parse --short HEAD) - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-bleeding -} - -sub_build_docker_server() { - cargo build --release --bin starkingdoms-server - docker buildx build -f server.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-$(git rev-parse --short HEAD) . - docker buildx build -f server.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-bleeding . - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-$(git rev-parse --short HEAD) - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-bleeding -} - -sub_build_docker_api_stable() { - cargo build --release --bin starkingdoms-api - docker buildx build -f api.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-$(git rev-parse --short HEAD) . - docker buildx build -f api.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-stable . - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-$(git rev-parse --short HEAD) - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:api-stable -} - -sub_build_docker_server_stable() { - cargo build --release --bin starkingdoms-server - docker buildx build -f server.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-$(git rev-parse --short HEAD) . - docker buildx build -f server.Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-stable . - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-$(git rev-parse --short HEAD) - docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:server-stable -} - -sub_build_docker() { - sub_build_docker_api - sub_build_docker_server -} - -sub_build_docker_stable() { - sub_build_docker_api_stable - sub_build_docker_server_stable -} - sub_clean() { rm -rf web/dist rm -rf assets/dist @@ -206,6 +166,60 @@ sub_build_assets_125() { exec_ninja asset-125 } + +build_docker() { + docker buildx build -f "$SCRIPT_DIR/$1".Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-$(git rev-parse --short HEAD) "$SCRIPT_DIR" + docker buildx build -f "$SCRIPT_DIR/$1".Dockerfile -t registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-"$2" "$SCRIPT_DIR" + docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-$(git rev-parse --short HEAD) + docker push registry.gitlab.com/starkingdoms.tk/starkingdoms.tk:"$1"-"$2" + +} + +sub_build_docker_api() { + sub_build_api_prod + build_docker "api" "bleeding" +} + +sub_build_docker_server() { + sub_build_server_prod + build_docker "server" "bleeding" +} + +swap_out_server_for() { + echo "[*] Swapping out API server" + sed -i'orig' "s/let api_server = \"http:\\/\\/localhost:8080\";/let api_server = \"https:\\/\\/api.$1.$2\";/" "$SCRIPT_DIR/client/index.html" + echo "[*] Swapping out game server" + sed -i "s/let servers = [\"localhost:3000\"];/let servers = [\"https:\\/\\/$1.$2\"];/" "$SCRIPT_DIR/client/index.html" +} + +sub_build_docker_web() { + swap_out_server_for "bleeding" "starkingdoms.io" + build_docker "web" "bleeding" + mv "$SCRIPT_DIR/client/index.htmlorig" "$SCRIPT_DIR/client/index.html" +} + +sub_build_docker_api_stable() { + sub_build_api_prod + build_docker "api" "stable" +} + +sub_build_docker_server_stable() { + sub_build_server_prod + build_docker "server" "stable" +} + +sub_build_docker() { + sub_build_docker_api + sub_build_docker_server + sub_build_docker_web +} + +sub_build_docker_stable() { + sub_build_docker_api_stable + sub_build_docker_server_stable + sub_build_docker_web_stable +} + subcommand=$1 case $subcommand in "" | "-h" | "--help" | "help") diff --git a/web.Dockerfile b/web.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..3e807ab147f475779e8f3f3dd97f14359204e03c --- /dev/null +++ b/web.Dockerfile @@ -0,0 +1,14 @@ +FROM node + +RUN npm i -g parcel + +COPY client /client + +RUN cd /client && yarn +RUN cd /client && yarn build + +FROM nginx + +COPY --from=0 /client/dist /usr/share/nginx/html +COPY assets/dist /usr/share/nginx/html +COPY docker/mime-types.conf /etc/nginx/conf.d/mime-types.conf \ No newline at end of file