The `backend` service depends on `localstack` and `mongodb` services, ensuring they are running before it starts. It also uses a .env file for environment variables. The frontend service depends on the backend and sets the API URL. The `mongodb` service uses a persistent volume for data storage, and `localstack` is configured to run the S3 service. This setup lets you to develop and test your application locally with AWS-like services.
```yaml
services:
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- 5000:5000
depends_on:
- localstack
- mongodb
env_file:
- backend/.env
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
ports:
- 5173:5173
depends_on:
- backend
environment:
- REACT_APP_API_URL=http://backend:5000/api
mongodb:
image: mongo
container_name: mongodb
volumes:
- mongodbdata:/data/db
ports:
- 27017:27017
localstack:
image: localstack/localstack
container_name: localstack
ports:
- 4566:4566
environment:
- SERVICES=s3
- GATEWAY_LISTEN=0.0.0.0:4566
volumes:
- ./localstack:/docker-entrypoint-initaws.d"
volumes:
mongodbdata:
```
2. Modify the `.env` file under the `backend/` directory to have the resources connect using the internal network names.
> [!TIP]
> Given the previous Compose file, the app would connect to LocalStack using the hostname `localstack` while Mongo would connect using the hostname `mongodb`.
```plaintext
MONGODB_URI=mongodb://mongodb:27017/todos
AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
S3_BUCKET_NAME=mysamplebucket
S3_ENDPOINT_URL=http://localstack:4566
AWS_REGION=us-east-1
```
3. Stop the running services
Ensure that you stop the Node frontend and backend service from the previous step by pressing “Ctrl+C” in the terminal. Also, you'll need to stop the LocalStack and Mongo containers by selecting them in the Docker Desktop Dashboard and selecting the "Delete" button.
4. Start the application stack by executing the following command at the root of your cloned project directory:
```console
$ docker compose -f compose.yml up -d --build
```
After a brief moment, the application will be up and running.
5. Create an S3 bucket manually
The AWS S3 bucket is not created beforehand by the Compose file. Run the following command to create a new bucket within the LocalStack environment:
```console
$ awslocal s3 mb s3://mysamplebucket
```
The command creates an S3 bucket named `mysamplebucket`.
Open [http://localhost:5173](http://localhost:5173) to access the complete to-do list application and start uploading images to the Amazon S3 bucket.
> [!TIP]
> To optimize performance and reduce upload times during development, consider uploading smaller image files. Larger images may take longer to process and could impact the overall responsiveness of the application.
## Recap
This guide has walked you through setting up a local development environment using LocalStack and Docker. You’ve learned how to test AWS-based applications locally, reducing costs and increasing the efficiency of your development workflow.