175 lines
4.8 KiB
Markdown
175 lines
4.8 KiB
Markdown
# Small Business Inventory Management System
|
|
|
|
This is a FastAPI application for managing small business inventory, products, orders, and suppliers.
|
|
|
|
## Features
|
|
|
|
- User authentication and authorization
|
|
- Product management
|
|
- Inventory tracking
|
|
- Order processing
|
|
- Supplier management
|
|
- Category organization
|
|
|
|
## API Endpoints
|
|
|
|
- `/docs` - Swagger UI documentation
|
|
- `/redoc` - ReDoc documentation
|
|
- `/health` - Health check endpoint
|
|
- `/api/v1/auth` - Authentication endpoints
|
|
- `/api/v1/users` - User management
|
|
- `/api/v1/products` - Product management
|
|
- `/api/v1/inventory` - Inventory management
|
|
- `/api/v1/orders` - Order processing
|
|
- `/api/v1/suppliers` - Supplier management
|
|
- `/api/v1/categories` - Category management
|
|
|
|
## Running Locally
|
|
|
|
1. Install dependencies:
|
|
```
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
2. Start the server:
|
|
```
|
|
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
The application uses the following environment variables:
|
|
|
|
- `SECRET_KEY`: Secret key for JWT token generation
|
|
- `SERVER_NAME`: Server name (e.g., "Inventory Management System")
|
|
- `SERVER_HOST`: Server host URL (e.g., "https://inventory.example.com")
|
|
- `FIRST_SUPERUSER`: Email for the first superuser
|
|
- `FIRST_SUPERUSER_PASSWORD`: Password for the first superuser
|
|
|
|
## Kubernetes Deployment
|
|
|
|
The application can be deployed using Kubernetes with the provided configuration files in the `kubernetes/` directory:
|
|
|
|
- `deployment.yaml`: Deployment configuration (using name `prod-pod`)
|
|
- `service.yaml`: Service configuration (using name `prod-pod-service`)
|
|
- `pvc.yaml`: Persistent Volume Claim for storage
|
|
- `secrets.yaml`: Secret configuration for environment variables
|
|
|
|
### Deployment Configuration
|
|
|
|
The deployment has been optimized for maximum scheduling flexibility and minimal resource requirements:
|
|
|
|
- **Minimal Resource Requirements**:
|
|
- Single replica (no high availability) to ensure easier scheduling
|
|
- Extremely low resource requests (10m CPU, 64Mi memory)
|
|
- No resource limits to allow for flexible resource usage
|
|
- Reduced PVC storage request (100Mi)
|
|
- Optional emptyDir volume configuration (commented out)
|
|
|
|
- **Maximum Scheduling Flexibility**:
|
|
- Uses Recreate deployment strategy instead of RollingUpdate
|
|
- Tolerations for all taints using `operator: "Exists"`
|
|
- No node selector or required affinity rules
|
|
- Default scheduler and DNS policy
|
|
|
|
- **Vault Integration (Commented Out)**:
|
|
- Added configuration templates for HashiCorp Vault integration
|
|
- Instructions for using Vault Agent Injector with the deployment
|
|
- Support for vault-agent and vault-agent-init sidecars
|
|
|
|
### Troubleshooting "pod does not have a host assigned" Error
|
|
|
|
If you encounter this error, follow these steps:
|
|
|
|
1. **Check Cluster Resources**:
|
|
```bash
|
|
kubectl get nodes
|
|
kubectl describe nodes
|
|
```
|
|
- Ensure nodes have available CPU, memory, and are in Ready state
|
|
|
|
2. **Check PVC Status**:
|
|
```bash
|
|
kubectl get pvc
|
|
kubectl describe pvc inventory-api-pvc
|
|
```
|
|
- If the PVC is stuck in Pending state, check storage class availability:
|
|
```bash
|
|
kubectl get storageclass
|
|
```
|
|
- If no storage class is available, modify deployment.yaml to use emptyDir:
|
|
```yaml
|
|
volumes:
|
|
- name: storage-volume
|
|
emptyDir: {}
|
|
# persistentVolumeClaim:
|
|
# claimName: inventory-api-pvc
|
|
```
|
|
|
|
3. **Check Pod Status**:
|
|
```bash
|
|
kubectl get pods
|
|
kubectl describe pod <pod-name>
|
|
kubectl get events --sort-by='.metadata.creationTimestamp'
|
|
```
|
|
- Look for scheduling errors or resource constraints
|
|
|
|
4. **Verify Vault Configuration** (if applicable):
|
|
- If your cluster uses HashiCorp Vault, uncomment the Vault configuration in deployment.yaml
|
|
- Check Vault service status:
|
|
```bash
|
|
kubectl get svc -n vault
|
|
```
|
|
|
|
5. **Extreme Resource Reduction**:
|
|
- If still having issues, you can uncomment and adjust these values in deployment.yaml:
|
|
```yaml
|
|
resources:
|
|
requests:
|
|
cpu: "1m" # Absolute minimum
|
|
memory: "32Mi" # Absolute minimum
|
|
```
|
|
|
|
### Deployment Commands
|
|
|
|
To deploy:
|
|
|
|
```bash
|
|
# Apply secret first
|
|
kubectl apply -f kubernetes/secrets.yaml
|
|
|
|
# Create PVC
|
|
kubectl apply -f kubernetes/pvc.yaml
|
|
|
|
# Apply deployment
|
|
kubectl apply -f kubernetes/deployment.yaml
|
|
|
|
# Apply service
|
|
kubectl apply -f kubernetes/service.yaml
|
|
```
|
|
|
|
To check status:
|
|
|
|
```bash
|
|
# Get pod status
|
|
kubectl get pods
|
|
|
|
# Describe pod for detailed information
|
|
kubectl describe pod <pod-name>
|
|
|
|
# Check recent events
|
|
kubectl get events --sort-by='.metadata.creationTimestamp'
|
|
|
|
# Get logs from container
|
|
kubectl logs <pod-name> -c app
|
|
```
|
|
|
|
To delete deployment:
|
|
|
|
```bash
|
|
kubectl delete -f kubernetes/deployment.yaml
|
|
kubectl delete -f kubernetes/service.yaml
|
|
kubectl delete -f kubernetes/pvc.yaml
|
|
kubectl delete -f kubernetes/secrets.yaml
|
|
```
|