added db to docker-compose

This commit is contained in:
Acid
2026-06-05 17:47:53 -04:00
parent 031d3006d8
commit 9b59c36974
5 changed files with 46 additions and 15 deletions
+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 *.go ./
COPY seed.sql ./
ENV CGO_ENABLED=1
RUN go build -o server . RUN go build -o server .
FROM alpine:latest FROM alpine:latest
+16 -10
View File
@@ -2,12 +2,15 @@ package main
import ( import (
"database/sql" "database/sql"
"log" _ "embed"
"time" "time"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
//go:embed seed.sql
var seedSQL string
// logs level=('debug', 'info', 'warning', 'error') // logs level=('debug', 'info', 'warning', 'error')
type logs struct { type logs struct {
level string level string
@@ -20,22 +23,25 @@ type dbStruct struct {
db *sql.DB db *sql.DB
} }
// Seed runs the schema in seed.sql. Idempotent via CREATE TABLE IF NOT EXISTS,
// so it's safe to call on every startup.
func (app *dbStruct) Seed() error {
_, err := app.db.Exec(seedSQL)
return err
}
// InsertLog() : database method, only inserts level + traceback // InsertLog() : database method, only inserts level + traceback
func (app *dbStruct) InsertLog(lg logs) { func (app *dbStruct) InsertLog(lg logs) error {
query := `INSERT INTO logs (level, traceback) VALUES (?, ?)` query := `INSERT INTO logs (level, traceback) VALUES (?, ?)`
_, err := app.db.Exec(query, lg.level, lg.traceback) _, err := app.db.Exec(query, lg.level, lg.traceback)
if err != nil { return err
log.Fatal(err)
}
} }
// InsertLog() : database method, logs level + Ip // LogIp() : database method, logs level + Ip
func (app *dbStruct) LogIp(lg logs) { func (app *dbStruct) LogIp(lg logs) error {
query := `INSERT INTO logs (level, ip) VALUES (?, ?)` query := `INSERT INTO logs (level, ip) VALUES (?, ?)`
_, err := app.db.Exec(query, lg.level, lg.ip) _, err := app.db.Exec(query, lg.level, lg.ip)
if err != nil { return err
log.Fatal(err)
}
} }
+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
+17 -3
View File
@@ -52,7 +52,12 @@ func main() {
godotenv.Load() godotenv.Load()
mux := http.NewServeMux() mux := http.NewServeMux()
db, err := sql.Open("sqlite3", "zum.db") dbPath := os.Getenv("DB_PATH")
if dbPath == "" {
dbPath = "zum.db"
}
db, err := sql.Open("sqlite3", dbPath)
if err != nil { if err != nil {
slog.Error("err opening db") slog.Error("err opening db")
return return
@@ -61,6 +66,11 @@ func main() {
database := &dbStruct{db: db} database := &dbStruct{db: db}
if err := database.Seed(); err != nil {
slog.Error("seeding db", "err", err)
return
}
// routes // routes
mux.HandleFunc("/", database.handleRoot) mux.HandleFunc("/", database.handleRoot)
mux.HandleFunc("/robots.txt", serveRobots) mux.HandleFunc("/robots.txt", serveRobots)
@@ -79,7 +89,9 @@ 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)
app.InsertLog(logs{level: "error", traceback: "template not found"}) if logErr := app.InsertLog(logs{level: "error", traceback: "template not found"}); logErr != nil {
slog.Error("failed to write log", "err", logErr)
}
return return
} }
@@ -97,7 +109,9 @@ func (app *dbStruct) handleRoot(w http.ResponseWriter, r *http.Request) {
dox := callApi(host) dox := callApi(host)
dox2 := secondApi(host) dox2 := secondApi(host)
app.LogIp(logs{level: "info", ip: dox.IP}) 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 -1
View File
@@ -3,5 +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 DEFAULT (datetime('now', 'localtime')), date DATETIME DEFAULT (datetime('now', 'localtime'))
); );