mirror of
https://github.com/hazemKrimi/touch-programming.git
synced 2026-05-01 18:20:26 +00:00
Deployment WIP
This commit is contained in:
@@ -3,3 +3,9 @@ charset = utf-8
|
|||||||
indent_style = tab
|
indent_style = tab
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
quote_type= single
|
quote_type= single
|
||||||
|
|
||||||
|
[*.{go}]
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = tab
|
||||||
|
indent_size = 2
|
||||||
|
quote_type= double
|
||||||
+2
-2
@@ -8,9 +8,9 @@ lerna-debug.log*
|
|||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
dist
|
dist
|
||||||
dist-ssr
|
build
|
||||||
*.local
|
*.local
|
||||||
.env
|
.env*
|
||||||
|
|
||||||
# Editor directories and files
|
# Editor directories and files
|
||||||
.vscode/*
|
.vscode/*
|
||||||
|
|||||||
+36
@@ -0,0 +1,36 @@
|
|||||||
|
FROM node:20-alpine AS frontend
|
||||||
|
WORKDIR /frontend
|
||||||
|
COPY ./client .
|
||||||
|
RUN npm install
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
FROM golang:1.23-alpine AS backend
|
||||||
|
WORKDIR /backend
|
||||||
|
COPY ./server .
|
||||||
|
RUN go mod tidy
|
||||||
|
RUN go build -o server
|
||||||
|
|
||||||
|
# FROM ollama/ollama:latest AS ai
|
||||||
|
|
||||||
|
# Install the llama3.2:1b model
|
||||||
|
# RUN ollama pull llama3.2:1b
|
||||||
|
|
||||||
|
# Stage 4: Setup NGINX to serve the React app and reverse proxy the Go and Ollama servers
|
||||||
|
FROM nginx:alpine AS reverse_proxy
|
||||||
|
|
||||||
|
# Copy the React build from the previous stage to NGINX's HTML folder
|
||||||
|
COPY --from=frontend /frontend/build /usr/share/nginx/html
|
||||||
|
|
||||||
|
# Copy the Go server binary into the container
|
||||||
|
COPY --from=backend /backend/.env.production .env
|
||||||
|
COPY --from=backend /backend/server /usr/local/bin/server
|
||||||
|
|
||||||
|
# Copy NGINX configuration to configure reverse proxy
|
||||||
|
COPY ./nginx.conf /etc/nginx/nginx.conf
|
||||||
|
|
||||||
|
# Expose necessary ports
|
||||||
|
EXPOSE 80
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# Start NGINX and Go server in parallel (using a simple entrypoint script)
|
||||||
|
CMD ["sh", "-c", "nginx -g 'daemon off;' & /usr/local/bin/server"]
|
||||||
@@ -16,8 +16,6 @@
|
|||||||
property="og:description"
|
property="og:description"
|
||||||
content="Master touch typing with real code snippets from your favorite programming languages, powered by AI."
|
content="Master touch typing with real code snippets from your favorite programming languages, powered by AI."
|
||||||
>
|
>
|
||||||
<meta property="og:url" content=".">
|
|
||||||
<link rel="canonical" href=".">
|
|
||||||
<link rel="icon" sizes="192x192" href="android-chrome-192x192.png">
|
<link rel="icon" sizes="192x192" href="android-chrome-192x192.png">
|
||||||
<link rel="icon" sizes="512x512" href="android-chrome-512x512.png">
|
<link rel="icon" sizes="512x512" href="android-chrome-512x512.png">
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png">
|
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png">
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ import App from './App.tsx';
|
|||||||
import './index.css';
|
import './index.css';
|
||||||
|
|
||||||
// TODO: Bring back strict mode when building and deploying
|
// TODO: Bring back strict mode when building and deploying
|
||||||
createRoot(document.getElementById('root')).render(
|
createRoot(document.querySelector('#root') as HTMLElement).render(
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<App />
|
<App />
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
|
|||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
events {}
|
||||||
|
|
||||||
|
http {
|
||||||
|
upstream backend {
|
||||||
|
server 127.0.0.1:8080;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream ai {
|
||||||
|
server 127.0.0.1:11434;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~* \.(?:css|js)$ {
|
||||||
|
try_files $uri/ =404;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://backend;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
[*.{go}]
|
|
||||||
charset = utf-8
|
|
||||||
indent_style = tab
|
|
||||||
indent_size = 2
|
|
||||||
quote_type= double
|
|
||||||
@@ -135,7 +135,7 @@ func Generate(ctx echo.Context) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctx.String(http.StatusInternalServerError, "Error generating code!")
|
return ctx.String(http.StatusInternalServerError, "Error generating code: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ func main() {
|
|||||||
err := godotenv.Load()
|
err := godotenv.Load()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error loading environment!")
|
log.Fatal("Error loading environment: ", err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
PORT := os.Getenv("PORT")
|
PORT := os.Getenv("PORT")
|
||||||
@@ -34,11 +34,11 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ech.Logger.Fatal(ech.Start(fmt.Sprintf(":%s", PORT)))
|
ech.Logger.Fatal(ech.Start(fmt.Sprintf(":%s", PORT)))
|
||||||
}
|
} else {
|
||||||
|
if len(PORT) == 0 {
|
||||||
|
PORT = "4443"
|
||||||
|
}
|
||||||
|
|
||||||
if len(PORT) == 0 {
|
ech.Logger.Fatal(ech.StartTLS(fmt.Sprintf(":%s", PORT), SSL_CERT_PATH, SSL_KEY_PATH))
|
||||||
PORT = "4443"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ech.Logger.Fatal(ech.StartTLS(fmt.Sprintf(":%s", PORT), SSL_CERT_PATH, SSL_KEY_PATH))
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user