diff --git a/Makefile b/Makefile index 14271b1a..86988f96 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,27 @@ SHELL:=/bin/bash -all: mnml +.PHONY: all deps build deploy install server client clean + +all: install deps: ./bin/deps.sh -package: - ./bin/package.sh - -mnml: +build: ./bin/build.sh +deploy: + ./bin/deploy.sh + +install: + ./bin/install.sh + +server: + ./bin/server.sh + +client: + ./bin/client.sh + clean: ./bin/clean.sh diff --git a/WORKLOG.md b/WORKLOG.md index ea2872e5..d12a7d2b 100644 --- a/WORKLOG.md +++ b/WORKLOG.md @@ -27,6 +27,8 @@ # WORK WORK ## NOW +*OPS* + *$$$* * rename costs 1cr * invader set diff --git a/bin/build.sh b/bin/build.sh index 9615431d..621d2817 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -1,67 +1,11 @@ -#!/bin/bash - # bless you chris and andy <3 + +# DOES NOT WORK AT MOMENT + DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) MNML_PATH=$(realpath "$DIR/../") +VERSION=$(<"$MNML_PATH/VERSION") -if [ ! -f $MNML_PATH/etc/mnml.env ]; then - echo "-----------------------------------------------" - echo "creating an env file in $MNML_PATH/etc/mnml.env" - echo "-----------------------------------------------" +make server +make client - echo "export MNML_USER=\"$(whoami)\"" >> $MNML_PATH/etc/mnml.env - echo "export MNML_PG_PASSWORD=\"$(openssl rand -hex 16)\"" >> $MNML_PATH/etc/mnml.env - echo "export MNML_PG_HOST=\"localhost\"" >> $MNML_PATH/etc/mnml.env -fi - -source $MNML_PATH/etc/mnml.env - -# DIRECTORY SETUP -sudo mkdir -p /opt/mnml -sudo chown $MNML_USER: /opt/mnml - -sudo mkdir -p /var/lib/mnml -sudo chown $MNML_USER: /var/lib/mnml -mkdir -p /var/lib/mnml/public -mkdir -p /var/lib/mnml/public/imgs -mkdir -p /var/lib/mnml/data - -sudo mkdir -p /var/log/mnml -sudo chown $MNML_USER: /var/log/mnml - -sudo ln -nfs $MNML_PATH/current /opt/mnml - -# SERVICES -sudo cp $MNML_PATH/etc/systemd/system/mnml.service /etc/systemd/system - -# POSTGRES SETUP -sudo -u postgres dropdb mnml -sudo -u postgres createdb mnml -sudo -u postgres createuser --encrypted mnml - -echo "DATABASE_URL=postgres://mnml:$MNML_PG_PASSWORD@$MNML_PG_HOST/mnml" > $MNML_PATH/server/.env - -sudo -u postgres psql -c "alter user mnml with encrypted password '$MNML_PG_PASSWORD';" - -cd $MNML_PATH/ops && npm run migrate - -# RUST SETUP -echo "DATABASE_URL=postgres://mnml:$MNML_PG_PASSWORD@$MNML_PG_HOST/mnml" > $MNML_PATH/server/.env -# cargo build -# cp -r $MNML_PATH/server/target/release /opt/mnml/bin - -# NGINX -if [ ! -f $MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf ]; then - echo "-----------------------------------------------" - echo "using development nginx config" - echo "$MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf" - echo "-----------------------------------------------" - - cp $MNML_PATH/etc/nginx/sites-available/mnml.gg.DEV.nginx.conf $MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf -fi - -sudo cp $MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf /etc/nginx/sites-available -sudo ln -nfs /etc/nginx/sites-available/mnml.gg.nginx.conf /etc/nginx/sites-enabled/mnml.gg.nginx.conf -# cd $MNML_PATH/client && npm run build - -sudo service nginx restart diff --git a/bin/clean.sh b/bin/clean.sh index 2ad64a89..c8f9bb95 100755 --- a/bin/clean.sh +++ b/bin/clean.sh @@ -4,5 +4,11 @@ DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) MNML_PATH=$(realpath "$DIR/../") -rm $MNML_PATH/etc/mnml.env -rm $MNML_PATH/server/.env +sudo rm -Rf /usr/local/mnml/ +sudo rm -Rf /var/lib/mnml/client +sudo rm -Rf /var/lib/mnml/public +sudo rm -Rf /etc/mnml/ +sudo rm -Rf /var/log/mnml + +sudo -u postgres dropdb mnml + diff --git a/bin/client.sh b/bin/client.sh new file mode 100755 index 00000000..2faac662 --- /dev/null +++ b/bin/client.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# bless you chris and andy <3 +DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +MNML_PATH=$(realpath "$DIR/../") + +VERSION=$(<"$MNML_PATH/VERSION") + +echo "Building client version $VERSION" + +cd $MNML_PATH/client +rm -rf dist +npm i +npm run build diff --git a/bin/deploy.sh b/bin/deploy.sh new file mode 100755 index 00000000..9ae5875d --- /dev/null +++ b/bin/deploy.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# bless you chris and andy <3 +DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +MNML_PATH=$(realpath "$DIR/../") +VERSION=$(<"$MNML_PATH/VERSION") + +SERVER_BIN_DIR="/usr/local/mnml/bin" +CLIENT_DIST_DIR="/var/lib/mnml/client" +CLIENT_PUBLIC_DIR="/var/lib/mnml/public/current" + +# server updates +echo "syncing server $VERSION " +rsync -a --delete --delete-excluded "$MNML_PATH/server/target/release/mnml" mnml:"$SERVER_BIN_DIR/$VERSION" +ssh -q mnml ln -nfs "$SERVER_BIN_DIR/$VERSION" "$SERVER_BIN_DIR/mnml" +ssh -q mnml ls -lah "$SERVER_BIN_DIR" + +# client updates +echo "syncing client $VERSION" +rsync -a --delete --delete-excluded "$MNML_PATH/client/dist" mnml:"$CLIENT_DIST_DIR/$VERSION" +ssh -q mnml ln -nfs "$CLIENT_DIST_DIR/$VERSION" "$CLIENT_PUBLIC_DIR" +ssh -q mnml ls -lah "/var/lib/mnml/public" + +echo "restarting mnml service" +ssh -q -t mnml sudo service mnml restart && sleep 1 && systemctl --no-pager status mnml + +echo "restarting nginx service" +ssh -q -t mnml sudo service nginx restart && sleep 1 && systemctl --no-pager status nginx diff --git a/bin/install.sh b/bin/install.sh new file mode 100755 index 00000000..e4b48bbe --- /dev/null +++ b/bin/install.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# bless you chris and andy <3 +DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +MNML_PATH=$(realpath "$DIR/../") + +MNML_CONF="/etc/mnml/mnml.conf" + +if [ ! -f $MNML_CONF ]; then + echo "-----------------------------------------------" + echo "creating an env file in $MNML_CONF" + echo "-----------------------------------------------" + + sudo mkdir -p /etc/mnml/ + echo "export MNML_USER=$(whoami)" | sudo tee -a $MNML_CONF + echo "export MNML_PG_PASSWORD=\"$(openssl rand -hex 16)\"" | sudo tee -a $MNML_CONF + echo "export MNML_PG_HOST=\"localhost\"" | sudo tee -a $MNML_CONF +fi + +source $MNML_CONF + +# /var/lib/mnml +# contains img data, builds +sudo mkdir -p /var/lib/mnml/client +sudo mkdir -p /var/lib/mnml/data +sudo mkdir -p /var/lib/mnml/public/imgs +sudo chown -R $MNML_USER:$MNML_USER /var/lib/mnml + +# /var/log/mnml +# log files +sudo mkdir -p /var/log/mnml +sudo chown -R $MNML_USER:$MNML_USER /var/log/mnml + +# /usr/local/mnml/bin +# server bin location +sudo mkdir -p /usr/local/mnml/bin +sudo chown -R $MNML_USER:$MNML_USER /usr/local/mnml + +# SERVICES +sudo mkdir -p /usr/local/systemd/system/ +sudo cp $MNML_PATH/etc/systemd/system/mnml.service /usr/local/systemd/system/ + +# POSTGRES SETUP +sudo -u postgres createdb mnml +sudo -u postgres createuser --encrypted mnml + +echo "DATABASE_URL=postgres://mnml:$MNML_PG_PASSWORD@$MNML_PG_HOST/mnml" | sudo tee -a /etc/mnml/server.conf +sudo -u postgres psql -c "alter user mnml with encrypted password '$MNML_PG_PASSWORD';" + +cd $MNML_PATH/ops && npm run migrate + +# NGINX +if [ ! -f $MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf ]; then + echo "-----------------------------------------------" + echo "using development nginx config" + echo "$MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf" + echo "-----------------------------------------------" + + cp $MNML_PATH/etc/nginx/sites-available/mnml.gg.DEV.nginx.conf $MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf +fi + +sudo cp $MNML_PATH/etc/nginx/sites-available/mnml.gg.nginx.conf /etc/nginx/sites-available +sudo ln -nfs /etc/nginx/sites-available/mnml.gg.nginx.conf /etc/nginx/sites-enabled/mnml.gg.nginx.conf diff --git a/bin/package.sh b/bin/package.sh deleted file mode 100755 index 02960166..00000000 --- a/bin/package.sh +++ /dev/null @@ -1,27 +0,0 @@ -# bless you chris and andy <3 - -# DOES NOT WORK AT MOMENT - -DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -MNML_PATH=$(realpath "$DIR/../") -VERSION=$(<"$MNML_PATH/VERSION") - -# copy this dir to the tmp build directory and build it -[[ -n "$BUILD_DIR" ]] || BUILD_DIR="/tmp/mnml/$VERSION" -[[ -n "$BUILD_PREFIX" ]] || BUILD_PREFIX="/opt/mnml" -[[ -n "$REPO_DIR" ]] || REPO_DIR="$HOME/mnml" - -rm -rf "$BUILD_DIR" && mkdir -p "$BUILD_DIR/$BUILD_PREFIX" && cd "$BUILD_DIR/$BUILD_PREFIX" - -( - rsync -a --delete --delete-excluded \ - --exclude=".git/" \ - --exclude=".gitignore" \ - --exclude="packaging" \ - "$REPO_DIR/" "$BUILD_DIR/$BUILD_PREFIX/" - - rsync -a --delete --delete-excluded "$DIR/postinstall" "$BUILD_DIR/$BUILD_PREFIX/" - - cd "$BUILD_DIR/$BUILD_PREFIX" && - make -) diff --git a/bin/server.sh b/bin/server.sh new file mode 100755 index 00000000..2e92f73d --- /dev/null +++ b/bin/server.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# bless you chris and andy <3 +DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +MNML_PATH=$(realpath "$DIR/../") +VERSION=$(<"$MNML_PATH/VERSION") + +cd $MNML_PATH/server +echo "building server $VERSION" +cargo build --release diff --git a/client/assets/styles/styles.css b/client/assets/styles/styles.css index 5e36a0f8..1ba2ee35 100644 --- a/client/assets/styles/styles.css +++ b/client/assets/styles/styles.css @@ -146,7 +146,7 @@ button, input { color: whitesmoke; height: auto; border-width: 2px; - border-color: #444; + border-color: #222; border-radius: 0; letter-spacing: 0.25em; box-sizing: border-box; @@ -299,13 +299,13 @@ button[disabled] { } #mnml input, #mnml select { - border-color: #444; - background-color: #333; + border-color: #222; + background-color: #222; border-radius: 0; } #mnml input:focus, #mnml select:focus { - border-color: whitesmoke; + border-color: #888; } /* diff --git a/client/package.json b/client/package.json index 4f9327d6..2182bf77 100644 --- a/client/package.json +++ b/client/package.json @@ -4,9 +4,9 @@ "description": "", "main": "index.js", "scripts": { - "start": "parcel watch index.html --out-dir /var/lib/mnml/public/dist", + "start": "parcel watch index.html --out-dir /var/lib/mnml/public/current", "anims": "parcel animations.html --host 0.0.0.0 --port 40080 --no-source-maps", - "build": "parcel build index.html --out-dir /var/lib/mnml/public/dist", + "build": "parcel build index.html", "scss": "node-sass --watch assets/scss -o assets/styles", "lint": "eslint --fix --ext .jsx src/", "test": "echo \"Error: no test specified\" && exit 1" diff --git a/etc/nginx/sites-available/mnml.gg.DEV.nginx.conf b/etc/nginx/sites-available/mnml.gg.DEV.nginx.conf index 19fe416b..dc7c219d 100644 --- a/etc/nginx/sites-available/mnml.gg.DEV.nginx.conf +++ b/etc/nginx/sites-available/mnml.gg.DEV.nginx.conf @@ -17,7 +17,7 @@ map $http_upgrade $connection_upgrade { # DEV server { location / { - root /var/lib/mnml/public/dist; + root /var/lib/mnml/public/current; index index.html; try_files $uri $uri/ index.html; } diff --git a/etc/nginx/sites-available/mnml.gg.PRODUCTION.nginx.conf b/etc/nginx/sites-available/mnml.gg.PRODUCTION.nginx.conf index f80ca78e..113a2b3c 100644 --- a/etc/nginx/sites-available/mnml.gg.PRODUCTION.nginx.conf +++ b/etc/nginx/sites-available/mnml.gg.PRODUCTION.nginx.conf @@ -1,48 +1,51 @@ -error_log /var/log/mnml/nginx.error.log; -access_log /var/log/mnml/nginx.access.log; +error_log /var/log/mnml/nginx.log; -upstream mnml { +upstream mnml_http { server 127.0.0.1:40000; } +upstream mnml_ws { + server 127.0.0.1:40055; +} + + map $http_upgrade $connection_upgrade { default upgrade; '' close; } -# PRODUCTION +# DEV server { - root /var/lib/mnml/public/; - index index.html; - - server_name mnml.gg; # managed by Certbot - - if ($host = minimal.gg) { - return 301 https://mnml.gg$request_uri; - } # managed by Certbot - - if ($host = cryps.gg) { - return 301 https://mnml.gg$request_uri; - } # managed by Certbot - location / { + root /var/lib/mnml/public/current; + index index.html; + try_files $uri $uri/ index.html; + } + + location /imgs/ { + root /var/lib/mnml/public/; try_files $uri $uri/ =404; } + location /api/ws { + proxy_pass http://mnml_ws; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_read_timeout 600s; + } + + location /api/ { + proxy_pass http://mnml_http; + proxy_read_timeout 600s; + } + listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/mnml.gg/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/mnml.gg/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot - - location /ws { - proxy_pass http://mnml; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_read_timeout 600s; - } } # http -> https diff --git a/etc/systemd/system/mnml.service b/etc/systemd/system/mnml.service index f5f66fd2..fd859f8d 100644 --- a/etc/systemd/system/mnml.service +++ b/etc/systemd/system/mnml.service @@ -1,14 +1,13 @@ [Unit] -Description=OpenBSD Secure Shell server -After=network.target auditd.service -ConditionPathExists=!/etc/ssh/sshd_not_to_be_run +Description=mnml game server +After=postgresql +User=mnml [Service] -ExecStart=/opt/mnml/bin/mnml +ExecStart=/usr/local/mnml/bin/mnml KillMode=process Restart=on-failure RestartPreventExitStatus=255 -Type=notify [Install] WantedBy=multi-user.target diff --git a/server/Cargo.toml b/server/Cargo.toml index 9a167f4e..17bd6446 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -3,6 +3,13 @@ name = "mnml" version = "0.1.0" authors = ["ntr "] +# makes sure to include openssl links in runtime path +# [profile.release] +# rpath = true + +# [profile.dev] +# rpath = true + [dependencies] rand = "0.6" uuid = { version = "0.5", features = ["serde", "v4"] } @@ -39,4 +46,3 @@ stripe-rust = { version = "0.10.4", features = ["webhooks"] } [patch.crates-io] # stripe-rust = { git = "https://github.com/margh/stripe-rs.git" } -stripe-rust = { git = "https://github.com/margh/stripe-rs.git" } diff --git a/server/src/main.rs b/server/src/main.rs index 47d2f8d1..22f0bf2c 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -52,7 +52,7 @@ mod ws; use std::thread::{sleep, spawn}; use std::time::{Duration}; -use dotenv::dotenv; +use std::path::{Path}; use pubsub::pg_listen; use warden::warden; @@ -78,7 +78,7 @@ fn setup_logger() -> Result<(), fern::InitError> { } fn main() { - dotenv().ok(); + dotenv::from_path(Path::new("/etc/mnml/server.conf")).ok(); setup_logger().unwrap(); let pool = pg::create_pool();