initial
This commit is contained in:
commit
0c7bdb8cc5
27
.gitignore
vendored
Normal file
27
.gitignore
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
### `.gitignore`
|
||||
```gitignore
|
||||
# Binaries
|
||||
main
|
||||
|
||||
# Vendor directory
|
||||
/vendor/
|
||||
|
||||
# Go build artifacts
|
||||
*.exe
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# IDE and editor settings
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
|
||||
# Docker-related
|
||||
docker-compose.override.yml
|
25
Dockerfile
Normal file
25
Dockerfile
Normal file
@ -0,0 +1,25 @@
|
||||
# Build stage
|
||||
FROM golang:1.23-alpine AS builder
|
||||
WORKDIR /app
|
||||
|
||||
# Copy and download dependencies
|
||||
# COPY go.mod go.sum ./
|
||||
COPY go.mod ./
|
||||
RUN go mod download
|
||||
|
||||
# Copy the source code
|
||||
COPY . .
|
||||
|
||||
# Build the application
|
||||
RUN go build -o main .
|
||||
|
||||
# Runtime stage
|
||||
FROM alpine:latest
|
||||
WORKDIR /root/
|
||||
COPY --from=builder /app/main .
|
||||
|
||||
# Expose the port the service will run on
|
||||
EXPOSE 8080
|
||||
|
||||
# Command to run the executable
|
||||
ENTRYPOINT ["./main"]
|
21
LICENSE.md
Normal file
21
LICENSE.md
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 Neur0toxine
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
58
README.md
Normal file
58
README.md
Normal file
@ -0,0 +1,58 @@
|
||||
# real-ip-request-printer
|
||||
|
||||
## Overview
|
||||
`real-ip-request-printer` is a simple Go service that listens for HTTP `GET` requests on the root endpoint (`/`) and responds with:
|
||||
- The request IP address as seen by the application (considering headers like `X-Real-Ip` and `X-Forwarded-For`).
|
||||
- All incoming HTTP headers in a `key: value` format.
|
||||
|
||||
This project is designed to help inspect and debug HTTP request information, particularly for applications deployed behind proxies or load balancers.
|
||||
|
||||
## How to Run
|
||||
|
||||
### Prerequisites
|
||||
- [Go](https://golang.org/dl/) (for local builds)
|
||||
- [Docker](https://www.docker.com/get-started) and [Docker Compose](https://docs.docker.com/compose/)
|
||||
|
||||
### Running Locally
|
||||
1. Clone the repository:
|
||||
```sh
|
||||
git clone https://github.com/yourusername/real-ip-request-printer.git
|
||||
cd real-ip-request-printer
|
||||
```
|
||||
2. Build and run the Go application:
|
||||
|
||||
```sh
|
||||
go mod tidy
|
||||
go run main.go
|
||||
```
|
||||
|
||||
The service will start on http://localhost:8080 by default. You can change the listening address by setting the LISTEN environment variable:
|
||||
|
||||
```sh
|
||||
LISTEN=127.0.0.1:9090 go run main.go
|
||||
```
|
||||
|
||||
### Running with Docker
|
||||
Change the hostname in the `compose.yaml` to your domain. Build and run the Docker container using Compose:
|
||||
|
||||
```sh
|
||||
docker compose up
|
||||
```
|
||||
|
||||
Access the service via the configured domain.
|
||||
|
||||
### Configuration
|
||||
- The listening address of the Go service can be customized using the LISTEN environment variable.
|
||||
- For containerized execution use Traefik for routing.
|
||||
|
||||
### Project Structure
|
||||
- `main.go`: The main Go application.
|
||||
- `Dockerfile`: Configuration for building the Docker image.
|
||||
- `compose.yaml`: Docker Compose configuration to run the service.
|
||||
- `README.md`: This documentation file.
|
||||
- `LICENSE.md`: License file.
|
||||
- `.gitignore`: Standard git ignore settings for Go projects.
|
||||
|
||||
### License
|
||||
|
||||
This project is open-source and available under the [MIT License](LICENSE.md).
|
14
compose.yaml
Normal file
14
compose.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
services:
|
||||
realipprinter:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- 3001:8080
|
||||
environment:
|
||||
- LISTEN=0.0.0.0:8080
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.realipprinter.rule=Host(`realipoutput.proxy.neur0tx.site`)"
|
||||
- "traefik.http.routers.realipprinter.entrypoints=web"
|
||||
- "traefik.http.services.realipprinter.loadbalancer.server.port=8080"
|
54
main.go
Normal file
54
main.go
Normal file
@ -0,0 +1,54 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func getClientIP(r *http.Request) string {
|
||||
// Check common headers for real client IP
|
||||
if ip := r.Header.Get("X-Real-Ip"); ip != "" {
|
||||
return ip
|
||||
}
|
||||
if forwardedFor := r.Header.Get("X-Forwarded-For"); forwardedFor != "" {
|
||||
ips := strings.Split(forwardedFor, ",")
|
||||
return strings.TrimSpace(ips[0])
|
||||
}
|
||||
// Fallback to remote address
|
||||
return r.RemoteAddr
|
||||
}
|
||||
|
||||
func handler(w http.ResponseWriter, r *http.Request) {
|
||||
// Set content type
|
||||
w.Header().Set("Content-Type", "text/plain")
|
||||
|
||||
// Get client IP
|
||||
clientIP := getClientIP(r)
|
||||
|
||||
// Write response
|
||||
fmt.Fprintf(w, "Request IP: %s\n", clientIP)
|
||||
fmt.Fprintln(w, "Headers:")
|
||||
|
||||
for name, values := range r.Header {
|
||||
for _, value := range values {
|
||||
fmt.Fprintf(w, "%s: %s\n", name, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Get the listen address from the environment variable or use default
|
||||
listenAddr := os.Getenv("LISTEN")
|
||||
if listenAddr == "" {
|
||||
listenAddr = "0.0.0.0:8080"
|
||||
}
|
||||
|
||||
http.HandleFunc("/", handler)
|
||||
|
||||
fmt.Printf("Starting server on %s\n", listenAddr)
|
||||
if err := http.ListenAndServe(listenAddr, nil); err != nil {
|
||||
fmt.Printf("Error starting server: %s\n", err)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user