A containerized microservices-based Task Management System built with FastAPI, PostgreSQL, Docker Compose, and JWT Authentication.
task_management_system/
│
├── docker-compose.yml
│
├── services/
│ ├── auth/
│ │ ├── Dockerfile
│ │ ├── requirements/
│ │ └── src/
│ │
│ └── task/
│ ├── Dockerfile
│ ├── requirements/
│ └── src/
│
└── shared/
└── auth/
The project consists of two independent services.
| Service | Port | Description |
|---|---|---|
| Auth Service | 8001 | User authentication and JWT generation |
| Task Service | 8000 | Task CRUD operations |
Each service has its own PostgreSQL database.
- FastAPI
- SQLAlchemy 2.0 (Async)
- PostgreSQL
- Docker Compose
- JWT Authentication
- Role Based Authorization
- Pagination
- Filtering
- Pydantic v2
- Clean Architecture
- Async Database Access
Install the following before starting the project.
- Docker Desktop
- Docker Compose (included with Docker Desktop)
- Git
Verify installation
docker --version
docker compose version
git --versiontask_management_system/
docker-compose.yml
services/
│
├── auth/
│ ├── Dockerfile
│ ├── .env
│ └── src/
│
├── task/
│ ├── Dockerfile
│ ├── .env
│ └── src/
│
shared/
Each service maintains its own environment variables.
Create
services/auth/.env
Example
APP_NAME=Auth Service
DATABASE_URL=postgresql+asyncpg://postgres:postgres@auth-postgres:5432/auth_db
SECRET_KEY=change_me
ACCESS_TOKEN_EXPIRE_MINUTES=30
REFRESH_TOKEN_EXPIRE_DAYS=7Create
services/task/.env
Example
APP_NAME=Task Service
DATABASE_URL=postgresql+asyncpg://postgres:postgres@task-postgres:5432/task_db
AUTH_SERVICE_URL=http://auth-service:8001The application starts four containers.
| Container | Description | Port |
|---|---|---|
| auth-service | Authentication API | 8001 |
| task-service | Task API | 8000 |
| auth-postgres | Authentication Database | 5433 (host) → 5432 (container) |
| task-postgres | Task Database | 5432 (host) → 5432 (container) |
docker compose builddocker compose upRun in detached mode
docker compose up -ddocker compose up --builddocker compose downThis removes all PostgreSQL data.
docker compose down -vAll services
docker compose logsTask Service
docker compose logs task-serviceAuth Service
docker compose logs auth-serviceFollow logs
docker compose logs -fAfter the containers are running:
Task Service
http://localhost:8000/docs
Authentication Service
http://localhost:8001/documentation/Swagger
Each service owns its own PostgreSQL database.
| Service | Database |
|---|---|
| Auth | auth_db |
| Task | task_db |
No database tables are shared between services.
Restart services
docker compose restartRestart a single service
docker compose restart task-serviceView running containers
docker psOpen a shell inside Task Service
docker exec -it task-service bashOpen PostgreSQL
docker exec -it task-postgres psql -U postgresInside a service container
pytestor
docker exec -it task-service pytestRebuild images
docker compose down
docker compose up --buildRemove existing volumes
docker compose down -v
docker compose up --buildCheck running processes
docker psor stop the conflicting container.
docker compose logs -f- Python 3.14
- FastAPI
- SQLAlchemy 2.0
- PostgreSQL
- Pydantic v2
- Docker
- Docker Compose
- Alembic
- Uvicorn
Clone Repository
│
▼
Create .env Files
│
▼
docker compose build
│
▼
docker compose up
│
▼
Run Alembic Migrations
│
▼
Open Swagger UI
│
▼
Begin Development
| Service | URL |
|---|---|
| Task API | http://localhost:8000 |
| Task Swagger | http://localhost:8000/docs |
| Auth API | http://localhost:8001 |
| Auth Swagger | http://localhost:8001/documentation/Swagger |
This project is provided for assessment and educational purposes.
| user_id | first_name | middle_name | last_name | username | password |
|---|---|---|---|---|---|
| 11111111-1111-1111-1111-111111111111 | System | Administrator | admin | stringstA@1 | |
| 22222222-2222-2222-2222-222222222222 | John | Doe | john | stringstA@1 |
Rename .env.example file to .env file in both the services root directory