From 4aaf1dc2a5bbe6035686d54d1c698874accd1c37 Mon Sep 17 00:00:00 2001 From: Michael <12646562+mbround18@users.noreply.github.com> Date: Wed, 14 Apr 2021 17:37:27 -0700 Subject: [PATCH] Updated Docs (#327) * Updated Docs * Whitespace --- .markdownlint.json | 5 + CONTRIBUTING.md | 21 +- Cargo.lock | 186 +++++++++--------- Dockerfile | 2 +- README.md | 135 ++++++++----- docker-compose.yml | 10 +- .../transfer-file-demo/install-croc.png | Bin 0 -> 33134 bytes .../transfer-file-demo/send-croc-success.png | Bin 0 -> 20369 bytes docs/assets/transfer-file-demo/send-croc.png | Bin 0 -> 7885 bytes docs/bepinex.md | 56 +++--- docs/getting_started_with_mods.md | 58 +++--- docs/odin.md | 15 +- docs/releases/status_update.md | 107 +++++----- docs/tutorials/how-to-transfer-files.md | 50 +++++ docs/webhooks.md | 71 ++++--- 15 files changed, 392 insertions(+), 324 deletions(-) create mode 100644 .markdownlint.json create mode 100644 docs/assets/transfer-file-demo/install-croc.png create mode 100644 docs/assets/transfer-file-demo/send-croc-success.png create mode 100644 docs/assets/transfer-file-demo/send-croc.png create mode 100644 docs/tutorials/how-to-transfer-files.md diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 00000000..4aead545 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,5 @@ +{ + "default": true, + "MD033": false, + "MD013": false +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0937b9ff..9e133978 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,17 +5,16 @@ This package includes a make file for easy development. You can get use the make file by installing cargo make via `cargo install cargo-make` - ### Commands -| Command | What it does | -|---------------------|--------------| -| makers format | Formats the `http-server` and `odin` | -| makers clippy | Builds and runs clippy on `http-server` and `odin` | -| makers build | Builds the two projects | -| makers start:dev | Formats, Clippy, docker-compose build, and docker-compose up | -| makers docker:build | Runs docker-compose build for the file `docker-compose.dev.yml` | -| makers docker:up | Runs docker-compose up for `docker-compose.dev.yml` | +| Command | What it does | +| ------------------- | ------------------------------------------------------------------------------ | +| makers format | Formats the `http-server` and `odin` | +| makers clippy | Builds and runs clippy on `http-server` and `odin` | +| makers build | Builds the two projects | +| makers start:dev | Formats, Clippy, docker-compose build, and docker-compose up | +| makers docker:build | Runs docker-compose build for the file `docker-compose.dev.yml` | +| makers docker:up | Runs docker-compose up for `docker-compose.dev.yml` | | makers access | Runs `docker-compose -f docker-compose.dev.yml exec --user steam valheim bash` | -| makers access:admin | Runs `docker-compose -f docker-compose.dev.yml exec valheim bash` | -| makers release | Builds a release binary for `odin` and `http-server` | +| makers access:admin | Runs `docker-compose -f docker-compose.dev.yml exec valheim bash` | +| makers release | Builds a release binary for `odin` and `http-server` | diff --git a/Cargo.lock b/Cargo.lock index 255f0ffa..71bb1c2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -242,6 +242,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + [[package]] name = "encoding_rs" version = "0.8.28" @@ -299,9 +305,9 @@ checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394" [[package]] name = "futures" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" +checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253" dependencies = [ "futures-channel", "futures-core", @@ -313,9 +319,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" dependencies = [ "futures-core", "futures-sink", @@ -323,21 +329,21 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" +checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" [[package]] name = "futures-io" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" +checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" [[package]] name = "futures-macro" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" +checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b" dependencies = [ "proc-macro-hack", "proc-macro2", @@ -347,21 +353,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" +checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23" [[package]] name = "futures-task" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" +checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc" [[package]] name = "futures-util" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" dependencies = [ "futures-core", "futures-io", @@ -416,9 +422,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "h2" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d832b01df74254fe364568d6ddc294443f61cbec82816b60904303af87efae78" +checksum = "fc018e188373e2777d0ef2467ebff62a08e66c3f5857b23c8fbec3018210dc00" dependencies = [ "bytes", "fnv", @@ -484,9 +490,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ "bytes", "fnv", @@ -495,19 +501,20 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2861bd27ee074e5ee891e8b539837a9430012e249d7f0ca2d795650f579c1994" +checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737" dependencies = [ "bytes", "http", + "pin-project-lite", ] [[package]] name = "httparse" -version = "1.3.5" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" +checksum = "bc35c995b9d93ec174cf9a27d425c7892722101e14993cd227fdb51d70cf9589" [[package]] name = "httpdate" @@ -517,9 +524,9 @@ checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" [[package]] name = "hyper" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8e946c2b1349055e0b72ae281b238baf1a3ea7307c7e9f9d64673bdd9c26ac7" +checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1" dependencies = [ "bytes", "futures-channel", @@ -613,9 +620,9 @@ checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" [[package]] name = "js-sys" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc15e39392125075f60c95ba416f5381ff6c3a948ff02ab12464715adf56c821" +checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c" dependencies = [ "wasm-bindgen", ] @@ -628,9 +635,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.89" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538c092e5586f4cdd7dd8078c4a79220e3e168880218124dcbce860f0ea938c6" +checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" [[package]] name = "linked-hash-map" @@ -640,9 +647,9 @@ checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" dependencies = [ "scopeguard", ] @@ -701,9 +708,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2182a122f3b7f3f5329cb1972cee089ba2459a0a80a56935e6e674f096f8d839" +checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956" dependencies = [ "libc", "log", @@ -714,11 +721,10 @@ dependencies = [ [[package]] name = "miow" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" dependencies = [ - "socket2", "winapi", ] @@ -867,18 +873,18 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96fa8ebb90271c4477f144354485b8068bd8f6b78b428b01ba892ca26caf0b63" +checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b" +checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" dependencies = [ "proc-macro2", "quote", @@ -947,9 +953,9 @@ checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" dependencies = [ "unicode-xid", ] @@ -1158,9 +1164,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "sct" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ "ring", "untrusted", @@ -1168,18 +1174,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.124" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd761ff957cb2a45fbb9ab3da6512de9de55872866160b23c25f1a841e99d29f" +checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.124" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1800f7693e94e186f5e25a28291ae1570da908aff7d97a095dec1e56ff99069b" +checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" dependencies = [ "proc-macro2", "quote", @@ -1267,11 +1273,10 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "socket2" -version = "0.3.19" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" dependencies = [ - "cfg-if 1.0.0", "libc", "winapi", ] @@ -1290,9 +1295,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.64" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd9d1e9976102a03c542daa2eff1b43f9d72306342f3f8b3ed5fb8908195d6f" +checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" dependencies = [ "proc-macro2", "quote", @@ -1389,9 +1394,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" dependencies = [ "tinyvec_macros", ] @@ -1404,9 +1409,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d56477f6ed99e10225f38f9f75f872f29b8b8bd8c0b946f63345bb144e9eeda" +checksum = "134af885d758d645f0f0505c9a8b3f9bf8a348fd822e112ab5248138348f1722" dependencies = [ "autocfg", "bytes", @@ -1446,9 +1451,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c535f53c0cfa1acace62995a8994fc9cc1f12d202420da96ff306ee24d576469" +checksum = "e177a5d8c3bf36de9ebe6d58537d8879e964332f93fb3339e43f618c81361af0" dependencies = [ "futures-core", "pin-project-lite", @@ -1470,9 +1475,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec31e5cc6b46e653cf57762f36f71d5e6386391d88a72fd6db4508f8f676fb29" +checksum = "5143d049e85af7fbc36f5454d990e62c2df705b3589f123b71f441b6b59f443f" dependencies = [ "bytes", "futures-core", @@ -1509,16 +1514,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - [[package]] name = "try-lock" version = "0.2.3" @@ -1570,9 +1565,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" dependencies = [ "matches", ] @@ -1652,9 +1647,9 @@ dependencies = [ [[package]] name = "warp" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dafd0aac2818a94a34df0df1100a7356c493d8ede4393875fd0b5c51bb6bc80" +checksum = "332d47745e9a0c38636dbd454729b147d16bd1ed08ae67b3ab281c4506771054" dependencies = [ "bytes", "futures", @@ -1677,7 +1672,6 @@ dependencies = [ "tokio-util", "tower-service", "tracing", - "tracing-futures", ] [[package]] @@ -1694,9 +1688,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe8f61dba8e5d645a4d8132dc7a0a66861ed5e1045d2c0ed940fab33bac0fbe" +checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" dependencies = [ "cfg-if 1.0.0", "serde", @@ -1706,9 +1700,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046ceba58ff062da072c7cb4ba5b22a37f00a302483f7e2a6cdc18fedbdc1fd3" +checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" dependencies = [ "bumpalo", "lazy_static", @@ -1721,9 +1715,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73157efb9af26fb564bb59a009afd1c7c334a44db171d280690d0c3faaec3468" +checksum = "81b8b767af23de6ac18bf2168b690bed2902743ddf0fb39252e36f9e2bfc63ea" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -1733,9 +1727,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9aa01d36cda046f797c57959ff5f3c615c9cc63997a8d545831ec7976819b" +checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1743,9 +1737,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96eb45c1b2ee33545a813a92dbb53856418bf7eb54ab34f7f7ff1448a5b3735d" +checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" dependencies = [ "proc-macro2", "quote", @@ -1756,15 +1750,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7148f4696fb4960a346eaa60bbfb42a1ac4ebba21f750f75fc1375b098d5ffa" +checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" [[package]] name = "web-sys" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fe19d70f5dacc03f6e46777213facae5ac3801575d56ca6cbd4c93dcd12310" +checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be" dependencies = [ "js-sys", "wasm-bindgen", @@ -1782,21 +1776,21 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82015b7e0b8bad8185994674a13a93306bea76cf5a16c5a181382fd3a5ec2376" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" dependencies = [ "webpki", ] [[package]] name = "which" -version = "4.0.2" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c14ef7e1b8b8ecfc75d5eca37949410046e66f15d185c01d70824f1f8111ef" +checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" dependencies = [ + "either", "libc", - "thiserror", ] [[package]] diff --git a/Dockerfile b/Dockerfile index 052cd596..993a5a2e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -71,7 +71,7 @@ RUN usermod -u ${PUID} steam \ HEALTHCHECK --interval=1m --timeout=3s \ - CMD pidof valheim_server.x86_64 || exit 1 + CMD pidof valheim_server.x86_64 || exit 1 ENTRYPOINT ["/bin/bash","/entrypoint.sh"] CMD ["/bin/bash", "/home/steam/scripts/start_valheim.sh"] diff --git a/README.md b/README.md index 5507612f..962ec9ad 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # [Valheim] + @@ -13,12 +14,10 @@ - - ## Docker > [If you are looking for a guide on how to get started click here](https://github.com/mbround18/valheim-docker/discussions/28) -> +> > Mod Support! It is supported to launch the server with BepInEx but!!!!! as a disclaimer! You take responsibility for debugging why your server won't start. > Modding is not supported by the Valheim developers officially yet; Which means you WILL run into errors. This repo has been tested with running ValheimPlus as a test mod and does not have any issues. > See [Getting started with mods] @@ -37,33 +36,64 @@ ### Environment Variables -> See further on down for advanced environment variables. - -| Variable | Default | Required | Description | -|--------------------------|------------------------|----------|-------------| -| TZ | `America/Los_Angeles` | FALSE | Sets what timezone your container is running on. This is used for timestamps and cron jobs. [Click Here for which timezones are valid.](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | -| PUID | `1000` | FALSE | Sets the User Id of the steam user. | -| PGID | `1000` | FALSE | Sets the Group Id of the steam user. | -| ADDRESS | `Your Public IP` | FALSE | This setting is used in conjunction with `odin status` and setting this will stop `odin` from trying to fetch your public IP | -| PORT | `2456` | TRUE | Sets the port your server will listen on. Take note it will also listen on +2 (ex: 2456, 2457, 2458) | -| NAME | `Valheim Docker` | TRUE | The name of your server! Make it fun and unique! | -| WORLD | `Dedicated` | TRUE | This is used to generate the name of your world. | -| PUBLIC | `1` | FALSE | Sets whether or not your server is public on the server list. | -| PASSWORD | ` ` | TRUE | Set this to something unique! | -| TYPE | `Vanilla` | FALSE | This can be set to `ValheimPlus`, `BepInEx`, `BepInExFull` or `Vanilla` | -| MODS | ` ` | FALSE | This is an array of mods separated by comma and a new line. [Click Here for Examples](./docs/getting_started_with_mods.md) Supported files are `zip`, `dll`, and `cfg`. | -| AUTO_UPDATE | `0` | FALSE | Set to `1` if you want your container to auto update! This means at the times indicated by `AUTO_UPDATE_SCHEDULE` it will check for server updates. If there is an update then the server will be shut down, updated, and brought back online if the server was running before. | -| AUTO_UPDATE_SCHEDULE | `0 1 * * *` | FALSE | This works in conjunction with `AUTO_UPDATE` and sets the schedule to which it will run an auto update. [If you need help figuring out a cron schedule click here] -| AUTO_UPDATE_PAUSE_WITH_PLAYERS | `0` | FALSE | Does not process an update for the server if there are players online. | -| AUTO_BACKUP | `0` | FALSE | Set to `1` to enable auto backups. Backups are stored under `/home/steam/backups` which means you will have to add a volume mount for this directory. | -| AUTO_BACKUP_SCHEDULE | `*/15 * * * *` | FALSE | Change to set how frequently you would like the server to backup. [If you need help figuring out a cron schedule click here]. -| AUTO_BACKUP_REMOVE_OLD | `1` | FALSE | Set to `0` to keep all backups or manually manage them. | -| AUTO_BACKUP_DAYS_TO_LIVE | `3` | FALSE | This is the number of days you would like to keep backups for. While backups are compressed and generally small it is best to change this number as needed. | -| AUTO_BACKUP_ON_UPDATE | `0` | FALSE | Create a backup on right before updating and starting your server. | -| AUTO_BACKUP_ON_SHUTDOWN | `0` | FALSE | Create a backup on shutdown. | -| AUTO_BACKUP_PAUSE_WITH_NO_PLAYERS | `0` | FALSE | Will skip creating a backup if there are no players. `PUBLIC` must be set to `1` for this to work! | -| WEBHOOK_URL | ` ` | FALSE | Supply this to get information regarding your server's status in a webhook or Discord notification! [Click here to learn how to get a webhook url for Discord](https://help.dashe.io/en/articles/2521940-how-to-create-a-discord-webhook-url) | -| UPDATE_ON_STARTUP | `1` | FALSE | Tries to update the server the container is started. | +> See further on down for advanced environment variables. + +| Variable | Default | Required | Description | +| -------- | ----------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| PORT | `2456` | TRUE | Sets the port your server will listen on. Take note it will also listen on +2 (ex: 2456, 2457, 2458) | +| NAME | `Valheim Docker` | TRUE | The name of your server! Make it fun and unique! | +| WORLD | `Dedicated` | TRUE | This is used to generate the name of your world. | +| PUBLIC | `1` | FALSE | Sets whether or not your server is public on the server list. | +| PASSWORD | `` | TRUE | Set this to something unique! | +| TYPE | `Vanilla` | FALSE | This can be set to `ValheimPlus`, `BepInEx`, `BepInExFull` or `Vanilla` | +| MODS | `` | FALSE | This is an array of mods separated by comma and a new line. [Click Here for Examples](./docs/getting_started_with_mods.md) Supported files are `zip`, `dll`, and `cfg`. | + +| WEBHOOK_URL | `` | FALSE | Supply this to get information regarding your server's status in a webhook or Discord notification! [Click here to learn how to get a webhook url for Discord](https://help.dashe.io/en/articles/2521940-how-to-create-a-discord-webhook-url) | +| UPDATE_ON_STARTUP | `1` | FALSE | Tries to update the server the container is started. | + +#### Container Env Variables + +| Variable | Default | Required | Description | +| -------- | --------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| TZ | `America/Los_Angeles` | FALSE | Sets what timezone your container is running on. This is used for timestamps and cron jobs. [Click Here for which timezones are valid.](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) | +| PUID | `1000` | FALSE | Sets the User Id of the steam user. | +| PGID | `1000` | FALSE | Sets the Group Id of the steam user. | + +#### Auto Update + +| Variable | Default | Required | Description | +| ------------------------------ | ----------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AUTO_UPDATE | `0` | FALSE | Set to `1` if you want your container to auto update! This means at the times indicated by `AUTO_UPDATE_SCHEDULE` it will check for server updates. If there is an update then the server will be shut down, updated, and brought back online if the server was running before. | +| AUTO_UPDATE_SCHEDULE | `0 1 * * *` | FALSE | This works in conjunction with `AUTO_UPDATE` and sets the schedule to which it will run an auto update. [If you need help figuring out a cron schedule click here] | +| AUTO_UPDATE_PAUSE_WITH_PLAYERS | `0` | FALSE | Does not process an update for the server if there are players online. | + +Auto update job, queries steam and compares it against your internal steam files for differential in version numbers. + +#### Auto Backup + +| Variable | Default | Required | Description | +| --------------------------------- | -------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| AUTO_BACKUP | `0` | FALSE | Set to `1` to enable auto backups. Backups are stored under `/home/steam/backups` which means you will have to add a volume mount for this directory. | +| AUTO_BACKUP_SCHEDULE | `*/15 * * * *` | FALSE | Change to set how frequently you would like the server to backup. [If you need help figuring out a cron schedule click here]. | +| AUTO_BACKUP_REMOVE_OLD | `1` | FALSE | Set to `0` to keep all backups or manually manage them. | +| AUTO_BACKUP_DAYS_TO_LIVE | `3` | FALSE | This is the number of days you would like to keep backups for. While backups are compressed and generally small it is best to change this number as needed. | +| AUTO_BACKUP_ON_UPDATE | `0` | FALSE | Create a backup on right before updating and starting your server. | +| AUTO_BACKUP_ON_SHUTDOWN | `0` | FALSE | Create a backup on shutdown. | +| AUTO_BACKUP_PAUSE_WITH_NO_PLAYERS | `0` | FALSE | Will skip creating a backup if there are no players. `PUBLIC` must be set to `1` for this to work! | + +Auto backup job produces an output of a `*.tar.gz` file which should average around 30mb for a world that has an average of 4 players consistently building on. You should be aware that if you place the server folder in your saves folder your backups could become astronomical in size. This is a common problem that others have observed, to avoid this please follow the guide for how volume mounts should be made in the `docker-compose.yml`. + +#### Http Server + +| Variable | Default | Required | Description | +| --------- | --------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | +| ADDRESS | `Your Public IP` | FALSE | This setting is used in conjunction with `odin status` and setting this will stop `odin` from trying to fetch your public IP | +| HTTP_PORT | `anything above 1024` | FALSE | Setting this will spin up a little http server that provides two endpoints for you to call. | + +- `/metrics` provides a prometheous style metrics output. +- `/status` provides a more traditional status page. + +> Note on `ADDRESS` this can be set to `127.0.0.1:` or `:` but does not have to be set. If it is set, it will prevent odin from reaching out to aws ip service from asking for your public IP address. Keep in mind, your query port is +1 of what you set in the `PORT` env variable for your valheim server. ### Docker Compose @@ -88,8 +118,8 @@ services: TZ: "America/Chicago" PUBLIC: 1 volumes: - - ./valheim/saves:/home/steam/.config/unity3d/IronGate/Valheim - - ./valheim/server:/home/steam/valheim + - ./valheim/saves:/home/steam/.config/unity3d/IronGate/Valheim + - ./valheim/server:/home/steam/valheim ``` #### Everything but the kitchen sink @@ -134,19 +164,23 @@ This repo has a CLI tool called [Odin] in it! It is used for managing the server ### [BepInEx Support](./docs/bepinex.md) -This repo automatically launches with the proper environment variables for BepInEx. +This repo automatically launches with the proper environment variables for BepInEx. However, you have to install it manually in the container due to the fact that the modding community around Valheim is still in its infancy. [Click Here to view documentation on BepInEx Support](./docs/bepinex.md) - ### [Webhook Support](./docs/webhooks.md) -This repo can automatically send notifications to discord via the WEBHOOK_URL variable. +This repo can automatically send notifications to discord via the WEBHOOK_URL variable. Only use the documentation link below if you want advanced settings! [Click Here to view documentation on Webhook Support](./docs/webhooks.md) +### [How to Transfer Files](./docs/tutorials/how-to-transfer-files.md) + +This is a tutorial of a recommended path to transfering files. This can be done to transfer world files between hosts, transfer BepInEx configs, or even to transfer backups. + +[Click Here to view the tutorial of how to transfer files.](./docs/tutorials/how-to-transfer-files.md) ## Sponsors @@ -156,51 +190,49 @@ Only use the documentation link below if you want advanced settings! - ## Release Notifications -If you would like to have release notifications tied into your Discord server, click here: +If you would like to have release notifications tied into your Discord server, click here: -**Note**: The discord is PURELY for release notifications and any + all permissions involving sending chat messages has been disabled. +**Note**: The discord is PURELY for release notifications and any + all permissions involving sending chat messages has been disabled. [Any support for this repository must take place on the Discussions.](https://github.com/mbround18/valheim-docker/discussions) - -## Versions: +## Versions - latest (Stable): - [#100] Added backup feature to run based on cronjob. - [#148] Added Mod support - [#158] Added webhook configuration and documentation updates - [#236] Now [publish to github registry as well](https://github.com/users/mbround18/packages/container/package/valheim) - - [#276] Advanced mod support with auto installer + - [#276] Advanced mod support with auto installer - 1.2.0 (Stable): - Readme update to include the versions section and environment variables section. - [#18] Changed to `root` as the default user to allow updated steams User+Group IDs. - [#18] Fixed issue with the timezone not persisting. - To exec into the container you now have to include the `-u|--user` argument to access steam directly. Example `docker-compose exec --user steam valheim bash` - - There is now a `dry-run` command argument on `odin` to preview what the command would do. + - There is now a `dry-run` command argument on `odin` to preview what the command would do. - You can run with `-d|--debug` to get verbose logging of what `odin` is doing. - [#11] Added check for length of password and fail on odin install or odin stop failures. - [#24] Added public variable to dockerfile and odin - [#35] Fix for the server to now utilizing SIGINT `YOU WILL HAVE TO MANUALLY STOP YOUR SERVER;` use `pidof valheim_server.x86_64` to get the pid and then `kill -2 $pid` but replace pid with the pid from `pidof` - [#53] Formatted scripts to be more useful and added timezone scheduling. - [#77] Fix auto update not acknowledging variables and added odin to system bin. - - [#89] Daemonized the server process by using rust specific bindings rather than dropping down to shell. -- 1.1.1 (Stable): - - Includes PR [#10] to fix the double world argument. -- 1.1.0 (Stable): + - [#89] Daemonized the server process by using rust specific bindings rather than dropping down to shell. +- 1.1.1 (Stable): + - Includes PR [#10] to fix the double world argument. +- 1.1.0 (Stable): - Includes a fix for [#3] and [#8]. - Improves the script interface and separation of concerns, files now have a respective code file that supports interactions for cleaner development experience. - Docker image is cleaned up to provide a better usage experience. There is now an `AUTO_UPDATE` feature. - Has a bug where the script has two entries for the world argument. - 1.0.0 (Stable): - - It works! It will start your server and stop when you shut down. + - It works! It will start your server and stop when you shut down. - This supports passing in environment variables or arguments to `odin` - - Has a bug in which it does not read passed in variables appropriately to Odin. Env variables are not impacted see [#3]. + - Has a bug in which it does not read passed in variables appropriately to Odin. Env variables are not impacted see [#3]. [//]: <> (Github Issues below...........) [#276]: https://github.com/mbround18/valheim-docker/pull/276 @@ -217,13 +249,12 @@ If you would like to have release notifications tied into your Discord server, c [#11]: https://github.com/mbround18/valheim-docker/issues/11 [#10]: https://github.com/mbround18/valheim-docker/pull/10 [#8]: https://github.com/mbround18/valheim-docker/issues/8 -[#3]: https://github.com/mbround18/valheim-docker/issues/3 - +[#3]: https://github.com/mbround18/valheim-docker/issues/3 [//]: <> (Links below...................) [Odin]: ./docs/odin.md [Valheim]: https://www.valheimgame.com/ -[Getting started with mods]: ./docs/getting_started_with_mods.md -[If you need help figuring out a cron schedule click here]: https://crontab.guru/#0_1_*_*_* +[Getting started with mods]: ./docs/getting*started_with_mods.md +[If you need help figuring out a cron schedule click here]: https://crontab.guru/#0_1*\_\_\_\_\* [//]: <> (Image Base Url: https://github.com/mbround18/valheim-docker/blob/main/docs/assets/name.png?raw=true) diff --git a/docker-compose.yml b/docker-compose.yml index c55d09eb..c229dc2c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,7 @@ services: context: . dockerfile: ./Dockerfile.odin volumes: - - odin-output:/data/odin/target/release + - odin-output:/data/odin/target/release valheim: depends_on: - odin @@ -26,10 +26,10 @@ services: - "2457:2457/udp" - "2458:2458/udp" volumes: - - ./tmp/saves:/home/steam/.config/unity3d/IronGate/Valheim - - ./tmp/server:/home/steam/valheim - - ./tmp/backups:/home/steam/backups - - odin-output:/home/steam/.odin + - ./tmp/saves:/home/steam/.config/unity3d/IronGate/Valheim + - ./tmp/server:/home/steam/valheim + - ./tmp/backups:/home/steam/backups + - odin-output:/home/steam/.odin volumes: odin-output: diff --git a/docs/assets/transfer-file-demo/install-croc.png b/docs/assets/transfer-file-demo/install-croc.png new file mode 100644 index 0000000000000000000000000000000000000000..b25656d44f1ad90d9031024f79bb753d398e7f6a GIT binary patch literal 33134 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 DcyMoj literal 0 HcmV?d00001 diff --git a/docs/assets/transfer-file-demo/send-croc-success.png b/docs/assets/transfer-file-demo/send-croc-success.png new file mode 100644 index 0000000000000000000000000000000000000000..282c2c5cf853d1634a0096bac28af386a4306fb9 GIT binary patch literal 20369 zcmdRV1y@_$)-DuxDDF^-ySux)dy(K;G)VE{ZpGc*-JxiTyIXO0yYQZKzVF=o5AMiL zGIz$xNY={CdSuQWs-z%^1dj&~1_p*CEhVM`2KLGJJ+6X<{&=iEpn87-cUF-U0jr!K zICwvS1PIFugMrmVBRm^Jy`RH5NNGERfg$&O+`)(Ji%r466e*;|gw@;)PBQ2nXym7> zpSW*$Z{WoEpcQ9n9qchF-~+hfgM*4i(VXu&szcc%#otJ$a8{57;y4 z<`5>zEGKKwd_EpVx7l}2nQj12Ie^||n+Dln{0yE@A)Nr8Y++5HkqnE`S|j1_0A2C?H#WfH0w>hh_62= z$YqWj{dgNc-@g@kL2g#Tb%D5In|p0N7eBBjgDKk;LrTAkLeSHvI)*p*-ot$@nsC6NZ#7|9HC#g##t2AQ*K5L!TgBErOP{JSynk!m4RuK2RyG>cP<-DB%Ofs~rUOuzg(@|povJBCy{j>o-I zpF&nbuBn#@^S7x>WF~uiZ7Y9i-U1-7S;(G?-pdUMVh|oRV$x12IH4z=9Q@Ocp#^ZlEDqMAC#A* zaN!csK3n)2H(@H@6B&vZ6r~6xf?SoJkvh?$0aOgi+*;cE^fD)n3K14hATvhKH4qLo&W zhFH}Mo1Y;r2O<^28>wM`6Km)wjO1oB%nC(Hry?Rp1<6`7BiQ_Y0CHU(fmpx=Ju)EL z)6UOvOT}f$Y++2?msFbhaX`N@Tm8s51_vy_B#FXwkzi?go)OBZaFbaVR*$0A4g~j+ z!pU=;T(~0qM8RF-u5u+q7Y*Eb-R_sa36uG_;Ew^6ow4mGzS1L~OC<|u-OpS56)w;0D z0+f@bvXQ@mz(Npq7h&?rB7o>pTA<%5Hd86OLM!g2956^o_MapiTn ze6-2R>QCW`lV387S6ng+fNBN9=LfCo_(hDUieE62iwUl0JmO3WCwMWIY%_Q!`MhPM zWilHHC<@G&#BrAzp9@9*LYX3=SxxIdB8yU=wAwB~xQ`r-8joJyqV0rNI5bl03X>!N zzcXFZeifD~;qIki72W)64ICSrZ)@r=jaaIG3C#H7xCnvoe=li+$__pg%-DAJ|K|4Sbeta{JDV~%->8I(U?h(*xr?A{6%snNLnna?H0J%j2F{ScN3=eoHQlNVhuMNsuv zsNF?+Tz7c;LH&M&O5!ULxi!b$G%t;cmK#zh3k#uc@k>xn?Et6TN=sj%V~ReO{B+Uz zd_g0|QM>H{#ix@-jSP!qfzss?WVfNYlA^iY{U44Kdmt>;y=f~xwz1Zn%CoO#GHZotpZ;sp`F3z0*s?b~fRWzLN? zeFX7o3ijb(KOj5Xx9swlO}W9wQL*qgg!iBi3s>YC>RkF$9Y zXO%ES+l2{XsqJ^8#3FyPXoO-$Ln1>3fneI0Jx!#Jp-X%)QK&~&DQalm+atR8h=u` zp()mmzZS}86pI!kyNc76lySNjxyP013tr?UL;$~NNeI(S#UN?1#d_qfE|zGcK@g-U zFYmN&>wu*dok?i9WNu+JX0pYjYbqLsUv67c40xFSa&=lmwQq8K$kod~UFS>kYDsIQ z<@*{mn`hP|A3rZkVN75AjTVhn93c_rmn>${y?$-;WS6M~G=POaukRX8>X&3ZA_^M9 zuU_p%aqLKv;f5cA+p6rubayRV8y1NC>w1_Gw6t=<#)KkmdDRy*o<^h2Rtv9_jt{_* zkv;qt^`Ow+C?4@Lg5liMDv9Y+)%IFoIbv{9Nm*3MTYI+?Z{lmAc1Cfw1fdNQ5)oHc z0zL$p0jZICD-0{BU6KfF=PI+pTp^pGq~I zMK_4=&nL*!+N9dConw)$Qf<0=YzExFshSpz9>J%5#yr0@ESK^qtNX}X>iX1sX6?B% z@Vh9YTTfR!Mp-O1Z1L)CttV(k3Iuw!xGutXMF}pZBXrL6%jyc%mci16V`zS>?X|!* zyRBq?Ir1PH)KBH>$(buILIGvtk9flG^SAI(3+&ic?*%)g+&wkeqS@@cAuZ+^&_ydrjm5DJYP{Paed{8Y*YqQ^4_ zx;xcsdZ-_-H9Fvds#lJ?LT5uoGI5V&3aTS!dt8k>k#2g?2^#L2kFUi{N9Bq96IQ>k zyRA?c@-LhMOS9%{J_VN0GB*vETXLuM-UFkhiGh#jlCSe3{QQ<(0tZX-WE2uVe%x|gIOo=0f^;a73rndDbf&Dm=d3k_p z|L|jBSW=m^e_rf`Ao-uj!B+;q;>-B$035;88nn(%OptX}-h+B^hqsl@?v>IX)8j+$ zTsygH8_Q7swJTdW-T0$|DxludXW2gegmq5G$olEhx$;x)$Tn->nTp}xRoamWLz!lq zZBSs<-jnH(n^H-=cZpKbMDiVgr3gdFRjO@T>N>FrQ{Uo|W(YeA1l^9Oeo}3)KsiJe zRv_Zm$G)D&$9#AE#BECx`$Vs6jN}7ScBr6zvf~;n`?3D^y4pcI(uiP~(8*z2-ikce zEp6CoTj9zA#8}R=&II_f?%B8FnQ|)-0RAeOhTc?){Ry3R z`HAK(OL(8-MYfqt7T*t8komtz&aF>9eVV1Nt7K@%#yt~a9Q=m}0`TBn^O_2-HJcE{-=*RG;~@sh(|jjp2| zhf-2y9rJQJYv6l^tU4T)Mc>QvV#6fWCY3#R^Wr+A3U7iiIOt)dVF@_Xi)zi{&aYZ3 zZ93duVFs{WPY<;)f|gJYevlan*J?TquDu)Gy+Uwk&ZaxlGLH7ju*X6sg!^zJZ z-Uy1)%pf+uT5<#h4PV&k@gCZsI{8jD94VUO!>qRY%EDZsmDmD!Z>gjc_Nf zN1m53vYw!B47u8wY!FMr*CYQ^sm}*ecR49=Ek~o2X>xA z_2UPBcJ_1PqT?#BLyT;ILvWSeeYB%#7N!>52b2fyWyDx3Be=1XNJa`;)A>NN@(haY z%G*6m!OT!T;uBPLlU`5U>D_PKlV!}xbg{$ML7g^Pb$?2yD=9Rwkn~RzUt*|b8N7Y;0(PlS0c!1C!4?941-Wb_Pc`De9$(x9ugxjyqDy%VgTBR<4S`b@Ho9<|iM`QjXn=vU{JUb-;n~GEDB3hyiBGaa z5MAm#<^28?1myzE20UkrtK!c0RB{3nqeQba51F+@$MSn$E|}nKHC*lX)<^J}R_j*n z(NmDqsD9kPV(`Lf!>qb)*XZc8 zLMY@~+!8%mD8v2xtJ3}ud??nh20R{G_9T~p53=5fI!MduJ;>G5l~F476_x_zJ=CA& zGUZjG?5DD#bkQ9JWMW;%?*}e2{<%eRy&8{9tl|n%^ku%j; z$jeqE>JEAs5=O^DMEOD{G4RtdeXI1&3D6;*q3x3<3@w)_c&c9Da{haRQpOpVX!mrsZZe>nX{dKpWsvB?U?hVA|W~JVtzm7;8T%D)u|y?J+_#^c#gp-u8g|bz zvLK;Io@mKWA^yGl0s8VC%wG#XD+kSXT@jE*gqnE4O*!-%iC)zxots?&Bhr$l0tmJ2 z`R>@D*YAFh%sJCLMD~siCz`3it9fV7T6kN}n6^b7<^)Q{Y!y?pz|`>a?m7}@PbuzB zxXd=dvMH`dZp79&#j2$DCe@g`oF5)oEBn}hGs~#>xw7=5#>s{mEzx6_JaOu8eI_FU z-TnoiJ49Ne&MdF)FSbZy_TOD29RsuH%C4e;ak@i7!Ji+OtWDnv4Re2M4^~uL#hL+S zuc)tN6O563Z7ao$;5oQL2Uf|iUDso9uCWQu*gb4>(qGw{1L~q z^Fa(pQzONn&TNs%+9Y5=-~%VFmp}V1Tx5 zXe9dti~0x1gKgKwEjJ;oXN>jBv~$zga|E5Cl5{&9&ue3~)83L=KBIFU!_+Ajc4Si| z^N1O9icfbvab1MAi$4s(gC3U^$^=+z>GQ9t#%BvNuJIn7;Qir#Qz_aO4EZ(-^Y+cxqNNG34!Xzbk8@I^J+15Xw*e;&RY5_M zj2;&L^e3iYc}}4ZPSZ{n(#xKE-iq^XRpn2G^_+Io`o+cQ(Ianv+Hok)ET(eFXMVSH zy+|#58jx`85P^7d%}yjS4Pq{y752QLXrXhZzdPZX?PWM3PIlco(Tjg7miEqu+5iu5Q7>ITJe16Z(6$ILtq-Ln-y$`XHlC#(| zS;`*y?Ts2pj-BT^e0 zdNZ0Lwh=iKjuJ@<%RCrm=xq8wG%^pJhN@L;qGde;1E)1%;c*dP=^kr4$;zW;c%J4P7E;kauTh%{&dt&o6_PJJ?#7X z`toG>a@8c#+t$ve+syczMUpm!sCgrZPSIZ9|XB*6MRUc$#WIfQ7?l9NE@&T|)je z-na*Q1u;^^-bHpY0HxQ#zu-}1wMV>fDo=--~b$j>Q?ehPIC$((x^2fEvfwZuuiQV0*kd8L{<=x;r^p_bQU@AU1_tr+}i4SHBn zXO-_&C4rU7ZN-(2tv?sv{YV3jWPWu?F8A)2XCy+2>2dmi2W<$SrfL|Kz(cl=?=3>m zSUizyLqJ$y&)JBcI(>9be5YZJ^;|><3%>6-GrTZ z+Tym$r=m7v10`?OkkgD!Px2J=O3b%M2`#r3GjTc)jCDs*oK$vlM;hbSTN!f~0GkmD zlM?I0gnZ`28d9J6=4eW%|50_0N|vgCnT*#8BOsUn(_)V!A=Zj;40C%xJbekirM^u$&W07N0_;{-yT6U^ zy!Hx#b58*v zj8HLA*;ya{GqV<^#aX4FKwAegOV8l4%)#i{@>|{eVd9MH3D=m?Dr1Fc?{g?xePVx3 z`ZT0il>U6sc*LH>JIF35r>mL>o%YKS?Y+X}gW@|wI?_s(9hD2v%SU(5_%^iXLOhVE zTm%f1FSI$?umzf${c%{?asH_>QXWSemZ5|d!;?gumoUEACF$Hz|7F(FM~CY~`w^P# zxvWrbqeao+w~D!>HhF@85?*NK=O+H{0jjxh<;C2>)lyrRA|pILwL$TBTjE~*SvX_7*6A;|nGGhdkTHCM z_%W`rcIDX3Wnq>_b2@W>Wy~%N=ARQcM!fT))&9^5LoZ*5B1aWf$FdQ7l=yeU!)&lw zP!moU6UbH+wqomuFs)kQ8rs^5CYj1MP;{}e6P}wV{j2G&;axX+; zrF?W4yCH0qe}Ohl2;z&-|gdt05ho4Jg|%W zM{AwMOZ7~+;Bd6YtS7C>x_R;D+B+pry&iNm$qC~Y!iO6pr3R~#Sz>ZYRC7y zXXvg$?FQs2l6r&0k5T%RpB}!^r?f!7KF^%5D2#zbmL2wd8*}9GKK(1*iLIPh83Pg` zATt{~BW;4XXwIJTXI{PV>|6Du=>#obOUb)AN!~GMb_J0*W2B?qvD$c0Vk89#$&Rs zFyS^LbTWTFqkZ+XTbbpP0nB^7I~H*>rn7rlT>wW4!WV#8NEMaF?ZAw23YZxQfNS^p z8k1;$QfvD}G?^12r<394;{MF)7&y)c9yb1738(Xo*~dj2QKTTCVD@*I4Fo1b5JTBl9He||LBR;W1v+6wQQaYHY3Nn&uQfC*%4B*hNc@%vxB z=Gx=@<;}-AbXp)VW|}rWUE2s6rRX|m?mjRyBcfALYgZ_CxB%XaHl6@CuV;mKZw{nF zSz|7_AZCic>rtIRq!f%GH_BW-U42LKjtA5{m&3*{baZs@u?3rDu>G?t*vbykL>tG~ zO*1_eHDq(ivo*{s()*yRDE?<6ZDy}KbuFl-1Q*78BHwTxQp26QUyEWE_7kie&&4zWod(k}4*=D+U>5SN#yM6SHA9|bR zGrDwp@DfYb9KyJV+8ZFY!$CfG&JW|pXp*@s}!4iFW_548!)yeM|4PP zAhu>_^8Q3`7xe3ox`JbyPTxOKgi*dXW-hVY+KOFe{B~`_sR`tJ@7fBgHlcR zOTBlM?4y#h8ua+q6YV{p%Ayr{`dej)dT(Aeg9KCcHetSbN*g^vHPPaY@`tP3iLS8( z&1&nn)uL;DilY5Js(SdnSoeW?;Rv_i&w0dy2Ca?ZyRe&PsKO^mj>svQ#OZUUa`T5V zYY1&nuxFU12C|!D){6QzqHwa`2%^B;#7QM?+Yuik+eo)}=V)ZpM4CyZUJEGUm{GRDGpxf)k*3E^9o6X6BvvG`OHbpA z#_{ze(PzSyH`^#|&~k({o;4W9_LdX73QvCvU~kixp5*D_s#!hXfiB=GeFSDMfiOCs zBSKO|?Nke%|4H6ElNQMa@v+n)(XvCiqGHD5=Mm@iu>1A0<16~)nZPj{(s@(cga$}x z)&e1N^>BC_5zCn{|I=gH={gw%m`n9g^%(yiWjXJ&n8XU~dWuA@^iBUaZsVGxs|f1w zKeru8F$ljB#qxII{HuH^p;Gqeahnckdb}9tlml#y)!nb^gi}OkmKbk$I6r9fy~GN) zZJCPzu^g?^ZD}jPtT3`U5v|H~2aQ_u%RZD`2<5`ubY-st%n41*&0ZE7<|*^xvByB} zy3BNfUe7tGNmYX*YZQZdjvvU#%@9Hqk-V4bYPlSC&c0qI?m_Bb_bGuv2TxYlX9EQ9 zCJasMVF0B<+pvU51Oo9G2d{3wZ*uD^iu-WNwP z`=$sYbifomMbx3-xEy<42)R}f5cT;wZvb5JxC|6^eY%>Hv5kvJ;rF4&55lxZsXFUn zbFCajNsx-O#|&Rf*p75@^V?&B;u5~j2w6;uCXsVIwzPHOZu-uMULhy@C9-O}@1E@fYYxuN^%1V@nB))?$Xb4ym@$69kKxdNBp9e~{^FAVmzP0- zDVhv34v`g&M{l%W!pnj7i2nP!HWTaJ{Z$Ou`*uK##HLxP2~>GOUR$&5sx<5HUJWD$ z*S0bVC;KN^dG8mKIP#B)3b^f%^bN$5GtL7@=MP~82IxNkZv|J-z!LpqpzuB1yI@+O z_8WkN%?P0ZjXduGn;iY{?m=_tYv`&zIsV$%;9gpI- z37e@K+7Fh&*XUjp%CeTx%XMF~Llqw!R`aD<^ z=__g^+$?EvE}RygW-^3lf?ipLZ&OTlhf;YZ8O9YNUH#;i+%`cGe1 z?hBVL-Lv>p-pWhmMAw&Rni2N^KH4PP1kCa~@05lxlgR5u#}ajkUVbOuf=CoxL4N^t zsbS`DmwzVqNr$;{kSy8g)RR-?$~BtR!hgw)tav zvsz-TL({Xz3yGgmG{GfW7<0jtd7cD1h?asK;|kee0PkpVK||U7Y;e!02PTR0gqKs% zsO-%2+~U~ZcKIhR-iv-VXZpKxpF1SbaG`pmB9+2qdD6+8Myph zF5pOIHBlK^PlnU0diDu$B(&VOIA1cA+H!AWE#Po;re5Q(c-$TUU}*XVP9|#?qb}h7 z)ex2@Ez`C}r53=HyGE9DtCh*#a~)gqx=N7%7^o#LeG-f-7}QmkU%h_V`nH`E>(KR_ z(^oeHmyuyvZ|nAbu5S`CYdaLAV)a$kOu&Vnf%^DqWGjx^y*-aU*o>wKdAfNl!c}l+ zgkpB5Ok4Q#5>-mV$tZYjV`LtefMMeuhIeDNgdO9X#1K@k&|owWkt!E1+=+CJgwO4@dza*(eN#gUSh3S#| z`Em3&%jjKgeJNvBjZU%kx{LkPDjVw?-**gSfH3l|kMlezD+P=n=A36#1FxHhC0%LR zO^pU3a{B6B&f1oVHv9>%qi7E%oxC^yI)rZv*ABLK6p#FF)ZpKSq-S~#lii90@m`MIwx@LLRA(%Ij%pMnnq-F=YewE3Q&ZVDGsiDIr~tt@bdq}Y!( z%T2GILEeZbf>vYx#UKS-dsy4=%Wl6bikrB$JBvs6w7F7`=i?X#HV1~Y;DEyn``#zB2K$6Bv4Fy=JcVG$g|3zo z{8}q5cgWuZg}#X0fT<~?hQi(8!sPP{w;2r%N*qckkD}F@oX*R`_3#)FNakJhwK7Wl zsfHSAoM65EL5x{>lNkwK2)d~A58S`QZDH|OWI_DPt))Ljl*dVAqPXA0Cviom)addg z=yZ0QpxDlvcr&Ic(c7`5xdd-+A((_YuE!pP5FK_;$eyZ((ZsvuAc5xM=WUgGvPkb4 zC9wTiD>W;8v`k&4lKUteE*+vuZMeC{Eo1|aL#@Q8KVA96OyT)jq#e{Mqm;^(`#A=r z9@b)Ff6?JdRTa8zYl)=o;OVfU^U`}tjC^4;>IFe1uk9P(z1b42k13N`R?snKmQ{;5 zs#j$&;((B1pHWCc$qX7Zq13KKLU5HwDG416u9KrM;BfD-ggz#x6;>oHQ}5|q$shSerH>^jQ$KD{m=f!sgglT(XXEyA))J>jI< z=b?-c+nlZtH6WSA6O^R#aP#F@Qc-=;+6n_Y^I!&O{@Bo9Y z-Y|?&td`-0{1iureU9cWcR6Q)S9E%fc6k0T>!$F12CFBvTL%b3P@xGQ`^Wy<%h}t@ zoh7hBI?ewN(XV8dM>ZGbiiOMZgs)Bhe6&|-S}qRtqtoJws&x5%yQ^5AD|#^`ST+3wI;2LFFVK3FzP4w>6X(4yP+@ zhEHTYPEIiwl3+>!BDP{5_{daUc49id{Jfho{FYno4ZedXIBP&p_pI>R-tp5~tr^8a zJ#j{S6YqPeY<{uS5VaS#DQ;Pdj@Es{&jR@m9t^n&j{4tGGrq;_Od`iOY#(lw6%~Q@=|F1`@8x__V*o27+pd0m=Z=`hfbL4 zNGklYoM#mzsX#v$So5Vb54swjz9beV_>^V=)|^mk{BJr9y{mmcB0Fb+HAkk=L$Tvj=VN$|XL5Q& z>_~Zc90#G={GJej#XeLUTDBjl;P6VTM0V&?3MN`}r&-kcqFnhr3|>}&6GxvE^jZ@F9Gvy;iUp9r3XZ%JmI6!c zpnw}2b6Zsfe8|W3Ne8l#_3_01-n)8p``$eJYo(I0On`AyI3T_B?ig*>c6@FgW?O(? zl;>Z#{PW2FWd7%8yv_gM@>efr#`{10itZGo&9S>j|HftfG>Ij6#LW^n@F%@9(M=}l zMh=sdBSr5#$dmD)Guv@a`wB;V)M7;LOA0YM&^Hi9#pUt$ zAELg2Ib`8z-L9iBo5^sy+BGYoB7%Ddno<*ZiW2PKkFy(EP7l$m-P|TD)bF>xsWuS= zR%P=Qoj44li4qq_wP;|v7^JUn<+3{>MZ*3yz{9(VdFruvb2kGtc1(b;jeEPy;YZTQ zxnD;jv}{}hA7a^0ws7+fJ9;9bV39&H|SB#k1(kCl^P% z(DpNM76T>yk#XISWdL7ngLqAO$kf~_ZS+rjCJFF{yW%$)j%_y}+M;zwYu%R521tYC zGX(i1$%`Tm+xs$r2uho{3oHY<>71ln9#}rX^%Hfz)%@4Sfl$Icy7%cyzL^hG=7sSo z0wE*W7<5?>yc=f*;iX=chRD5|N*YVozxQn=6HnetUP{*MxtW>TddC2lp4fg2D3i&T z?8Of9xfeo?FoZ*h0%Ku6{QkN@;E=q4e@;N5akiwsAk-K{=6v^B3R2Xca^?JY1dkEx zQIu(k7zqsd_6ejlK#1*&v@qKQo}vttN}wJ2iNp??W<0`pugTLFltHg{Vw-$;v#g9) z0h0$F%jdRq;ZruKT-AEozIODIOFN5!H1M^{MA?Ee#*n)Zi`yPp)ORC3rZ8{S0d^)Q zdiktsF?Sp0mgzRUuRXKS8fb{2ScjG8H~&y6Q`Uig$hgx*WaVX zb-aV~U57XhPEYDbUBwD5w;MMw#cOmMvZ1=_C%D(Fs&B7+%xv_>vXz-r5f4m{JO%#Ar@BJKV7tjIrM z;JRfPBdzGwuisw{qUypL%rezgf7dPT65)xlIdAX7r!|oDD4``=aKo-c)7U0iD>I@h zVJ1nSS*ZvLPA5-2YsMHsar!*%SXyfjRL31Yz#p#>{Jm>X5%(u8crpL(?wV5nnK=z1 z=DoMm$a1-(<7z9=#p^lSpA#`=5f7C!0iw$~xem(0Z7P1O z<6N*}6-?bpbCdHwzxlH=niJWD% zl$rQ24ocY`)KRvZFKAU7dcX`|DqXIBTrqiZ7ow`Fs^EK-Yfa|ey}9;^e0-=o+_2AW zNBsb9&Dww_w_ghl?H60Am|w4m|7bJJ_@w1l&lc#mT(J@UV)aT4yAnOzU=&N>cpneZ zMxr>^E>8+eADG=@^bc7$&7@_};Htn(#mDSU9;6(`Y8Q}cS(OZ5^Nr+6XcBCd@>;rpO5O&=)vNfej z${wXCbT;E(UhEIq#|o3(cOS}biQ*cL8)q60#*uIc8cgDwj(_i>I`HxcX8GWY^bOisR z5cp#MOCeAO5#`Enw-BeUcM0=1+SXS0+X4@=mutQCP3ldN2E#5$JZyZcZufbDJmgJ; z0{9RTv#^(_I*GZpdlgTf>$g>Yj~=(myu#l7Cf;9BaJgSe#30i-x!f4-d0@J3ZBrD) zu@NTdSR(vc zPc{=W*g4xy^%a1ivx7;0xaiJF(E=7=X3#1_X5t^?zmJju>q|wQo3e-A{$yhZxKkdV zbiFA9BptC6;3W7;wg>)>%`eo={t86gVZ2vCsjJ8!j_LG(aZ!Mv-=Ji4vjU`Mq$Rb?mXSTDgOOBpy!7;Bc(7=x<#R`xfwlbBhm~EbUzC&*ssD@n7ghym;`+jQJlZYXWxq zNBTodWy%?D&CXpc;b@39iw;QXOk^x&9QoCgxWh9cUmr6g1wmfBfI^=XpP*jaP+oy# z7qC1I9bFQ^4wvEF!UYS?W&N)@YB$Rpy8bfPdgJ`+qgy=Odj!)eAk*shy(CclGfn4w;Ra69ARVH6t5-LC{b_*e&s zn4$bT^2@axlPl|3A>r#^H^GN3d~cUvLsKJ_x6f}5!Pl9PxUO7VKRSCL z*%pjTnw6Er;Mpd)T9hQE< z)UY{<6<(i3F$Ptl;spqi7oaw=${IL+)@Xxu%8e2c%m%nQr&Nnd?&9{RvEn0K<&`gE zIBXRX6?NgZ1IiP1*`ox**vK{;7+T$&{juEzi3o-1w_1AV)MG;(v^o?)z=8iDI8Wa5 z1?#$0q<(Qrl|f|649HPUoM5aMiL$O&-eMwz_j*@()Zq|5r}Bbrt|M4BKP!t_fGeN- zpMI#VOI3{{2cO$=h`I(@{2=k;#i#^3kOth>ddSV!i?-TyOz-a{p$#!xpaN}d9dol& z+UM0Kd9flUYm+8Iasi;}DJU#hkNlW2yVzLhGLJklaajbVNdK0=2!DX!nm|n#ejoHzWorw=Y;b zK1XQ9dG+^|f62-!z%t^#YI6S*^cGhnv|1uWjeP$p0-aWYic;o64PDQ=zs@#=IaNJN z{oBrbNGJM4ox=m>_QA0AHY-&OaEzGpUjk2?qu~ z3G>repbFXEJ0*jkA5{X{_YxhiyqAuF@dctSgO6m!vB*gzHN38VYa+4YKqwuD#AissjKj~= zTvMCy6{MqDHtOXh^^*S$+wV-^-%$Pz;IkTTO}t^}F;e=UAvY9^V`VS=v56k z*ChAn61KJd3|tB-56Mz3W|eO5G!NN-1uk-V&-dEohiblhH{8X%yX~UFwy)4mN6Sll zRT9J5);qwL%e+oT*Gmz%e1;c;SJM%plD-bX&d%I#+i6JUbqA%%`f1J(ZT4Gf&f!d$ zqyw$hlX-bA4_PG;)v761+RRn~Q^QAboEZrNP`!OZ0Vtqhq6pj+t&;&Y4$@z*NIiJHY>(XnO?1aVSWLked zO$D;#P2c?Fo$Yy~qyFA2?h_t9cgn8pMnrA%7@>M)=Q_81M6j{Cq6z4qlo|+>Tz8Pr z@l2WJ$RuSch-W7`veB3sx&QNcB!dSq7%+ohhLU`}6 z=p>kaFZqfEuh8dL<8r6{1#-OdT_t9vJ{s>Z1ZjSD^O`#XlW=Kh#B=G@O{Oc&M2J?@ zww%r@X(CkL$lG1(RsMrD#Gg7a;G==9rcg+Q({T!;a{Kw{6}d5l2Y%{i+cH6n1;l%5 zf(W<+;aQt&G?DV%FmwY3oBSm1`GK8*JPP|PIL3!x>KQ`tj28Gb{Xz6=Mhw?C5dBwl z#Ob+4UkmgkJbOi%{Q%`#QQ?Mpd)AL;Ses3+_!LZpw;Nh1CX@7IOb?s;`RRduRncb3 zy~4*0$mCV=o#H&APt_Ht{>?YE+Ex%fgmyXzvBG^I)8D5A<}&@%um%C7V?)^Or> z;2O;#hds&@XS-SBT|d`L!5(M>CD{tu;ru+s4S>yZa8wAvyEc^ z(#V@z9BAC4+SmSL7PS-3#^HeXgnf?W_|>6g)4xQO@|$B%5fkxUr8yktDYmBNv~xmK z8st&c78HJ%rnak&I3edu_DKJqCL2#1(p zieSPUXI$B_q)q4l)N!WaQ0{#k&z7YciLsLSw~rtEMv>WFxDblXlzBuGKjR< zB5Pvo!!Y)J&4|J{85|}W+X)#miF$_W^qlLtp6j~b+;8re_y70*{=T12-!?ScS0loG zeDQ%$gLAFL%B{HeFB3Sx;JBZ*6ITdc^5rDXijiGjyFPrk0_?VR3hCi2UqC~-!y{8| zo_*yAAI7_47kOO0|Hc=)gH~?UIGd>`1hif?aHzmqc~y={I4G@HD{94PcKOf-DvkU3 zxdI#bip#ixe&%pI76_xM<&L;E@NO|ONU8RND@@){)a*SVRguhcDbMH^cyIYqet0O9 zHF7$WX|EMtf*}{w#6AEF1D?VqT&YK%NUQRIz3JUBW$l?}!u|!{7IP2asHuq)xKjtc z5FT+X>yqWCn%KOL=3_TZdK}~x%uuJDo$w|O;>Kq?U7QN3X9)|;Xx6iwr*;SHFA{TF zI^a!!{vLDrO=j}f|DG0*Kc|ImI4L?f-D;kS^AgA>Yx8}xtyyNJW1%L_M8Eh~kNB%L zK`)OpMfo}J9YaqjI~*jo~%QY`3}l`hJnos zk&+@6Zv?9od*H1cIw99!{{k&LPsdOiV#I<<#MriD4nEz+V?hcXuvu&sW1AuDy>`!h zcgdzFu<~Y{J@jS8nkwS*$B&i`*C(SM=d|rSU?!xd4$QR-w7lrFJAHS0ZY0%Oa5aCo zHQuuz3(oEuFzh~soD50Z(OI)M59EmSRkq9&0Wefb(?lNXNkFe z!_6Z!Tn#ly-gigR}x_78MG|q zL@CO-$i}>7Ot~$$ye*<9#@(mk#Cqe>3U8XkTXk!0mAn2VmY6g~E9B^Sqt8)6baH+) zUSDx3y^U#b(mFN6WdycFp+XY+=JFUJf;3M4?}8cQd=~F&gincI5IQ#ZwOY{jco;9H z#(W|BVc7%a-o%I{Fu^{s`Gmbqkwfq>@yV21?}jdi$xca*lQgbh-VU4IMXQmwzHE>S z7gmL>ZFzadX#ohr{g?Fs4mk%zC3(kk<_(yF>Cfx51Z~oGO_?}`er5-;-w7E2V7b(D=8WO}%){KSkm2;s5O~-^y?fD%MTM47-+uZzUoT9#=L8ybRDAXBHSizXB)6qLl62B5QoZV@7A2n_xIDjLNAs(^ zo>k?+EFLIqr2f3#w_mO2UUCi3C{Y&39RH!IB>M08_v%>uscm>00QH`cLZbzKN$`&O-($va+54!GCj zH}~7@aYJao1vq;BAr$k#kpW?tRA?qWg)iEKky-y1v04Y=}|W(1oUx*=E?|X;7?qT=lxeHg!>2 z`5&xXqyYvIGw+S;X(S}}VJBDwZMP6Ia3}YN@FTE8bzk_AB{GeZH~$xZmV*1a=j;_@B@iTwbf%%5`jrixr5N9=pb1KvslA=KS({h^=Xs64TJ?r|N{ z>%LBaPtQ0PPff3h(NYJXOeMP%FxjyUt*+j(`=#(mW~3`Tlo2z6#L0>mcVsSt3<{5W zN}!H6;VebB8D#gatlC{g9&w~@PP5?|W%)ooATI$=IBR8gEANLsOaA-Re#pmbapI@a zcsgoq6)d)W8oQ!kmh9Xw&+&AvL@~YH$`p&T1_^r-| zdlZWvP*@uH=H}@JrS@mW!;AZ@-s=EEbZi`p3AwEGMS}j9`EMOLpNca$Q@`5zMQEY3 zeY75%|3LMWy8l7-d^%+QLG`wFwSUMu_{V-&GG9%TK)xr(WF{!el;k@Pm-k?`ua4z1ykL34iB=Dm6)1%941lA83ldPoxw6|7sPh|*-y4nDO?;g`z@SB82@ z>DOD*p|(=;Mh_1st8Bx`=6kqWBJ+$;CqWqayvb-rnYzoG?BE%8ndF}Gc@c-N*1s=m zlbH~`dL(kaW$HDh5%TtAuaRer1jobxSLu4~BdZS`8qncTIedFNyXVy2OH*&t5iidq z#q+tl2&%@2y&P>E*u$DCHmSAr*eBQtXg$MlTd1G z#uu&R?9LtC_rCQYBq9^`+aRJx4%~BLpn~Ty`|qoqzg=`qHv7@l{u6x=OVRTr@+t%E ayR1y+7qxaR5?!Nr=<-FFUWJZh=^Og7g-O0-_*2fb=d%3xwVk=>bBM z-XVk8=v3vuJx{W-GAP-?)_ut%$_-C&YoGbzw_DqeALoVqNZe|1ONckD$4RY z0KkPK^6|TCSIB#lowrNm=7PJ9k{qCXka>e_T(Xl@mjwVSW2nw8E|cx+Zlw#broRR?Wk}bO;~wbE@uvRzspkjc zJqem9qpIo)GI*6o1o(-^m^aq=!xO5vB59$W}vyPq@B>Vb>t=}vtX+#I83A}4VE;q;6R|LAOWht5{DnnA>qn|(UW!zXxJq2%wD;KDrXj+;F=4bL8a>R(?)>vBe4@KdXdFpfMD zp4eB=hA+geT8llIMjo7=(y;LfWwQnt*jg%l>=~5wVIsoKPg;|b1xh-`O5h`s)W&1Z z+O0qy^QSF{d?RyknqR=;H$|})Yj|!{qSY@AA^)M*t)Yo#tMe?pV@w)qM;W6WjYAe^ zFHU~UPDA7?(^_T3KCCDvLJ4KGxZUho&7P_g(fC^6@C&2S!*r<{7Lp^$PG0tj5IzMt zs|~Zg4)l@Fu)cc7!1g0amocgjy3x2@uO;R^rOOqihge<*pMC#~F|%(I9eT#18-u~r z1~6vT3W2JvefREG-`r_kx#K2j0=>Ht?15Wp$U40(hRc1h7Eo+6x_(u0K|2|(8m*2& z435QSb#11rHAwvA0Tz#pf#>h0v*32CG<(OGo7;QYle_D?q1M2?i19Pdr>w(x5WW=1 zX_)2l$!gPGygy9DmvhWacTLD@iFU(N#czK+%Y+SVprn&Tm3zcPOxP62v&c%%9lRO& z%(2aokccmg74R%0q2P^>vzg`}dPnQ-Y3elJ;im+h7m&a%DJ4?_J%oOu`NrppGqpl_ zu5q1-D`7L6nsk*OI=j_91n&9UJgSkWy5rG^1`rkPvv^BiJAuzaCyNZHPt~-4&Ha*z ztbG1BKTW$|iO!5BKS(Dd`TbLz@BHtR!`eBmKfNot7wRm8@7*6JqeoDp6%C%rxvHC)Aea|;$Pn+@zNiGkX? z2XY*2`BY1P5M&r%b?&q`k|{hWR}@qD7y1cws@+tJ3f~w$|aLU%^OIiH)KUJDK zq}#^Yg+91FY9V@0!8)qH@j1sV?*p|L8i%jnkJ1_Ceg#|9luFln`DtXLk27bGhiXZn zDQ^=oQ$HaO(@>r9oo|$t)VM<&D18_xHVlzO5ws`mk?T@lY-SQe>;~h zRreR;$|-2okj1!+z;62BS=DQ_rC!dtY@XgQb3cL;KO?i`=`w6F2 zz-$M02SoXU*<5aY4jK>0y>t`s(PeXL$c07{<(tf^nn$)gDpj~zaJ~76UN39}6Ih6zZd{$gD(Ld~ zC&2xR)}_Pht{3ieQHC`kiVEr6e6@7d7pJOcO?RnBZfH+oPSO23M&nVL;kA0wO3O*f zGt_5(u{Leek>Cb3_OIN^2XBNOZaQR+Rwk{kaM2%GU^VfIRIa&g;%0A0UbFF0bk_*w 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 literal 0 HcmV?d00001 diff --git a/docs/bepinex.md b/docs/bepinex.md index b4029534..4cb7d3ef 100644 --- a/docs/bepinex.md +++ b/docs/bepinex.md @@ -8,55 +8,53 @@ 1. Access the container as the steam user. - ```shell - docker-compose exec --user steam valheim bash - ``` + ```sh + docker-compose exec --user steam valheim bash + ``` 2. Create a new folder - ```shell - mkdir -p ~/tmp - ``` + ```sh + mkdir -p ~/tmp + ``` 3. Download BepInEx - ```shell - wget -O /home/steam/tmp/bepinex.zip https://github.com/valheimPlus/ValheimPlus/releases/download/0.9.7/UnixServer.zip - ``` + ```sh + wget -O /home/steam/tmp/bepinex.zip https://github.com/valheimPlus/ValheimPlus/releases/download/0.9.7/UnixServer.zip + ``` 4. Extract the BepInEx zip file - ```shell - unzip -o /home/steam/tmp/bepinex.zip -d /home/steam/valheim - - ``` + ```shell + unzip -o /home/steam/tmp/bepinex.zip -d /home/steam/valheim + ``` 5. Cleanup files - ```shell - cd /home/steam/valheim && rm -rf /home/steam/tmp - ``` + ```shell + cd /home/steam/valheim && rm -rf /home/steam/tmp + ``` 6. Restart your server. -> You should see a huge disclaimer in your console about running with bepinex. +> You should see a huge disclaimer in your console about running with bepinex. ## BepInEx/Modded Variables > These are set automatically by [Odin] for a basic BepInEx installation; > you DO NOT need to set these and only mess with them if you Know what you are doing. -| Variable | Default | Required | Description | -|-------------------------------|----------------------------------------------------------|----------|-------------| -| LD_PRELOAD | `libdoorstop_x64.so` | TRUE | Sets which library to preload on Valheim start. | -| LD_LIBRARY_PATH | `./linux64:/home/steam/valheim/doorstop_libs` | TRUE | Sets which library paths it should look in for preload libs. | -| DOORSTOP_ENABLE | `TRUE` | TRUE | Enables Doorstop or not. | -| DOORSTOP_LIB | `libdoorstop_x64.so` | TRUE | Which doorstop lib to load | -| DOORSTOP_LIBS | `/home/steam/valheim/doorstop_libs` | TRUE | Where to look for doorstop libs. | -| DOORSTOP_INVOKE_DLL_PATH | `/home/steam/valheim/BepInEx/core/BepInEx.Preloader.dll` | TRUE | BepInEx preload dll to load. | -| DOORSTOP_CORLIB_OVERRIDE_PATH | `/home/steam/valheim/unstripped_corlib` | TRUE | Sets where the decompiled libraries containing base mono files are located at | +| Variable | Default | Required | Description | +| ----------------------------- | -------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------ | +| LD_PRELOAD | `libdoorstop_x64.so` | TRUE | Sets which library to preload on Valheim start. | +| LD_LIBRARY_PATH | `./linux64:/home/steam/valheim/doorstop_libs` | TRUE | Sets which library paths it should look in for preload libs. | +| DOORSTOP_ENABLE | `TRUE` | TRUE | Enables Doorstop or not. | +| DOORSTOP_LIB | `libdoorstop_x64.so` | TRUE | Which doorstop lib to load | +| DOORSTOP_LIBS | `/home/steam/valheim/doorstop_libs` | TRUE | Where to look for doorstop libs. | +| DOORSTOP_INVOKE_DLL_PATH | `/home/steam/valheim/BepInEx/core/BepInEx.Preloader.dll` | TRUE | BepInEx preload dll to load. | +| DOORSTOP_CORLIB_OVERRIDE_PATH | `/home/steam/valheim/unstripped_corlib` | TRUE | Sets where the decompiled libraries containing base mono files are located at | | DYLD_LIBRARY_PATH | `"/home/steam/valheim/doorstop_libs"` | TRUE | Sets the library paths. NOTE: This variable is weird and MUST have quotes around it! | -| DYLD_INSERT_LIBRARIES | `/home/steam/valheim/doorstop_libs/libdoorstop_x64.so` | TRUE | Sets which library to load. | +| DYLD_INSERT_LIBRARIES | `/home/steam/valheim/doorstop_libs/libdoorstop_x64.so` | TRUE | Sets which library to load. | - -[Odin]: ./odin.md +[odin]: ./odin.md diff --git a/docs/getting_started_with_mods.md b/docs/getting_started_with_mods.md index 62a829d5..ee19516a 100644 --- a/docs/getting_started_with_mods.md +++ b/docs/getting_started_with_mods.md @@ -1,50 +1,50 @@ # Getting started with Mods -> For this example we will be going over installing ValheimPlus. There is a lot of mysteries when it comes to modding but this should help you get started. +> For this example we will be going over installing ValheimPlus. There is a lot of mysteries when it comes to modding but this should help you get started. ## Steps 1. Set the variable `TYPE` to be ONne of the following: - | Type | What it installs | - |-------------|------------------| - | Vanilla | Default value and the most common installation type. This will run Valheim normally. | - | BepInEx | This will install [BepInEx from this package](https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/) and is purely just BepInEx with minimally needed components. | - | BepInExFull | This will install [BepInEx Full from this package](https://valheim.thunderstore.io/package/1F31A/BepInEx_Valheim_Full/) and contains a modern set of components with some extras for expanded mod compatibility. | - | ValheimPlus | This will install [Valheim Plus from this repository](https://github.com/valheimPlus/ValheimPlus) and included BepInEx as a basic version with the most common set of components | + | Type | What it installs | + | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | Vanilla | Default value and the most common installation type. This will run Valheim normally. | + | BepInEx | This will install [BepInEx from this package](https://valheim.thunderstore.io/package/denikson/BepInExPack_Valheim/) and is purely just BepInEx with minimally needed components. | + | BepInExFull | This will install [BepInEx Full from this package](https://valheim.thunderstore.io/package/1F31A/BepInEx_Valheim_Full/) and contains a modern set of components with some extras for expanded mod compatibility. | + | ValheimPlus | This will install [Valheim Plus from this repository](https://github.com/valheimPlus/ValheimPlus) and included BepInEx as a basic version with the most common set of components | 2. If you wish do not with to use additional mods, you can skip this step. Otherwise, in order to install additional mods you can use the `MODS` variable. - - Example of MODS, this example is slimmed down to go over the `TYPE` and `MODS` variable. - - ```yaml - version: "3" - services: - valheim: - image: mbround18/valheim:latest - environment: - # The Type variable is used to set which type of server you would like to run. - - TYPE=ValheimPlus - # The Mods variable is a comma and newline separated string. - # It MUST be a link with a command and a new line at the end to be valid. - - "MODS= - https://cdn.thunderstore.io/live/repository/packages/abearcodes-SimpleRecycling-0.0.10.zip, - https://cdn.thunderstore.io/live/repository/packages/abearcodes-CraftingWithContainers-1.0.9.zip - " - ``` + + Example of MODS, this example is slimmed down to go over the `TYPE` and `MODS` variable. + + ```yaml + version: "3" + services: + valheim: + image: mbround18/valheim:latest + environment: + # The Type variable is used to set which type of server you would like to run. + - TYPE=ValheimPlus + # The Mods variable is a comma and newline separated string. + # It MUST be a link with a command and a new line at the end to be valid. + - "MODS= + https://cdn.thunderstore.io/live/repository/packages/abearcodes-SimpleRecycling-0.0.10.zip, + https://cdn.thunderstore.io/live/repository/packages/abearcodes-CraftingWithContainers-1.0.9.zip + " + ``` 3. Now that you have your compose setup, run `docker-compose up` > Odin automatically detects if you are running with BepInEx and adds the environment variables appropriately. -> +> > DISCLAIMER! Modding your server can cause a lot of errors. > Please do NOT post an issue on the valheim-docker repo based on mod issues. > By installing mods, you agree that you will do a root cause analysis to why your server is failing before you make a post. > Modding is currently unsupported by the Valheim developers and limited support by the valheim-docker repo. > If you have issues please contact the MOD developer FIRST based on the output logs. -## Valheim Updated Help!!!! +## Valheim Updated Help -Mod development is slow, and the more mods you have the more complicated it will be to keep everything up to date. +Mod development is slow, and the more mods you have the more complicated it will be to keep everything up to date. It is a suggestion that you turn off the AUTO_UPDATE variable when you are using mods and refrain from updating your local client until all your mods have been updated. -Some mods break on new updates of Valheim while others do not. Be on the look out for mod issues if you update your server. +Some mods break on new updates of Valheim while others do not. Be on the look out for mod issues if you update your server. diff --git a/docs/odin.md b/docs/odin.md index 160e71ef..35fbf06b 100644 --- a/docs/odin.md +++ b/docs/odin.md @@ -2,16 +2,16 @@ Odin is a CLI tool utilized for installing, starting, and stopping [Valheim] servers -#### Odin Specific Environment Variables +## Odin Specific Environment Variables > These are set automatically by Odin; > you DO NOT need to set these and only mess with them if you Know what you are doing. -| Variable | Default | Required | Description | -|--------------------------|------------------------|----------|-------------| -| DEBUG_MODE | `0` | FALSE | Set to `1` if you want a noisy output and to see what Odin is doing. -| ODIN_CONFIG_FILE | `config.json` | FALSE | This file stores start parameters to restart the instance, change if you run multiple container instances on the same host | -| ODIN_WORKING_DIR | `$PWD` | FALSE | Sets the directory you wish to run `odin` commands in and can be used to set where valheim is managed from. | +| Variable | Default | Required | Description | +| ---------------- | ------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- | +| DEBUG_MODE | `0` | FALSE | Set to `1` if you want a noisy output and to see what Odin is doing. | +| ODIN_CONFIG_FILE | `config.json` | FALSE | This file stores start parameters to restart the instance, change if you run multiple container instances on the same host | +| ODIN_WORKING_DIR | `$PWD` | FALSE | Sets the directory you wish to run `odin` commands in and can be used to set where valheim is managed from. | ## Gotchas @@ -32,7 +32,7 @@ cargo install --git https://github.com/mbround18/valheim-docker.git --branch mai ![Main Menu](./assets/main-menu.png) -#### Install Valheim +### Install Valheim ```sh odin install @@ -56,7 +56,6 @@ odin stop ![Install Menu](./assets/stop-menu.png) - ### Status #### Local Server diff --git a/docs/releases/status_update.md b/docs/releases/status_update.md index 9b84af66..72f7a88c 100644 --- a/docs/releases/status_update.md +++ b/docs/releases/status_update.md @@ -1,5 +1,4 @@ -# ❤️Status Update ❤️ - +# ❤️Status Update ❤️ ## 🆕 odin status @@ -9,7 +8,9 @@ - Has the ability to output with JSON, see below. ### Json flag + Without `--json` + ```shell [ODIN][INFO] - Name: Creative Update [ODIN][INFO] - Players: 0/10 @@ -20,33 +21,34 @@ Without `--json` With `--json` (with ValheimPlus for example) + ```json { - "name":"Fancy Name", - "version":"0.147.3@0.9.5.5", - "players":0, - "max_players":10, - "map":"Fancy Name", - "online":true, - "bepinex":{ - "enabled":true, - "mods":[ + "name": "Fancy Name", + "version": "0.147.3@0.9.5.5", + "players": 0, + "max_players": 10, + "map": "Fancy Name", + "online": true, + "bepinex": { + "enabled": true, + "mods": [ { - "name":"ValheimPlus.dll", - "location":"/home/steam/valheim/BepInEx/plugins/ValheimPlus.dll" + "name": "ValheimPlus.dll", + "location": "/home/steam/valheim/BepInEx/plugins/ValheimPlus.dll" } ] }, - "jobs":[ + "jobs": [ { - "name":"AUTO_UPDATE", - "enabled":false, - "schedule":"*/5 * * * *" + "name": "AUTO_UPDATE", + "enabled": false, + "schedule": "*/5 * * * *" }, { - "name":"AUTO_BACKUP", - "enabled":true, - "schedule":"*/5 * * * *" + "name": "AUTO_BACKUP", + "enabled": true, + "schedule": "*/5 * * * *" } ] } @@ -59,40 +61,39 @@ Setting the `HTTP_PORT` variable to any number will spin up a small http server You can access it via `http://127.0.0.1:HTTP_PORT/status`. You are responsible for putting your status endpoint behind SSL or authentication if you desire. - ### When server is found ```json { - "name":"Creative Update", - "version":"0.147.3@0.9.5.5", - "players":0, - "max_players":10, - "map":"Creative Update", - "online":true, - "bepinex":{ - "enabled":true, - "mods":[ + "name": "Creative Update", + "version": "0.147.3@0.9.5.5", + "players": 0, + "max_players": 10, + "map": "Creative Update", + "online": true, + "bepinex": { + "enabled": true, + "mods": [ { - "name":"BetterUI.dll", - "location":"/home/steam/valheim/BepInEx/plugins/BetterUI/plugins/BetterUI/BetterUI.dll" + "name": "BetterUI.dll", + "location": "/home/steam/valheim/BepInEx/plugins/BetterUI/plugins/BetterUI/BetterUI.dll" }, { - "name":"ValheimPlus.dll", - "location":"/home/steam/valheim/BepInEx/plugins/ValheimPlus.dll" + "name": "ValheimPlus.dll", + "location": "/home/steam/valheim/BepInEx/plugins/ValheimPlus.dll" } ] }, - "jobs":[ + "jobs": [ { - "name":"AUTO_UPDATE", - "enabled":false, - "schedule":"*/5 * * * *" + "name": "AUTO_UPDATE", + "enabled": false, + "schedule": "*/5 * * * *" }, { - "name":"AUTO_BACKUP", - "enabled":true, - "schedule":"*/5 * * * *" + "name": "AUTO_BACKUP", + "enabled": true, + "schedule": "*/5 * * * *" } ] } @@ -106,20 +107,16 @@ You are responsible for putting your status endpoint behind SSL or authenticatio ```json { - "name":"Unknown", - "version":"Unknown", - "players":0, - "max_players":0, - "map":"Unknown", - "online":false, - "bepinex":{ - "enabled":false, - "mods":[ - - ] + "name": "Unknown", + "version": "Unknown", + "players": 0, + "max_players": 0, + "map": "Unknown", + "online": false, + "bepinex": { + "enabled": false, + "mods": [] }, - "jobs":[ - - ] + "jobs": [] } ``` diff --git a/docs/tutorials/how-to-transfer-files.md b/docs/tutorials/how-to-transfer-files.md new file mode 100644 index 00000000..340b84f9 --- /dev/null +++ b/docs/tutorials/how-to-transfer-files.md @@ -0,0 +1,50 @@ +# How To Transfer Files + +> For this tutorial, we will be using [schollz/croc] which is a cli tool for sending files. This is for temporary access to transfer files and if you want to do this frequently, then consider running a [file browser](https://hub.docker.com/r/hurlenko/filebrowser) sidecar container. + +## Setup + +1. Access the container via the root user. + +```sh +# This can be accomplished via many methods but for this tutorial we will be using docker-compose. +docker-compose exec valheim bash + +# 1. Replace valheim with the name of your container. +# 2. This tutorial cannot account fo all the wide variety of names or methods on which the container is created. +# 3. You just need to access the container via the root user to install croc. +``` + +1. Run `curl https://getcroc.schollz.com | bash` inside the `mbround18/valheim` container. +2. Run `curl https://getcroc.schollz.com | bash` inside the destination machine. (If the destination machine is not a linux|unix based system with access to bash, please look at [schollz/croc] repo for installation instructions.) + +![Install Croc Success](../assets/transfer-file-demo/install-croc.png) + +## Instructions + +> For this example, we will be transfering world files from one instance of `mbround18/valheim` to another `mbround18/valheim`. If you have a slightly different use case, such as transfering backups or something else, then this guide will be helpful but not match 1 to 1. + +1. Access the `mbround18/valheim` container A and container B as the steam user. + + ```sh + # This can be accomplished via many methods but for this tutorial we will be using docker-compose. + docker-compose exec --user steam valheim bash + + # Replace valheim with the name of your container. + # This tutorial cannot account fo all the wide variety of names or methods on which the container is created. + # You just need to access the container via the steam user when sending the files. + ``` + +2. Stop the valheim server on both machines, `odin stop` +3. Cd into your saves dir with `cd /home/steam/.config/unity3d/IronGate/Valheim` on both container A and container B. +4. With croc already installed, run `croc send ./*` on container A. + + ![croc send command](../assets/transfer-file-demo/send-croc.png) + +5. Once it spits out the transfer key, copy the transfer key to container B and hit the enter key. + + ![croc send command success](../assets/transfer-file-demo/send-croc-success.png) + +6. You can now safely shutdown container A and restart container B. + +[schollz/croc]: https://github.com/schollz/croc diff --git a/docs/webhooks.md b/docs/webhooks.md index 54b3bc47..e5b4d8c2 100644 --- a/docs/webhooks.md +++ b/docs/webhooks.md @@ -2,22 +2,19 @@ ## Environment Variables -| Variable | Default | Required | Description | -|-------------------------------------|------------------------------------|----------|-------------| -| WEBHOOK_URL | ` ` | FALSE | Supply this to get information regarding your server's status in a webhook or Discord notification! [Click here to learn how to get a webhook url for Discord](https://help.dashe.io/en/articles/2521940-how-to-create-a-discord-webhook-url) | - - +| Variable | Default | Required | Description | +| --------------------------------- | ---------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| WEBHOOK_URL | `` | FALSE | Supply this to get information regarding your server's status in a webhook or Discord notification! [Click here to learn how to get a webhook url for Discord](https://help.dashe.io/en/articles/2521940-how-to-create-a-discord-webhook-url) | +| WEBHOOK_BROADCAST_MESSAGE | CHANGE_ME | TRUE | You set this. See `odin notify --help` | +| WEBHOOK_UPDATING_MESSAGE | `Server Status: Updating` | FALSE | Set the Updating message of your server | +| WEBHOOK_UPDATE_SUCCESSFUL_MESSAGE | `Server Status: Update Successful` | FALSE | Set the Update Successful message of your server | +| WEBHOOK_UPDATE_FAILED_MESSAGE | `Server Status: Update Failed` | FALSE | Set the Update Failed message of your server | +| WEBHOOK_STARTING_MESSAGE | `Server Status: Starting` | FALSE | Set the Starting message of your server | +| WEBHOOK_START_SUCCESSFUL_MESSAGE | `Server Status: Start Successful` | FALSE | Set the Start Successful message of your server | +| WEBHOOK_START_FAILED_MESSAGE | `Server Status: Start Failed` | FALSE | Set the Start Failed message of your server | +| WEBHOOK_STOPPING_MESSAGE | `Server Status: Stopping` | FALSE | Set the Stopping message of your server | +| WEBHOOK_STOP_SUCCESSFUL_MESSAGE | `Server Status: Stop Successful` | FALSE | Set the Stop Successful message of your server | +| WEBHOOK_STOP_FAILED_MESSAGE | `Server Status: Stop Failed` | FALSE | Set the Stop Failed message of your server | ## POST Body Example @@ -32,33 +29,31 @@ } ``` -| Key | Description | -|-----------------|-------------| -| `event_type.name` | Name of the event | -| `event_type.status` | Status of the event | -| `event_message` | A description of the event. | -| `timestamp` | ISO8601 timestamp | +| Key | Description | +| ------------------- | --------------------------- | +| `event_type.name` | Name of the event | +| `event_type.status` | Status of the event | +| `event_message` | A description of the event. | +| `timestamp` | ISO8601 timestamp | ## Considerations -- The expected HTTP codes returned from the webhook should be either 204 or 201 to be considered successful. - - 204 is the default return http code for a webhook as it signifies the request has been processed. - - 201 was included in case you want to stream into an endpoint for creating a resource. - - Example 1, logging actions on the server. - - Example 2, using json-server to debug webhooks. - +- The expected HTTP codes returned from the webhook should be either 204 or 201 to be considered successful. + - 204 is the default return http code for a webhook as it signifies the request has been processed. + - 201 was included in case you want to stream into an endpoint for creating a resource. + - Example 1, logging actions on the server. + - Example 2, using json-server to debug webhooks. + ## Developing/Debugging Webhooks 1. Start json-server - - ```shell - docker run --rm -p 3000:3000 vimagick/json-server -H 0.0.0.0 -p 3000 -w db.json - ``` - -2. Run notify against the webhook - - ```shell - cargo run -- notify "Derp Testing another notification" --webhook "http://127.0.0.1:3000/posts" - ``` + ```shell + docker run --rm -p 3000:3000 vimagick/json-server -H 0.0.0.0 -p 3000 -w db.json + ``` + +2. Run notify against the webhook + ```shell + cargo run -- notify "Derp Testing another notification" --webhook "http://127.0.0.1:3000/posts" + ```