docker: added dockerfile support
This commit is contained in:
parent
b066ba8d66
commit
84d4ecba5b
19
.dockerignore
Normal file
19
.dockerignore
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
.dockerignore
|
||||||
|
Dockerfile
|
||||||
|
.direnv
|
||||||
|
.git
|
||||||
|
/bin
|
||||||
|
public/
|
||||||
|
*_templ.go
|
||||||
|
/tmp
|
||||||
|
/rest
|
||||||
|
out
|
||||||
|
node_modules
|
||||||
|
.air.toml
|
||||||
|
.env
|
||||||
|
.envrc
|
||||||
|
.gitignore
|
||||||
|
*.db
|
||||||
|
flake.lock
|
||||||
|
flake.nix
|
||||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -29,7 +29,7 @@ public/htmx*.js
|
||||||
.direnv
|
.direnv
|
||||||
/tmp
|
/tmp
|
||||||
db/queries/**/*.go
|
db/queries/**/*.go
|
||||||
*.db
|
/*.db
|
||||||
|
|
||||||
public/*.min.js
|
public/*.min.js
|
||||||
|
|
||||||
|
|
30
Dockerfile
Normal file
30
Dockerfile
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
FROM node:22-bullseye AS web-builder
|
||||||
|
WORKDIR /web
|
||||||
|
COPY package.json package-lock.json ./
|
||||||
|
RUN npm install
|
||||||
|
COPY Makefile ./
|
||||||
|
COPY views ./views
|
||||||
|
COPY tailwind.config.js ./
|
||||||
|
RUN make web-build
|
||||||
|
|
||||||
|
FROM golang:1.22.1 AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY Makefile ./
|
||||||
|
RUN make build-dependencies
|
||||||
|
COPY go.mod go.sum ./
|
||||||
|
RUN go mod download
|
||||||
|
COPY . .
|
||||||
|
COPY --from=web-builder /web/public ./public
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/go-build \
|
||||||
|
./bin/templ generate && GOOS=linux GOARCH=amd64 go build -o /app/redmage main.go
|
||||||
|
|
||||||
|
|
||||||
|
FROM gcr.io/distroless/base:nonroot
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /app/redmage /app/redmage
|
||||||
|
ENV REDMAGE_FLAGS_CONTAINERIZED=true
|
||||||
|
ENV REDMAGE_DB_STRING=/app/db/data.db
|
||||||
|
ENV REDMAGE_PUBSUB_DB_NAME=/app/db/pubsub.db
|
||||||
|
ENV REDMAGE_DOWNLOAD_DIRECTORY=/app/downloads
|
||||||
|
ENV REDMAGE_RUNTIME_ENVIRONMENT=production
|
||||||
|
CMD [ "/app/redmage", "serve" ]
|
18
Makefile
18
Makefile
|
@ -27,8 +27,15 @@ build-dependencies:
|
||||||
@if ! command -v templ > /dev/null; then
|
@if ! command -v templ > /dev/null; then
|
||||||
mkdir -p bin
|
mkdir -p bin
|
||||||
echo "Templ not found in PATH, installing it to $(shell pwd)/bin/templ"
|
echo "Templ not found in PATH, installing it to $(shell pwd)/bin/templ"
|
||||||
go install github.com/a-h/templ/cmd/templ@v0.2.648
|
go install github.com/a-h/templ/cmd/templ@v0.2.663
|
||||||
fi
|
fi
|
||||||
|
@if ! command -v goose > /dev/null; then
|
||||||
|
mkdir -p bin
|
||||||
|
echo "Goose not found in PATH, installing it to $(shell pwd)/bin/goose"
|
||||||
|
go install github.com/pressly/goose/v3/cmd/goose@latest
|
||||||
|
fi
|
||||||
|
|
||||||
|
web-dependencies:
|
||||||
@if [ ! -d "node_modules" ]; then
|
@if [ ! -d "node_modules" ]; then
|
||||||
echo "Node modules not found, installing them"
|
echo "Node modules not found, installing them"
|
||||||
npm install
|
npm install
|
||||||
|
@ -69,9 +76,16 @@ build-dependencies:
|
||||||
curl -o public/alpinejs-${REDMAGE_WEB_DEPENDENCIES_ALPINEJS_VERSION}.min.js https://cdn.jsdelivr.net/npm/alpinejs@${REDMAGE_WEB_DEPENDENCIES_ALPINEJS_VERSION}/dist/cdn.min.js
|
curl -o public/alpinejs-${REDMAGE_WEB_DEPENDENCIES_ALPINEJS_VERSION}.min.js https://cdn.jsdelivr.net/npm/alpinejs@${REDMAGE_WEB_DEPENDENCIES_ALPINEJS_VERSION}/dist/cdn.min.js
|
||||||
fi
|
fi
|
||||||
|
|
||||||
build: build-dependencies prepare
|
web-build: web-dependencies
|
||||||
|
mkdir -p public
|
||||||
|
npx tailwindcss -i views/style.css -o public/style.css
|
||||||
|
|
||||||
|
build: web-dependencies build-dependencies prepare
|
||||||
go build -o redmage
|
go build -o redmage
|
||||||
|
|
||||||
|
build-docker: migrate-up
|
||||||
|
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o redmage
|
||||||
|
|
||||||
prepare: gen
|
prepare: gen
|
||||||
mkdir -p public
|
mkdir -p public
|
||||||
tailwindcss -i views/style.css -o public/style.css
|
tailwindcss -i views/style.css -o public/style.css
|
||||||
|
|
15
db/db.go
15
db/db.go
|
@ -3,6 +3,8 @@ package db
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
_ "github.com/mattn/go-sqlite3"
|
_ "github.com/mattn/go-sqlite3"
|
||||||
"github.com/pressly/goose/v3"
|
"github.com/pressly/goose/v3"
|
||||||
|
@ -19,11 +21,22 @@ var Migrations fs.FS
|
||||||
func Open(cfg *config.Config) (*sql.DB, error) {
|
func Open(cfg *config.Config) (*sql.DB, error) {
|
||||||
driver := cfg.String("db.driver")
|
driver := cfg.String("db.driver")
|
||||||
dsn := cfg.String("db.string")
|
dsn := cfg.String("db.string")
|
||||||
|
if driver == "sqlite3" {
|
||||||
|
path, err := filepath.Abs(dsn)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errs.Wrapw(err, "failed to get absolute path of sqlite3 database", "path", dsn)
|
||||||
|
}
|
||||||
|
dir := filepath.Dir(path)
|
||||||
|
err = os.MkdirAll(dir, 0777)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errs.Wrapw(err, "failed to create directory for sqlite3 database", "dir", dir)
|
||||||
|
}
|
||||||
|
}
|
||||||
db, err := otelsql.Open(driver, dsn, otelsql.WithAttributes(
|
db, err := otelsql.Open(driver, dsn, otelsql.WithAttributes(
|
||||||
semconv.DBSystemSqlite,
|
semconv.DBSystemSqlite,
|
||||||
))
|
))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return db, errs.Wrapw(err, "failed to open database", "driver", driver)
|
return db, errs.Wrapw(err, "failed to open database", "driver", driver, "db.string", dsn)
|
||||||
}
|
}
|
||||||
if cfg.Bool("db.automigrate") {
|
if cfg.Bool("db.automigrate") {
|
||||||
goose.SetLogger(goose.NopLogger())
|
goose.SetLogger(goose.NopLogger())
|
||||||
|
|
Loading…
Reference in a new issue