Tweaking how the app launches
This commit is contained in:
parent
39de15a7ab
commit
46617e34b2
@ -1,5 +1,7 @@
|
|||||||
FROM node:20-alpine
|
FROM node:20-alpine
|
||||||
|
|
||||||
|
RUN apk add --no-cache sqlite
|
||||||
|
|
||||||
WORKDIR /server
|
WORKDIR /server
|
||||||
|
|
||||||
# For dev, we install in container, but to speed up, perhaps copy package and install
|
# For dev, we install in container, but to speed up, perhaps copy package and install
|
||||||
|
117
README.md
117
README.md
@ -4,107 +4,58 @@ This project consists of both the front-end React client and back-end Node.js ga
|
|||||||
|
|
||||||
The application is designed to run inside Docker containers. Do not run `npm install` or modify `node_modules` locally, as this can create environment drift. All development and building should be done through the provided Docker workflows.
|
The application is designed to run inside Docker containers. Do not run `npm install` or modify `node_modules` locally, as this can create environment drift. All development and building should be done through the provided Docker workflows.
|
||||||
|
|
||||||
## Development
|
## Development and Production
|
||||||
|
|
||||||
For live development with hot reloading, React DevTools support, and TypeScript compilation on-the-fly.
|
The application can be launched in development or production mode by setting the `PRODUCTION` environment variable.
|
||||||
|
|
||||||
|
- Set `PRODUCTION=0` (or leave unset) for development mode: hot-reloading server and client.
|
||||||
|
- Set `PRODUCTION=1` for production mode: static built site served by the server.
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
- Docker
|
- Docker
|
||||||
- Docker Compose
|
- Docker Compose
|
||||||
|
|
||||||
### Running the Server (Backend)
|
### Launching
|
||||||
|
|
||||||
The server uses TypeScript with hot reloading via `ts-node-dev`.
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose -f docker-compose.dev.yml up
|
# For development (hot-reload)
|
||||||
|
PRODUCTION=0 ./launch.sh
|
||||||
|
|
||||||
|
# For production (static build)
|
||||||
|
PRODUCTION=1 ./launch.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
This will:
|
#### Development Mode
|
||||||
- Build the server container using `Dockerfile.server`
|
|
||||||
- Mount the `server/` directory for live code changes
|
|
||||||
- Run `npm run start:dev` which uses `ts-node-dev` for hot reloading
|
|
||||||
- Expose the server on port 8930
|
|
||||||
|
|
||||||
### Testing the Server
|
When `PRODUCTION=0`:
|
||||||
|
- Server runs with hot-reloading via `ts-node-dev` on port 8930
|
||||||
|
- Client runs with React hot module replacement on port 3001 (HTTPS)
|
||||||
|
- Client proxies API calls to the server
|
||||||
|
- Both services run in separate containers with mounted source directories
|
||||||
|
|
||||||
The server uses Jest for unit testing. Tests are located in `server/tests/`.
|
Open `https://localhost:3001` in your browser for the client. Changes to server or client code will trigger automatic reloads.
|
||||||
|
|
||||||
To run tests:
|
#### Production Mode
|
||||||
|
|
||||||
```bash
|
When `PRODUCTION=1`:
|
||||||
docker compose run --rm server npm test
|
- Builds static client files and serves them directly from the Node.js server
|
||||||
```
|
- Server runs compiled TypeScript from `dist/` on port 8930
|
||||||
|
- No hot-reloading; requires rebuild for changes
|
||||||
This will run all test files matching `*.test.ts` in the `server/tests/` directory.
|
- Database mounted for persistence
|
||||||
|
|
||||||
To run tests in watch mode:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose run --rm server npm run test:watch
|
|
||||||
```
|
|
||||||
|
|
||||||
Note: If you add `test:watch` script, but for now, it's just `test`.
|
|
||||||
|
|
||||||
### Running the Client (Frontend)
|
|
||||||
|
|
||||||
The client is a React application with hot reloading and debug support.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose -f docker-compose.client.dev.yml up
|
|
||||||
```
|
|
||||||
|
|
||||||
This will:
|
|
||||||
- Mount the `client/` directory for live code changes
|
|
||||||
- Run `npm start` in development mode
|
|
||||||
- Enable React DevTools and hot module replacement
|
|
||||||
- Expose the client on port 3001 (HTTPS)
|
|
||||||
- Proxy API calls to the server at `http://host.docker.internal:8930`
|
|
||||||
|
|
||||||
### Full Development Stack
|
|
||||||
|
|
||||||
To run both server and client together:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Terminal 1: Server
|
|
||||||
docker compose -f docker-compose.dev.yml up
|
|
||||||
|
|
||||||
# Terminal 2: Client
|
|
||||||
docker compose -f docker-compose.client.dev.yml up
|
|
||||||
```
|
|
||||||
|
|
||||||
Open `https://localhost:3001` in your browser. The client will hot-reload on code changes, and the server will restart automatically on backend changes.
|
|
||||||
|
|
||||||
## Production
|
|
||||||
|
|
||||||
For production deployment, the client is built as static files and served directly by the Node.js server.
|
|
||||||
|
|
||||||
### Building
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose build
|
|
||||||
```
|
|
||||||
|
|
||||||
This builds the production image using `Dockerfile`, which:
|
|
||||||
- Installs server dependencies and builds TypeScript to `dist/`
|
|
||||||
- Installs client dependencies and builds static files to `client/build/`
|
|
||||||
- Copies the built client files to be served by the server
|
|
||||||
|
|
||||||
### Running
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker compose up
|
|
||||||
```
|
|
||||||
|
|
||||||
This will:
|
|
||||||
- Start the server on port 8930
|
|
||||||
- Serve the built client static files
|
|
||||||
- Mount the `db/` directory for persistent database storage
|
|
||||||
- Mount `server/routes/` for dynamic route files
|
|
||||||
|
|
||||||
The application will be available at `http://localhost:8930`.
|
The application will be available at `http://localhost:8930`.
|
||||||
|
|
||||||
|
### Building (for Production)
|
||||||
|
|
||||||
|
If you need to manually build the production image:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose build
|
||||||
|
```
|
||||||
|
|
||||||
|
This builds the image with server and client dependencies installed and built.
|
||||||
|
|
||||||
### Environment Variables
|
### Environment Variables
|
||||||
|
|
||||||
Create a `.env` file in the project root with any required environment variables. The server start script loads these via `export $(cat ../.env | xargs)`.
|
Create a `.env` file in the project root with any required environment variables. The server start script loads these via `export $(cat ../.env | xargs)`.
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
services:
|
|
||||||
peddlers-client:
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
hostname: peddlers-client
|
|
||||||
container_name: peddlers-client
|
|
||||||
working_dir: /client
|
|
||||||
volumes:
|
|
||||||
- ./client:/client:rw
|
|
||||||
ports:
|
|
||||||
- 3001:3000
|
|
||||||
environment:
|
|
||||||
- BROWSER=none
|
|
||||||
- HTTPS=true
|
|
||||||
- HOST=0.0.0.0
|
|
||||||
command: ["bash", "-c", "cd /client && npm install --legacy-peer-deps --silent --no-audit --no-fund && npm start"]
|
|
||||||
networks:
|
|
||||||
- peddlers-network
|
|
||||||
|
|
||||||
networks:
|
|
||||||
peddlers-network:
|
|
||||||
driver: bridge
|
|
@ -1,21 +0,0 @@
|
|||||||
services:
|
|
||||||
peddlers-of-ketran:
|
|
||||||
hostname: peddlers-server
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile.dev
|
|
||||||
volumes:
|
|
||||||
- ./server:/server:rw
|
|
||||||
- ./db:/db:rw
|
|
||||||
#- ./server/node_modules:app/server/node_modules:rw
|
|
||||||
command: ["sh", "-c", "cd /server && npm install --no-audit --no-fund --silent && npm rebuild sqlite3 && npm run start:dev"]
|
|
||||||
ports:
|
|
||||||
- 8930:8930
|
|
||||||
environment:
|
|
||||||
- NODE_ENV=development
|
|
||||||
networks:
|
|
||||||
- peddlers-network
|
|
||||||
|
|
||||||
networks:
|
|
||||||
peddlers-network:
|
|
||||||
driver: bridge
|
|
@ -1,5 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
peddlers-of-ketran:
|
peddlers-of-ketran:
|
||||||
|
profiles: [prod]
|
||||||
container_name: ketr.ketran
|
container_name: ketr.ketran
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
@ -11,15 +12,43 @@ services:
|
|||||||
- ./db:/db:rw
|
- ./db:/db:rw
|
||||||
- ./server/routes:/server/routes:ro
|
- ./server/routes:/server/routes:ro
|
||||||
working_dir: /server
|
working_dir: /server
|
||||||
|
peddlers-of-ketran-dev:
|
||||||
|
profiles: [dev]
|
||||||
|
container_name: ketr.ketran.dev
|
||||||
|
hostname: peddlers-server
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.dev
|
||||||
|
volumes:
|
||||||
|
- ./server:/server:rw
|
||||||
|
- ./db:/db:rw
|
||||||
|
command: ["sh", "-c", "cd /server && npm install --no-audit --no-fund --silent && npm rebuild sqlite3 && npm run start:dev"]
|
||||||
|
ports:
|
||||||
|
- 8930:8930
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
networks:
|
||||||
|
- peddlers-network
|
||||||
peddlers-client:
|
peddlers-client:
|
||||||
|
profiles: [dev]
|
||||||
container_name: ketr.client
|
container_name: ketr.client
|
||||||
|
hostname: peddlers-client
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
restart: 'no'
|
|
||||||
working_dir: /client
|
working_dir: /client
|
||||||
volumes:
|
volumes:
|
||||||
- ./client:/client:rw
|
- ./client:/client:rw
|
||||||
#- ./client:/client/node_modules:rw
|
ports:
|
||||||
tty: true
|
- 3001:3000
|
||||||
stdin_open: true
|
environment:
|
||||||
|
- BROWSER=none
|
||||||
|
- HTTPS=true
|
||||||
|
- HOST=0.0.0.0
|
||||||
|
command: ["bash", "-c", "cd /client && npm install --legacy-peer-deps --silent --no-audit --no-fund && npm start"]
|
||||||
|
networks:
|
||||||
|
- peddlers-network
|
||||||
|
|
||||||
|
networks:
|
||||||
|
peddlers-network:
|
||||||
|
driver: bridge
|
||||||
|
Loading…
x
Reference in New Issue
Block a user