118 lines
2.3 KiB
Markdown
118 lines
2.3 KiB
Markdown
# gl-operate-go-k8s
|
|
|
|
Go HTTP server for a Gitlab Interview
|
|
|
|
## Requirements
|
|
|
|
- Go 1.23+
|
|
- Docker (optional)
|
|
- Helm 4.0+ (optional)
|
|
|
|
## Quick Start
|
|
|
|
Build and run:
|
|
|
|
```bash
|
|
go build -o interview-server .
|
|
./interview-server
|
|
```
|
|
|
|
Server starts on `http://localhost:8080`
|
|
|
|
## Configuration
|
|
|
|
You can configure the server using environment variables or a JSON config file. Environment variables take precedence.
|
|
|
|
**Environment variables:**
|
|
|
|
- `SERVER_PORT` - Port to listen on (default: 8080)
|
|
- `SERVER_HOST` - Host to bind to (default: 0.0.0.0)
|
|
- `SERVER_ROOT_PATH` - Directory to serve files from (default: current directory)
|
|
- `SERVER_AUTH_SECRET` - Bearer token for API authentication
|
|
- `CONFIG_FILE` - Path to config file
|
|
|
|
**Example:**
|
|
|
|
```bash
|
|
export SERVER_PORT=3000
|
|
export SERVER_ROOT_PATH=/var/www
|
|
export SERVER_AUTH_SECRET=my-secret-token
|
|
./interview-server
|
|
```
|
|
|
|
**Config file:**
|
|
|
|
```bash
|
|
./interview-server -config config.json
|
|
```
|
|
|
|
The config file is JSON:
|
|
|
|
```json
|
|
{
|
|
"port": 8080,
|
|
"host": "0.0.0.0",
|
|
"root_path": "/app/data",
|
|
"auth_secret": "your-secret-token"
|
|
}
|
|
```
|
|
|
|
## Docker
|
|
|
|
Build:
|
|
|
|
```bash
|
|
docker build -t interview-service:latest .
|
|
```
|
|
|
|
Run:
|
|
|
|
```bash
|
|
docker run -p 8080:8080 -e SERVER_AUTH_SECRET=mysecret interview-service:latest
|
|
```
|
|
|
|
## Kubernetes
|
|
|
|
Install with Helm:
|
|
|
|
```bash
|
|
helm install interview-server ./helm
|
|
```
|
|
|
|
Port forward to access locally:
|
|
|
|
```bash
|
|
kubectl port-forward svc/interview-server-interview-server 8080:8080
|
|
```
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
go test -v
|
|
```
|
|
|
|
## How it works
|
|
|
|
The server has two main parts:
|
|
|
|
- `/` - Serves static files from the configured root path
|
|
- `/api/*` - Protected endpoint that requires authentication
|
|
|
|
For `/api/*` routes, you need to send a Bearer token that matches `SERVER_AUTH_SECRET`:
|
|
|
|
```bash
|
|
curl -H "Authorization: Bearer my-secret-token" http://localhost:8080/api/test
|
|
```
|
|
|
|
Logs are JSON formatted and go to stdout. The app handles SIGTERM/SIGINT for graceful shutdown.
|
|
|
|
## Deployment notes
|
|
|
|
The application is stateless and can be scaled horizontally. It runs as a non-root user (UID 1000) in the container.
|
|
|
|
Resource usage is minimal - 50m CPU and 64Mi memory is enough for most workloads. Recommended limits are 100m CPU and 128Mi memory.
|
|
|
|
The server doesn't do TLS, so you'll want a reverse proxy or ingress controller in production for HTTPS.
|
|
|
|
Store `SERVER_AUTH_SECRET` in Kubernetes Secrets, not in plain text config.
|