added Dockerfile & added --port --domain --skip-config-check flags

This commit is contained in:
partisan 2024-11-21 12:30:16 +01:00
parent 3ca7d57680
commit 28f71271d7
5 changed files with 249 additions and 18 deletions

32
Dockerfile Normal file
View file

@ -0,0 +1,32 @@
# Use Alpine Linux as the base image
FROM alpine:3.20
# Update and install Golang and Git
RUN apk update && apk add --no-cache go git
# Create a new user and switch to it
RUN adduser -D myuser
USER myuser
# Set the working directory
WORKDIR /home/myuser
# Clone the Git repository
RUN git clone https://weforge.xyz/Spitfire/Search.git
# Change directory to the cloned repository
WORKDIR /home/myuser/Search
# Ensure the run.sh script is executable
RUN chmod +x run.sh
# Expose the application's port
EXPOSE 5000
# Define environment variables for port and domain with default values
ENV PORT=
ENV DOMAIN=
ENV SKIP_CONFIG="--skip-config-check"
# Run the run.sh script on container start
CMD ["sh", "-c", "./run.sh $SKIP_CONFIG --port ${PORT:-} --domain ${DOMAIN:-}"]

103
README.md Normal file
View file

@ -0,0 +1,103 @@
<p align="center">
<img src="https://weforge.xyz/Spitfire/Branding/raw/commit/a80a6e075b8daffb54783d097ffa2da1da922128/icon11.svg" alt="Logo" width="64" height="64">
</p>
<p align="center" style="font-size: 32px;">
<strong><a href="https://qgato.xyz/">QGato Search Engine</a></strong>
</p>
<p align="center">
A self-hosted private <a href="https://en.wikipedia.org/wiki/Metasearch_engine">metasearch engine</a> that aims to be more resource-efficient than its competition.
</p>
# Bare in mind that this project is still WIP
## Comparison to other search engines
| Feature | Whoogle [1] | Araa-Search | LibreY | 4get | SearchXNG | *QGato* |
| :------------------------- | ------------------ | ------------------------- | ------------------------ | ------------------------ | ------------------------- | ---------------------------------------------------- |
| Works without JavaScript | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Music search | ❓ | ❌ | ❌ | ✅ | ✅ | ✅ |
| Torrent search | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ |
| API | ❌ | ❓ [2] | ✅ | ✅ | ✅ | ✅ |
| Scalable | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| Not Resource Hungry | ❓ Moderate | ❌ Very resource hungry | ❌ Moderate 200-400mb~ | ❌ Moderate 200-400mb~ | ❌ Moderate 200-300MiB~ | ✅ about 15-20MiB at idle, 17-22MiB when searching |
| Result caching | ❌ | ❌ | ❓ | ❓ | ❓ | ✅ |
| Dynamic Page Loading | ❓ Not specified | ❌ | ❌ | ❌ | ✅ | ✅ |
| User themable | ❌ | ✅ | ❌ | ❌ | ✅[3] | ✅ |
| Unusual logo choice | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ |
[1]: I was not able to check this since their site does not work, same for the community instances.
[2]: In the project repo they specify that it has API, but It looks like they are no loger supporting it. Or just removed "API" button and documentation, since I was not able to find it anymore.
[3]: It is called 'User Themable' because you want to give the user freedom of choice for their theme, not by hard-setting one theme in the backend and calling it themable.
## Features
### For Casual Users
- **Works out of the box** - No configuration required, just works by default.
- **No tracking or ads** - Fully private, ad-free experience.
- **Custom themes** - Personalize the look and feel.
- **Search suggestions** - Get faster results with helpful suggestions.
- **Privacy-first** - Open-source and transparent (unlike DuckDuckGo).
- **Annoyance-free** - No pop-ups, crypto, or clutter (I'm looking at you, Brave).
### For Self-Hosting
- **Self-hosted option** - Run on your own server for even more privacy.
- **Lightweight** - Low memory footprint (15-22MiB) even during searches.
- **Decentralized** - No single point of failure.
- **Results caching in RAM** - Faster response times through caching.
- **Configurable** - Tweak features via `config.ini`.
- **Flexible media support** - Images optionally stored on HDD/SSD for caching and improved response time.
### Results Sources
- **Search suggestions** - Sources include Yahoo, Startpage, Qwant, Ecosia, Brave, Edge, and DuckDuckGo.
- **Text search** - Google, Brave, DuckDuckGo, LibreX/Y.
- **Image search** - Sources include Qwant, Bing, and Imgur.
- **Video search** - Utilizes the Piped API.
- **Maps** - Integrated OpenStreetMap.
- **File downloads** - Access via torrent sources.
## Getting Started
### Prerequisites
- Go (version 1.18 or higher recommended)
- Git (unexpected)
- Access to the internet for fetching results (even more unexpected)
### Running the QGato
Linux:
```bash
git clone https://weforgecode.xyz/Spitfire/Search.git
cd Search
chmod +x ./run.sh
./run.sh
```
Windows:
```powershell
git clone https://weforgecode.xyz/Spitfire/Search.git
cd Search
.\run.bat
```
*Its that easy!*
### Configuring
Configuration is done via the ``config.ini`` file.
On first start, you will be guided through the basic setup.
More advanced setup and all options will be listed here later, as this is still being updated.
## License
[![](https://www.gnu.org/graphics/agplv3-with-text-162x68.png)](https://www.gnu.org/licenses/agpl-3.0.html)

49
init.go
View file

@ -1,6 +1,8 @@
package main
import (
"flag"
"os"
"time"
)
@ -35,14 +37,43 @@ const configFilePath = "config.ini"
var config Config
func main() {
err := initConfig()
if err != nil {
printErr("Error during initialization:")
return
// Command-line flags
portFlag := flag.Int("port", 0, "Port number to run the application (overrides config)")
domainFlag := flag.String("domain", "", "Domain address for the application (overrides config)")
skipConfigFlag := flag.Bool("skip-config-check", false, "Skip interactive prompts and load config.ini")
// Parse command-line flags
flag.Parse()
if *skipConfigFlag {
// Skip interactive configuration
if _, err := os.Stat(configFilePath); err == nil {
// Load from config file if it exists
config = loadConfig()
} else {
// Use defaults if config file does not exist
config = defaultConfig
saveConfig(config) // Save the defaults to config.ini
printInfo("Configuration saved to %s", configFilePath)
}
} else {
// Initialize configuration interactively or from config file
err := initConfig()
if err != nil {
printErr("Error during initialization:")
return
}
}
// Override with command-line arguments if provided
if *portFlag != 0 {
config.Port = *portFlag
}
if *domainFlag != "" {
config.Domain = *domainFlag
}
loadNodeConfig()
// go checkMasterHeartbeat() // Not currently used
if config.AuthCode == "" {
config.AuthCode = generateStrongRandomString(64)
@ -57,14 +88,6 @@ func main() {
}
config.PeerID = hostID
// if len(config.Peers) > 0 {
// time.Sleep(2 * time.Second) // Give some time for connections to establish
// startElection()
// }
// Start automatic update checker, not used now
//go checkForUpdates()
InitializeLanguage("en") // Initialize language before generating OpenSearch
generateOpenSearchXML(config)

42
run.bat
View file

@ -1,6 +1,36 @@
@echo off
setlocal enabledelayedexpansion
rem Initialize variables
set SKIP_CONFIG=""
set PORT=""
set DOMAIN=""
rem Parse arguments
:parse_args
if "%~1"=="" goto end_parse
if "%~1"=="--port" (
set PORT=%~2
shift
shift
goto parse_args
)
if "%~1"=="--domain" (
set DOMAIN=%~2
shift
shift
goto parse_args
)
if "%~1"=="--skip-config-check" (
set SKIP_CONFIG=--skip-config-check
shift
goto parse_args
)
echo Unknown argument: %~1
exit /b 1
:end_parse
rem Use the current directory where the script is executed
pushd %~dp0
@ -10,8 +40,16 @@ for %%f in (*.go) do (
set GO_FILES=!GO_FILES! %%f
)
rem Run the Go program with all the .go files
go run !GO_FILES!
rem Construct the command
set CMD=go run !GO_FILES! !SKIP_CONFIG!
if not "%PORT%"=="" set CMD=!CMD! --port %PORT%
if not "%DOMAIN%"=="" set CMD=!CMD! --domain %DOMAIN%
rem Informative output
echo Starting application with command: !CMD!
rem Run the Go program with the constructed command
call !CMD!
rem Return to the original directory
popd

41
run.sh
View file

@ -1,7 +1,42 @@
#!/bin/sh
# List all go files in this directory
# Initialize variables
SKIP_CONFIG=""
PORT=""
DOMAIN=""
# Parse arguments
while [ $# -gt 0 ]; do
case $1 in
--port)
PORT=$2
shift 2
;;
--domain)
DOMAIN=$2
shift 2
;;
--skip-config-check)
SKIP_CONFIG="--skip-config-check"
shift
;;
*)
echo "Unknown argument: $1"
exit 1
;;
esac
done
# List all Go files in this directory
GO_FILES=$(find . -name '*.go' -print)
# Run the Go program with the specified files first, followed by the remaining files
go run $FILES $GO_FILES
# Construct the command
CMD="go run $GO_FILES $SKIP_CONFIG"
[ -n "$PORT" ] && CMD="$CMD --port $PORT"
[ -n "$DOMAIN" ] && CMD="$CMD --domain $DOMAIN"
# Informative output
echo "Starting application with command: $CMD"
# Run the Go program with the constructed command
eval $CMD