From 25f3e2fb25208ba5fd9d5e3923e9bb832a059b8f Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Mon, 8 Nov 2021 14:53:48 -0800 Subject: [PATCH] Deploy website - based on ebebc3d5b59d082889089af4e791232b8671a7d9 --- 404.html | 4 ++-- assets/js/{03f09ed3.38f71f61.js => 03f09ed3.3d44865e.js} | 2 +- .../{runtime~main.afd1eb88.js => runtime~main.bd1a0b32.js} | 2 +- blog/archive/index.html | 4 ++-- blog/first-blog-post/index.html | 4 ++-- blog/index.html | 4 ++-- blog/long-blog-post/index.html | 4 ++-- blog/mdx-blog-post/index.html | 4 ++-- blog/tags/docusaurus/index.html | 4 ++-- blog/tags/facebook/index.html | 4 ++-- blog/tags/hello/index.html | 4 ++-- blog/tags/hola/index.html | 4 ++-- blog/tags/index.html | 4 ++-- blog/welcome/index.html | 4 ++-- docs/architecture/index.html | 4 ++-- docs/intro/index.html | 4 ++-- docs/resources/index.html | 4 ++-- docs/tags/index.html | 4 ++-- docs/unraid_install/index.html | 6 +++--- index.html | 4 ++-- markdown-page/index.html | 4 ++-- 21 files changed, 41 insertions(+), 41 deletions(-) rename assets/js/{03f09ed3.38f71f61.js => 03f09ed3.3d44865e.js} (72%) rename assets/js/{runtime~main.afd1eb88.js => runtime~main.bd1a0b32.js} (98%) diff --git a/404.html b/404.html index c95f35b..65ad12f 100644 --- a/404.html +++ b/404.html @@ -6,13 +6,13 @@ Page Not Found | ThreeTwo! - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/assets/js/03f09ed3.38f71f61.js b/assets/js/03f09ed3.3d44865e.js similarity index 72% rename from assets/js/03f09ed3.38f71f61.js rename to assets/js/03f09ed3.3d44865e.js index 0f4e2b5..990a38d 100644 --- a/assets/js/03f09ed3.38f71f61.js +++ b/assets/js/03f09ed3.3d44865e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkthreetwo_docs=self.webpackChunkthreetwo_docs||[]).push([[115],{93:function(e,t,n){n.r(t),n.d(t,{frontMatter:function(){return l},contentTitle:function(){return s},metadata:function(){return p},toc:function(){return d},default:function(){return k}});var a=n(7462),i=n(3366),o=(n(7294),n(3905)),r=["components"],l={sidebar_position:2,id:"unraid_install",title:"Install ThreeTwo! on unRaid"},s=void 0,p={unversionedId:"unraid_install",id:"unraid_install",isDocsHomePage:!1,title:"Install ThreeTwo! on unRaid",description:"Notes",source:"@site/docs/unraid_install.md",sourceDirName:".",slug:"/unraid_install",permalink:"/threetwo-docs/docs/unraid_install",editUrl:"https://github.com/facebook/docusaurus/edit/main/website/docs/unraid_install.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,id:"unraid_install",title:"Install ThreeTwo! on unRaid"},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/threetwo-docs/docs/intro"},next:{title:"Resources & Help",permalink:"/threetwo-docs/docs/resources"}},d=[{value:"Notes",id:"notes",children:[]},{value:"Pre-requisites",id:"pre-requisites",children:[]},{value:"Getting the VM up and running",id:"getting-the-vm-up-and-running",children:[]},{value:"Installing Debian on the VM",id:"installing-debian-on-the-vm",children:[]},{value:"Docker pre-requisites",id:"docker-pre-requisites",children:[]},{value:"VM pre-requisites",id:"vm-pre-requisites",children:[]},{value:"Installation",id:"installation",children:[]},{value:"Post-install checks",id:"post-install-checks",children:[]},{value:"To get updates",id:"to-get-updates",children:[]},{value:"Troubleshooting",id:"troubleshooting",children:[]}],m={toc:d};function k(e){var t=e.components,n=(0,i.Z)(e,r);return(0,o.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"notes"},"Notes"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Currently, ",(0,o.kt)("inlineCode",{parentName:"li"},"ThreeTwo!")," is installed along with its dependencies using ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose"),". The easiest way to install it on ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," is to use a VM. This guide is written with ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," in mind, but can theoretically run on any platform that supports ",(0,o.kt)("inlineCode",{parentName:"li"},"docker")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose")),(0,o.kt)("li",{parentName:"ul"},"Skip the VM creation steps, if you already have a Debian VM")),(0,o.kt)("h3",{id:"pre-requisites"},"Pre-requisites"),(0,o.kt)("p",null,"This guide assumes the following is installed or readily available:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"unRaid 6.9.2")," (this version was tested against ",(0,o.kt)("inlineCode",{parentName:"p"},"6.9.2"),")")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"For ",(0,o.kt)("inlineCode",{parentName:"p"},"DC++")," functionality, ",(0,o.kt)("inlineCode",{parentName:"p"},"AirDC++")," is required")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"Debian 10.x")," (Grab the install ",(0,o.kt)("inlineCode",{parentName:"p"},".iso")," ",(0,o.kt)("a",{parentName:"p",href:"https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.1.0-amd64-netinst.iso"},"here"),")")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"You need to create the following folder structure on your ",(0,o.kt)("inlineCode",{parentName:"p"},"unRaid")," host. "),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"}," - comics\n - userdata\n |- covers\n |- expanded\n |- temporary\n")),(0,o.kt)("p",{parentName:"li"}," ",(0,o.kt)("inlineCode",{parentName:"p"},"comics")," could be where your final; downloaded, renamed comics reside. ",(0,o.kt)("inlineCode",{parentName:"p"},"userdata")," is purely for ",(0,o.kt)("inlineCode",{parentName:"p"},"ThreeTwo!"),". "),(0,o.kt)("p",{parentName:"li"}," ",(0,o.kt)("em",{parentName:"p"},"You absolutely need both these folders with the structure described above. Many core functions won't work otherwise!")))),(0,o.kt)("h3",{id:"getting-the-vm-up-and-running"},"Getting the VM up and running"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Download the ",(0,o.kt)("inlineCode",{parentName:"li"},"Debian")," install ",(0,o.kt)("inlineCode",{parentName:"li"},".iso")),(0,o.kt)("li",{parentName:"ol"},"Place it in a folder accessible by the VM"),(0,o.kt)("li",{parentName:"ol"},"Go to the ",(0,o.kt)("inlineCode",{parentName:"li"},"VM")," tab in your ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," navigation"),(0,o.kt)("li",{parentName:"ol"},"Click ",(0,o.kt)("inlineCode",{parentName:"li"},"Add VM")),(0,o.kt)("li",{parentName:"ol"},"From the list presented to you, click ",(0,o.kt)("inlineCode",{parentName:"li"},"Debian")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"Linux")),(0,o.kt)("li",{parentName:"ol"},"On the VM configration page, enter the desired options for memory, CPU cores, vdisk allocation"),(0,o.kt)("li",{parentName:"ol"},"Make sure that you have set the volume containing the ",(0,o.kt)("inlineCode",{parentName:"li"},"comics")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"userdata")," folders correctly for ",(0,o.kt)("inlineCode",{parentName:"li"},"Unraid Share")),(0,o.kt)("li",{parentName:"ol"},"Make sure that you have also set the ",(0,o.kt)("inlineCode",{parentName:"li"},"Unraid Mount tag")," option"),(0,o.kt)("li",{parentName:"ol"},"Make sure that the network bridge is set to ",(0,o.kt)("inlineCode",{parentName:"li"},"br0")),(0,o.kt)("li",{parentName:"ol"},"Set a password for ",(0,o.kt)("inlineCode",{parentName:"li"},"VNC")," so you can follow through with a graphical install if you so wish")),(0,o.kt)("h3",{id:"installing-debian-on-the-vm"},"Installing Debian on the VM"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Launch the VM via ",(0,o.kt)("inlineCode",{parentName:"li"},"VNC Remote")," option"),(0,o.kt)("li",{parentName:"ol"},"Follow the steps of the graphical installer"),(0,o.kt)("li",{parentName:"ol"},"Create a ",(0,o.kt)("inlineCode",{parentName:"li"},"root")," user and a normal ",(0,o.kt)("inlineCode",{parentName:"li"},"user")," and set the passwords for both")),(0,o.kt)("h3",{id:"docker-pre-requisites"},"Docker pre-requisites"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://unix.stackexchange.com/questions/354928/bash-sudo-command-not-found"},"Make sure you have")," ",(0,o.kt)("inlineCode",{parentName:"li"},"sudo")),(0,o.kt)("li",{parentName:"ol"},"Make sure you have ",(0,o.kt)("inlineCode",{parentName:"li"},"ssh")," access for the user you created earlier"),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"ssh")," into the VM as the non-root user"),(0,o.kt)("li",{parentName:"ol"},"Install ",(0,o.kt)("a",{parentName:"li",href:"https://docs.docker.com/engine/install/debian/"},"Docker Engine")),(0,o.kt)("li",{parentName:"ol"},"Install ",(0,o.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install/#install-compose-on-linux-systems"},"docker-compose")),(0,o.kt)("li",{parentName:"ol"},"Verify that ",(0,o.kt)("inlineCode",{parentName:"li"},"docker")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose")," commands work")),(0,o.kt)("h3",{id:"vm-pre-requisites"},"VM pre-requisites"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Once you have mapped the ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," share containing ",(0,o.kt)("inlineCode",{parentName:"li"},"comics")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"userdata")," to the mountpoint of the VM, add this line to your ",(0,o.kt)("inlineCode",{parentName:"li"},"/etc/fstab"))),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"unraidshare /mnt/unraidshare 9p trans=virtio,version=9p2000.L,_netdev,rw 0 0\n")),(0,o.kt)("p",null," where, ",(0,o.kt)("inlineCode",{parentName:"p"},"unraidshare")," is the ",(0,o.kt)("inlineCode",{parentName:"p"},"unRaid")," host folder you chose to map to the VM mountpoint during the VM creation process."),(0,o.kt)("p",null," ",(0,o.kt)("inlineCode",{parentName:"p"},"/mnt/unraidshare")," is simply a location where you want ",(0,o.kt)("inlineCode",{parentName:"p"},"unraidshare")," mounted."),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Add the current user to the ",(0,o.kt)("inlineCode",{parentName:"p"},"docker")," group:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"sudo gpasswd -a $USER docker\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Reboot the VM for posterity")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Check that ",(0,o.kt)("inlineCode",{parentName:"p"},"/mnt/unraidshare")," correctly shows the folder contents."))),(0,o.kt)("h3",{id:"installation"},"Installation"),(0,o.kt)("h4",{id:"wherever-applicable-please-remember-to-substitute-things-enclosed-in--with-your-actual-values"},(0,o.kt)("em",{parentName:"h4"},"Wherever applicable, please remember to substitute things enclosed in ",(0,o.kt)("inlineCode",{parentName:"em"},"<...>")," with your actual values!")),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Clone the repo: ",(0,o.kt)("inlineCode",{parentName:"p"},"git clone https://github.com/rishighan/threetwo.git"),". If you have already cloned the repo and want updates, run ",(0,o.kt)("inlineCode",{parentName:"p"},"git pull")," from ",(0,o.kt)("inlineCode",{parentName:"p"},"threetwo")," directory.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Change the directory: ",(0,o.kt)("inlineCode",{parentName:"p"},"cd threetwo"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Create an external docker network using ",(0,o.kt)("inlineCode",{parentName:"p"},"docker network create proxy"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You need to add the VM's hostname to ",(0,o.kt)("inlineCode",{parentName:"p"},"environment.list"),".\nAdd this line: "),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"UNDERLYING_HOST= \n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You also need to provide your own ",(0,o.kt)("a",{parentName:"p",href:"https://comicvine.gamespot.com/api/"},"ComicVine API KEY"),". To do so, create a folder called ",(0,o.kt)("inlineCode",{parentName:"p"},".env")," and add the environment variable ",(0,o.kt)("inlineCode",{parentName:"p"},"COMICVINE_API_KEY")," to a file called ",(0,o.kt)("inlineCode",{parentName:"p"},"service.env"),". See below:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"mkdir .env\nnano .env/service.env\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Add ",(0,o.kt)("inlineCode",{parentName:"p"},"COMICVINE_API_KEY=")," to this file, then save ",(0,o.kt)("inlineCode",{parentName:"p"},"Ctrl O")," and exit ",(0,o.kt)("inlineCode",{parentName:"p"},"Ctrl X")," ")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Run the stack using: (",(0,o.kt)("em",{parentName:"p"},"Windows users please remove the trailing slashes ",(0,o.kt)("inlineCode",{parentName:"em"},"\\")," at the end of each line, when you copy-paste"),")"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"COMICS_DIRECTORY= \\\nUSERDATA_DIRECTORY= \\\nSERVICE_ENV_FILE= \\\ndocker-compose up --force-recreate -d\n")))),(0,o.kt)("h3",{id:"post-install-checks"},"Post-install checks"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Once the ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose up")," command successfully completes, you can check the spun-up containers using ",(0,o.kt)("inlineCode",{parentName:"li"},"docker ps")),(0,o.kt)("li",{parentName:"ol"},"You should see the following services up:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"threetwo-ui\nthreetwo-import-api\nimage-transformation\nimport\ncomicvine-api\nqueue\ntraefik\ndatabase\ntransporter\ncomicvine-service\n")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Past this, you can try accessing the ",(0,o.kt)("inlineCode",{parentName:"li"},"ThreeTwo!")," UI at ",(0,o.kt)("inlineCode",{parentName:"li"},":8050")," (Replace ",(0,o.kt)("inlineCode",{parentName:"li"},"")," with your VM's IP or hostname)")),(0,o.kt)("h3",{id:"to-get-updates"},"To get updates"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"First, take the stack down:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker-compose down\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"To get the updates from upstream, run the following, one command at a time:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker-compose rm -f\n\ndocker-compose pull\n\nCOMICS_DIRECTORY= \\\nUSERDATA_DIRECTORY= \\\nSERVICE_ENV_FILE= \\\ndocker-compose up --force-recreate -d\n \n")))),(0,o.kt)("h3",{id:"troubleshooting"},"Troubleshooting"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You aren't seeing all the services listed in ",(0,o.kt)("inlineCode",{parentName:"p"},"#2")," in the previous section spun up\nNote any errors listed at the end of ",(0,o.kt)("inlineCode",{parentName:"p"},"docker-compose up --force-recreate -d"),"\nRun ",(0,o.kt)("inlineCode",{parentName:"p"},"docker ps -a")," and look for any services with an ",(0,o.kt)("inlineCode",{parentName:"p"},"... (exited x seconds ago)")," message. Note the container name, typically under the ",(0,o.kt)("inlineCode",{parentName:"p"},"NAMES")," column.\nRun ",(0,o.kt)("inlineCode",{parentName:"p"},"docker logs ")," for the service that exited.\nCopy the error and open an issue on the repo's issue page.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Check the browser's inspector and the network tab. Note any calls that may have failed."))))}k.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkthreetwo_docs=self.webpackChunkthreetwo_docs||[]).push([[115],{93:function(e,t,n){n.r(t),n.d(t,{frontMatter:function(){return l},contentTitle:function(){return s},metadata:function(){return p},toc:function(){return d},default:function(){return k}});var a=n(7462),i=n(3366),o=(n(7294),n(3905)),r=["components"],l={sidebar_position:2,id:"unraid_install",title:"Install ThreeTwo! on unRaid"},s=void 0,p={unversionedId:"unraid_install",id:"unraid_install",isDocsHomePage:!1,title:"Install ThreeTwo! on unRaid",description:"Notes",source:"@site/docs/unraid_install.md",sourceDirName:".",slug:"/unraid_install",permalink:"/threetwo-docs/docs/unraid_install",editUrl:"https://github.com/facebook/docusaurus/edit/main/website/docs/unraid_install.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,id:"unraid_install",title:"Install ThreeTwo! on unRaid"},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/threetwo-docs/docs/intro"},next:{title:"Resources & Help",permalink:"/threetwo-docs/docs/resources"}},d=[{value:"Notes",id:"notes",children:[]},{value:"Pre-requisites",id:"pre-requisites",children:[]},{value:"Getting the VM up and running",id:"getting-the-vm-up-and-running",children:[]},{value:"Installing Debian on the VM",id:"installing-debian-on-the-vm",children:[]},{value:"Docker pre-requisites",id:"docker-pre-requisites",children:[]},{value:"VM pre-requisites",id:"vm-pre-requisites",children:[]},{value:"Installation",id:"installation",children:[]},{value:"Post-install checks",id:"post-install-checks",children:[]},{value:"To get updates",id:"to-get-updates",children:[]},{value:"Troubleshooting",id:"troubleshooting",children:[]}],m={toc:d};function k(e){var t=e.components,n=(0,i.Z)(e,r);return(0,o.kt)("wrapper",(0,a.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h3",{id:"notes"},"Notes"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Currently, ",(0,o.kt)("inlineCode",{parentName:"li"},"ThreeTwo!")," is installed along with its dependencies using ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose"),". The easiest way to install it on ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," is to use a VM. This guide is written with ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," in mind, but can theoretically run on any platform that supports ",(0,o.kt)("inlineCode",{parentName:"li"},"docker")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose")),(0,o.kt)("li",{parentName:"ul"},"Skip the VM creation steps, if you already have a Debian VM")),(0,o.kt)("h3",{id:"pre-requisites"},"Pre-requisites"),(0,o.kt)("p",null,"This guide assumes the following is installed or readily available:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"unRaid 6.9.2")," (this version was tested against ",(0,o.kt)("inlineCode",{parentName:"p"},"6.9.2"),")")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"For ",(0,o.kt)("inlineCode",{parentName:"p"},"DC++")," functionality, ",(0,o.kt)("inlineCode",{parentName:"p"},"AirDC++")," is required")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},(0,o.kt)("inlineCode",{parentName:"p"},"Debian 10.x")," (Grab the install ",(0,o.kt)("inlineCode",{parentName:"p"},".iso")," ",(0,o.kt)("a",{parentName:"p",href:"https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.1.0-amd64-netinst.iso"},"here"),")")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("p",{parentName:"li"},"You need to create the following folder structure on your ",(0,o.kt)("inlineCode",{parentName:"p"},"unRaid")," host. "),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre"}," - comics\n - userdata\n |- covers\n |- expanded\n |- temporary\n")),(0,o.kt)("p",{parentName:"li"}," ",(0,o.kt)("inlineCode",{parentName:"p"},"comics")," could be where your final; downloaded, renamed comics reside. ",(0,o.kt)("inlineCode",{parentName:"p"},"userdata")," is purely for ",(0,o.kt)("inlineCode",{parentName:"p"},"ThreeTwo!"),". "),(0,o.kt)("p",{parentName:"li"}," ",(0,o.kt)("em",{parentName:"p"},"You absolutely need both these folders with the structure described above. Many core functions won't work otherwise!")))),(0,o.kt)("h3",{id:"getting-the-vm-up-and-running"},"Getting the VM up and running"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Download the ",(0,o.kt)("inlineCode",{parentName:"li"},"Debian")," install ",(0,o.kt)("inlineCode",{parentName:"li"},".iso")),(0,o.kt)("li",{parentName:"ol"},"Place it in a folder accessible by the VM"),(0,o.kt)("li",{parentName:"ol"},"Go to the ",(0,o.kt)("inlineCode",{parentName:"li"},"VM")," tab in your ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," navigation"),(0,o.kt)("li",{parentName:"ol"},"Click ",(0,o.kt)("inlineCode",{parentName:"li"},"Add VM")),(0,o.kt)("li",{parentName:"ol"},"From the list presented to you, click ",(0,o.kt)("inlineCode",{parentName:"li"},"Debian")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"Linux")),(0,o.kt)("li",{parentName:"ol"},"On the VM configration page, enter the desired options for memory, CPU cores, vdisk allocation"),(0,o.kt)("li",{parentName:"ol"},"Make sure that you have set the volume containing the ",(0,o.kt)("inlineCode",{parentName:"li"},"comics")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"userdata")," folders correctly for ",(0,o.kt)("inlineCode",{parentName:"li"},"Unraid Share")),(0,o.kt)("li",{parentName:"ol"},"Make sure that you have also set the ",(0,o.kt)("inlineCode",{parentName:"li"},"Unraid Mount tag")," option"),(0,o.kt)("li",{parentName:"ol"},"Make sure that the network bridge is set to ",(0,o.kt)("inlineCode",{parentName:"li"},"br0")),(0,o.kt)("li",{parentName:"ol"},"Set a password for ",(0,o.kt)("inlineCode",{parentName:"li"},"VNC")," so you can follow through with a graphical install if you so wish")),(0,o.kt)("h3",{id:"installing-debian-on-the-vm"},"Installing Debian on the VM"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Launch the VM via ",(0,o.kt)("inlineCode",{parentName:"li"},"VNC Remote")," option"),(0,o.kt)("li",{parentName:"ol"},"Follow the steps of the graphical installer"),(0,o.kt)("li",{parentName:"ol"},"Create a ",(0,o.kt)("inlineCode",{parentName:"li"},"root")," user and a normal ",(0,o.kt)("inlineCode",{parentName:"li"},"user")," and set the passwords for both")),(0,o.kt)("h3",{id:"docker-pre-requisites"},"Docker pre-requisites"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("a",{parentName:"li",href:"https://unix.stackexchange.com/questions/354928/bash-sudo-command-not-found"},"Make sure you have")," ",(0,o.kt)("inlineCode",{parentName:"li"},"sudo")),(0,o.kt)("li",{parentName:"ol"},"Make sure you have ",(0,o.kt)("inlineCode",{parentName:"li"},"ssh")," access for the user you created earlier"),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"ssh")," into the VM as the non-root user"),(0,o.kt)("li",{parentName:"ol"},"Install ",(0,o.kt)("a",{parentName:"li",href:"https://docs.docker.com/engine/install/debian/"},"Docker Engine")),(0,o.kt)("li",{parentName:"ol"},"Install ",(0,o.kt)("a",{parentName:"li",href:"https://docs.docker.com/compose/install/#install-compose-on-linux-systems"},"docker-compose")),(0,o.kt)("li",{parentName:"ol"},"Verify that ",(0,o.kt)("inlineCode",{parentName:"li"},"docker")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose")," commands work")),(0,o.kt)("h3",{id:"vm-pre-requisites"},"VM pre-requisites"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Once you have mapped the ",(0,o.kt)("inlineCode",{parentName:"li"},"unRaid")," share containing ",(0,o.kt)("inlineCode",{parentName:"li"},"comics")," and ",(0,o.kt)("inlineCode",{parentName:"li"},"userdata")," to the mountpoint of the VM, add this line to your ",(0,o.kt)("inlineCode",{parentName:"li"},"/etc/fstab"))),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"unraidshare /mnt/unraidshare 9p trans=virtio,version=9p2000.L,_netdev,rw 0 0\n")),(0,o.kt)("p",null," where, ",(0,o.kt)("inlineCode",{parentName:"p"},"unraidshare")," is the ",(0,o.kt)("inlineCode",{parentName:"p"},"unRaid")," host folder you chose to map to the VM mountpoint during the VM creation process."),(0,o.kt)("p",null," ",(0,o.kt)("inlineCode",{parentName:"p"},"/mnt/unraidshare")," is simply a location where you want ",(0,o.kt)("inlineCode",{parentName:"p"},"unraidshare")," mounted."),(0,o.kt)("ol",{start:2},(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Add the current user to the ",(0,o.kt)("inlineCode",{parentName:"p"},"docker")," group:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"sudo gpasswd -a $USER docker\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Reboot the VM for posterity")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Check that ",(0,o.kt)("inlineCode",{parentName:"p"},"/mnt/unraidshare")," correctly shows the folder contents."))),(0,o.kt)("h3",{id:"installation"},"Installation"),(0,o.kt)("h4",{id:"wherever-applicable-please-remember-to-substitute-things-enclosed-in--with-your-actual-values"},(0,o.kt)("em",{parentName:"h4"},"Wherever applicable, please remember to substitute things enclosed in ",(0,o.kt)("inlineCode",{parentName:"em"},"<...>")," with your actual values!")),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Clone the repo: ",(0,o.kt)("inlineCode",{parentName:"p"},"git clone https://github.com/rishighan/threetwo.git"),". If you have already cloned the repo and want updates, run ",(0,o.kt)("inlineCode",{parentName:"p"},"git pull")," from ",(0,o.kt)("inlineCode",{parentName:"p"},"threetwo")," directory.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Change the directory: ",(0,o.kt)("inlineCode",{parentName:"p"},"cd threetwo"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Create an external docker network using ",(0,o.kt)("inlineCode",{parentName:"p"},"docker network create proxy"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You need to add the VM's hostname to ",(0,o.kt)("inlineCode",{parentName:"p"},"environment.list"),".\nAdd this line: "),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"UNDERLYING_HOST= \n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You also need to provide your own ",(0,o.kt)("a",{parentName:"p",href:"https://comicvine.gamespot.com/api/"},"ComicVine API KEY"),". To do so, create a folder called ",(0,o.kt)("inlineCode",{parentName:"p"},".env")," in the root of ",(0,o.kt)("inlineCode",{parentName:"p"},"threetwo")," directory and add the environment variable ",(0,o.kt)("inlineCode",{parentName:"p"},"COMICVINE_API_KEY")," to a file called ",(0,o.kt)("inlineCode",{parentName:"p"},"service.env"),". See below:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"mkdir .env\nnano .env/service.env\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Add ",(0,o.kt)("inlineCode",{parentName:"p"},"COMICVINE_API_KEY=")," to this file, then save ",(0,o.kt)("inlineCode",{parentName:"p"},"Ctrl O")," and exit ",(0,o.kt)("inlineCode",{parentName:"p"},"Ctrl X")," ")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Run the stack using: (",(0,o.kt)("em",{parentName:"p"},"Windows users please remove the trailing slashes ",(0,o.kt)("inlineCode",{parentName:"em"},"\\")," at the end of each line, when you copy-paste"),")"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"COMICS_DIRECTORY= \\\nUSERDATA_DIRECTORY= \\\nSERVICE_ENV_FILE= \\\ndocker-compose up --force-recreate -d\n")))),(0,o.kt)("h3",{id:"post-install-checks"},"Post-install checks"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Once the ",(0,o.kt)("inlineCode",{parentName:"li"},"docker-compose up")," command successfully completes, you can check the spun-up containers using ",(0,o.kt)("inlineCode",{parentName:"li"},"docker ps")),(0,o.kt)("li",{parentName:"ol"},"You should see the following services up:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"threetwo-ui\nthreetwo-import-api\nimage-transformation\nimport\ncomicvine-api\nqueue\ntraefik\ndatabase\ntransporter\ncomicvine-service\n")),(0,o.kt)("ol",{start:3},(0,o.kt)("li",{parentName:"ol"},"Past this, you can try accessing the ",(0,o.kt)("inlineCode",{parentName:"li"},"ThreeTwo!")," UI at ",(0,o.kt)("inlineCode",{parentName:"li"},":8050")," (Replace ",(0,o.kt)("inlineCode",{parentName:"li"},"")," with your VM's IP or hostname)")),(0,o.kt)("h3",{id:"to-get-updates"},"To get updates"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"First, take the stack down:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker-compose down\n"))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"To get the updates from upstream, run the following, one command at a time:"),(0,o.kt)("pre",{parentName:"li"},(0,o.kt)("code",{parentName:"pre",className:"language-bash"},"docker-compose rm -f\n\ndocker-compose pull\n\nCOMICS_DIRECTORY= \\\nUSERDATA_DIRECTORY= \\\nSERVICE_ENV_FILE= \\\ndocker-compose up --force-recreate -d\n \n")))),(0,o.kt)("h3",{id:"troubleshooting"},"Troubleshooting"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"You aren't seeing all the services listed in ",(0,o.kt)("inlineCode",{parentName:"p"},"#2")," in the previous section spun up\nNote any errors listed at the end of ",(0,o.kt)("inlineCode",{parentName:"p"},"docker-compose up --force-recreate -d"),"\nRun ",(0,o.kt)("inlineCode",{parentName:"p"},"docker ps -a")," and look for any services with an ",(0,o.kt)("inlineCode",{parentName:"p"},"... (exited x seconds ago)")," message. Note the container name, typically under the ",(0,o.kt)("inlineCode",{parentName:"p"},"NAMES")," column.\nRun ",(0,o.kt)("inlineCode",{parentName:"p"},"docker logs ")," for the service that exited.\nCopy the error and open an issue on the repo's issue page.")),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("p",{parentName:"li"},"Check the browser's inspector and the network tab. Note any calls that may have failed."))))}k.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.afd1eb88.js b/assets/js/runtime~main.bd1a0b32.js similarity index 98% rename from assets/js/runtime~main.afd1eb88.js rename to assets/js/runtime~main.bd1a0b32.js index 2122d1b..142829e 100644 --- a/assets/js/runtime~main.afd1eb88.js +++ b/assets/js/runtime~main.bd1a0b32.js @@ -1 +1 @@ -!function(){"use strict";var e,t,n,r,o,c={},f={};function a(e){var t=f[e];if(void 0!==t)return t.exports;var n=f[e]={id:e,loaded:!1,exports:{}};return c[e].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=c,a.c=f,e=[],a.O=function(t,n,r,o){if(!n){var c=1/0;for(d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(f=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=n(f))Object.getOwnPropertyNames(f).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},a.d(o,c),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return"assets/js/"+({3:"925b3f96",13:"01a85c17",32:"86a5cf17",36:"73664a40",45:"c0db966c",53:"935f2afb",85:"1f391b9e",89:"a6aa9e1f",103:"ccc49370",115:"03f09ed3",121:"55960ee5",237:"1df93b7f",267:"59362658",362:"e273c56f",414:"393be207",458:"421237dd",514:"1be78505",535:"814f3328",590:"4bcc3c7c",592:"common",608:"9e4087bc",610:"6875c492",636:"f4f34a3a",642:"7661071f",671:"0e384e19",714:"09c8d506",751:"3720c009",787:"30b2e18d",798:"d92a3c43",830:"c0248160",914:"d9f32620",918:"17896441",927:"5281b7a2",948:"8717b14a"}[e]||e)+"."+{3:"a8b0a9bf",13:"88824f9f",32:"da2218c8",36:"1c1f42bc",45:"b6c5a98f",53:"c189c75b",75:"e24d0ea2",85:"34fa7b3c",89:"642319b3",103:"2910b377",115:"38f71f61",121:"b2aa5457",237:"9f71df12",267:"44b9b8a3",362:"48857720",414:"d974e613",458:"36c0926f",514:"7c5fe792",535:"95981da2",590:"6e211512",592:"07ec1e38",608:"27d8422e",610:"c9edb3a1",636:"6a18501b",642:"2d4d7957",671:"376c719d",714:"4fa546da",751:"116541d6",787:"17c82bf0",798:"bd841b64",830:"ca1f2136",845:"f6a6a72b",914:"0304da02",918:"826347ab",927:"2187f517",948:"2a97f55d"}[e]+".js"},a.miniCssF=function(e){return"assets/css/styles.75c8dd84.css"},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="threetwo-docs:",a.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var f,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),d=0;d=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(f=!1,o0&&e[d-1][2]>o;d--)e[d]=e[d-1];e[d]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var f=2&r&&e;"object"==typeof f&&!~t.indexOf(f);f=n(f))Object.getOwnPropertyNames(f).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},a.d(o,c),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return"assets/js/"+({3:"925b3f96",13:"01a85c17",32:"86a5cf17",36:"73664a40",45:"c0db966c",53:"935f2afb",85:"1f391b9e",89:"a6aa9e1f",103:"ccc49370",115:"03f09ed3",121:"55960ee5",237:"1df93b7f",267:"59362658",362:"e273c56f",414:"393be207",458:"421237dd",514:"1be78505",535:"814f3328",590:"4bcc3c7c",592:"common",608:"9e4087bc",610:"6875c492",636:"f4f34a3a",642:"7661071f",671:"0e384e19",714:"09c8d506",751:"3720c009",787:"30b2e18d",798:"d92a3c43",830:"c0248160",914:"d9f32620",918:"17896441",927:"5281b7a2",948:"8717b14a"}[e]||e)+"."+{3:"a8b0a9bf",13:"88824f9f",32:"da2218c8",36:"1c1f42bc",45:"b6c5a98f",53:"c189c75b",75:"e24d0ea2",85:"34fa7b3c",89:"642319b3",103:"2910b377",115:"3d44865e",121:"b2aa5457",237:"9f71df12",267:"44b9b8a3",362:"48857720",414:"d974e613",458:"36c0926f",514:"7c5fe792",535:"95981da2",590:"6e211512",592:"07ec1e38",608:"27d8422e",610:"c9edb3a1",636:"6a18501b",642:"2d4d7957",671:"376c719d",714:"4fa546da",751:"116541d6",787:"17c82bf0",798:"bd841b64",830:"ca1f2136",845:"f6a6a72b",914:"0304da02",918:"826347ab",927:"2187f517",948:"2a97f55d"}[e]+".js"},a.miniCssF=function(e){return"assets/css/styles.75c8dd84.css"},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="threetwo-docs:",a.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var f,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),d=0;d Archive | ThreeTwo! - + - + \ No newline at end of file diff --git a/blog/first-blog-post/index.html b/blog/first-blog-post/index.html index bdcb80d..19283ff 100644 --- a/blog/first-blog-post/index.html +++ b/blog/first-blog-post/index.html @@ -6,13 +6,13 @@ First Blog Post | ThreeTwo! - +

First Blog Post

· One min read
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/index.html b/blog/index.html index e117325..7414b31 100644 --- a/blog/index.html +++ b/blog/index.html @@ -6,13 +6,13 @@ Blog | ThreeTwo! - +

· One min read
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

· One min read
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/long-blog-post/index.html b/blog/long-blog-post/index.html index 18e0fc1..30d4249 100644 --- a/blog/long-blog-post/index.html +++ b/blog/long-blog-post/index.html @@ -6,13 +6,13 @@ Long Blog Post | ThreeTwo! - +

Long Blog Post

· 3 min read
Endilie Yacop Sucipto

This is the summary of a very long blog post,

Use a <!-- truncate --> comment to limit blog post size in the list view.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/mdx-blog-post/index.html b/blog/mdx-blog-post/index.html index a9c72a9..7a187ee 100644 --- a/blog/mdx-blog-post/index.html +++ b/blog/mdx-blog-post/index.html @@ -6,13 +6,13 @@ MDX Blog Post | ThreeTwo! - +
- + \ No newline at end of file diff --git a/blog/tags/docusaurus/index.html b/blog/tags/docusaurus/index.html index cc08496..f637e27 100644 --- a/blog/tags/docusaurus/index.html +++ b/blog/tags/docusaurus/index.html @@ -6,13 +6,13 @@ 4 posts tagged with "docusaurus" | ThreeTwo! - +

4 posts tagged with "docusaurus"

View All Tags

· One min read
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

· One min read
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/tags/facebook/index.html b/blog/tags/facebook/index.html index 50b4ff6..23de11a 100644 --- a/blog/tags/facebook/index.html +++ b/blog/tags/facebook/index.html @@ -6,13 +6,13 @@ One post tagged with "facebook" | ThreeTwo! - +

One post tagged with "facebook"

View All Tags

· One min read
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

- + \ No newline at end of file diff --git a/blog/tags/hello/index.html b/blog/tags/hello/index.html index b99db9a..d299a14 100644 --- a/blog/tags/hello/index.html +++ b/blog/tags/hello/index.html @@ -6,13 +6,13 @@ 2 posts tagged with "hello" | ThreeTwo! - +

2 posts tagged with "hello"

View All Tags

· One min read
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

- + \ No newline at end of file diff --git a/blog/tags/hola/index.html b/blog/tags/hola/index.html index f176a2c..38b5c63 100644 --- a/blog/tags/hola/index.html +++ b/blog/tags/hola/index.html @@ -6,13 +6,13 @@ One post tagged with "hola" | ThreeTwo! - +

One post tagged with "hola"

View All Tags

· One min read
Gao Wei

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

- + \ No newline at end of file diff --git a/blog/tags/index.html b/blog/tags/index.html index 8672ba1..af3d576 100644 --- a/blog/tags/index.html +++ b/blog/tags/index.html @@ -6,13 +6,13 @@ Tags | ThreeTwo! - + - + \ No newline at end of file diff --git a/blog/welcome/index.html b/blog/welcome/index.html index 2d1dae3..a2e889e 100644 --- a/blog/welcome/index.html +++ b/blog/welcome/index.html @@ -6,13 +6,13 @@ Welcome | ThreeTwo! - +

Welcome

· One min read
Sébastien Lorber
Yangshun Tay

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.

- + \ No newline at end of file diff --git a/docs/architecture/index.html b/docs/architecture/index.html index 19ff7ff..119f464 100644 --- a/docs/architecture/index.html +++ b/docs/architecture/index.html @@ -6,13 +6,13 @@ Technical Architecture | ThreeTwo! - +

Technical Architecture

High-level Architecture#

ThreeTwo!, the app is built upon the microservice architecture. The UI is a standalone node.js app and the rest of the logic is broken into microservices.

The microservices deal with:

  1. Library functions (model orchestration, CRUD ops on comics, metadata)
  2. Comic Vine (scraping issues, volumes and more)
  3. Grand Comics Database (scraping, aggregations and more)
  4. Helpers (image transformation, file-system ops, compression/uncompression)

Technical stack#

ThreeTwo! is written in TypeScript from UI to the services layer.

The technologies used are:

  1. React
  2. Redux
  3. moleculer
  4. RabbitMQ
  5. socket.io
  6. node.js
  7. Express
  8. MongoDB
  9. Redis
  10. nats
  11. nginx
- + \ No newline at end of file diff --git a/docs/intro/index.html b/docs/intro/index.html index 739dfa1..4066d1e 100644 --- a/docs/intro/index.html +++ b/docs/intro/index.html @@ -6,13 +6,13 @@ Introduction | ThreeTwo! - +

ThreeTwo!

ThreeTwo! is a comic book curation app.

It aims to help you organize your comic book collection and automate various aspects of acquiring new comic books.

It is a culmination of ideas I developed over the past couple of years using various pieces of software to achieve the stated goal of curating comic books. It borrows heavily from Mylar, Ubooquity, ComicRack, Calibre and many other software used to manage comic book collections.

Philosophy#

Curation is a disease of the mind, albeit a disease with a purpose. You want to be able to peruse your collection, and enjoy the process of doing so.

Discovery#

The first tenet of ThreeTwo! is discovery–the act of importing comics from your OS, finding new comic to read or just searching through your collection for a comic that sparks nostalgia. Discovery is important, both from a technical perspective, so that ThreeTwo! can infer metadata from your collection, as well as from a curatorial standpoint, you want to keep track of what you are reading, or what you want to be reading.

Curation#

ThreeTwo! takes curation seriously, and thusly offers ComicVine scraping, and other means of applying/extending the comic metadata. This is so that your collection can truly shine, and actually help in discovering or rediscovering comics.

Acquisition#

Once you have added to your list of wanted comics, you can rely on ThreeTwo!'s first-class support for DC++ via AirDC++ to acquire them. Just configure your AirDC++ host, hub information and you are golden.

Consumption#

You can access your massive comic collection via OPDS through apps on your mobile devices, like Panels on iOS

- + \ No newline at end of file diff --git a/docs/resources/index.html b/docs/resources/index.html index 61c94c3..2e302d9 100644 --- a/docs/resources/index.html +++ b/docs/resources/index.html @@ -6,13 +6,13 @@ Resources & Help | ThreeTwo! - +
- + \ No newline at end of file diff --git a/docs/tags/index.html b/docs/tags/index.html index 477beb7..8d5bf1b 100644 --- a/docs/tags/index.html +++ b/docs/tags/index.html @@ -6,13 +6,13 @@ Tags | ThreeTwo! - +

Tags

- + \ No newline at end of file diff --git a/docs/unraid_install/index.html b/docs/unraid_install/index.html index 58dc7ce..8207c5d 100644 --- a/docs/unraid_install/index.html +++ b/docs/unraid_install/index.html @@ -6,20 +6,20 @@ Install ThreeTwo! on unRaid | ThreeTwo! - +

Install ThreeTwo! on unRaid

Notes#

  • Currently, ThreeTwo! is installed along with its dependencies using docker-compose. The easiest way to install it on unRaid is to use a VM. This guide is written with unRaid in mind, but can theoretically run on any platform that supports docker and docker-compose
  • Skip the VM creation steps, if you already have a Debian VM

Pre-requisites#

This guide assumes the following is installed or readily available:

  • unRaid 6.9.2 (this version was tested against 6.9.2)

  • For DC++ functionality, AirDC++ is required

  • Debian 10.x (Grab the install .iso here)

  • You need to create the following folder structure on your unRaid host.

      - comics  - userdata    |- covers    |- expanded    |- temporary

    comics could be where your final; downloaded, renamed comics reside. userdata is purely for ThreeTwo!.

    You absolutely need both these folders with the structure described above. Many core functions won't work otherwise!

Getting the VM up and running#

  1. Download the Debian install .iso
  2. Place it in a folder accessible by the VM
  3. Go to the VM tab in your unRaid navigation
  4. Click Add VM
  5. From the list presented to you, click Debian under Linux
  6. On the VM configration page, enter the desired options for memory, CPU cores, vdisk allocation
  7. Make sure that you have set the volume containing the comics and userdata folders correctly for Unraid Share
  8. Make sure that you have also set the Unraid Mount tag option
  9. Make sure that the network bridge is set to br0
  10. Set a password for VNC so you can follow through with a graphical install if you so wish

Installing Debian on the VM#

  1. Launch the VM via VNC Remote option
  2. Follow the steps of the graphical installer
  3. Create a root user and a normal user and set the passwords for both

Docker pre-requisites#

  1. Make sure you have sudo
  2. Make sure you have ssh access for the user you created earlier
  3. ssh into the VM as the non-root user
  4. Install Docker Engine
  5. Install docker-compose
  6. Verify that docker and docker-compose commands work

VM pre-requisites#

  1. Once you have mapped the unRaid share containing comics and userdata to the mountpoint of the VM, add this line to your /etc/fstab
unraidshare /mnt/unraidshare    9p  trans=virtio,version=9p2000.L,_netdev,rw 0 0

where, unraidshare is the unRaid host folder you chose to map to the VM mountpoint during the VM creation process.

/mnt/unraidshare is simply a location where you want unraidshare mounted.

  1. Add the current user to the docker group:

    sudo gpasswd -a $USER docker
  2. Reboot the VM for posterity

  3. Check that /mnt/unraidshare correctly shows the folder contents.

Installation#

Wherever applicable, please remember to substitute things enclosed in <...> with your actual values!#

  1. Clone the repo: git clone https://github.com/rishighan/threetwo.git. If you have already cloned the repo and want updates, run git pull from threetwo directory.

  2. Change the directory: cd threetwo

  3. Create an external docker network using docker network create proxy

  4. You need to add the VM's hostname to environment.list. -Add this line:

    UNDERLYING_HOST=<YOUR VM\'s HOSTNAME>      
  5. You also need to provide your own ComicVine API KEY. To do so, create a folder called .env and add the environment variable COMICVINE_API_KEY to a file called service.env. See below:

    mkdir .envnano .env/service.env
  6. Add COMICVINE_API_KEY=<YOUR COMICVINE API KEY> to this file, then save Ctrl O and exit Ctrl X

  7. Run the stack using: (Windows users please remove the trailing slashes \ at the end of each line, when you copy-paste)

    COMICS_DIRECTORY=<PATH TO YOUR COMICS DIRECTORY>  \USERDATA_DIRECTORY=<PATH TO YOUR USERDATA DIRECTORY> \SERVICE_ENV_FILE=<PATH TO service.env> \docker-compose up --force-recreate -d

Post-install checks#

  1. Once the docker-compose up command successfully completes, you can check the spun-up containers using docker ps
  2. You should see the following services up:
threetwo-uithreetwo-import-apiimage-transformationimportcomicvine-apiqueuetraefikdatabasetransportercomicvine-service
  1. Past this, you can try accessing the ThreeTwo! UI at <VM IP>:8050 (Replace <server IP> with your VM's IP or hostname)

To get updates#

  1. First, take the stack down:

    docker-compose down
  2. To get the updates from upstream, run the following, one command at a time:

    docker-compose rm -f
    +Add this line: 

    UNDERLYING_HOST=<YOUR VM\'s HOSTNAME>      
  3. You also need to provide your own ComicVine API KEY. To do so, create a folder called .env in the root of threetwo directory and add the environment variable COMICVINE_API_KEY to a file called service.env. See below:

    mkdir .envnano .env/service.env
  4. Add COMICVINE_API_KEY=<YOUR COMICVINE API KEY> to this file, then save Ctrl O and exit Ctrl X

  5. Run the stack using: (Windows users please remove the trailing slashes \ at the end of each line, when you copy-paste)

    COMICS_DIRECTORY=<PATH TO YOUR COMICS DIRECTORY>  \USERDATA_DIRECTORY=<PATH TO YOUR USERDATA DIRECTORY> \SERVICE_ENV_FILE=<PATH TO service.env> \docker-compose up --force-recreate -d

Post-install checks#

  1. Once the docker-compose up command successfully completes, you can check the spun-up containers using docker ps
  2. You should see the following services up:
threetwo-uithreetwo-import-apiimage-transformationimportcomicvine-apiqueuetraefikdatabasetransportercomicvine-service
  1. Past this, you can try accessing the ThreeTwo! UI at <VM IP>:8050 (Replace <server IP> with your VM's IP or hostname)

To get updates#

  1. First, take the stack down:

    docker-compose down
  2. To get the updates from upstream, run the following, one command at a time:

    docker-compose rm -f
     docker-compose pull
     COMICS_DIRECTORY=<PATH TO YOUR COMICS DIRECTORY>  \USERDATA_DIRECTORY=<PATH TO YOUR USERDATA DIRECTORY> \SERVICE_ENV_FILE=<PATH TO service.env> \docker-compose up --force-recreate -d   

Troubleshooting#

  1. You aren't seeing all the services listed in #2 in the previous section spun up Note any errors listed at the end of docker-compose up --force-recreate -d Run docker ps -a and look for any services with an ... (exited x seconds ago) message. Note the container name, typically under the NAMES column. Run docker logs <service name> for the service that exited. Copy the error and open an issue on the repo's issue page.

  2. Check the browser's inspector and the network tab. Note any calls that may have failed.

- + \ No newline at end of file diff --git a/index.html b/index.html index 458b0dc..2205ae4 100644 --- a/index.html +++ b/index.html @@ -6,13 +6,13 @@ Hello from ThreeTwo! | ThreeTwo! - +

ThreeTwo!

Start Flipping!

Don't Hate, Curate.

Don't Hate, Curate.

Browse, search, discover your comic book library that you have so proudly built from scratch.

No Fuss DC++

No Fuss DC++

With first-class support for the excellent AirDC++, find and acquire hidden gems.

Shine with Comic Vine

Shine with Comic Vine

Scrape Comic Vine's exhaustive comic book database to analyze and clean up your library's metadata.

- + \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index af5eadf..3baf20b 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -6,13 +6,13 @@ Markdown page example | ThreeTwo! - +

Markdown page example

You don't need React to write simple standalone pages.

- + \ No newline at end of file