Skip to content

Commit

Permalink
Merge pull request #233 from SageSeekerSociety/chore-add-docker-script
Browse files Browse the repository at this point in the history
chore: add script to start docker dependencies
  • Loading branch information
Nictheboy authored Sep 7, 2024
2 parents e483eb9 + 192342b commit 0ae6149
Show file tree
Hide file tree
Showing 6 changed files with 193 additions and 13 deletions.
42 changes: 29 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@
[Cheese Backend](https://github.com/SageSeekerSociety/cheese-backend)
The backend of the cheese Q&A system.

## Run without installation

If you only want to start the application, you can use `docs/scripts/cheese-start.sh` and `docs/scripts/cheese-restart.sh`
to start and restart the application. You do not need to do anything else if you use these scripts. By default, after the application
is started in this way, it will be available at `http://localhost:3000`.

Notice that these scripts use the latest docker image on GitHub built from the `dev` branch, so it has nothing to do with your local code.
If you want to use your local code, you need to install the dependencies and run the app manually, as described below.

## Installation

Before installing this backend, ensure that you have installed the pnpm package manager. If you have not yet installed it, you can install it with the following command:
Expand All @@ -23,32 +32,39 @@ After this repo is cloned, you should install the dependencies with the followin
pnpm install
```

You need to create a database for this backend. We recommend you to use PostgreSQL because we have tested the app with PostgreSQL, and it works very well.
You need to create a database for this backend. Currently, we only support PostgreSQL.
Also, you need to set up an Elasticsearch instance. It is used to provide full-text search feature.

If you want to use other databases, you need to modify src/app.prisma. Replace
Setting up PostgreSQL and Elasticsearch can be complicated, so we recommend you to use Docker to set up the environment.
You can use `docs/scripts/dependency-start.sh` and `docs/scripts/dependency-restart.sh` to start and restart the dependencies.
If you set up dependencies in this way, then simply use `docs/scripts/dependency.env` as your `.env` file.

```prisma
provider = "postgresql"
```bash
docs/scripts/dependency-start.sh
cp docs/scripts/dependency.env .env
```

with what you want to use, such as
If you set up dependencies manually, you need to modify the `.env` file according to your condition.
Copy `sample.env` to `.env` and modify according to your condition.

```prisma
provider = "mysql"
```bash
cp sample.env .env
```

and recompile the prisma client with the following command:

Once you believe you have set up the environment correctly, you can run the following command to initialize the database schema:
```bash
pnpm build-prisma
pnpm prisma db push
```

Also, you need to set up an Elasticsearch instance. It is used to provide full-text search feature.

Copy `sample.env` to `.env` and modify according to your condition.
You need to start the app once before running tests.
```bash
pnpm start
```

Now, you can run tests with the following command to ensure that the app is working correctly:
```bash
cp sample.env .env
pnpm test
```

## Running the app
Expand Down
3 changes: 3 additions & 0 deletions docs/scripts/cheese-restart.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh
sudo systemctl start docker
sudo docker restart elasticsearch postgres cheese_legacy
63 changes: 63 additions & 0 deletions docs/scripts/cheese-start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#!/bin/sh
sudo systemctl start docker.service

sudo docker network create cheese_network

sudo docker run -d \
--name elasticsearch \
--network cheese_network \
-e discovery.type=single-node \
-e xpack.security.enabled=true \
-e ELASTIC_USERNAME=elastic \
-e ELASTIC_PASSWORD=elastic \
--health-cmd="curl http://localhost:9200/_cluster/health" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=10 \
-p 9200:9200 \
docker.elastic.co/elasticsearch/elasticsearch:8.12.1

sudo docker run -d \
--name postgres \
--network cheese_network \
-e POSTGRES_PASSWORD=postgres \
--health-cmd="pg_isready" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=5 \
-p 5432:5432 \
postgres
echo "Wait for 5 seconds please..."
sleep 5
sudo docker exec -i postgres bash << EOF
sed -i -e 's/max_connections = 100/max_connections = 1000/' /var/lib/postgresql/data/postgresql.conf
sed -i -e 's/shared_buffers = 128MB/shared_buffers = 2GB/' /var/lib/postgresql/data/postgresql.conf
EOF
sudo docker restart --time 0 postgres

sudo docker run -d \
--name cheese_legacy \
--network cheese_network \
-p 3000:3000 \
-e PORT=3000 \
-e JWT_SECRET="test-secret" \
-e PRISMA_DATABASE_URL="postgresql://postgres:postgres@postgres:5432/postgres?schema=public&connection_limit=16" \
-e ELASTICSEARCH_NODE=http://elasticsearch:9200/ \
-e ELASTICSEARCH_AUTH_USERNAME=elastic \
-e ELASTICSEARCH_AUTH_PASSWORD=elastic \
-e FILE_UPLOAD_PATH=/app/uploads \
-e DEFAULT_AVATAR_NAME=default.jpg \
-e EMAIL_SMTP_HOST=smtp.example.com \
-e EMAIL_SMTP_PORT=587 \
-e EMAIL_SMTP_SSL_ENABLE=true \
-e EMAIL_SMTP_USERNAME=user@example.com \
-e EMAIL_SMTP_PASSWORD=a_super_strong_password \
-e EMAIL_DEFAULT_FROM="No Reply <noreply@example.com>" \
ghcr.io/sageseekersociety/cheese-backend-dev:dev \
bash -c '
if [ ! -f "FLAG_INIT" ]; then
touch FLAG_INIT
pnpm prisma db push
fi
pnpm start
'
3 changes: 3 additions & 0 deletions docs/scripts/dependency-restart.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/bin/sh
sudo systemctl start docker
sudo docker restart elasticsearch postgres
32 changes: 32 additions & 0 deletions docs/scripts/dependency-start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/sh
sudo systemctl start docker.service

sudo docker run -d \
--name elasticsearch \
-e discovery.type=single-node \
-e xpack.security.enabled=true \
-e ELASTIC_USERNAME=elastic \
-e ELASTIC_PASSWORD=elastic \
--health-cmd="curl http://localhost:9200/_cluster/health" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=10 \
-p 9200:9200 \
docker.elastic.co/elasticsearch/elasticsearch:8.12.1

sudo docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=postgres \
--health-cmd="pg_isready" \
--health-interval=10s \
--health-timeout=5s \
--health-retries=5 \
-p 5432:5432 \
postgres
echo "Wait for 5 seconds please..."
sleep 5
sudo docker exec -i postgres bash << EOF
sed -i -e 's/max_connections = 100/max_connections = 1000/' /var/lib/postgresql/data/postgresql.conf
sed -i -e 's/shared_buffers = 128MB/shared_buffers = 2GB/' /var/lib/postgresql/data/postgresql.conf
EOF
sudo docker restart --time 0 postgres
63 changes: 63 additions & 0 deletions docs/scripts/dependency.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# The port that the app will listen to
PORT=3000

# The secret used to sign the JWT token
# You MUST change this secret to your own secret!
# Otherwise, your app will be as insecure as with an empty admin password!
JWT_SECRET="test-secret"

DB_HOST=localhost # set DB_HOST to database to use with docker
DB_USERNAME=postgres
DB_PASSWORD=postgres # your passowrd
DB_PASSWORD_URL_FORMAT=postgres # password in url-format, see https://github.com/prisma/prisma/discussions/15679
DB_PORT=5432
DB_NAME=postgres

# The connection URL of the database for Prisma
# See https://www.prisma.io/docs/orm/reference/connection-urls for more information
# Keep align with the TypeORM configuration
PRISMA_DATABASE_URL="postgresql://${DB_USERNAME}:${DB_PASSWORD_URL_FORMAT}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=public&connection_limit=16"

# The maximum amount of time the interactive transaction can run before being canceled and rolled back.
# See: https://github.com/prisma/prisma/releases/tag/5.10.0
# See: https://github.com/prisma/prisma/issues/15028
PRISMA_TRANSACTION_TIMEOUT=60000 # 60s

# The configuration for Elasticsearch
ELASTICSEARCH_NODE=http://localhost:9200/
ELASTICSEARCH_MAX_RETRIES=10
ELASTICSEARCH_REQUEST_TIMEOUT=60000
ELASTICSEARCH_PING_TIMEOUT=60000
ELASTICSEARCH_SNIFF_ON_START=true
ELASTICSEARCH_AUTH_USERNAME=elastic
ELASTICSEARCH_AUTH_PASSWORD=elastic

# The configuration for uploaded files
FILE_UPLOAD_PATH=/tmp/app/uploads
DEFAULT_AVATAR_NAME=default.jpg


# The configuration for CORS
CORS_ORIGINS=http://localhost:3000 # use `,` to separate multiple origins
CORS_METHODS=GET,POST,PUT,PATCH,DELETE
CORS_HEADERS=Content-Type,Authorization
CORS_CREDENTIALS=true

# additionally setup the following if you want to use docker-compose
# to setup environment
POSTGRES_DB=${DB_NAME}
POSTGRES_USER=${DB_USERNAME}
POSTGRES_PASSWORD=${DB_PASSWORD}

# Email configuration:
EMAIL_SMTP_HOST=smtp.example.com
EMAIL_SMTP_PORT=587
EMAIL_SMTP_SSL_ENABLE=true
EMAIL_SMTP_USERNAME=user@example.com
EMAIL_SMTP_PASSWORD=a_super_strong_password
EMAIL_DEFAULT_FROM='"No Reply" <noreply@example.com>'

# Email test configuration:
# Enabling email test means when you run test, emails will be sent.
EMAILTEST_ENABLE=false
EMAILTEST_RECEIVER=developer@example.com

0 comments on commit 0ae6149

Please sign in to comment.