{"id":16278260,"url":"https://github.com/gbaptista/datomic-pro-docker","last_synced_at":"2025-08-03T04:32:54.601Z","repository":{"id":208722518,"uuid":"722283734","full_name":"gbaptista/datomic-pro-docker","owner":"gbaptista","description":"Setting up Datomic Pro for Docker with Docker Compose.","archived":false,"fork":false,"pushed_at":"2024-10-06T12:56:53.000Z","size":50,"stargazers_count":10,"open_issues_count":0,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-11T18:57:53.945Z","etag":null,"topics":["clojure","datalog","datomic","datomic-database","datomic-flare","datomic-pro"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gbaptista.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-11-22T20:16:17.000Z","updated_at":"2024-10-06T12:56:56.000Z","dependencies_parsed_at":"2023-11-23T00:36:32.005Z","dependency_job_id":null,"html_url":"https://github.com/gbaptista/datomic-pro-docker","commit_stats":null,"previous_names":["gbaptista/datomic-pro-docker"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fdatomic-pro-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fdatomic-pro-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fdatomic-pro-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbaptista%2Fdatomic-pro-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gbaptista","download_url":"https://codeload.github.com/gbaptista/datomic-pro-docker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223130175,"owners_count":17092241,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clojure","datalog","datomic","datomic-database","datomic-flare","datomic-pro"],"created_at":"2024-10-10T18:57:59.449Z","updated_at":"2024-11-05T07:02:06.204Z","avatar_url":"https://github.com/gbaptista.png","language":"Dockerfile","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Datomic Pro for Docker\n\nSetting up Datomic Pro for Docker with Docker Compose.\n\n![The image features a logo with curved lines forming a whale, suggesting distortion and movement like space-time.](https://raw.githubusercontent.com/gbaptista/assets/refs/heads/main/datomic-pro-docker/datomic-pro-docker-canvas.jpg)\n\n\u003e _As of April 27, 2023, [Datomic Pro is free](https://blog.datomic.com/2023/04/datomic-is-free.html)!_\n\n_This is not an official Datomic project or documentation and is not affiliated with Datomic in any way._\n\n## TL;DR and Quick Start\n\nAssuming you want to use PostgreSQL as your storage service:\n\n```bash\ngit clone https://github.com/gbaptista/datomic-pro-docker.git\n\ncd datomic-pro-docker\n\ncp compose/datomic-postgresql.yml docker-compose.yml\n\ndocker compose up datomic-storage\n\ndocker compose run datomic-tools psql \\\n  -h datomic-storage \\\n  -U datomic-user \\\n  -d my-datomic-storage \\\n  -c 'CREATE TABLE datomic_kvs (\n        id TEXT NOT NULL,\n        rev INTEGER,\n        map TEXT,\n        val BYTEA,\n        CONSTRAINT pk_id PRIMARY KEY (id)\n      );'\n\n# password: unsafe\n\ndocker compose up datomic-transactor\n\ndocker compose run datomic-tools clojure -M -e \"$(cat \u003c\u003c'CLOJURE'\n  (require '[datomic.api :as d])\n  (d/create-database \"datomic:sql://my-datomic-database?jdbc:postgresql://datomic-storage:5432/my-datomic-storage?user=datomic-user\u0026password=unsafe\")\n  (System/exit 0)\nCLOJURE\n)\"\n```\n\n```bash\ndocker compose run datomic-tools clojure -M:repl\n```\n\n```mermaid\ngraph RL\n    Transactor --- Storage[(\"Storage\")]\n    REPL(\"REPL (Peer)\") -.- Storage\n    REPL --- Transactor\n```\n\n```clojure\n(require '[datomic.api :as d])\n\n(def connection (d/connect \"datomic:sql://my-datomic-database?jdbc:postgresql://datomic-storage:5432/my-datomic-storage?user=datomic-user\u0026password=unsafe\"))\n\n@(d/transact connection\n  [{:db/ident       :book/title\n    :db/valueType   :db.type/string\n    :db/cardinality :db.cardinality/one\n    :db/doc         \"The title of the book.\"}\n\n    {:db/ident       :book/genre\n    :db/valueType   :db.type/string\n    :db/cardinality :db.cardinality/one\n    :db/doc         \"The genre of the book.\"}])\n\n@(d/transact connection\n  [{:db/id      -1\n    :book/title \"The Tell-Tale Heart\"\n    :book/genre \"Horror\"}])\n\n(def database (d/db connection))\n\n(d/q '[:find ?e ?title ?genre\n       :where [?e :book/title ?title]\n              [?e :book/genre ?genre]]\n     database)\n\n; #{[4611681620380877802 \"The Tell-Tale Heart\" \"Horror\"]}\n\n(System/exit 0)\n```\n\n## Index\n\n- [TL;DR and Quick Start](#tldr-and-quick-start)\n- [Index](#index)\n- [Flavors](#flavors)\n  - [PostgreSQL as Storage Service](#postgresql-as-storage-service)\n    - [Run PostgreSQL as the Storage Service](#run-postgresql-as-the-storage-service)\n    - [Run the Transactor](#run-the-transactor)\n    - [Create a Database](#create-a-database)\n    - [Transact and Query through an Embedded Peer](#transact-and-query-through-an-embedded-peer)\n    - [Run a Peer Server](#run-a-peer-server)\n    - [Transact and Query through a Peer Server](#transact-and-query-through-a-peer-server)\n  - [Dev Mode](#dev-mode)\n    - [Run the Transactor](#run-the-transactor)\n    - [Create a Database](#create-a-database)\n    - [Transact and Query through an Embedded Peer](#transact-and-query-through-an-embedded-peer)\n    - [Run a Peer Server](#run-a-peer-server)\n    - [Transact and Query through a Peer Server](#transact-and-query-through-a-peer-server)\n- [Utilities](#utilities)\n  - [REPL](#repl)\n  - [Datomic Console](#datomic-console)\n  - [MusicBrainz Sample Database](#musicbrainz-sample-database)\n    - [Restoring with PostgreSQL as Storage Service](#restoring-with-postgresql-as-storage-service)\n      - [Exploring the Data](#exploring-the-data)\n    - [Restoring with Dev Mode](#restoring-with-dev-mode)\n      - [Exploring the Data](#exploring-the-data)\n- [Development](#development)\n  - [Principles](#principles)\n    - [First Time to Joy](#first-time-to-joy)\n    - [Predictable and Reliable](#predictable-and-reliable)\n    - [Lightweight Images](#lightweight-images)\n  - [Updating the README](#updating-the-readme)\n  - [Clojure Dependencies](#clojure-dependencies)\n\n## Flavors\n\n### PostgreSQL as Storage Service\n\n#### Run PostgreSQL as the Storage Service\n\n```sh\ncp compose/datomic-postgresql.yml docker-compose.yml\n\ndocker compose up datomic-storage\n```\n\nCreate the table for Datomic databases:\n\n```bash\ndocker compose run datomic-tools psql \\\n  -h datomic-storage \\\n  -U datomic-user \\\n  -d my-datomic-storage \\\n  -c 'CREATE TABLE datomic_kvs (\n        id TEXT NOT NULL,\n        rev INTEGER,\n        map TEXT,\n        val BYTEA,\n        CONSTRAINT pk_id PRIMARY KEY (id)\n      );'\n```\n\nYou will be prompted for a password, which is `unsafe`.\n\n#### Run the Transactor\n\n```sh\ndocker compose up datomic-transactor\n```\n\n#### Create a Database\n\n```sh\ndocker compose run datomic-tools clojure -M -e \"$(cat \u003c\u003c'CLOJURE'\n  (require '[datomic.api :as d])\n  (d/create-database \"datomic:sql://my-datomic-database?jdbc:postgresql://datomic-storage:5432/my-datomic-storage?user=datomic-user\u0026password=unsafe\")\n  (System/exit 0)\nCLOJURE\n)\"\n```\n\n#### Transact and Query through an Embedded Peer\n\n```bash\ndocker compose run datomic-tools clojure -M:repl\n```\n\n```mermaid\ngraph RL\n    Transactor --- Storage[(Storage)]\n    REPL(\"REPL (Peer)\") -.- Storage\n    REPL --- Transactor\n```\n\n```clojure\n(require '[datomic.api :as d])\n\n(def connection (d/connect \"datomic:sql://my-datomic-database?jdbc:postgresql://datomic-storage:5432/my-datomic-storage?user=datomic-user\u0026password=unsafe\"))\n\n@(d/transact connection\n  [{:db/ident       :book/title\n    :db/valueType   :db.type/string\n    :db/cardinality :db.cardinality/one\n    :db/doc         \"The title of the book.\"}\n\n   {:db/ident       :book/genre\n    :db/valueType   :db.type/string\n    :db/cardinality :db.cardinality/one\n    :db/doc         \"The genre of the book.\"}])\n\n@(d/transact connection\n  [{:db/id      -1\n    :book/title \"The Tell-Tale Heart\"\n    :book/genre \"Horror\"}])\n\n(def database (d/db connection))\n\n(d/q '[:find ?e ?title ?genre\n       :where [?e :book/title ?title]\n              [?e :book/genre ?genre]]\n     database)\n\n; #{[4611681620380877802 \"The Tell-Tale Heart\" \"Horror\"]}\n\n(System/exit 0)\n```\n\n#### Run a Peer Server\n\n```bash\ndocker compose up datomic-peer-server\n```\n\n#### Transact and Query through a Peer Server\n\n```bash\ndocker compose run datomic-tools clojure -M:repl\n```\n\n```mermaid\ngraph RL\n    Transactor --- Storage\n    PeerServer --- Transactor\n    PeerServer -.- Storage\n    REPL(REPL) --- PeerServer[Peer Server]\n```\n\n```clojure\n(require '[datomic.client.api :as d])\n\n(def client\n  (d/client {:server-type :peer-server\n             :endpoint    \"datomic-peer-server:8998\"\n             :secret      \"unsafe-secret\"\n             :access-key  \"unsafe-key\"\n             :validate-hostnames false}))\n\n(def connection (d/connect client {:db-name \"my-datomic-database\"}))\n\n(d/transact connection\n  {:tx-data [{:db/ident       :book/title\n              :db/valueType   :db.type/string\n              :db/cardinality :db.cardinality/one\n              :db/doc         \"The title of the book.\"}\n\n             {:db/ident       :book/genre\n              :db/valueType   :db.type/string\n              :db/cardinality :db.cardinality/one\n              :db/doc         \"The genre of the book.\"}]})\n\n(d/transact connection\n  {:tx-data [{:db/id      -1\n              :book/title \"The Tell-Tale Heart\"\n              :book/genre \"Horror\"}]})\n\n(def database (d/db connection))\n\n(d/q '[:find ?e ?title ?genre\n       :where [?e :book/title ?title]\n              [?e :book/genre ?genre]]\n     database)\n\n; #{[4611681620380877802 \"The Tell-Tale Heart\" \"Horror\"]}\n\n(System/exit 0)\n```\n\n### Dev Mode\n\n#### Run the Transactor\n\n```sh\ncp compose/datomic-dev-mode.yml docker-compose.yml\n\ndocker compose up datomic-transactor\n```\n\n#### Create a Database\n\n```sh\ndocker compose run datomic-tools clojure -M -e \"$(cat \u003c\u003c'CLOJURE'\n  (require '[datomic.api :as d])\n  (d/create-database \"datomic:dev://datomic-transactor:4334/my-datomic-database/?password=unsafe\")\n  (System/exit 0)\nCLOJURE\n)\"\n```\n\n#### Transact and Query through an Embedded Peer\n\n```bash\ndocker compose run datomic-tools clojure -M:repl\n```\n\n```mermaid\ngraph RL\n    Transactor --- Storage[(\"Memory\")]\n    REPL(\"REPL (Peer)\") -.- Transactor\n    REPL --- Transactor\n```\n\n```clojure\n(require '[datomic.api :as d])\n\n(def connection (d/connect \"datomic:dev://datomic-transactor:4334/my-datomic-database/?password=unsafe\"))\n\n@(d/transact connection\n  [{:db/ident       :book/title\n    :db/valueType   :db.type/string\n    :db/cardinality :db.cardinality/one\n    :db/doc         \"The title of the book.\"}\n\n   {:db/ident       :book/genre\n    :db/valueType   :db.type/string\n    :db/cardinality :db.cardinality/one\n    :db/doc         \"The genre of the book.\"}])\n\n@(d/transact connection\n  [{:db/id      -1\n    :book/title \"The Tell-Tale Heart\"\n    :book/genre \"Horror\"}])\n\n(def database (d/db connection))\n\n(d/q '[:find ?e ?title ?genre\n       :where [?e :book/title ?title]\n              [?e :book/genre ?genre]]\n     database)\n\n; #{[4611681620380877802 \"The Tell-Tale Heart\" \"Horror\"]}\n\n(System/exit 0)\n```\n\n#### Run a Peer Server\n\n```bash\ndocker compose up datomic-peer-server\n```\n\n#### Transact and Query through a Peer Server\n\n```bash\ndocker compose run datomic-tools clojure -M:repl\n```\n\n```mermaid\ngraph RL\n    Transactor --- Storage[(\"Memory\")]\n    PeerServer(Peer Server) --- Transactor\n    PeerServer -.- Transactor\n    REPL --- PeerServer\n    REPL -.- PeerServer\n```\n\n```clojure\n(require '[datomic.client.api :as d])\n\n(def client\n  (d/client {:server-type :peer-server\n             :endpoint    \"datomic-peer-server:8998\"\n             :secret      \"unsafe-secret\"\n             :access-key  \"unsafe-key\"\n             :validate-hostnames false}))\n\n(def connection (d/connect client {:db-name \"my-datomic-database\"}))\n\n(d/transact connection\n  {:tx-data [{:db/ident       :book/title\n              :db/valueType   :db.type/string\n              :db/cardinality :db.cardinality/one\n              :db/doc         \"The title of the book.\"}\n\n             {:db/ident       :book/genre\n              :db/valueType   :db.type/string\n              :db/cardinality :db.cardinality/one\n              :db/doc         \"The genre of the book.\"}]})\n\n(d/transact connection\n  {:tx-data [{:db/id      -1\n              :book/title \"The Tell-Tale Heart\"\n              :book/genre \"Horror\"}]})\n\n(def database (d/db connection))\n\n(d/q '[:find ?e ?title ?genre\n       :where [?e :book/title ?title]\n              [?e :book/genre ?genre]]\n     database)\n\n; #{[4611681620380877802 \"The Tell-Tale Heart\" \"Horror\"]}\n\n(System/exit 0)\n```\n\n## Utilities\n\n### REPL\n\nStarting a REPL:\n```sh\ndocker compose run datomic-tools clojure -M:repl\n```\n\nTo exit the REPL:\n```clojure\n(System/exit 0)\n```\n\n### Datomic Console\n\nTo run [Datomic Console](https://docs.datomic.com/resources/console.html):\n\n```sh\ndocker compose up datomic-console\n```\n\nhttp://localhost:8080/browse\n\n![Screenshot of the Datomic Console interface](https://docs.datomic.com/pro/images/console-window.png \"Screenshot of the Datomic Console interface\")\n\n### MusicBrainz Sample Database\n\nThe MusicBrainz Sample Database, sourced from the open music encyclopedia [MusicBrainz](https://musicbrainz.org), is useful for exploring Datomic with a pre-populated database.\n\nA backup is already included in the `datomic-tools` image; to restore it:\n\n#### Restoring with PostgreSQL as Storage Service\n\n```sh\ndocker compose run datomic-tools \\\n  sh -c \"/usr/download-mbrainz.sh \u0026\u0026 \\\n  ./bin/datomic restore-db \\\n  file:/usr/mbrainz-1968-1973 \\\n  'datomic:sql://my-datomic-database?jdbc:postgresql://datomic-storage:5432/my-datomic-storage?user=datomic-user\u0026password=unsafe'\"\n```\n\nIf you are receiving:\n```txt\n:restore/collision The name 'my-datomic-database' is already in use\n```\n\nYou need to delete the current database so you can restore a new one:\n\n```bash\ndocker compose run datomic-tools clojure -M -e \"$(cat \u003c\u003c'CLOJURE'\n  (require '[datomic.api :as d])\n  (d/delete-database \"datomic:sql://my-datomic-database?jdbc:postgresql://datomic-storage:5432/my-datomic-storage?user=datomic-user\u0026password=unsafe\")\n  (System/exit 0)\nCLOJURE\n)\"\n```\n\n##### Exploring the Data\n\n```bash\ndocker compose run datomic-tools clojure -M:repl\n```\n\n```clojure\n(require '[datomic.api :as d])\n\n(def connection (d/connect \"datomic:sql://my-datomic-database?jdbc:postgresql://datomic-storage:5432/my-datomic-storage?user=datomic-user\u0026password=unsafe\"))\n\n(def database (d/db connection))\n\n(d/q '[:find ?id ?type ?gender\n         :in $ ?name\n       :where\n         [?e :artist/name ?name]\n         [?e :artist/gid ?id]\n         [?e :artist/type ?teid]\n         [?teid :db/ident ?type]\n         [?e :artist/gender ?geid]\n         [?geid :db/ident ?gender]]\n     database\n     \"Jimi Hendrix\")\n\n(System/exit 0)\n```\n\n#### Restoring with Dev Mode\n\n```sh\ndocker compose run datomic-tools \\\n  sh -c \"/usr/download-mbrainz.sh \u0026\u0026 \\\n  ./bin/datomic restore-db \\\n  file:/usr/mbrainz-1968-1973 \\\n  'datomic:dev://datomic-transactor:4334/my-datomic-database?password=unsafe'\"\n```\n\nIf you are receiving:\n```txt\n:restore/collision The name 'my-datomic-database' is already in use\n```\n\nYou need to delete the current database so you can restore a new one:\n\n```bash\ndocker compose run datomic-tools clojure -M -e \"$(cat \u003c\u003c'CLOJURE'\n  (require '[datomic.api :as d])\n  (d/delete-database \"datomic:dev://datomic-transactor:4334/my-datomic-database?password=unsafe\")\n  (System/exit 0)\nCLOJURE\n)\"\n```\n\n##### Exploring the Data\n\n```bash\ndocker compose run datomic-tools clojure -M:repl\n```\n\n```clojure\n(require '[datomic.api :as d])\n\n(def connection (d/connect \"datomic:dev://datomic-transactor:4334/my-datomic-database?password=unsafe\"))\n\n(def database (d/db connection))\n\n(d/q '[:find ?id ?type ?gender\n         :in $ ?name\n       :where\n         [?e :artist/name ?name]\n         [?e :artist/gid ?id]\n         [?e :artist/type ?teid]\n         [?teid :db/ident ?type]\n         [?e :artist/gender ?geid]\n         [?geid :db/ident ?gender]]\n     database\n     \"Jimi Hendrix\")\n\n(System/exit 0)\n```\n\n## Development\n\n### Principles\n\n#### First Time to Joy\n\nFrom cloning the repository to running 'hello world,' the goal is to minimize setup and boot time. Download delays, long build or boot times, and flakiness are obstacles.\n\n#### Predictable and Reliable\n\nAssets must state version numbers and be verified with MD5 checksums to ensure integrity and security.\n\n#### Lightweight Images\n\nMinimize Docker image size with lightweight base images and multi-stage builds.\n\n### Updating the README\n\nInstall [Babashka](https://babashka.org):\n\n```sh\ncurl -s https://raw.githubusercontent.com/babashka/babashka/master/install | sudo bash\n```\n\nUpdate the `template.md` file and then:\n\n```sh\nbb tasks/generate-readme.clj\n```\n\nTrick for automatically updating the `README.md` when `template.md` changes:\n\n```sh\nsudo pacman -S inotify-tools # Arch / Manjaro\nsudo apt-get install inotify-tools # Debian / Ubuntu / Raspberry Pi OS\nsudo dnf install inotify-tools # Fedora / CentOS / RHEL\n\nwhile inotifywait -e modify template.md; do bb tasks/generate-readme.clj; done\n```\n\nTrick for Markdown Live Preview:\n```sh\npip install -U markdown_live_preview\n\nmlp README.md -p 8076\n```\n\n### Clojure Dependencies\n\n- [org.clojure/clojure](https://central.sonatype.com/artifact/org.clojure/clojure/overview)\n- [com.datomic/peer](https://central.sonatype.com/artifact/com.datomic/peer/overview)\n- [com.datomic/client-pro](https://central.sonatype.com/artifact/com.datomic/client-pro/overview)\n- [org.postgresql/postgresql](https://central.sonatype.com/artifact/org.postgresql/postgresql)\n- [org.slf4j/slf4j-simple](https://central.sonatype.com/artifact/org.slf4j/slf4j-simple)\n- [com.bhauman/rebel-readline](https://clojars.org/com.bhauman/rebel-readline)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbaptista%2Fdatomic-pro-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgbaptista%2Fdatomic-pro-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbaptista%2Fdatomic-pro-docker/lists"}