PageSourceSearch

https://www.cloudpanel.io/docs/v2/assets/js/f7cdb905.d7b4d587.js

js cloudpanel.io collected 2026-10-02 02:52:00 UTC 11,036 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkcloudpanel_ce_docusaurus_clp=self.webpackChunkcloudpanel_ce_docusaurus_clp||[]).push([[7717],{3905:(t,e,a)=>{a.d(e,{kt:()=>g});var n=a(7294);function r(t,e,a){return e in t?Object.defineProperty(t,e,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[e]=a,t}function o(t,e){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),a.push.apply(a,n)}return a}function s(t){for(var e=1;e<arguments.length;e++){var a=null!=arguments[e]?arguments[e]:{};e%2?o(Object(a),!0).forEach((function(e){r(t,e,a[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(a,e))}))}return t}function l(t,e){if(null==t)return{};var a,n,r=function(t,e){if(null==t)return{};var a,n,r={},o=Object.keys(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(n=0;n<o.length;n++)a=o[n],e.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var i=n.createContext({}),p=function(t){var e=n.useContext(i),a=e;return t&&(a="function"==typeof t?t(e):s(s({},e),t)),a},c="mdxType",d={inlineCode:"code",wrapper:function(t){var e=t.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(t,e){var a=t.components,r=t.mdxType,o=t.originalType,i=t.parentName,c=l(t,["components","mdxType","originalType","parentName"]),m=p(a),g=r,u=m["".concat(i,".").concat(g)]||m[g]||d[g]||o;return a?n.createElement(u,s(s({ref:e},c),{},{components:a})):n.createElement(u,s({ref:e},c))}));function g(t,e){var a=arguments,r=e&&e.mdxType;if("string"==typeof t||r){var o=a.length,s=new Array(o);s[0]=m;var l={};for(var i in e)hasOwnProperty.call(e,i)&&(l[i]=e[i]);l.originalType=t,l[c]="string"==typeof t?t:r,s[1]=l;for(var p=2;p<o;p++)s[p]=a[p];return n.createElement.apply(null,s)}return n.createElement.apply(null,a)}m.displayName="MDXCreateElement"},3919:(t,e,a)=>{function n(t){return!0===/^(\w*:|\/\/)/.test(t)}function r(t){return void 0!==t&&!n(t)}a.d(e,{Z:()=>r,b:()=>n})},4996:(t,e,a)=>{a.d(e,{C:()=>o,Z:()=>s});var n=a(2263),r=a(3919);function o(){const{siteConfig:{baseUrl:t="/",url:e}={}}=(0,n.Z)();return{withBaseUrl:(a,n)=>function(t,e,a,n){let{forcePrependBaseUrl:o=!1,absolute:s=!1}=void 0===n?{}:n;if(!a)return a;if(a.startsWith("#"))return a;if((0,r.b)(a))return a;if(o)return e+a;const l=a.startsWith(e)?a:e+a.replace(/^\//,"");return s?t+l:l}(e,t,a,n)}}function s(t,e){void 0===e&&(e={});const{withBaseUrl:a}=o();return a(t,e)}},6090:(t,e,a)=>{a.r(e),a.d(e,{contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>i,toc:()=>p});var n=a(7462),r=(a(7294),a(3905)),o=a(4996);const s={id:"ghost",title:"Ghost",sidebar_label:"Ghost"},l=void 0,i={unversionedId:"nodejs/applications/ghost",id:"nodejs/applications/ghost",isDocsHomePage:!1,title:"Ghost",description:"On this site, you find a guide to install and configure Ghost on CloudPanel.",source:"@site/docs/nodejs/applications/ghost.md",sourceDirName:"nodejs/applications",slug:"/nodejs/applications/ghost",permalink:"/docs/v2/nodejs/applications/ghost",editUrl:"https://github.com/cloudpanel-io/docs/tree/master/cloudpanel-ce/docs/nodejs/applications/ghost.md",version:"current",frontMatter:{id:"ghost",title:"Ghost",sidebar_label:"Ghost"},sidebar:"sidebar",previous:{title:"With pm2",permalink:"/docs/v2/nodejs/deployment/pm2"},next:{title:"Strapi 4",permalink:"/docs/v2/nodejs/applications/strapi"}},p=[{value:"Creating a Node.js Site",id:"creating-a-nodejs-site",children:[{value:"Via CloudPanel",id:"via-cloudpanel",children:[]},{value:"Via CloudPanel CLI",id:"via-cloudpanel-cli",children:[]}]},{value:"Creating a Ghost project",id:"creating-a-ghost-project",children:[]},{value:"Deployment",id:"deployment",children:[]}],c={toc:p},d="wrapper";function m(t){let{components:e,...a}=t;return(0,r.kt)(d,(0,n.Z)({},c,a,{components:e,mdxType:"MDXLayout"}
1),(0,r.kt)("p",null,"On this site, you find a guide to install and configure ",(0,r.kt)("a",{parentName:"p",href:"https://ghost.org/"},"Ghost")," on ",(0,r.kt)("strong",{parentName:"p"},"CloudPanel"),"."),(0,r.kt)("h2",{id:"creating-a-nodejs-site"},"Creating a Node.js Site"),(0,r.kt)("h3",{id:"via-cloudpanel"},"Via CloudPanel"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Click on ",(0,r.kt)("strong",{parentName:"li"},"+ Add Site")," and then click on ",(0,r.kt)("strong",{parentName:"li"},"Create a Node.js Site"),".")),(0,r.kt)("img",{class:"border",alt:"Add Node.js Site",src:(0,o.Z)("img/nodejs/applications/strapi/add-site.png")}),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Enter the ",(0,r.kt)("strong",{parentName:"li"},"Domain Name"),", ",(0,r.kt)("strong",{parentName:"li"},"Node.js Version"),", and the ",(0,r.kt)("strong",{parentName:"li"},"App Port"),", and click on ",(0,r.kt)("strong",{parentName:"li"},"Create"),".")),(0,r.kt)("img",{alt:"Add Ghost Site Form",class:"border",src:(0,o.Z)("img/nodejs/applications/ghost/add-site-form.png?v=0.0.2")}),(0,r.kt)("h3",{id:"via-cloudpanel-cli"},"Via CloudPanel CLI"),(0,r.kt)("p",null,"You can create a ",(0,r.kt)("strong",{parentName:"p"},"Node.js Site")," with the following command as ",(0,r.kt)("strong",{parentName:"p"},"root user")," if you like the command line."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"clpctl site:add:nodejs --domainName=www.domain.com --nodejsVersion=18 --appPort=2368 --siteUser='john-doe' --siteUserPassword='!secretPassword!'\n")),(0,r.kt)("h2",{id:"creating-a-ghost-project"},"Creating a Ghost project"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Create a ",(0,r.kt)("a",{parentName:"p",href:"../../../frontend-area/databases/#adding-a-database"},"Database")," and copy the ",(0,r.kt)("strong",{parentName:"p"},"Database Name"),", ",(0,r.kt)("strong",{parentName:"p"},"Database User Name"),", ",(0,r.kt)("strong",{parentName:"p"},"Database User Password"),".")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Log in via ",(0,r.kt)("a",{parentName:"p",href:"../../../frontend-area/ssh-ftp/#ssh-login"},"SSH")," with the ",(0,r.kt)("strong",{parentName:"p"},"Site User"),":"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ssh john-doe@server-ip-address\n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Install the ",(0,r.kt)("strong",{parentName:"li"},"Ghost CLI"),":")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"npm install ghost-cli@latest -g\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Replace ",(0,r.kt)("strong",{parentName:"li"},"DATABASE_USERNAME"),", ",(0,r.kt)("strong",{parentName:"li"},"DATABASE_USER_PASSWORD"),", ",(0,r.kt)("strong",{parentName:"li"},"DATABASE_NAME"),", ",(0,r.kt)("strong",{parentName:"li"},"SITE_USER"),", and ",(0,r.kt)("strong",{parentName:"li"},"DOMAIN")," and install ",(0,r.kt)("strong",{parentName:"li"},"Ghost"),".")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ghost install --db mysql --port 2368 \\\n--dbhost 127.0.0.1 \\\n--dbuser $DATABASE_USER_NAME \\\n--dbpass $DATABASE_USER_PASSWORD \\\n--dbname $DATABASE_NAME \\\n--process local \\\n--no-setup-linux-user \\\n--no-setup-ssl \\\n--no-setup-nginx \\\n--dir /home/$SITE_USER/htdocs/$DOMAIN/\n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},"Enter your ",(0,r.kt)("strong",{parentName:"li"},"Blog Url")," like ",(0,r.kt)("strong",{parentName:"li"},(0,r.kt)("a",{parentName:"strong",href:"https://www.domain.com/"},"https://www.domain.com/")))),(0,r.kt)("img",{alt:"Ghost - Enter Blog Url",class:"border",src:(0,o.Z)("img/nodejs/applications/ghost/enter-blog-url.png")}),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"Start ",(0,r.kt)("strong",{parentName:"li"},"Ghost")," by confirming with ",(0,r.kt)("strong",{parentName:"li"},"Y"),":")),(0,r.kt)("img",{alt:"Start Ghost Dialog",class:"border",src:(0,o.Z)("img/nodejs/applications/ghost/start-ghost-dialog.png")}),(0,r.kt)("ol",{start:7},(0,r.kt)("li",{parentName:"ol"},"The installation is done. Open your site in the browser and create an admin user.")),(0,r.kt)("img",{alt:"Welcome to Ghost",class:"border",src:(0,o.Z)("img/nodejs/applications/ghost/welcome-to-ghost.png")}),(0,r.kt)("h2",{id:"deployment"},"Deployment"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Ghost")," needs to be started after an instance reboot. We will create a script that gets executed after the reboot."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Log in via ",(0,r.kt)("a",{parentName:"li",href:"../../../frontend-area/ssh-ftp/#ssh-login"},"SSH")," with the ",(0,r.kt)("strong",{parentName:"li"},"Site User"),":")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"ssh john-doe@server-ip-address\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Create ",(0,r.kt)("strong",{parentName:"li"},"scripts")," directory:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"mkdir ~/scripts/ \n")),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Create a ",(0,r.kt)("strong",{parentName:"li"},"start script"),":")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"nano ~/scripts/ghost-start.sh\n")),(0,r.kt)("p",null,"Modify the ",(0,r.kt)("strong",{parentName:"p"},"--dir")," value and save the ",(0,r.kt)("strong",{parentName:"p"},"start script"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"}
1,'#!/bin/bash\nexport NVM_DIR="$HOME/.nvm"\n[ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh"  # This loads nvm\nghost start --dir $HOME/htdocs/ghost.moby.io/ --no-setup-linux-user > $HOME/logs/ghost.log &\n')),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Set execution permissions:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"chmod 700 ~/scripts/ghost-start.sh\n")),(0,r.kt)("ol",{start:4},(0,r.kt)("li",{parentName:"ol"},"Edit the ",(0,r.kt)("strong",{parentName:"li"},"crontab")," for the ",(0,r.kt)("strong",{parentName:"li"},"site user"),".")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"crontab -e\n")),(0,r.kt)("ol",{start:5},(0,r.kt)("li",{parentName:"ol"},"Replace ",(0,r.kt)("strong",{parentName:"li"},"SITE_USER")," with your ",(0,r.kt)("strong",{parentName:"li"},"site user ")," and add the following line:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"@reboot /home/$SITE_USER/scripts/ghost-start.sh &> /dev/null\n")),(0,r.kt)("ol",{start:6},(0,r.kt)("li",{parentName:"ol"},"Reboot and test if ",(0,r.kt)("strong",{parentName:"li"},"Ghost")," is running as expected.")))}m.isMDXComponent=!0}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.