Compare commits

...

3 Commits

Author SHA1 Message Date
Acid f45a94622e changed tree 2026-06-06 04:05:48 -04:00
Acid 9b59c36974 added db to docker-compose 2026-06-05 17:47:53 -04:00
Acid 031d3006d8 added db connections and ip login 2026-06-05 17:36:41 -04:00
8 changed files with 111 additions and 10 deletions
+14
View File
@@ -0,0 +1,14 @@
root = "."
tmp_dir = "tmp"
[build]
cmd = "go build -o ./tmp/main ./src"
bin = "./tmp/main"
include_ext = ["go", "html", "sql", "css", "js"]
include_dir = ["src", "templates", "static"]
exclude_dir = ["tmp", "scrap", ".git", ".vscode"]
delay = 1000
stop_on_error = true
[misc]
clean_on_exit = true
+3
View File
@@ -11,3 +11,6 @@ scrap/
*.sqlite3 *.sqlite3
*.db *.db
init.sql init.sql
.prettierignore
.vscode/
query.sql
+8 -1
View File
@@ -1,10 +1,17 @@
FROM golang:alpine AS builder FROM golang:alpine AS builder
# go-sqlite3 is a cgo package, so it needs a C toolchain
RUN apk add --no-cache gcc musl-dev
WORKDIR /app WORKDIR /app
COPY go.mod go.sum ./ COPY go.mod go.sum ./
COPY *.go ./ RUN go mod download
COPY src/*.go ./
COPY src/seed.sql ./
ENV CGO_ENABLED=1
RUN go build -o server . RUN go build -o server .
FROM alpine:latest FROM alpine:latest
+4
View File
@@ -1,6 +1,8 @@
services: services:
website: website:
env_file: .env env_file: .env
environment:
DB_PATH: /app/data/zum.db
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
@@ -8,4 +10,6 @@ services:
container_name: acidarchon.com container_name: acidarchon.com
ports: ports:
- 8088:8080 - 8088:8080
volumes:
- /dockers/acidarchon:/app/data
restart: unless-stopped restart: unless-stopped
+2 -2
View File
@@ -3,6 +3,6 @@ module acidburnmonkey/acidarchon
go 1.26.2 go 1.26.2
require ( require (
github.com/joho/godotenv v1.5.1 // indirect github.com/joho/godotenv v1.5.1
github.com/mattn/go-sqlite3 v1.14.44 // indirect github.com/mattn/go-sqlite3 v1.14.44
) )
+46
View File
@@ -0,0 +1,46 @@
package main
import (
"database/sql"
_ "embed"
"time"
_ "github.com/mattn/go-sqlite3"
)
//go:embed seed.sql
var seedSQL string
// logs level=('debug', 'info', 'warning', 'error')
type logs struct {
level string
ip string
traceback string
date time.Time
}
type dbStruct struct {
db *sql.DB
}
// Seed runs the schema in seed.sql. Idempotent via CREATE TABLE IF NOT EXISTS,
func (app *dbStruct) Seed() error {
_, err := app.db.Exec(seedSQL)
return err
}
// InsertLog() : database method, only inserts level + traceback
func (app *dbStruct) InsertLog(lg logs) error {
query := `INSERT INTO logs (level, traceback) VALUES (?, ?)`
_, err := app.db.Exec(query, lg.level, lg.traceback)
return err
}
// LogIp() : database method, logs level + Ip
func (app *dbStruct) LogIp(lg logs) error {
query := `INSERT INTO logs (level, ip) VALUES (?, ?)`
_, err := app.db.Exec(query, lg.level, lg.ip)
return err
}
+32 -4
View File
@@ -1,6 +1,7 @@
package main package main
import ( import (
"database/sql"
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
@@ -48,14 +49,32 @@ type TemolateData struct {
} }
func main() { func main() {
godotenv.Load()
mux := http.NewServeMux() mux := http.NewServeMux()
godotenv.Load() dbPath := os.Getenv("DB_PATH")
if dbPath == "" {
dbPath = "zum.db"
}
db, err := sql.Open("sqlite3", dbPath)
if err != nil {
slog.Error("err opening db")
return
}
defer db.Close()
database := &dbStruct{db: db}
if err := database.Seed(); err != nil {
slog.Error("seeding db", "err", err)
return
}
// routes // routes
mux.HandleFunc("/", handleRoot) mux.HandleFunc("/", database.handleRoot)
mux.HandleFunc("/robots.txt", serveRobots) mux.HandleFunc("/robots.txt", serveRobots)
mux.HandleFunc("/*", handleRoot) mux.HandleFunc("/*", database.handleRoot)
mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static")))) mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
@@ -64,10 +83,15 @@ func main() {
} }
// Routes // Routes
func handleRoot(w http.ResponseWriter, r *http.Request) {
// handleRoot() : part of dbStruct
func (app *dbStruct) handleRoot(w http.ResponseWriter, r *http.Request) {
templ, err := template.ParseFiles("templates/home.html") templ, err := template.ParseFiles("templates/home.html")
if err != nil { if err != nil {
http.Error(w, "template not found", http.StatusInternalServerError) http.Error(w, "template not found", http.StatusInternalServerError)
if logErr := app.InsertLog(logs{level: "error", traceback: "template not found"}); logErr != nil {
slog.Error("failed to write log", "err", logErr)
}
return return
} }
@@ -85,6 +109,10 @@ func handleRoot(w http.ResponseWriter, r *http.Request) {
dox := callApi(host) dox := callApi(host)
dox2 := secondApi(host) dox2 := secondApi(host)
if logErr := app.LogIp(logs{level: "info", ip: dox.IP}); logErr != nil {
slog.Error("failed to write log", "err", logErr)
}
templ.Execute(w, TemolateData{Ip: dox, IP2: *dox2}) templ.Execute(w, TemolateData{Ip: dox, IP2: *dox2})
} }
+1 -2
View File
@@ -3,6 +3,5 @@ CREATE TABLE IF NOT EXISTS logs (
level TEXT NOT NULL CHECK(level IN ('debug', 'info', 'warning', 'error')), level TEXT NOT NULL CHECK(level IN ('debug', 'info', 'warning', 'error')),
ip TEXT, ip TEXT,
traceback TEXT, traceback TEXT,
date DATETIME, date DATETIME DEFAULT (datetime('now', 'localtime'))
repeating INTEGER
); );