Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

upgrade typeorm to 0.3.x, clean up config and build #934

Merged
merged 9 commits into from
Jun 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading