diff --git a/Dockerfile b/Dockerfile index 66f9283..bfb524b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,8 +3,13 @@ FROM golang:1.21 LABEL authors="bjornurban" EXPOSE 8080:8080 -RUN mkdir /kubevoyage -RUN mkdir /kubevoyage/bin -COPY frontend/public /kubevoyage/public -COPY backend/build /kubevoyage/bin +WORKDIR /kubevoyage + +# Copy frontend and backend files +COPY frontend/public ./public +COPY backend/build ./bin + +# Ensure the binary has executable permissions +RUN chmod +x ./bin/kubevoyage + ENTRYPOINT ["./bin/kubevoyage"] \ No newline at end of file diff --git a/backend/cmd/kubevoyage/main.go b/backend/cmd/kubevoyage/main.go index 79f0c54..a4005ef 100644 --- a/backend/cmd/kubevoyage/main.go +++ b/backend/cmd/kubevoyage/main.go @@ -1,9 +1,12 @@ package main import ( + "fmt" "github.com/B-Urb/KubeVoyage/internal/handlers" "github.com/B-Urb/KubeVoyage/internal/models" "github.com/rs/cors" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" "log" @@ -15,10 +18,34 @@ import ( var db *gorm.DB func main() { + // Read environment variables + dbType := os.Getenv("DB_TYPE") + dbHost := os.Getenv("DB_HOST") + dbPort := os.Getenv("DB_PORT") + dbUser := os.Getenv("DB_USER") + dbPassword := os.Getenv("DB_PASSWORD") + dbName := os.Getenv("DB_NAME") + + var dsn string var err error - db, err = gorm.Open(sqlite.Open("test.db"), &gorm.Config{}) + var db *gorm.DB + + switch dbType { + case "mysql": + dsn = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName) + db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) + case "postgres": + dsn = fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s sslmode=disable", dbHost, dbPort, dbUser, dbName, dbPassword) + db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}) + case "sqlite": + dsn = dbName // For SQLite, dbName would be the path to the .db file + db, err = gorm.Open(sqlite.Open(dsn), &gorm.Config{}) + default: + log.Fatalf("Unsupported DB_TYPE: %s", dbType) + } + if err != nil { - panic("failed to connect database") + log.Fatalf("Failed to connect to database: %v", err) } mux := http.NewServeMux() diff --git a/backend/go.mod b/backend/go.mod index 1897c74..cdcdecf 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -7,15 +7,24 @@ require ( github.com/rs/cors v1.10.0 github.com/stretchr/testify v1.8.4 golang.org/x/crypto v0.13.0 + gorm.io/driver/mysql v1.5.1 + gorm.io/driver/postgres v1.5.2 gorm.io/driver/sqlite v1.5.3 gorm.io/gorm v1.25.4 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.3.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/kr/text v0.2.0 // indirect github.com/mattn/go-sqlite3 v1.14.17 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + golang.org/x/text v0.13.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index e3fc5b0..e1722d1 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,26 +1,54 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= +github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v1.10.0 h1:62NOS1h+r8p1mW6FM0FSB0exioXLhd/sh15KpjWBZ+8= github.com/rs/cors v1.10.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= +gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= +gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= +gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= gorm.io/driver/sqlite v1.5.3 h1:7/0dUgX28KAcopdfbRWWl68Rflh6osa4rDh+m51KL2g= gorm.io/driver/sqlite v1.5.3/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4= +gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= diff --git a/backend/internal/handlers/auth.go b/backend/internal/handlers/auth.go index 41cf3a1..28d5cd1 100644 --- a/backend/internal/handlers/auth.go +++ b/backend/internal/handlers/auth.go @@ -134,12 +134,18 @@ func HandleAuthenticate(w http.ResponseWriter, r *http.Request, db *gorm.DB) { } // 2. Extract the redirect parameter from the request to get the site URL. - siteURL := r.URL.Query().Get("redirect") + siteURL := r.Header.Get("X-Forwarded-Uri") if siteURL == "" { http.Error(w, "Redirect URL missing", http.StatusBadRequest) return } + //siteURL := r.URL.Query().Get("redirect") + //if siteURL == "" { + // http.Error(w, "Redirect URL missing", http.StatusBadRequest) + // return + //} + // 3. Query the database to check if the user has an "authorized" state for the given site. var userSite models.UserSite err = db.Joins("JOIN users ON users.id = user_sites.user_id"). diff --git a/deploy/charts/templates/_helpers.tpl b/deploy/charts/templates/_helpers.tpl index fd8a6a5..eab884c 100644 --- a/deploy/charts/templates/_helpers.tpl +++ b/deploy/charts/templates/_helpers.tpl @@ -1,2 +1,6 @@ {{/* Generate the best default app name */}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} + +{{- define "kubevoyage.fullname" -}} +{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/deploy/charts/templates/deployment.yaml b/deploy/charts/templates/deployment.yaml index 9ab5d8d..e0f13f2 100644 --- a/deploy/charts/templates/deployment.yaml +++ b/deploy/charts/templates/deployment.yaml @@ -2,6 +2,7 @@ apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "kubevoyage.fullname" . }} + namespace: {{ .Values.app.namespace}} labels: app: {{ include "kubevoyage.fullname" . }} spec: diff --git a/deploy/charts/templates/ingress.yaml b/deploy/charts/templates/ingress.yaml new file mode 100644 index 0000000..7380371 --- /dev/null +++ b/deploy/charts/templates/ingress.yaml @@ -0,0 +1,39 @@ +{{- if .Values.ingress.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "kubevoyage.fullname" . }} + namespace: {{ .Values.app.namespace }} + labels: + {{- include "kubevoyage.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ .service.name }} + port: + number: {{ .service.port }} + {{- end }} + {{- end }} +{{- end }} diff --git a/deploy/charts/templates/namespace.yaml b/deploy/charts/templates/namespace.yaml new file mode 100644 index 0000000..5ddd77b --- /dev/null +++ b/deploy/charts/templates/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: {{ .Values.app.namespace }} \ No newline at end of file diff --git a/deploy/charts/templates/secret.yaml b/deploy/charts/templates/secret.yaml index 8d327e8..2df30ea 100644 --- a/deploy/charts/templates/secret.yaml +++ b/deploy/charts/templates/secret.yaml @@ -2,6 +2,7 @@ apiVersion: v1 kind: Secret metadata: name: {{ include "kubevoyage.fullname" . }}-db-secret + namespace: {{ .Values.app.namespace }} type: Opaque data: db-password: {{ .Values.database.password | b64enc | quote }} \ No newline at end of file diff --git a/deploy/charts/templates/service.yaml b/deploy/charts/templates/service.yaml index f9e05f0..101b154 100644 --- a/deploy/charts/templates/service.yaml +++ b/deploy/charts/templates/service.yaml @@ -2,6 +2,7 @@ apiVersion: v1 kind: Service metadata: name: {{ include "kubevoyage.fullname" . }} + namespace: {{ .Values.app.namespace }} labels: app: {{ include "kubevoyage.fullname" . }} spec: diff --git a/deploy/charts/values.yaml b/deploy/charts/values.yaml index 3a79fe2..281d960 100644 --- a/deploy/charts/values.yaml +++ b/deploy/charts/values.yaml @@ -1,5 +1,8 @@ replicaCount: 1 + +app: + namespace: image: repository: kubevoyage tag: "latest" @@ -9,6 +12,25 @@ service: type: ClusterIP port: 80 +ingress: + enabled: false + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: chart-example.local + paths: + - path: / + pathType: ImplementationSpecific + service: + name: kubevoyage + port: 80 + tls: [] + # - secretName: chart-example-tls + # hosts: + # - chart-example.local + + auth: adminUser: adminPassword: