diff --git a/deploy_couchdb_to_flyio_v2_with_swap.ipynb b/deploy_couchdb_to_flyio_v2_with_swap.ipynb index dd7e0d0..78e4d73 100644 --- a/deploy_couchdb_to_flyio_v2_with_swap.ipynb +++ b/deploy_couchdb_to_flyio_v2_with_swap.ipynb @@ -3,8 +3,8 @@ { "cell_type": "markdown", "metadata": { - "id": "view-in-github", - "colab_type": "text" + "colab_type": "text", + "id": "view-in-github" }, "source": [ "\"Open" @@ -12,15 +12,16 @@ }, { "cell_type": "markdown", + "metadata": { + "id": "HiRV7G8Gk1Rs" + }, "source": [ "History:\n", "- 18, May, 2023: Initial.\n", "- 19, Jun., 2023: Patched for enabling swap.\n", - "- 22, Aug., 2023: Generating Setup-URI implemented." - ], - "metadata": { - "id": "HiRV7G8Gk1Rs" - } + "- 22, Aug., 2023: Generating Setup-URI implemented.\n", + "- 7, Nov., 2023: Fixed the issue of TOML editing." + ] }, { "cell_type": "code", @@ -45,7 +46,7 @@ }, "outputs": [], "source": [ - "# Delete once\n", + "# Delete once (Do not care about `cannot remove './fly.toml': No such file or directory`)\n", "!rm ./fly.toml" ] }, @@ -78,15 +79,15 @@ }, { "cell_type": "code", - "source": [ - "# Check the toml once.\n", - "!cat fly.toml" - ], + "execution_count": null, "metadata": { "id": "2RSoO9o-i2TT" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [ + "# Check the toml once.\n", + "!cat fly.toml" + ] }, { "cell_type": "code", @@ -96,52 +97,45 @@ }, "outputs": [], "source": [ - "# Modify fly.toml\n", - "## Port modification\n", - "!sed -i 's/8080/5984/g' fly.toml\n", - "## Add user into.\n", - "!echo -e \"\\n[env]\\n COUCHDB_USER = \\\"${couchUser}\\\"\" >> ./fly.toml\n", - "## Set the location of an ini file which to save configurations persistently via erlang flags.\n", - "!echo -e \"\\nERL_FLAGS=\\\"-couch_ini /opt/couchdb/etc/default.ini /opt/couchdb/etc/default.d/ /opt/couchdb/etc/local.d /opt/couchdb/etc/local.ini /opt/couchdb/data/persistence.ini\\\"\" >> ./fly.toml\n", - "## Mounting volumes to store data and ini file.\n", - "!echo -e \"\\n[mounts]\\n source=\\\"couchdata\\\"\\n destination=\\\"/opt/couchdb/data\\\"\" >> ./fly.toml\n", - "!cat fly.toml" - ] - }, - { - "cell_type": "code", - "source": [ + "# Modify the TOML and generate Dockerfile\n", + "!pip install mergedeep\n", + "from mergedeep import merge\n", + "import toml\n", + "fly = toml.load('fly.toml')\n", + "override = {\n", + " \"http_service\":{\n", + " \"internal_port\":5984\n", + " },\n", + " \"build\":{\n", + " \"dockerfile\":\"./Dockerfile\"\n", + " },\n", + " \"mounts\":{\n", + " \"source\":\"couchdata\",\n", + " \"destination\":\"/opt/couchdb/data\"\n", + " },\n", + " \"env\":{\n", + " \"COUCHDB_USER\":os.environ['couchUser'],\n", + " \"ERL_FLAGS\":\"-couch_ini /opt/couchdb/etc/default.ini /opt/couchdb/etc/default.d/ /opt/couchdb/etc/local.d /opt/couchdb/etc/local.ini /opt/couchdb/data/persistence.ini\",\n", + " }\n", + "}\n", + "out = merge(fly,override)\n", + "with open('fly.toml', 'wt') as fp:\n", + " toml.dump(out, fp)\n", + " fp.close()\n", + "\n", "# Make the Dockerfile to modify the permission of the ini file. If you want to use a specific version, you should change `latest` here.\n", - "!echo -e \"\\n[build]\\n dockerfile = \\\"./Dockerfile\\\"\" >> ./fly.toml" - ], - "metadata": { - "id": "LQPsZ_dYxkTu" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "!echo -e \"FROM couchdb:latest\\nRUN sed -i '2itouch /opt/couchdb/data/persistence.ini && chmod +w /opt/couchdb/data/persistence.ini && fallocate -l 512M /swapfile && chmod 0600 /swapfile && mkswap /swapfile && echo 10 > /proc/sys/vm/swappiness && swapon /swapfile && echo 1 > /proc/sys/vm/overcommit_memory' /docker-entrypoint.sh\" > ./Dockerfile" - ], - "metadata": { - "id": "44cBeGJ9on5i" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# Check dockerfile\n", - "!cat ./Dockerfile" - ], - "metadata": { - "id": "ai2R3BbpxRSe" - }, - "execution_count": null, - "outputs": [] + "dockerfile = '''FROM couchdb:latest\n", + "RUN sed -i '2itouch /opt/couchdb/data/persistence.ini && chmod +w /opt/couchdb/data/persistence.ini && fallocate -l 512M /swapfile && chmod 0600 /swapfile && mkswap /swapfile && echo 10 > /proc/sys/vm/swappiness && swapon /swapfile && echo 1 > /proc/sys/vm/overcommit_memory' /docker-entrypoint.sh\n", + "'''\n", + "with open(\"./Dockerfile\",\"wt\") as fp:\n", + " fp.write(dockerfile)\n", + " fp.close()\n", + "\n", + "!echo ------\n", + "!cat fly.toml\n", + "!echo ------\n", + "!cat Dockerfile" + ] }, { "cell_type": "code", @@ -189,20 +183,27 @@ }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "cGlSzVqlQG_z" + }, + "outputs": [], "source": [ "# Finish setting up the CouchDB\n", "# Please repeat until the request is completed without error messages\n", "# i.e., You have to redo this block while \"curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection to xxxx\" is showing.\n", + "#\n", + "# Note: A few minutes might be required to be booted.\n", "!curl -X POST \"${couchHost}/_cluster_setup\" -H \"Content-Type: application/json\" -d \"{\\\"action\\\":\\\"enable_single_node\\\",\\\"username\\\":\\\"${couchUser}\\\",\\\"password\\\":\\\"${couchPwd}\\\",\\\"bind_address\\\":\\\"0.0.0.0\\\",\\\"port\\\":5984,\\\"singlenode\\\":true}\" --user \"${couchUser}:${couchPwd}\"" - ], - "metadata": { - "id": "cGlSzVqlQG_z" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JePzrsHypY18" + }, + "outputs": [], "source": [ "# Please repeat until all lines are completed without error messages\n", "!curl -X PUT \"${couchHost}/_node/nonode@nohost/_config/chttpd/require_valid_user\" -H \"Content-Type: application/json\" -d '\"true\"' --user \"${couchUser}:${couchPwd}\"\n", @@ -214,28 +215,28 @@ "!curl -X PUT \"${couchHost}/_node/nonode@nohost/_config/couchdb/max_document_size\" -H \"Content-Type: application/json\" -d '\"50000000\"' --user \"${couchUser}:${couchPwd}\"\n", "!curl -X PUT \"${couchHost}/_node/nonode@nohost/_config/cors/credentials\" -H \"Content-Type: application/json\" -d '\"true\"' --user \"${couchUser}:${couchPwd}\"\n", "!curl -X PUT \"${couchHost}/_node/nonode@nohost/_config/cors/origins\" -H \"Content-Type: application/json\" -d '\"app://obsidian.md,capacitor://localhost,http://localhost\"' --user \"${couchUser}:${couchPwd}\"" - ], - "metadata": { - "id": "JePzrsHypY18" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "markdown", + "metadata": { + "id": "YfSOomsoXbGS" + }, "source": [ "Now, our CouchDB has been surely installed and configured. Cheers!\n", "\n", "In the steps that follow, create a setup-URI.\n", "\n", "This URI could be imported directly into Self-hosted LiveSync, to configure the use of the CouchDB which we configured now." - ], - "metadata": { - "id": "YfSOomsoXbGS" - } + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "416YncOqXdNn" + }, + "outputs": [], "source": [ "# Database config\n", "import random, string\n", @@ -250,39 +251,39 @@ "\n", "print(\"Your database:\"+os.environ['database'])\n", "print(\"Your passphrase:\"+os.environ['passphrase'])" - ], - "metadata": { - "id": "416YncOqXdNn" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "code", - "source": [ - "# Install deno for make setup uri\n", - "!curl -fsSL https://deno.land/x/install/install.sh | sh" - ], + "execution_count": null, "metadata": { "id": "C4d7C0HAXgsr" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [ + "# Install deno for make setup uri\n", + "!curl -fsSL https://deno.land/x/install/install.sh | sh" + ] }, { "cell_type": "code", - "source": [ - "# Fetch module for encrypting a Setup URI\n", - "!curl -o encrypt.ts https://gist.githubusercontent.com/vrtmrz/f9d1d95ee2ca3afa1a924a2c6759b854/raw/d7a070d864a6f61403d8dc74208238d5741aeb5a/encrypt.ts" - ], + "execution_count": null, "metadata": { "id": "hQL_Dx-PXise" }, - "execution_count": null, - "outputs": [] + "outputs": [], + "source": [ + "# Fetch module for encrypting a Setup URI\n", + "!curl -o encrypt.ts https://gist.githubusercontent.com/vrtmrz/f9d1d95ee2ca3afa1a924a2c6759b854/raw/d7a070d864a6f61403d8dc74208238d5741aeb5a/encrypt.ts" + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "o0gX_thFXlIZ" + }, + "outputs": [], "source": [ "# Make buttons!\n", "from IPython.display import HTML\n", @@ -294,29 +295,24 @@ "else:\n", " result = \"Failed to encrypt the setup URI\"\n", "result" - ], - "metadata": { - "id": "o0gX_thFXlIZ" - }, - "execution_count": null, - "outputs": [] + ] } ], "metadata": { "colab": { - "provenance": [], + "include_colab_link": true, "private_outputs": true, - "include_colab_link": true + "provenance": [] }, + "gpuClass": "standard", "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" - }, - "gpuClass": "standard" + } }, "nbformat": 4, "nbformat_minor": 0 -} \ No newline at end of file +}