Skip to content

Commit

Permalink
Merge pull request #934 from sgfost/deps/typeorm-0.3.x
Browse files Browse the repository at this point in the history
upgrade typeorm to 0.3.x and clean up config + build
  • Loading branch information
alee committed Jun 11, 2024
2 parents b2fe551 + 7975bcc commit 506416d
Show file tree
Hide file tree
Showing 70 changed files with 1,268 additions and 876 deletions.
3 changes: 2 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
client/node_modules
server/node_modules
server/deploy/Dockerfile*
server/Dockerfile.dev
server/Dockerfile.prod
server/output
docker
keys
162 changes: 64 additions & 98 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,55 +1,39 @@
include config.mk

DB_USER=marsmadness
TEST_DB_NAME=pom_testing
DB_DATA_PATH=docker/data
DATA_DUMP_PATH=docker/dump
LOG_DATA_PATH=docker/logs

DB_PASSWORD_PATH=keys/pom_db_password
REDIS_SETTINGS_PATH=keys/settings.json
ORMCONFIG_PATH=keys/ormconfig.json
SERVER_ENV_TEMPLATE=server/.env.template
SERVER_ENV=server/.env
PGPASS_PATH=keys/.pgpass
SECRET_KEY_PATH=keys/secret_key
SENTRY_DSN_PATH=keys/sentry_dsn
SENTRY_DSN=$(shell cat $(SENTRY_DSN_PATH))
MAIL_API_KEY_PATH=keys/mail_api_key
SECRETS=$(MAIL_API_KEY_PATH) $(DB_PASSWORD_PATH) $(ORMCONFIG_PATH) $(PGPASS_PATH) $(SENTRY_DSN_PATH) $(SECRET_KEY_PATH)
SHARED_CONFIG_PATH=shared/src/assets/config.ts
BUILD_ID=$(shell git describe --tags --abbrev=1)
GA_TAG_PATH=keys/ga_tag
GA_TAG=$(shell cat $(GA_TAG_PATH))
GENERATED_SECRETS=$(DB_PASSWORD_PATH) $(PGPASS_PATH) $(SECRET_KEY_PATH)
EXT_SECRETS=mail_api_key google_client_secret facebook_client_secret

.PHONY: build
build: docker-compose.yml
docker compose pull db redis
docker compose build --pull
ENVREPLACE := deploy/scripts/envreplace
DEPLOY_CONF_DIR=deploy/conf
ENV_TEMPLATE=${DEPLOY_CONF_DIR}/.env.template
DYNAMIC_SETTINGS_TEMPLATE=${DEPLOY_CONF_DIR}/settings.template.json
DYNAMIC_SETTINGS_PATH=keys/settings.json

include config.mk
include .env

.EXPORT_ALL_VARIABLES:

$(LOG_DATA_PATH):
mkdir -p $(LOG_DATA_PATH)

$(DB_DATA_PATH):
mkdir -p "$(DB_DATA_PATH)"

.PHONY: browser
browser:
firefox --new-tab --url 'ext+container:name=Bob&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Amanda&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Frank&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Sydney&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Adison&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Bob2&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Amanda2&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Frank2&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Sydney2&url=http://localhost:8081/#/game' \
--new-tab --url 'ext+container:name=Adison2&url=http://localhost:8081/#/game'

.PHONY: browser-staging
browser-staging:
firefox --new-tab --url 'ext+container:name=Bob&url=http://alpha.portofmars.asu.edu' \
--new-tab --url 'ext+container:name=Amanda&url=http://alpha.portofmars.asu.edu' \
--new-tab --url 'ext+container:name=Frank&url=http://alpha.portofmars.asu.edu' \
--new-tab --url 'ext+container:name=Sydney&url=http://alpha.portofmars.asu.edu' \
--new-tab --url 'ext+container:name=Adison&url=http://alpha.portofmars.asu.edu'
$(DATA_DUMP_PATH):
mkdir -p $(DATA_DUMP_PATH)

keys:
mkdir -p keys

$(DYNAMIC_SETTINGS_PATH): $(DYNAMIC_SETTINGS_TEMPLATE) | keys
cp $(DYNAMIC_SETTINGS_TEMPLATE) $(DYNAMIC_SETTINGS_PATH)

$(DB_PASSWORD_PATH): | keys
DB_PASSWORD=$$(openssl rand -base64 48); \
TODAY=$$(date +%Y-%m-%d-%H:%M:%S); \
Expand All @@ -59,66 +43,56 @@ $(DB_PASSWORD_PATH): | keys
fi; \
echo "$${DB_PASSWORD}" > $(DB_PASSWORD_PATH)

$(LOG_DATA_PATH):
mkdir -p $(LOG_DATA_PATH)

$(DATA_DUMP_PATH):
mkdir -p $(DATA_DUMP_PATH)

$(REDIS_SETTINGS_PATH): server/deploy/settings.template.json | keys
cp server/deploy/settings.template.json $(REDIS_SETTINGS_PATH)

$(ORMCONFIG_PATH): server/ormconfig.template.json $(DB_PASSWORD_PATH)
DB_PASSWORD=$$(cat $(DB_PASSWORD_PATH)); \
sed "s|DB_PASSWORD|$$DB_PASSWORD|g" server/ormconfig.template.json > $(ORMCONFIG_PATH)

$(SERVER_ENV): $(SERVER_ENV_TEMPLATE) $(SECRETS)
POM_BASE_URL=${POM_BASE_URL} \
envsubst < $(SERVER_ENV_TEMPLATE) > $(SERVER_ENV)

$(PGPASS_PATH): $(DB_PASSWORD_PATH) server/deploy/pgpass.template | keys
DB_PASSWORD=$$(cat $(DB_PASSWORD_PATH)); \
sed "s|DB_PASSWORD|$$DB_PASSWORD|g" server/deploy/pgpass.template > $(PGPASS_PATH)
$(PGPASS_PATH): $(DB_PASSWORD_PATH) | keys
echo "${DB_HOST}:5432:*:${DB_USER}:$$(cat $(DB_PASSWORD_PATH))" > $(PGPASS_PATH)
chmod 0600 $(PGPASS_PATH)

$(MAIL_API_KEY_PATH): | keys
touch "$(MAIL_API_KEY_PATH)"

$(SENTRY_DSN_PATH): | keys
touch "$(SENTRY_DSN_PATH)"

$(GA_TAG_PATH): | keys
touch "$(GA_TAG_PATH)"

$(DB_DATA_PATH):
mkdir -p "$(DB_DATA_PATH)"

.PHONY: secrets
secrets: $(SECRETS)

$(SECRET_KEY_PATH): | keys
SECRET_KEY=$$(openssl rand -base64 48); \
echo $${SECRET_KEY} > $(SECRET_KEY_PATH)

.PHONY: settings
settings: $(SENTRY_DSN_PATH) $(SECRET_KEY_PATH) | keys
echo 'export const BUILD_ID = "${BUILD_ID}";' > $(SHARED_CONFIG_PATH)
echo 'export const SENTRY_DSN = "${SENTRY_DSN}";' >> $(SHARED_CONFIG_PATH)
echo 'export const GA_TAG = "${GA_TAG}";' >> $(SHARED_CONFIG_PATH)
.PHONY: secrets
secrets: keys $(GENERATED_SECRETS)
for secret_path in $(EXT_SECRETS); do \
touch keys/$$secret_path; \
done

.env: $(ENV_TEMPLATE)
if [ ! -f .env ]; then \
cp $(ENV_TEMPLATE) .env; \
fi

.PHONY: release-version
release-version: .env
$(ENVREPLACE) SHARED_RELEASE_VERSION $$(git describe --tags --abbrev=1) .env

docker-compose.yml: base.yml $(DEPLOY_ENVIRONMENT).yml config.mk $(DB_DATA_PATH) $(DATA_DUMP_PATH) $(LOG_DATA_PATH) $(DYNAMIC_SETTINGS_PATH) secrets $(PGPASS_PATH) release-version
case "$(DEPLOY_ENVIRONMENT)" in \
dev|staging|prod) docker compose -f base.yml -f "$(DEPLOY_ENVIRONMENT).yml" config > docker-compose.yml;; \
*) echo "invalid environment. must be either dev, staging or prod" 1>&2; exit 1;; \
esac

.PHONY: build
build: docker-compose.yml
docker compose pull db redis
docker compose build --pull

.PHONY: deploy
deploy: build
docker compose up -d

.PHONY: buildprod
buildprod: docker-compose.yml
docker compose run --rm client npm run build
docker compose run --rm server npm run build

.PHONY: initialize
initialize: build
docker compose run --rm server npm run initdb

docker-compose.yml: base.yml $(ENVIR).yml config.mk $(DB_DATA_PATH) $(DATA_DUMP_PATH) $(LOG_DATA_PATH) $(REDIS_SETTINGS_PATH) $(ORMCONFIG_PATH) $(NUXT_ORMCONFIG_PATH) $(PGPASS_PATH) $(SERVER_ENV) settings
case "$(ENVIR)" in \
dev|staging|prod) docker compose -f base.yml -f "$(ENVIR).yml" config > docker-compose.yml;; \
*) echo "invalid environment. must be either dev, staging or prod" 1>&2; exit 1;; \
esac

.PHONY: test-setup
test-setup: docker-compose.yml
docker compose run --rm server bash -c "dropdb --if-exists -h db -U ${DB_USER} ${TEST_DB_NAME} && createdb -h db -U ${DB_USER} ${TEST_DB_NAME} && npm run typeorm -- schema:sync -c test && npm run load-fixtures -- ./fixtures/sologame -cn test"
docker compose run --rm server bash -c "dropdb --if-exists -h ${DB_HOST} -U ${DB_USER} ${TEST_DB_NAME} && createdb -h db -U ${DB_USER} ${TEST_DB_NAME} && npm run test-setup"

.PHONY: test
test: test-setup
Expand All @@ -127,16 +101,7 @@ test: test-setup

.PHONY: test-server
test-server: test-setup
docker compose run --rm server npm run test $(tests)

.PHONY: deploy
deploy: build
docker compose up -d

.PHONY: buildprod
buildprod: docker-compose.yml
docker compose run --rm client npm run build
docker compose run --rm server npm run build
docker compose run --rm server npm run test

.PHONY: docker-clean
docker-clean:
Expand All @@ -146,4 +111,5 @@ docker-clean:

.PHONY: clean
clean:
rm -f server/.env # any other generated resources? SHARED_CONFIG_PATH?
@echo "Backing up generated files to /tmp directory"
mv .env config.mk docker-compose.yml $(shell mktemp -d)
31 changes: 25 additions & 6 deletions base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ services:
context: .
restart: always
image: port-of-mars/server:dev
secrets:
- pom_db_password
- mail_api_key
- secret_key
- google_client_secret
- facebook_client_secret
env_file:
- .env
depends_on:
redis:
condition: service_started
Expand All @@ -12,11 +20,9 @@ services:
volumes:
- ./docker/dump:/dump
- ./docker/logs:/var/log/port-of-mars
- ./keys/ormconfig.json:/code/server/ormconfig.json
- ./keys/.pgpass:/root/.pgpass
- ./keys:/run/secrets
- ./keys/settings.json:/run/secrets/settings.json
- ./scripts:/scripts
- ./server/.env:/code/server/.env
- ./.prettierrc:/code/.prettierrc
redis:
image: redis:7
Expand All @@ -28,12 +34,25 @@ services:
timeout: 5s
retries: 5
image: postgres:12
secrets:
- pom_db_password
restart: always
environment:
POSTGRES_USER: marsmadness
POSTGRES_DB: ${DB_NAME}
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD_FILE: /run/secrets/pom_db_password
POSTGRES_DB: port_of_mars
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- ./keys/pom_db_password:/run/secrets/pom_db_password:ro
- ./docker/data:/var/lib/postgresql/data/pgdata

secrets:
pom_db_password:
file: ./keys/pom_db_password
mail_api_key:
file: ./keys/mail_api_key
secret_key:
file: ./keys/secret_key
google_client_secret:
file: ./keys/google_client_secret
facebook_client_secret:
file: ./keys/facebook_client_secret
3 changes: 1 addition & 2 deletions client/src/components/game/Inventory.vue
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@
import { Vue, Component, Prop } from "vue-property-decorator";
import { Role, RESEARCHER } from "@port-of-mars/shared/types";
import { Investment, Resource, RESOURCES, Phase } from "@port-of-mars/shared/types";
import { Constants } from "@port-of-mars/shared/settings";
@Component({
components: {},
Expand Down Expand Up @@ -96,7 +95,7 @@ export default class Inventory extends Vue {
}
canInvest(cost: number): boolean {
return cost < Constants.MAXIMUM_COST;
return cost < this.$settings.MAXIMUM_COST;
}
toggleCosts() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { Investment, Resource } from "@port-of-mars/shared/types";
import { Constants } from "@port-of-mars/shared/settings";
@Component({})
export default class InvestmentCard extends Vue {
Expand Down Expand Up @@ -100,7 +99,7 @@ export default class InvestmentCard extends Vue {
* Define if investment is affordable.
*/
get cannotPurchase(): boolean {
return this.cost >= Constants.MAXIMUM_COST;
return this.cost >= this.$settings.MAXIMUM_COST;
}
/**
Expand Down
15 changes: 7 additions & 8 deletions client/src/components/global/Footer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -64,25 +64,25 @@ ccarra1@asu.edu
<h2>Connect with Us</h2>
<ul>
<li>
<a :href="constants.DISCORD_URL" title="Discord">
<a :href="$settings.DISCORD_URL" title="Discord">
Discord
<b-icon-discord></b-icon-discord>
</a>
</li>
<li>
<a :href="'mailto:' + constants.CONTACT_EMAIL" title="Email us">
<a :href="'mailto:' + $settings.CONTACT_EMAIL" title="Email us">
Email
<b-icon-envelope class="mx-1"></b-icon-envelope>
</a>
</li>
<li>
<a :href="constants.INSTAGRAM_URL" title="Instagram">
<a :href="$settings.INSTAGRAM_URL" title="Instagram">
Instagram
<b-icon-instagram class="mx-1"></b-icon-instagram>
</a>
</li>
<li>
<a :href="constants.TWITTER_URL" title="Twitter">
<a :href="$settings.TWITTER_URL" title="Twitter">
Twitter
<b-icon-twitter class="mx-1"></b-icon-twitter>
</a>
Expand All @@ -93,15 +93,14 @@ ccarra1@asu.edu
&copy; 2020-{{ currentYear }}
<a href="https://www.azregents.edu/">Arizona Board of Regents</a> |

<a :href="constants.GITHUB_URL">{{ constants.BUILD_ID }}</a>
<a :href="$settings.GITHUB_URL">{{ RELEASE_VERSION }}</a>
</div>
</footer>
<!-- </b-container> -->
</template>

<script lang="ts">
import { Component, Vue } from "vue-property-decorator";
import { Constants } from "@port-of-mars/shared/settings";
import {
LOGIN_PAGE,
FREE_PLAY_LOBBY_PAGE,
Expand All @@ -123,8 +122,8 @@ export default class Footer extends Vue {
privacy = { name: PRIVACY_PAGE };
solo = { name: SOLO_GAME_PAGE };
get constants() {
return Constants;
get RELEASE_VERSION() {
return import.meta.env.SHARED_RELEASE_VERSION;
}
get isTournamentEnabled() {
Expand Down
Loading

0 comments on commit 506416d

Please sign in to comment.