First Commit

This commit is contained in:
Simon Rieger 2024-01-11 22:23:10 +01:00
commit 99e2cd23f3
6 changed files with 250 additions and 0 deletions

63
README.md Normal file
View file

@ -0,0 +1,63 @@
# Picture Uploader
This project is a simple web application written in Go for uploading and viewing images.
## Getting Started
To run this application, follow the steps below:
### Prerequisites
- [Docker](https://www.docker.com/)
- [docker-compose](https://docs.docker.com/compose/)
### Instructions
1. Clone the repository:
```bash
git clone <repository-url>
```
2. Navigate to the project directory:
```bash
cd <project-directory>
```
3. Create a folder named `uploads`:
```bash
mkdir uploads
```
4. Set permissions for the `uploads` folder:
```bash
chmod 777 uploads
```
5. Run the application using Docker Compose:
```bash
docker-compose up -d
```
The application should be accessible at [http://localhost:8080](http://localhost:8080).
## Configuration
Modify the `docker-compose.yml` file to adjust environment variables, ports, or any other configurations as needed.
## Additional Information
- This project uses NGINX as a reverse proxy. Ensure that the required networks (`nginx-proxy` and `edge`) are set up externally or adjust the `docker-compose.yml` accordingly.
- If you encounter issues with image uploads, verify the permissions on the `uploads` folder.
### Support and Issues
For support or to report issues, please [open an issue](<repository-url>/issues).
### License
This project is licensed under the [MIT License](LICENSE).

41
docker-compose.yml Executable file
View file

@ -0,0 +1,41 @@
version: "3.9"
services:
# Go application service
go-app:
build:
context: go/.
args:
- GO111MODULE=on
#ports:
# - "8080:8080"
environment:
- VIRTUAL_HOST=pick.brothertec.eu
- VIRTUAL_PORT=8080
- LETSENCRYPT_HOST=pick.brothertec.eu
- LETSENCRYPT_EMAIL=admin@brothertec.eu
volumes:
- ./uploads:/uploads
restart: always
labels:
- flame.type=application
- flame.name=Picture Upload
- flame.url=https://pick.brothertec.eu
- flame.icon=image
networks:
default:
proxy:
edge-tier:
networks:
proxy:
name: nginx-proxy
external: true
edge-tier:
name: edge
external: true

30
go/Dockerfile Executable file
View file

@ -0,0 +1,30 @@
# syntax=docker/dockerfile:1
# Build the application from source
FROM golang:1.21.4 AS build-stage
WORKDIR /app
COPY go.mod ./
RUN go mod download
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /picture-uploader
# Run the tests in the container
FROM build-stage AS run-test-stage
RUN go test -v ./...
# Deploy the application binary into a lean image
FROM gcr.io/distroless/base-debian11 AS build-release-stage
WORKDIR /
COPY --from=build-stage /picture-uploader /picture-uploader
EXPOSE 8080
USER nonroot:nonroot
ENTRYPOINT ["/picture-uploader"]

22
go/Dockerfile.old Executable file
View file

@ -0,0 +1,22 @@
# Use an official Golang runtime as a parent image
FROM golang:1.21.4
# Set the working directory in the container
WORKDIR /go/src/app
# Copy the local package files to the container's workspace
COPY . .
# Download and install any required third-party dependencies into the container.
#RUN go get -u github.com/gorilla/mux
RUN go get -u github.com/go-sql-driver/mysql
RUN go get -u github.com/sirupsen/logrus
# Build the Go application
RUN go build -o main .
# Expose port 8080 to the outside world
EXPOSE 8080
# Command to run the application with environment variables
CMD ["./main"]

3
go/go.mod Normal file
View file

@ -0,0 +1,3 @@
module picture-uploader
go 1.20

91
go/main.go Executable file
View file

@ -0,0 +1,91 @@
package main
import (
"fmt"
_ "html/template"
"io"
"log"
"net/http"
"os"
)
func main() {
http.HandleFunc("/", homeHandler)
http.HandleFunc("/upload", uploadHandler)
http.HandleFunc("/view/", viewHandler)
fmt.Println("Server listening on :8080")
http.ListenAndServe(":8080", nil)
}
func homeHandler(w http.ResponseWriter, r *http.Request) {
// Hier können Sie eine HTML-Templatedatei für die Homepage erstellen
// und sie mit template.Execute laden.
fmt.Fprint(w, "Willkommen! Besuchen Sie /upload, um Bilder hochzuladen.")
}
func uploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodPost {
file, handler, err := r.FormFile("image")
if err != nil {
http.Error(w, "Fehler beim Lesen der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Lesen der Datei: %v", err)
return
}
defer file.Close()
// Hier können Sie den Dateinamen manipulieren oder einen anderen Speicherort wählen
uploadPath := "./uploads/" + handler.Filename
f, err := os.Create(uploadPath)
if err != nil {
http.Error(w, "Fehler beim Erstellen der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Erstellen der Datei: %v", err)
return
}
defer f.Close()
_, copyErr := io.Copy(f, file)
if copyErr != nil {
http.Error(w, "Fehler beim Kopieren der Datei", http.StatusInternalServerError)
log.Printf("Fehler beim Kopieren der Datei: %v", copyErr)
return
}
// Erfolgsmeldung mit dem Link ausgeben
link := fmt.Sprintf("Bild erfolgreich hochgeladen. Sie können es hier anzeigen: <a href='/view/%s'>Anzeigen</a>", handler.Filename)
// Schreiben Sie den Link als HTML in die Antwort
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, link)
} else {
// HTML-Formular für Bild-Upload hier anzeigen
form := `<html><body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="Hochladen">
</form>
</body></html>`
fmt.Fprint(w, form)
}
}
func viewHandler(w http.ResponseWriter, r *http.Request) {
filePath := r.URL.Path[len("/view/"):]
imagePath := "./uploads/" + filePath
// Öffnen und Lesen der Bilddatei
imageFile, err := os.Open(imagePath)
if err != nil {
http.Error(w, "Bild nicht gefunden", http.StatusNotFound)
log.Printf("Fehler beim Öffnen des Bildes: %v", err)
return
}
defer imageFile.Close()
// Kopieren des Bildes in die HTTP-Antwort
_, copyErr := io.Copy(w, imageFile)
if copyErr != nil {
log.Printf("Fehler beim Senden des Bildes: %v", copyErr)
return
}
}