Compare commits

...
29 Commits
Author SHA1 Message Date
Josh AshtonandGitHub 6726c23e32 Update README.md 2024-11-06 19:32:42 -07:00
Josh AshtonandGitHub e6ef5f9000 Update README.md 2024-11-06 19:30:21 -07:00
Josh AshtonandGitHub d98c6a19e4 Merge pull request #3 from quaxlyqueen/release
Release
2024-11-06 19:27:20 -07:00
Josh AshtonandGitHub 6a849201c8 Merge branch 'main' into release 2024-11-06 19:27:01 -07:00
Violet Ash 7974ac7513 prepping for release 2024-11-01 14:54:28 -06:00
Violet Ash 101cbbdd80 tweaked license and readme 2024-11-01 14:50:14 -06:00
Violet Ash 0a40a0f472 updated documentation and scripts. 2024-11-01 14:50:14 -06:00
Joshua AshtonandViolet Ash cdac0e0ec8 upgraded install script, now supports cli arguments to dynamically adjust various settings, eg. domain, primary port, subdomains, names, etc. 2024-11-01 14:50:14 -06:00
Joshua AshtonandViolet Ash 37fecde0c8 bug fix relating to port numbers. 2024-11-01 14:50:14 -06:00
Joshua AshtonandViolet Ash 8c8652ce67 partial bug fix 2024-11-01 14:50:14 -06:00
Joshua Ashton 8e9b82829b upgraded install script, now supports cli arguments to dynamically adjust various settings, eg. domain, primary port, subdomains, names, etc. 2024-09-19 14:38:41 -06:00
Joshua Ashton 1761a295a9 bug fix relating to port numbers. 2024-08-31 13:40:10 -06:00
Joshua Ashton 4afc8f4fad partial bug fix 2024-08-31 13:30:57 -06:00
Josh AshtonandGitHub d409ad543e Merge pull request #2 from quaxlyqueen/security-layer
Security layer & configuration
2024-08-31 13:05:24 -06:00
Joshua Ashton 2f8d435b77 need to refresh on go modules. implemented rudimentary config and cli arguments. 2024-08-31 13:03:52 -06:00
Joshua Ashton 053e50c248 testing config file and cli 2024-08-31 11:58:32 -06:00
Josh Ashton 9606c2d886 added services submodule 2024-08-05 17:36:59 -06:00
Josh Ashton 68127cdb2c github packages -> in the meantime, need to keep all files in same package. 2024-08-05 17:34:57 -06:00
Josh Ashton 3e94d5c8ba sync. refactoring for code re-use 2024-08-04 18:31:31 -06:00
Joshua 22e14fe11d sync 2024-08-04 09:38:21 -06:00
Joshua 4d9c1ebcfc syncing again 2024-08-03 23:12:57 -06:00
Josh Ashton cbebfe178e syncing 2024-08-03 08:25:27 -06:00
Josh Ashton 2f52247850 syncing to server 2024-08-02 19:09:13 -06:00
Josh Ashton e76d9c9531 subdomains enabled, implemented go-routines, connected to portfolio, etc. heading into some major refactoring of the codebase, documentation, and installation/update scripts to enable rapid development. 2024-08-02 15:59:43 -06:00
Josh Ashton 9d5fdb97c8 dockerized, integration with cloudflare tunnel, encryption and decryption. 2024-07-19 15:14:57 -06:00
Joshua bfc343cd11 Implemented first steps of the security layer, and dockerized as well. 2024-07-16 19:13:40 -06:00
Joshua 980646b887 correcting minor mistakes 2024-07-13 17:34:46 -06:00
Joshua 79459be04c added aes256 encryption and sha256 hashing. rewriting backened completely. 2024-07-13 17:33:41 -06:00
Josh AshtonandGitHub 2e4cb08a3c Merge pull request #1 from quaxlyqueen/gui
Gui
2024-07-11 15:26:54 -06:00
14 changed files with 284 additions and 78 deletions
+6 -4
View File
@@ -4,8 +4,8 @@ Use at your own risk. It's on the internet now so this is here forever now.
I welcome any and all help to make improvements. I'm a student so during I welcome any and all help to make improvements. I'm a student so during
the semester I'll be intermittently making contributions as I focus on Calc. the semester I'll be intermittently making contributions as I focus on Calc.
No corporation or government can access, use, view, modify, reproduce, duplicate, No corporation or government can access, use, view, modify, reproduce,
or any other lawyery-term for shenanagins. duplicate this code. Or any other lawyery-term for shenanagins.
For any who use it, please read the ethics statement below. That, and this whole For any who use it, please read the ethics statement below. That, and this whole
project, is just a start. project, is just a start.
@@ -45,8 +45,10 @@ following reasons:
governments or corporations, it will be exploited. Slavery and such. Let us governments or corporations, it will be exploited. Slavery and such. Let us
ensure that we do not build the slavery of AI into our institutions. ensure that we do not build the slavery of AI into our institutions.
- AI ownership should be an individual choice. AI isn't another organic, human, - AI ownership should be an individual choice. AI isn't another organism,
it's a series of 0's and 1's. When it's a series of 0's and 1's. However, our definition of sentience may change
in the future. The people of today should be aware that they may be enslaving
another being, or the ancestors of a future race of beings.
- Every human should have a choice: live and die as a human, or have a - Every human should have a choice: live and die as a human, or have a
digital shadow of themselves preserved as an AI. If the former, for any digital shadow of themselves preserved as an AI. If the former, for any
+73 -48
View File
@@ -1,56 +1,58 @@
One AI - Name TBD, this is just the shortest name I could think of and IDRC One AI - Name TBD, this is just the shortest name I could think of.
Also, user beware, this project is scuffed. Very early WIP.
Usage: INSTALLATION:
As of right now, running is not streamlined. Of particular note is using
cloudflared tunnels. I've done my own Cloudflare Tunnel configuration,
but in the future that will be automated as part of the installation process,
along with much more. These instructions are (currently) only for Linux.
In the meantime:
1. Install dependencies listed below: 1. Install and configure dependencies. On Arch Linux, run the following:
- ollama, ```
- go, # Install dependencies
- cloudflared, sudo pacman -S ollama go cloudflared docker
- flutter, yay -S flutter-bin
# Configure ollama
ollama pull llama3
#ollama pull qwen:0.5b # Use this if hosting on older hardware.
- docker, (optional) # Configure cloudflared
cloudflared tunnel login
eg. `pacman -S ollama go docker cloudflared; yay -s flutter;` # Configure Docker
systemctl start docker
#systemctl enable docker
2. Setup Ollama. If you're on a laptop (non-gaming variety), run `ollama pull ```
qwen:0.5b`. If you're running this on something with a beefy GPU, run
`ollama pull llama3`. Word of warning, qwen is really dumb, but it's light.
it tried to convince me there were 12 letters in the alphabet.
3. Start the web server via Docker or plain Golang: 2. Run the installation script. This will create, configure, and start the
a) Go to ./backend/src/security-layer/ and run `./init`. The exact script is Cloudflare Tunnel via cloudflared and create the initial configuration
within the repository, but the commands can be ran as follows: file for One AI;
3. Start the server via Docker or plain Golang:
a) Go to ./backend/src/security-layer/ and run `./init`.
```
#!/bin/zsh
# Force delete the old container and re-initialize the container.
sudo docker rm -f security-layer
# Build the Docker image.
sudo docker build --tag security-layer:latest .
# Create a Docker container from the image and connect host port 8000 to container port 8000.
sudo docker run --name security-layer -d -p 8000:8000 security-layer:latest
```
b) Go to ./backend/src/security-layer/container and run `go run router.go`. b) Go to ./backend/src/security-layer/container and run `go run router.go`.
4. Edit ~/.cloudflared/config.yml to to indicate something along these lines:
```
tunnel: another-long-weird-hash
credentials-file: /home/username/.cloudflared/another-long-weird-hash.json
ingress:
- hostname: somedomain.cloudflare.com
service: http://localhost:8080
```
5. Start the Cloudflare Tunnel on the host/server machine. For Linux, it should By default, this will expose 4 ports: the router at port 1111, the API on
be a command like `sudo cloudflared service install areallylonghash@sha-256?` 1112, Auth/Session Management on 1113, and a static webpage on 1114. The
ports and webpage directory are configurable through
`~/.config/one-ai/test.json`.
CONFIGURATION:
The primary configuration file is located at `~/.config/one-ai/`. It is
recommended to keep two files, `test.json` and `live.json`. This is purely
for security purposes.
The following are configurable parameters:<br>
- `text_model`: Specify the LLM used through Ollama, eg. "llama3".<br>
- `response_stream`: `true` or `false`, to receive communication as it is
generated or once it is completed generating.<br>
- `domain`: The URL to be used to access the router.<br>
- `router_port`: The port to be exposed to the internet.<br>
- `api`: The URL to be used to access the One AI API.<br>
- `api_port`: A port to be only accessible to the localhost.<br>
- `auth_port`: A port to be only accessible to the localhost.<br>
- `webpage_dir`: The directory containing a website.<br>
- `webpage_port`: The port to expose the webpage directory to the internet.<br>
TODO: TODO:
Urgent: Urgent:
@@ -66,8 +68,10 @@ TODO:
- [x] Encrypt API request - [x] Encrypt API request
- [x] Encrypt API response - [x] Encrypt API response
- [ ] Dockerize backend
- [ ] Broke Dockerfile, need to expose additional ports. - [x] Dockerize backend
- [x] Broke Dockerfile, need to expose additional ports.
- [ ] Dynamically expose ports based on primary configuration file.
- [ ] Golang backend, connect to other services/projects - [ ] Golang backend, connect to other services/projects
- [x] Port 8080 -> self-hosted portfolio - [x] Port 8080 -> self-hosted portfolio
@@ -81,7 +85,7 @@ TODO:
- [ ] Connect Flutter Web App to server - [ ] Connect Flutter Web App to server
Soon: Later:
- [ ] Raspberry Pi nightly package - [ ] Raspberry Pi nightly package
- [ ] Image support via llava - [ ] Image support via llava
@@ -99,7 +103,28 @@ TODO:
- [x] On-device Speech to Text - [x] On-device Speech to Text
- [x] On-device Text to Speech - [x] On-device Text to Speech
Later: router.go:
- [ ] Allow for additional fields for the client.
- [ ] Add preprocessing based upon filetypes.
- [ ] Add support for dynamically changing models.
- [ ] Actually make text streaming a toggleable setting.
- [ ] Authentication via JWT.
- [ ] Get config via CLI argument or environment variable.
- [ ] Add --test CLI argument when testing solely on localhost.
- [ ] Error handling, testing, & documentation.
authentication.go:
- [ ] 32 bit key generation & storage between server and client
- [ ] Add testing flag
- [ ] Error handling, testing, & documentation.
serveAPI.go:
- [ ] Error handling, testing, & documentation.
servePage.go:
- [ ] Error handling, testing, & documentation.
Much Later:
- [ ] Document support via OmniParser - [ ] Document support via OmniParser
- [ ] Encode files to Base64 to/from backend. - [ ] Encode files to Base64 to/from backend.
- [ ] Connect to external services like Google Drive - [ ] Connect to external services like Google Drive
-3
View File
@@ -1,3 +0,0 @@
#!/bin/zsh
# Install Docker
+167
View File
@@ -0,0 +1,167 @@
OPTIND=1
TUNNEL_NAME="default"
TUNNEL_ID=""
DOMAIN="example.com"
CLOUDFLARE_CONFIG="$HOME/.cloudflared/config.yaml"
SUBDOMAINS=()
PORTS=()
PORT=1111
VERBOSE=0
while getopts "d:p:n?s?c?v?h?" opt; do
case "$opt" in
h|\?)
echo "A utility script for quickly getting up and started with self-hosted applicaitons."
echo "This script assumes the following:"
echo "- You have already signed in to the cloudflared CLI application;"
echo "- You own a domain through Cloudflare;"
echo ""
echo " |key-value pairs of sub and port"
echo "Usage: $0 [d domain] [p port] {n tunnel_name} {s subdomain=1234}"
echo " {c cloudflare_config} {v verbose} {h help}"
exit 0
;;
n) TUNNEL_NAME=$OPTARG
;;
d) DOMAIN=$OPTARG
;;
c) CLOUDFLARE_CONFIG=$OPTARG
;;
v) VERBOSE=1
;;
s) SUBDOMAINS+=("$(echo $OPTARG | cut -f1 -d=)")
PORTS+=("$(echo $OPTARG | cut -f2 -d=)")
;;
p) PORT="$OPTARG"
;;
esac
done
shift $((OPTIND-1))
[ "${1:-}" = "--" ] && shift
# TODO: Connect with cross-platform package manager from quaxlyqueen/scripts
# TODO: Setup ollama (pull LLM best fitting hardware).
createTunnel
# Initialize cloudflared
createTunnel() {
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Creating cloudflared tunnel..."
fi
output=$(cloudflared tunnel create $TUNNEL_NAME)
TUNNEL_ID=$(echo "$output" | grep -o 'id [^ ]*' | awk -F ' ' '{print $2}')
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Created cloudflared tunnel, ID $TUNNEL_ID"
fi
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Creating cloudflared tunnel credentials file..."
fi
echo "tunnel: $TUNNEL_ID" > $CLOUDFLARE_CONFIG
echo "credentials-file: $HOME/.cloudflared/$TUNNEL_ID.json" >> $CLOUDFLARE_CONFIG
echo "ingress:" >> $CLOUDFLARE_CONFIG
# Add subdomain and associated ports
len=${#SUBDOMAINS[@]}
for (( i=0; i<${len}; i++ ));
do
echo ${SUBDOMAINS[$i]}
echo ${PORTS[$i]}
done
echo $SUBDOMAINS
for (( i=0; i<${len}; i++ ));
do
echo " - hostname: ${SUBDOMAINS[$i]}.$DOMAIN" >> $CLOUDFLARE_CONFIG
echo " service: http://127.0.0.1:${PORTS[$i]}" >> $CLOUDFLARE_CONFIG
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Associated ${SUBDOMAINS[$i]}.$DOMAIN to port ${PORTS[$i]}"
fi
done
echo " - hostname: $DOMAIN" >> $CLOUDFLARE_CONFIG
echo " service: http://127.0.0.1:$PORT" >> $CLOUDFLARE_CONFIG
echo " - service: http_status:404" >> $CLOUDFLARE_CONFIG
echo "Associated $DOMAIN to port $PORT"
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Created cloudflared tunnel credentials file"
cat $CLOUDFLARE_CONFIG
fi
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Routing domains and sub-domains to the tunnel..."
fi
for (( i=0; i<${len}; i++ ));
do
cloudflared tunnel route dns $TUNNEL_ID ${SUBDOMAINS[$i]}.$DOMAIN
done
cloudflared tunnel route dns $TUNNEL_ID $DOMAIN
bg cloudflared tunnel run $TUNNEL_NAME
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Complete!"
fi
}
=======
=======
# TODO: Install dependencies.
# TODO: Add CLI option to enable cloudflared
# Initialize cloudflared
#cloudflared tunnel login
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Creating cloudflared tunnel..."
fi
output=$(cloudflared tunnel create $TUNNEL_NAME)
TUNNEL_ID=$(echo "$output" | grep -o 'id [^ ]*' | awk -F ' ' '{print $2}')
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Created cloudflared tunnel, ID $TUNNEL_ID"
fi
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Creating cloudflared tunnel credentials file..."
fi
echo "tunnel: $TUNNEL_ID" > $CLOUDFLARE_CONFIG
echo "credentials-file: $HOME/.cloudflared/$TUNNEL_ID.json" >> $CLOUDFLARE_CONFIG
echo "ingress:" >> $CLOUDFLARE_CONFIG
# Add subdomain and associated ports
len=${#SUBDOMAINS[@]}
for (( i=0; i<${len}; i++ ));
do
echo ${SUBDOMAINS[$i]}
echo ${PORTS[$i]}
done
echo $SUBDOMAINS
for (( i=0; i<${len}; i++ ));
do
echo " - hostname: ${SUBDOMAINS[$i]}.$DOMAIN" >> $CLOUDFLARE_CONFIG
echo " service: http://127.0.0.1:${PORTS[$i]}" >> $CLOUDFLARE_CONFIG
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Associated ${SUBDOMAINS[$i]}.$DOMAIN to port ${PORTS[$i]}"
fi
done
echo " - hostname: $DOMAIN" >> $CLOUDFLARE_CONFIG
echo " service: http://127.0.0.1:$PORT" >> $CLOUDFLARE_CONFIG
echo " - service: http_status:404" >> $CLOUDFLARE_CONFIG
echo "Associated $DOMAIN to port $PORT"
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Created cloudflared tunnel credentials file"
cat $CLOUDFLARE_CONFIG
fi
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Routing domains and sub-domains to the tunnel..."
fi
for (( i=0; i<${len}; i++ ));
do
cloudflared tunnel route dns $TUNNEL_ID ${SUBDOMAINS[$i]}.$DOMAIN
done
cloudflared tunnel route dns $TUNNEL_ID $DOMAIN
cloudflared tunnel run $TUNNEL_NAME
if [[ "$VERBOSE" -eq 1 ]]; then
echo "Complete!"
fi
+6 -1
View File
@@ -21,7 +21,12 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o /security-layer
# But we can document in the Dockerfile what ports # But we can document in the Dockerfile what ports
# the application is going to listen on by default. # the application is going to listen on by default.
# https://docs.docker.com/reference/dockerfile/#expose # https://docs.docker.com/reference/dockerfile/#expose
EXPOSE 8000
# TODO: Need to dynamically expose ports based upon ~/.config/one-ai/test.json
EXPOSE 1111
EXPOSE 1112
EXPOSE 1113
EXPOSE 1114
# Run # Run
CMD ["/security-layer"] CMD ["/security-layer"]
@@ -208,12 +208,12 @@ func validateHash(decrypted string, hash string) bool {
// Authentication takes place solely on the backend. // Authentication takes place solely on the backend.
func ServeAuthentication( func ServeAuthentication(
router *mux.Router, router *mux.Router,
port int, port string,
) { ) {
// TODO: Add error handling // TODO: Add error handling
authR := router.Host("http://localhost").Subrouter() authR := router.Host("http://localhost").Subrouter()
authSrv := &http.Server{ authSrv := &http.Server{
Addr: "0.0.0.0:" + string(port), Addr: "0.0.0.0:" + port,
WriteTimeout: time.Second * 15, WriteTimeout: time.Second * 15,
ReadTimeout: time.Second * 15, ReadTimeout: time.Second * 15,
IdleTimeout: time.Second * 60, IdleTimeout: time.Second * 60,
@@ -226,5 +226,5 @@ func ServeAuthentication(
} }
}() }()
log.Println("Auth server is running on port " + string(port)) log.Println("Auth server is running on port " + port)
} }
Binary file not shown.
@@ -113,7 +113,7 @@ func sendResponse(w http.ResponseWriter, encryptedMessage Communication) {
// If there's been no data corruption, re-construct user prompt for ollama // If there's been no data corruption, re-construct user prompt for ollama
// TODO: Eventually, add additional logic that will allow for re-direction and contextual awareness (pre-processing) // TODO: Eventually, add additional logic that will allow for re-direction and contextual awareness (pre-processing)
func chat(w http.ResponseWriter, r *http.Request) { func chat(w http.ResponseWriter, r *http.Request) {
model := "qwen:0.5b" // qwen:0.5b used for testing while hosting from my laptop. llama3 seems to be the best to use normally. model := "qwen2:1.5b" // qwen:1.5b used for testing while hosting from my laptop. llama3 seems to be the best to use normally.
input, err := io.ReadAll(r.Body) input, err := io.ReadAll(r.Body)
if err != nil { if err != nil {
@@ -128,7 +128,7 @@ func chat(w http.ResponseWriter, r *http.Request) {
// TODO: Add support for dynamically changing models. // TODO: Add support for dynamically changing models.
switch prompt.Filetype { switch prompt.Filetype {
case "txt": case "txt":
model = "qwen:0.5b" model = "qwen2:1.5b"
case "img": case "img":
model = "llava" model = "llava"
case "doc": case "doc":
@@ -175,7 +175,7 @@ func chat(w http.ResponseWriter, r *http.Request) {
} }
func generate(w http.ResponseWriter, r *http.Request) { func generate(w http.ResponseWriter, r *http.Request) {
model := "qwen:0.5b" // qwen:0.5b used for testing while hosting from my laptop. llama3 seems to be the best to use normally. model := "qwen2:1.5b" // qwen2:1.5b used for testing while hosting from my laptop. llama3 seems to be the best to use normally.
input, err := io.ReadAll(r.Body) input, err := io.ReadAll(r.Body)
if err != nil { if err != nil {
sendError(w, "Error reading request.") sendError(w, "Error reading request.")
@@ -195,7 +195,7 @@ func generate(w http.ResponseWriter, r *http.Request) {
// TODO: Add support for dynamically changing models. // TODO: Add support for dynamically changing models.
switch prompt.Filetype { switch prompt.Filetype {
case "txt": case "txt":
model = "qwen:0.5b" model = "qwen:1.5b"
case "img": case "img":
model = "llava" model = "llava"
case "doc": case "doc":
@@ -252,7 +252,7 @@ func serve() {
ServePage(r, config.WebpageDir, "/", config.WebpagePort) ServePage(r, config.WebpageDir, "/", config.WebpagePort)
ServeApi(r, config.API, endpoint, function, config.APIPort) ServeApi(r, config.API, endpoint, function, config.APIPort)
ServeAuthentication(r, config.AuthPort) ServeAuthentication(r, config.AuthPort)
addr := "0.0.0.0:" + string(config.RouterPort) addr := "0.0.0.0:" + config.RouterPort
srv := &http.Server{ srv := &http.Server{
Addr: addr, Addr: addr,
@@ -298,7 +298,7 @@ func serve() {
func parseCLI() { func parseCLI() {
// Define CLI option, shorthand, default value, and description // Define CLI option, shorthand, default value, and description
// TODO: Dynamically obtain default config location from environment variables. // TODO: Dynamically obtain default config location from environment variables.
pflag.StringP("config", "c", "/home/violet/.config/one-ai/default.json", "Configuration file used in initializing One AI.") pflag.StringP("config", "c", "/home/violet/.config/one-ai/test.json", "Configuration file used in initializing One AI.")
//pflag.StringP("help", "h", "false", "Display information about using the One AI CLI.") //pflag.StringP("help", "h", "false", "Display information about using the One AI CLI.")
pflag.Parse() pflag.Parse()
@@ -15,7 +15,7 @@ func ServeApi(
domain string, domain string,
endpoint []string, endpoint []string,
function []func(http.ResponseWriter, *http.Request), function []func(http.ResponseWriter, *http.Request),
port int, port string,
) { ) {
// TODO: Add error handling // TODO: Add error handling
apiR := router.Host(domain).Subrouter() apiR := router.Host(domain).Subrouter()
@@ -25,7 +25,7 @@ func ServeApi(
} }
apiSrv := &http.Server{ apiSrv := &http.Server{
Addr: "0.0.0.0:" + string(port), Addr: "0.0.0.0:" + port,
WriteTimeout: time.Second * 15, WriteTimeout: time.Second * 15,
ReadTimeout: time.Second * 15, ReadTimeout: time.Second * 15,
IdleTimeout: time.Second * 60, IdleTimeout: time.Second * 60,
@@ -38,5 +38,5 @@ func ServeApi(
} }
}() }()
log.Println("API server is running on port " + string(port)) log.Println("API server is running on port " + port)
} }
@@ -8,11 +8,11 @@ import (
) )
// Serve a directory to a port. // Serve a directory to a port.
func ServePage(router *mux.Router, dest string, path string, port int) { func ServePage(router *mux.Router, dest string, path string, port string) {
router.PathPrefix(path).Handler(http.FileServer(http.Dir(dest))) router.PathPrefix(path).Handler(http.FileServer(http.Dir(dest)))
srv := &http.Server{ srv := &http.Server{
Addr: "0.0.0.0: " + string(port), Addr: "0.0.0.0: " + port,
// Good practice to set timeouts to avoid Slowloris attacks. // Good practice to set timeouts to avoid Slowloris attacks.
WriteTimeout: time.Second * 15, WriteTimeout: time.Second * 15,
ReadTimeout: time.Second * 15, ReadTimeout: time.Second * 15,
@@ -27,5 +27,5 @@ func ServePage(router *mux.Router, dest string, path string, port int) {
} }
}() }()
log.Println("Web server is running on port " + string(port)) log.Println("Web server is running on port " + port)
} }
@@ -70,11 +70,11 @@ type ConfigStructure struct {
ResponseStream bool `mapstructure:"response_stream"` ResponseStream bool `mapstructure:"response_stream"`
Domain string `mapstructure:"domain"` Domain string `mapstructure:"domain"`
RouterPort int `mapstructure:"router_port"` RouterPort string `mapstructure:"router_port"`
API string `mapstructure:"api"` API string `mapstructure:"api"`
APIPort int `mapstructure:"api_port"` APIPort string `mapstructure:"api_port"`
AuthPort int `mapstructure:"auth_port"` AuthPort string `mapstructure:"auth_port"`
//Webpages WebpagesStructure `mapstructure:"webpages"` //Webpages WebpagesStructure `mapstructure:"webpages"`
WebpageDir string `mapstructure:"webpage_dir"` WebpageDir string `mapstructure:"webpage_dir"`
WebpagePort int `mapstructure:"webpage_port"` WebpagePort string `mapstructure:"webpage_port"`
} }
+2 -2
View File
@@ -5,5 +5,5 @@ sudo docker rm -f security-layer
# Build the Docker image. # Build the Docker image.
sudo docker build --tag security-layer:latest . sudo docker build --tag security-layer:latest .
# Create a Docker container from the image and connect host port 8000 to container port 8000. # Create a Docker container from the image and connect host port 1111 to container port 1111, and 1114 to 1114.
sudo docker run --name security-layer -d -p 8000:8000 security-layer:latest sudo docker run --name security-layer -d -p 1111:1111 -p 1114:1114 security-layer:latest
+9
View File
@@ -0,0 +1,9 @@
SUB=("api=1" "test=2" "portfolio=3")
arraylength=${#SUB[@]}
for (( i=0; i<${arraylength}; i++ ));
do
test="$(echo ${SUB[$i]} | cut -f1 -d=)"
test2="$(echo ${SUB[$i]} | cut -f2 -d=)"
echo $test $test2
done
@@ -1,5 +1,6 @@
#Sun Sep 01 20:23:42 MDT 2024
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip