A modern, responsive portfolio web application built with Flask, Docker, and GitHub Actions. This project showcases software engineering skills, project highlights, and a knowledge map, all deployable with production-ready best practices.
- Flask-based web app with modular templates and Bootstrap 5 styling
- Responsive UI with custom themes and interactive knowledge map
- Dockerized for easy local and production deployment
- GitHub Actions CI/CD for automated Docker image build and deployment
- HTTPS support with automatic HTTP→HTTPS redirection in production
- Health check endpoint for monitoring
- Configurable via environment variables for secrets and SSL
flowchart LR
A[👨💻 Developer] --> B[📝 Git Push to main]
B --> C[🔄 GitHub Actions]
C --> D[🐳 Docker Build]
D --> E[📦 Push to Docker Hub]
E --> F[🚀 Deploy to Server]
F --> G[✅ Health Check]
subgraph "🏗️ Build Process"
D --> D1[Copy Files]
D1 --> D2[Install Dependencies]
D2 --> D3[Configure Gunicorn]
end
subgraph "🖥️ Server Infrastructure"
F --> F1[🐋 Docker Compose Up]
F1 --> F2[🌐 NGINX Proxy]
F2 --> F3[🔒 SSL/HTTPS]
F3 --> F4[🌍 Domain Access]
end
style A fill:#e1f5fe
style G fill:#c8e6c9
style F4 fill:#fff3e0
flowchart TD
subgraph "🌐 Internet"
U[👤 User Request]
D[🌍 yourdomain.com]
end
subgraph "🏠 Home Network"
R[🌐 Router<br/>Port Forward<br/>80/443]
end
subgraph "🖥️ Your Server"
N[⚡ NGINX<br/>Reverse Proxy<br/>SSL Termination]
subgraph "🐳 Docker Container"
G[🦄 Gunicorn<br/>WSGI Server]
F[🐍 Flask App<br/>app.py]
end
subgraph "📁 App Structure"
T[📄 Templates<br/>Jinja2 HTML]
S[🎨 Static Files<br/>CSS, Images, JS]
C[⚙️ Config<br/>gunicorn_config.py]
end
end
U --> D
D --> R
R --> N
N --> G
G --> F
F --> T
F --> S
F --> C
subgraph "🛣️ Flask Routes"
F --> H1[🏠 Home /]
F --> H2[👤 About /about]
F --> H3[📞 Contact /contact]
F --> H4[📄 Resume /resume]
F --> H5[❤️ Health /health]
end
style U fill:#e3f2fd
style D fill:#e8f5e8
style N fill:#fff3e0
style F fill:#f3e5f5
style G fill:#e0f2f1
-
Clone the repository:
git clone https://github.com/Burger-Byte/portfolio-web.git cd portfolio-web -
Install Python dependencies:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate pip install -r requirements.txt
-
Run the Flask app:
python app.py
The app will be available at http://localhost:80 or http://localhost:5000 depending on your environment.
-
Build the Docker image:
docker build -t portfolio:latest . -
Run with Docker Compose:
docker-compose up -d
- The app will be available on ports 80 (HTTP) and 443 (HTTPS, if SSL certs are provided).
- Environment variables and volumes are configured in
docker-compose.yaml.
- SSL Certificates:
Place your SSL certificates in/etc/letsencrypt/live/yourcoolendpointhere/(or updateSSL_CERT_PATHandSSL_KEY_PATHin your environment). - HTTP→HTTPS Redirect:
In production, the app automatically redirects HTTP traffic to HTTPS. - Health Check:
The/healthendpoint returns a JSON status for uptime monitoring.
- On every push to
main, deploy.yaml will:- Build and push the Docker image to Docker Hub.
- Deploy the latest image to your server via Docker Compose.
- Run a health check to verify deployment.
Key environment variables (see docker-compose.yaml):
FLASK_ENV=productionSECRET_KEY=your-secret-keySSL_CERT_PATHandSSL_KEY_PATHfor HTTPSDOCKER_USERNAMEfor Docker Hub authentication
- Profile & About Info:
Update thePORTFOLIO_DATAdictionary inapp.pyfor your name, title, links, and summary. - Projects:
Add your projects to the relevant data structure and templates. - Styling:
Modify CSS inportfolio_base.htmlor add static assets as needed.
This project is for personal portfolio use. Feel free to fork and adapt for your own portfolio!
Questions or feedback?
LinkedIn: Jaques Burger
