# FastAPI ISS Project A FastAPI application with Docker and docker-compose support. ## Features - FastAPI REST API with CRUD operations - PostgreSQL database integration - SQLAlchemy ORM with Alembic migrations - Docker containerization - Docker Compose for easy deployment - Health check endpoints - CORS middleware enabled - Auto-generated API documentation ## API Endpoints - `GET /` - Welcome message - `GET /health` - Health check - `GET /items` - Get all items - `GET /items/{item_id}` - Get specific item - `POST /items` - Create new item - `PUT /items/{item_id}` - Update item - `DELETE /items/{item_id}` - Delete item ## Quick Start with Docker Compose 1. **Set up environment variables:** ```bash # Copy the example environment file cp env.example .env # Edit the .env file with your secure passwords # nano .env # or use your preferred editor ``` 2. **Build and start the application:** ```bash docker-compose up --build ``` 3. **Access the application:** - API: http://localhost:8000 - Interactive API docs: http://localhost:8000/docs - ReDoc documentation: http://localhost:8000/redoc 4. **Stop the application:** ```bash docker-compose down ``` ## Development ### Running locally without Docker 1. **Install dependencies:** ```bash pip install -r requirements.txt ``` 2. **Run the application:** ```bash uvicorn main:app --reload --host 0.0.0.0 --port 8000 ``` ### Docker Commands **Build the image:** ```bash docker build -t fastapi-iss . ``` **Run the container:** ```bash docker run -p 8000:8000 fastapi-iss ``` **Run in detached mode:** ```bash docker run -d -p 8000:8000 --name fastapi-app fastapi-iss ``` ## API Examples ### Create an item ```bash curl -X POST "http://localhost:8000/items" \ -H "Content-Type: application/json" \ -d '{"name": "Sample Item", "description": "A sample item", "price": 29.99}' ``` ### Get all items ```bash curl "http://localhost:8000/items" ``` ### Get specific item ```bash curl "http://localhost:8000/items/1" ``` ### Update item ```bash curl -X PUT "http://localhost:8000/items/1" \ -H "Content-Type: application/json" \ -d '{"name": "Updated Item", "description": "Updated description", "price": 39.99}' ``` ### Delete item ```bash curl -X DELETE "http://localhost:8000/items/1" ``` ### Database Connection You can connect to the PostgreSQL database directly: ```bash # Using psql (if installed) psql -h localhost -p ${POSTGRES_PORT} -U ${POSTGRES_USER} -d ${POSTGRES_DB} # Using Docker docker exec -it fastapi-iss-postgres-1 psql -U ${POSTGRES_USER} -d ${POSTGRES_DB} ``` ## Project Structure ``` FastApi-ISS/ ├── main.py # FastAPI application ├── database.py # Database configuration and models ├── requirements.txt # Python dependencies ├── Dockerfile # Docker configuration ├── docker-compose.yml # Docker Compose configuration ├── env.example # Example environment variables ├── .env # Environment variables (create from env.example) ├── alembic.ini # Alembic configuration ├── alembic/ # Database migrations │ ├── env.py # Alembic environment │ └── script.py.mako # Migration template ├── .dockerignore # Docker ignore file ├── .gitignore # Git ignore file └── README.md # This file ``` ## Environment Variables The application uses environment variables for configuration. Copy `env.example` to `.env` and customize the values: ### Database Configuration - `POSTGRES_DB`: Database name (default: `fastapi_db`) - `POSTGRES_USER`: Database user (default: `fastapi_user`) - `POSTGRES_PASSWORD`: Database password (**CHANGE THIS**) - `POSTGRES_HOST`: Database host (default: `postgres`) - `POSTGRES_PORT`: Database port (default: `5432`) - `DATABASE_URL`: Full database connection string (auto-generated from above) ### Application Configuration - `PYTHONPATH`: Python path (default: `/app`) - `PYTHONUNBUFFERED`: Python output buffering (default: `1`) - `FASTAPI_TITLE`: Application title - `FASTAPI_DESCRIPTION`: Application description - `FASTAPI_VERSION`: Application version ### Security Configuration - `SECRET_KEY`: Secret key for JWT tokens (**CHANGE THIS**) - `ALGORITHM`: JWT algorithm (default: `HS256`) - `ACCESS_TOKEN_EXPIRE_MINUTES`: Token expiration time ### CORS Configuration - `ALLOWED_ORIGINS`: Allowed origins for CORS - `ALLOWED_CREDENTIALS`: Allow credentials in CORS - `ALLOWED_METHODS`: Allowed HTTP methods - `ALLOWED_HEADERS`: Allowed HTTP headers ### Logging - `LOG_LEVEL`: Logging level (default: `INFO`) ## Database The application uses PostgreSQL with the following configuration (configurable via environment variables): - **Database**: `fastapi_db` (configurable via `POSTGRES_DB`) - **User**: `fastapi_user` (configurable via `POSTGRES_USER`) - **Password**: Configurable via `POSTGRES_PASSWORD` (change this!) - **Port**: `5432` (configurable via `POSTGRES_PORT`) ### Database Migrations To run database migrations: ```bash # Generate a new migration alembic revision --autogenerate -m "Description of changes" # Apply migrations alembic upgrade head # Rollback migrations alembic downgrade -1 ``` ## Health Checks The application includes health checks that can be accessed at: - Docker health check: `http://localhost:8000/health` - Docker Compose health check: Configured in docker-compose.yml ## Security ### Environment Variables - **Never commit `.env` files** to version control - Use `env.example` as a template for your `.env` file - Change all default passwords and secret keys - Use strong, unique passwords for production ### Production Deployment - Change all default credentials - Use strong secret keys - Configure proper CORS settings - Enable HTTPS - Use environment-specific `.env` files ### Database Security - Use strong database passwords - Limit database access to necessary users only - Regularly update dependencies - Monitor database logs ## Troubleshooting 1. **Port already in use:** - Change the port in docker-compose.yml or use a different port - Kill existing processes using the port 2. **Docker build fails:** - Ensure Docker is running - Clear Docker cache: `docker system prune -a` 3. **Application not starting:** - Check logs: `docker-compose logs` - Verify all files are present in the project directory 4. **Database connection issues:** - Verify `.env` file exists and has correct values - Check if PostgreSQL container is running: `docker-compose ps` - Check database logs: `docker-compose logs postgres` ## Contributing 1. Fork the repository 2. Create a feature branch 3. Make your changes 4. Test with Docker Compose 5. Submit a pull request ## License This project is open source and available under the MIT License.