Skip to content

Instantly share code, notes, and snippets.

@zkat
Created December 11, 2023 19:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zkat/cced87b287dc7ee04ff030eb12ea8d3a to your computer and use it in GitHub Desktop.
Save zkat/cced87b287dc7ee04ff030eb12ea8d3a to your computer and use it in GitHub Desktop.
Docker Compose in KDL
// This is a KDL translation of https://gitea.treehouse.systems/treehouse/mastodon/src/branch/main/docker-compose.yml,
// with some examples of proposed KDL 2.0 grammar sprinkled in with comments.
version "3"
services {
db {
restart "always"
image "postgres:14-alpine"
shm_size "256mb"
networks {
- "internal_network"
}
healthcheck {
test "CMD" "pg_isready" "-U" "postgres"
}
volumes {
- "./postgres14:/var/lib/postgresql/data"
}
environment {
- "POSTGRES_HOST_AUTH_METHOD=trust"
}
}
redis {
restart "always"
image "redis:7-alpine"
// If you don't have a lot of items in your "arrays", you can just use a
// flat node argument (and move to children later). The semantics for this
// are determined by the application, not the parser, though.
networks "internal_network"
healthcheck {
test "CMD" "redis-cli" "ping"
}
volumes "./redis:/data"
}
// /- comments can be used to comment out entire nodes without having to
// comment each line, or use multi-line comments.
/-es {
restart "always"
image "docker.elastic.co/elasticsearch/elasticsearch:7.17.4"
// Again, you can represent this in two ways, so I'll show both.
environment \
ES_JAVA_OPTS="-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true" \
xpack.license.self_generated.type="basic" \
xpack.security.enabled=false \
xpack.watcher.enabled=false \
xpack.graph.enabled=false \
xpack.ml.enabled=false \
bootstrap.memory_lock=true \
cluster.name="es-mastodon" \
discovery.type="single-node" \
thread_pool.write.queue_size=1000
// Using child nodes instead
/-environment {
ES_JAVA_OPTS "-Xms512m -Xmx512m -Des.enforce.bootstrap.checks=true"
xpack.license.self_generated.type "basic"
xpack.security.enabled false
}
networks "external_network" "internal_network"
healthcheck {
test "CMD-SHELL" "curl --silent --fail localhost:9200/_cluster/health || exit 1"
// With the new `#` proposal for KDL 2.0, this would look like this:
test "CMD-SHELL" #curl --silent --fail localhost:9200/_cluster/health || exit 1
}
volumes "./elasticsearch:/usr/share/elasticsearch/data"
ulimits {
memlock soft=-1 hard=-1
nofile soft=65536 hard=65536
}
ports "127.0.0.1:9200:9200"
}
web {
build "."
image "ghcr.io/mastodon/mastodon:v4.2.0"
restart "always"
env_file ".env.production"
// KDL 1.0
command r#"bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000""#
// KDL 2.0
command #bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
networks "external_network" "internal_network"
healthcheck {
// KDL 2.0
test "CMD-SHELL" #wget -q --spider --proxy=off localhost:3000/health || exit 1
}
ports "127.0.0.1:3000:3000"
// /- comments work for individual values, too
depends_on "db" /-"es" "redis"
volumes "./public/system:/mastodon/public/system"
}
streaming {
build "."
image "ghcr.io/mastodon/mastodon:v4.2.0"
restart "always"
env_file ".env.production"
command "node ./streaming"
networks "external_network" "internal_network"
healthcheck {
// KDL 2.0
test: "CMD-SHELL" #wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1
}
ports "127.0.0.1:4000:4000"
depends_on "db" "redis"
}
sidekiq {
build "."
image "ghcr.io/mastodon/mastodon:v4.2.0"
restart "always"
env_file ".env.production"
command "bundle exec sidekiq"
depends_on "db" "redis"
networks "external_network" "internal_network"
volumes "./public/system:/mastodon/public/system"
healthcheck {
// KDL 2.0
test "CMD-SHELL" #ps aux | grep "[s]idekiq\ 6" || false
}
}
// Uncomment to enable federation with tor instances along with adding the following ENV variables
// http_hidden_proxy=http://privoxy:8118
// ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
/-tor {
image "sirboops/tor"
networks "internal_network" "external_network"
}
/-privoxy {
image "sirboops/privoxy"
volumes "./priv-config:/opt/config"
networks "internal_network" "external_network"
}
}
networks {
external_network
internal_network internal=true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment