get docker deploy working
This commit is contained in:
parent
7e0659cebe
commit
637bb6740c
10 changed files with 101 additions and 23 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -1,3 +1,4 @@
|
||||||
|
target/
|
||||||
node_modules
|
node_modules
|
||||||
.serverless
|
.serverless
|
||||||
.env
|
.env
|
||||||
|
|
@ -6,5 +7,5 @@ nostr/*
|
||||||
dist
|
dist
|
||||||
.clj-kondo/
|
.clj-kondo/
|
||||||
.lsp/
|
.lsp/
|
||||||
config.edn
|
|
||||||
.cpcache
|
.cpcache
|
||||||
|
.env
|
||||||
|
|
|
||||||
43
Dockerfile
Normal file
43
Dockerfile
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
# The default deploy instructions (https://biffweb.com/docs/reference/production/) don't
|
||||||
|
# use Docker, but this file is provided in case you'd like to deploy with containers.
|
||||||
|
#
|
||||||
|
# When running the container, make sure you set any environment variables defined in config.env,
|
||||||
|
# e.g. using whatever tools your deployment platform provides for setting environment variables.
|
||||||
|
#
|
||||||
|
# Run these commands to test this file locally:
|
||||||
|
#
|
||||||
|
# docker build -t your-app .
|
||||||
|
# docker run --rm -e BIFF_PROFILE=dev -v $PWD/config.env:/app/config.env your-app
|
||||||
|
|
||||||
|
# This is the base builder image, construct the jar file in this one
|
||||||
|
# it uses alpine for a small image
|
||||||
|
FROM clojure:temurin-21-tools-deps-alpine AS jre-build
|
||||||
|
|
||||||
|
# Install the missing packages and applications in a single layer
|
||||||
|
RUN apk add curl rlwrap
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY deps.edn ./
|
||||||
|
RUN clj -P
|
||||||
|
COPY build.clj config.edn ./
|
||||||
|
COPY src ./src
|
||||||
|
|
||||||
|
# construct the application jar
|
||||||
|
RUN clj -T:build uber && cp target/micro-blog-standalone.jar ./app.jar && rm -r target
|
||||||
|
|
||||||
|
# This stage (see multi-stage builds) is a bare Java container
|
||||||
|
# copy over the uberjar from the builder image and run the application
|
||||||
|
FROM eclipse-temurin:21-alpine
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Take the uberjar from the base image and put it in the final image
|
||||||
|
COPY --from=jre-build /app/app.jar /app/app.jar
|
||||||
|
COPY --from=jre-build /app/config.edn /app/
|
||||||
|
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# By default, run in PROD profile
|
||||||
|
# ENV BIFF_PROFILE=prod
|
||||||
|
ENV HOST=0.0.0.0
|
||||||
|
ENV PORT=8080
|
||||||
|
CMD ["/opt/java/openjdk/bin/java", "-XX:-OmitStackTraceInFastThrow", "-XX:+CrashOnOutOfMemoryError", "-jar", "app.jar"]
|
||||||
19
README.md
19
README.md
|
|
@ -17,7 +17,24 @@ instance.
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
|
|
||||||
TODO
|
Repl:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ clj
|
||||||
|
```
|
||||||
|
|
||||||
|
Build and run uber jar manually:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ clj -T:build uber
|
||||||
|
$ java -jar ./target/micro-blog-standalone.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
Build new docker image and push it to ECR
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ docker buildx build --platform linux/amd64,linux/arm64 -t 853019563312.dkr.ecr.eu-central-1.amazonaws.com/micro-blog-fetchers:2.0.1 --push .
|
||||||
|
```
|
||||||
|
|
||||||
## Project history
|
## Project history
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
(ns build
|
(ns build
|
||||||
(:require [clojure.tools.build.api :as b]))
|
(:require [clojure.tools.build.api :as b]))
|
||||||
|
|
||||||
(def lib 'snippets)
|
(def lib 'micro-blog)
|
||||||
|
|
||||||
(def class-dir "target/classes")
|
(def class-dir "target/classes")
|
||||||
(def uber-file (format "target/%s-standalone.jar" (name lib)))
|
(def uber-file (format "target/%s-standalone.jar" (name lib)))
|
||||||
|
|
@ -17,9 +17,9 @@
|
||||||
(b/copy-dir {:src-dirs ["src" "resources"]
|
(b/copy-dir {:src-dirs ["src" "resources"]
|
||||||
:target-dir class-dir})
|
:target-dir class-dir})
|
||||||
(b/compile-clj {:basis @basis
|
(b/compile-clj {:basis @basis
|
||||||
:ns-compile '[snippets.main]
|
:ns-compile '[micro-blog.main]
|
||||||
:class-dir class-dir})
|
:class-dir class-dir})
|
||||||
(b/uber {:class-dir class-dir
|
(b/uber {:class-dir class-dir
|
||||||
:uber-file uber-file
|
:uber-file uber-file
|
||||||
:basis @basis
|
:basis @basis
|
||||||
:main 'snippets.main}))
|
:main 'micro-blog.main}))
|
||||||
|
|
|
||||||
8
config.edn
Normal file
8
config.edn
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
{:mistral-agent-id "ag:e4f9e422:20250716:ismicroblogposttech:99ac9759"
|
||||||
|
:mistral-host "https://api.mistral.ai"
|
||||||
|
|
||||||
|
:pocket-base-user "micro_blog_fetchers"
|
||||||
|
:pocket-base-host "http://aemos:5000"
|
||||||
|
|
||||||
|
:blue-sky-host "https://bsky.social/xrpc"
|
||||||
|
:blue-sky-username "travisshears.bsky.social"}
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
{:mistral-api-key "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
|
||||||
:mistral-agent-id "ag:xxxxxxxx:xxxxxxxx:xxxxxxxxxxxxxxxxxxx:xxxxxxxx"
|
|
||||||
:mistral-host "https://api.mistral.ai"
|
|
||||||
|
|
||||||
:pocket-base-pw "xxxxxxxx"
|
|
||||||
:pocket-base-user "xxxxxxxxxxxxxxxxxxx"
|
|
||||||
:pocket-base-host "xxxxxxxxxxxxx"
|
|
||||||
|
|
||||||
:blue-sky-api-key "xxxxxxxxxxxxxxxxxxx"
|
|
||||||
:blue-sky-username "coolguy.bsky.social"}
|
|
||||||
5
deps.edn
5
deps.edn
|
|
@ -2,10 +2,11 @@
|
||||||
:deps {clj-http/clj-http {:mvn/version "3.13.1"}
|
:deps {clj-http/clj-http {:mvn/version "3.13.1"}
|
||||||
;; logging
|
;; logging
|
||||||
com.taoensso/telemere {:mvn/version "1.0.0"}
|
com.taoensso/telemere {:mvn/version "1.0.0"}
|
||||||
;; environment variables
|
|
||||||
environ/environ {:mvn/version "1.2.0"}
|
|
||||||
;; schema validation
|
;; schema validation
|
||||||
metosin/malli {:mvn/version "0.18.0"}
|
metosin/malli {:mvn/version "0.18.0"}
|
||||||
|
;; scheduling
|
||||||
|
jarohen/chime {:mvn/version "0.3.3"}
|
||||||
|
org.clojure/core.async {:mvn/version "1.8.741"}
|
||||||
;; json decoding
|
;; json decoding
|
||||||
cheshire/cheshire {:mvn/version "6.0.0"}
|
cheshire/cheshire {:mvn/version "6.0.0"}
|
||||||
;; metosin/muuntaja {:mvn/version "0.6.11"}
|
;; metosin/muuntaja {:mvn/version "0.6.11"}
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,7 @@
|
||||||
[clj-http.client :as http-client]
|
[clj-http.client :as http-client]
|
||||||
[micro-blog.pocket-base :as pb]
|
[micro-blog.pocket-base :as pb]
|
||||||
[micro-blog.utils :as utils]
|
[micro-blog.utils :as utils]
|
||||||
[malli.core :as m]
|
[taoensso.telemere :as tel]
|
||||||
[clojure.pprint :refer [pprint]]
|
|
||||||
[micro-blog.config :refer [config]]))
|
[micro-blog.config :refer [config]]))
|
||||||
|
|
||||||
(defn create-session []
|
(defn create-session []
|
||||||
|
|
@ -97,6 +96,7 @@
|
||||||
(map #(vector (:fullsize %) (:alt %)) images)))
|
(map #(vector (:fullsize %) (:alt %)) images)))
|
||||||
|
|
||||||
(defn run []
|
(defn run []
|
||||||
|
(tel/log! :info "Running blue sky fetcher")
|
||||||
(let [session (create-session)
|
(let [session (create-session)
|
||||||
last-saved-id (pb/get-latest-post-remote-id-by-source :blue_sky)
|
last-saved-id (pb/get-latest-post-remote-id-by-source :blue_sky)
|
||||||
new-posts (reverse (get-posts-until-id session last-saved-id))]
|
new-posts (reverse (get-posts-until-id session last-saved-id))]
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,18 @@
|
||||||
(ns micro-blog.config
|
(ns micro-blog.config
|
||||||
(:require [environ.core :refer [env]]))
|
(:require
|
||||||
|
[taoensso.telemere :as tel]))
|
||||||
|
|
||||||
(def ^:private env-overrides
|
(def ^:private env-overrides
|
||||||
{:minstral-api-key "MISTRAL_API_KEY"})
|
{:pocket-base-pw "POCKET_BASE_PW"
|
||||||
|
:pocket-base-host "POCKET_BASE_HOST"
|
||||||
|
:blue-sky-api-key "BLUE_SKY_API_KEY"
|
||||||
|
:minstral-api-key "MISTRAL_API_KEY"})
|
||||||
|
|
||||||
(defn- load-config []
|
(defn- load-config []
|
||||||
(println "config is being loaded")
|
(tel/log! :info "Config is being loaded")
|
||||||
(merge (read-string (slurp "config.edn"))
|
(merge (read-string (slurp "config.edn"))
|
||||||
(into {} (for [[k env-var] env-overrides
|
(into {} (for [[k env-var] env-overrides
|
||||||
:let [env-val (env env-var)]
|
:let [env-val (System/getenv env-var)]
|
||||||
:when env-val]
|
:when env-val]
|
||||||
[k env-val]))))
|
[k env-val]))))
|
||||||
|
|
||||||
|
|
|
||||||
14
src/micro_blog/main.clj
Normal file
14
src/micro_blog/main.clj
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
(ns micro-blog.main
|
||||||
|
(:gen-class)
|
||||||
|
(:import [java.time Instant Duration])
|
||||||
|
(:require [chime.core :as chime]
|
||||||
|
[taoensso.telemere :as tel]
|
||||||
|
[micro-blog.blue-sky :as blue-sky]))
|
||||||
|
|
||||||
|
(defn -main []
|
||||||
|
(tel/log! :info "Setting up crons")
|
||||||
|
(chime/chime-at (chime/periodic-seq (Instant/now) (Duration/ofMinutes 30))
|
||||||
|
(fn [_time]
|
||||||
|
(blue-sky/run)))
|
||||||
|
|
||||||
|
@(promise))
|
||||||
Loading…
Add table
Add a link
Reference in a new issue