Overview
This site is a small, production-style deployment on Oracle Cloud Infrastructure. Two web servers share the work behind a load balancer, keep no files that matter on their own disks, and hold no cloud credentials. Each request follows the path below; the server that answered yours is highlighted.
- Your browser HTTP for the public site, HTTPS for admin
- OCI Load Balancer Terminates TLS, balances traffic, health-checks both servers
- KirkStrongWebServer1 Served this page from fault domain 2 Second server Identical, in a separate fault domain
- OCI Object Storage Resume, photos and page content, shared by both servers
Infrastructure
The two web servers are VM.Standard.E5.Flex instances running Oracle Autonomous Linux 8, placed in different fault domains so a single hardware failure can't take the site down. They sit in a private subnet with no public IP addresses; the load balancer in the public subnet is the only way in from the internet.
Outbound traffic is split by purpose: a NAT gateway for operating system and package updates, and a service gateway for Object Storage, so content traffic never leaves Oracle's network. Security lists allow web traffic to the servers only from the load balancer's subnet.
Security
- No stored credentials. The servers reach Object Storage with Instance Principals. A dynamic group identifies them, and an IAM policy limits them to this site's single bucket.
- Encrypted administration. The admin area only works over HTTPS, with a hashed password, one-hour sessions, CSRF protection and sign-in rate limiting.
- Hardened pages. Every response carries a strict Content Security Policy and related security headers, and edited text is sanitized before it's shown.
- Private photos. Uploaded photos are re-encoded with all metadata removed, including GPS location.
Application and deployment
On each server, Apache httpd sits in front of a Python Flask application running under Gunicorn as a hardened systemd service. Content is read from Object Storage and briefly cached, so an update made from the admin page on either server appears on both within seconds.
New versions are published to Object Storage as release packages. Each server pulls the release using its own identity and installs it, one server at a time, while the load balancer's health check keeps traffic on whichever server is ready.