Truck Signs API - Deployment
This repository contains the containerized deployment for the Truck Signs API, a Django-based REST API for truck signage management. The setup uses Docker to orchestrate a production-ready environment with PostgreSQL database, Stripe payment integration, and email functionality.
Table of Contents
Prerequisites
- Docker: Version 20.10 or higher
- Python: Version 3.10 or higher
- Git: For repository management
- Stripe Account: For payment integration (test keys for development)
- Gmail Account: With app password for email functionality
Verify Docker installation:
docker --version
docker images
docker ps
Quickstart
1. Clone the repository
git clone -b feature/api-containerization git@github.com:Ozinho78/truck_signs_api.git
cd truck_signs_api
2. Create environment file
# Windows
copy env.template .env
# Linux/macOS
cp env.template .env
3. Build Docker image
docker build -t truck-signs-api:latest .
4. Create Docker network
docker network create truck-signs-network
5. Start PostgreSQL database
docker run -d \
--name truck-signs-db \
--network truck-signs-network \
--env-file .env \
-v truck-signs-data:/var/lib/postgresql/data \
postgres:15-alpine
6. Start Django API
docker run -d \
--name truck-signs-api \
--network truck-signs-network \
--env-file .env \
-p 8020:8000 \
truck-signs-api:latest
7. Verify containers status
docker ps --filter "name=truck-signs"
Expected output:
CONTAINER ID IMAGE STATUS PORTS NAMES
abc123def456 truck-signs-api:latest Up 10 seconds 0.0.0.0:8020->8000/tcp truck-signs-api
def456ghi789 postgres:15-alpine Up 15 seconds 5432/tcp truck-signs-db
9. Access application
- API:
http://<YOUR_SERVER_IP>:8020 - Admin Panel:
http://<YOUR_SERVER_IP>:8020/admin
Usage
Project Structure
truck-signs-api/
├── .gitignore # Excludes .env, logs, IDE configs, OS files
├── Dockerfile # Container build instructions
├── checklist.md # DevSecOps checklist that has to be fulfilled for the project
├── entrypoint.sh # Container startup script, DB migrations and Gunicorn launch
├── .env.template # Template for .env, contains environment variables
├── .env # Runtime environment variables (NOT in Git!), created by YOU
├── README.md # This document, project documentation with ToC, quickstart, usage
├── requirements.txt # Python dependencies that have to be installed for running the project
Environment Configuration
The .env file contains all configuration for the deployment. This file is not stored in Git for security reasons.
Create from template:
# Windows
copy .env.example .env
notepad .env
# Linux/macOS
cp .env.example .env
nano .env
Critical settings to modify:
1. Database Configuration (REQUIRED)
POSTGRES_HOST=truck-signs-db # Container name
POSTGRES_PORT=5432 # Default PostgreSQL port
POSTGRES_DB=truck_signs_db # Database name
POSTGRES_USER=truck_signs_user # Database user
POSTGRES_PASSWORD=use_strong_password # CHANGE THIS!
[!WARNING] Never use default passwords in production!
2. Django Secret Key
Generate using Python (Python and Django required):
python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
Then set in .env:
DOCKER_SECRET_KEY=your_generated_secret_key_here
3. Django Settings (REQUIRED for production)
DJANGO_ENV=production # or 'development'
DEBUG=False # NEVER True in production!
ALLOWED_HOSTS=localhost,127.0.0.1,<YOUR_SERVER_IP> # Add the ip address of your server here
4. Stripe Integration (REQUIRED)
Get your keys from Stripe Dashboard:
DOCKER_STRIPE_PUBLISHABLE_KEY=pk_test_xxxxxxxxxxxxx
DOCKER_STRIPE_SECRET_KEY=sk_test_xxxxxxxxxxxxx
[!TIP] Use test keys (
pk_test_andsk_test_) for development
5. Email Configuration (REQUIRED)
For Gmail, create an App Password:
DOCKER_EMAIL_HOST_USER=<your-email>@gmail.com
DOCKER_EMAIL_HOST_PASSWORD=your_16_char_app_password
Managing Containers
View running containers:
docker ps --filter "name=truck-signs"
Stop containers:
docker stop truck-signs-api truck-signs-db
Start stopped containers:
docker start truck-signs-db
docker start truck-signs-api
Restart containers:
docker restart truck-signs-api
docker restart truck-signs-db
Remove containers (keeps data volumes):
docker stop truck-signs-api truck-signs-db
docker rm truck-signs-api truck-signs-db
Remove everything including data:
[!WARNING] This deletes all database data permanently!
# Stop and remove containers
docker stop truck-signs-api truck-signs-db
docker rm truck-signs-api truck-signs-db
# Remove network
docker network rm truck-signs-network
# Remove volume (DATABASE DATA WILL BE LOST!)
docker volume rm truck-signs-data
# Remove image
docker rmi truck-signs-api:latest
View database logs:
docker logs truck-signs-db
docker logs -f truck-signs-db
Save logs to file:
docker logs truck-signs-api > api-logs.txt
docker logs truck-signs-db > db-logs.txt
Troubleshooting
Container won't start
Check if image exists:
docker images | findstr truck-signs-api
Check container status:
docker ps -a --filter "name=truck-signs"
View startup logs:
docker logs truck-signs-api
Database connection errors
Verify database is running:
docker ps --filter "name=truck-signs-db"
Check database logs:
docker logs truck-signs-db
Verify network connectivity:
docker network inspect truck-signs-network
Test database connection from API container:
docker exec -it truck-signs-api psql -h truck-signs-db -U truck_signs_user -d truck_signs_db
Port already in use
Check what's using port 8020:
# Windows
netstat -ano | findstr :8020
# Linux/macOS
lsof -i :8020
Use different port:
docker run -d \
--name truck-signs-api \
--network truck-signs-network \
-p 8080:8000 \
--env-file .env \
truck-signs-api:latest
Complete cleanup and fresh start
# Stop all containers
docker stop truck-signs-api truck-signs-db
# Remove containers
docker rm truck-signs-api truck-signs-db
# Remove network
docker network rm truck-signs-network
# Remove volume (WARNING: deletes data!)
docker volume rm truck-signs-data
# Remove image
docker rmi truck-signs-api:latest
# Start fresh deployment from step 4 in Quickstart
Project Information
- Course: DevSecOps
- Branch: feature/api-containerization
- Last Updated: January 2026