An open API service indexing awesome lists of open source software.

https://github.com/codeware-sthlm/codeware

Codeware multi stack and architecture playground
https://github.com/codeware-sthlm/codeware

github-action hono infisical mongodb monorepo nx nx-plugin payloadcms postgres react remix tailwindcss typescript

Last synced: 2 months ago
JSON representation

Codeware multi stack and architecture playground

Awesome Lists containing this project

README

        




codeware sthlm logo




Codeware Playground


A playground for multi stack and architecture powered by Codeware Sthlm.




MIT




## Contents

- [Packages](#packages)
- [Nx Plugins](#nx-plugins)
- [GitHub Actions](#github-actions)
- [Node Libraries](#node-libraries)
- [Utilities](#utilities)
- [Startup Payload multi-tenant in dev mode](#startup-payload-multi-tenant-in-dev-mode)
- [Terminal 1: Start Postgres and admin UI](#terminal-1-start-postgres-and-admin-ui)
- [Terminal 2: Start web client](#terminal-2-start-web-client)
- [Terminal 3: Start reverse proxy to simulate multi-tenancy](#terminal-3-start-reverse-proxy-to-simulate-multi-tenancy)
- [Development Tools \& Services](#development-tools--services)
- [Infisical Secrets Management](#infisical-secrets-management)
- [Fly.io Deployment](#flyio-deployment)
- [Release Management](#release-management)

## Packages

### Nx Plugins

#### [`nx-payload`](packages/nx-payload)

Add support for [Payload](https://payloadcms.com) in your existing [Nx](https://nx.dev) workspace.

```sh
npx add @cdwr/nx-payload
```

##### [`create-nx-payload`](packages/create-nx-payload)

Quickly create a new [Nx](https://nx.dev) workspace with a [Payload](https://payloadcms.com) application, using the plugin as a preset.

```sh
npx create-nx-payload
```

### GitHub Actions

#### [`deploy-env-action`](packages/deploy-env-action)

GitHub action that analyzes the environment to deploy to based on the event details.

#### [`nx-fly-deployment-action`](packages/nx-fly-deployment-action)

GitHub action that brings automatic [Fly.io](https://fly.io) deployments to your [Nx](https://nx.dev) workspace.

#### [`nx-migrate-action`](packages/nx-migrate-action)

GitHub action that brings automatic [Nx](https://nx.dev) migrations to your workspace.

### Node Libraries

#### [`fly-node`](packages/fly-node)

Fly CLI node wrapper for programmatic deployments to [Fly.io](https://fly.io).

### Utilities

#### [`core`](packages/core)

A set of core utilities for the [Codeware](https://codeware.se) ecosystem.

## Startup Payload multi-tenant in dev mode

The Payload suite consists of

- Payload Admin UI (`cms`)
- Web Client (`web`)
- Docker Postgres Database
- Nginx Reverse Proxy to simulate multi-tenancy

> [!IMPORTANT]
> For a better DX you should not connect to Infisical in dev mode, since the development seed has much more data.
>
> Make sure the credentials in the `.env.local` file are not set.

### Terminal 1: Start Postgres and admin UI

#### Start Postgres in Docker

```sh
nx dx:postgres cms
```

#### Serve admin UI

```sh
nx serve cms
```

> [!NOTE]
> Database is auto-seeded with static data when the admin UI is started.

#### Optional

##### Clear database and run migrations

```sh
nx payload cms migrate:fresh
```

##### Generate seed data

Seed data is stored in environment-specific TypeScript files in

- `libs/shared/util/seed/src/lib/static-data`.

You can remove the existing seed data and keep just an empty object to force the generation of new seed data.

```sh
nx seed cms
```

### Terminal 2: Start web client

> [!NOTE]
> Live-reload is not fully operational.

```sh
nx start web
```

### Terminal 3: Start reverse proxy to simulate multi-tenancy

```sh
nx payload-proxy:up
```

> [!NOTE]
> You can now access the different web sites as different tenants:
>
> 🌐 `cms.localhost`
>
> :pouting_face: `[email protected]` @ `dev`

#### Optional

##### Stop the proxy

```sh
nx payload-proxy:down
```

##### Communicate with the proxy

```sh
nx payload-proxy [docker compose options]
```

## Development Tools & Services

### Infisical Secrets Management

The [Infisical](https://infisical.com) secret management tool is used to manage secrets for the Codeware ecosystem.

1. [Install Infisical CLI](https://infisical.com/docs/cli/overview#installation)

2. Login to access the secrets

```sh
infisical login
```

3. List the development secrets

```sh
# all secrets
infisical secrets --recursive

# cms application (all secrets and some by tag)
infisical secrets --recursive --path /cms
infisical secrets --tag cms

# web application (all secrets and some by tag)
infisical secrets --recursive --path /web
infisical secrets --tag web

# 'demo' tenant using web application
infisical secrets --path /web/tenants/demo
```

#### Using the secrets

Add Infisical creadentials to you local environment.

`apps/cms/.env.local`

```env
# Alt 1: Client credentials
INFISICAL_CLIENT_ID=
INFISICAL_CLIENT_SECRET=

# Alt 2: Service token
INFISICAL_SERVICE_TOKEN=
```

> [!NOTE]
> Secrets can also be injected into `process.env` for any command, but this is not how we normally do it.
>
> ```sh
> infisical run --path [path] -- [command]
> ```

### Fly.io Deployment

The [Fly.io](https://fly.io) platform is used to host the deployed applications and the required services.

Deployments are automatic on push events, detected by the [nx-fly-deployment-action](packages/nx-fly-deployment-action).

Still it's highly recommended to have the Fly CLI installed locally.

1. [Install Fly CLI](https://github.com/superfly/flyctl?tab=readme-ov-file#installation)

2. Login to your Fly account

```sh
fly auth login
```

3. List the applications (for example)

```sh
fly apps list
```

#### Database setup for preview deployments

Applications affected by a pull request are deployed to a temporary preview environment.
To handle the dynamic nature of preview deployments, a Fly Postgres cluster `pg-preview` is used to store the temporary databases.

Applications deployed to preview will be automatically attached to the Postgres cluster, and detached when the pull request is closed.

> [!NOTE]
> Some commands for reference and knowledge:
>
> ```sh
> # Create a Postgres development cluster
> fly pg create --name pg-preview --org codeware --region arn --vm-size shared-cpu-1x --volume-size 1 --initial-cluster-size 2
>
> # Detach application from the Postgres cluster
> fly pg detach pg-preview -a cdwr-cms-pr-{pr-number}
>
> # Delete application
> fly apps destroy cdwr-cms-pr-{pr-number}
>
> # List all Postgres databases
> fly pg db list -a pg-preview
>
> ```

##### Pull request database maintenance

Cleanup dangling database and user when the PR has been closed.

```sh
sh scripts/cleanup-db.sh {pr-number} {cluster-password}
```

Drop the database when you want to start fresh on next app start/restart.

```sh
sh scripts/drop-db.sh {pr-number} {cluster-password}
```

Then stop and restart the application machine.

```sh
fly machine stop {machine-id}
fly machine restart {machine-id}
```

##### Connect to the database on local machine

Forward server port `5432` to local port `5433` to avoid conflicts with local Postgres running in Docker.

```sh
fly proxy 5433:5432 -a pg-preview
```

Connect with the following connection string:

`postgres://postgres:@localhost:5433`

### Release Management

The release process is semi-automatic which means:

- Releases are generated from a local machine by a developer
- GitHub action trigger on the tags and publish to NPM

Simply run the following command to start the release process:

```sh
nx release-cli
```