This commit is contained in:
parent
63f9b2cff0
commit
e6ef7819df
|
@ -0,0 +1,14 @@
|
||||||
|
|
||||||
|
load("@this//ghost:drone.star", "drone")
|
||||||
|
load("@this//ghost:stack-name.star", "stackName")
|
||||||
|
load("@this//ghost:stack-root.star", "stackRoot")
|
||||||
|
|
||||||
|
def main(ctx):
|
||||||
|
return drone(
|
||||||
|
ctx,
|
||||||
|
"home-deploy",
|
||||||
|
stackRoot,
|
||||||
|
stackName,
|
||||||
|
[]
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,63 @@
|
||||||
|
version: "3.7"
|
||||||
|
services:
|
||||||
|
ghost:
|
||||||
|
# ghost blog
|
||||||
|
deploy:
|
||||||
|
placement:
|
||||||
|
constraints: [node.labels.com.sigyl.git-stack == yes]
|
||||||
|
replicas: 1
|
||||||
|
restart_policy:
|
||||||
|
condition: any
|
||||||
|
image: ${LOCAL_DOCKER_REGISTRY}ghost
|
||||||
|
volumes:
|
||||||
|
- ghost-content-images:/var/lib/ghost/content/images
|
||||||
|
- ghost-content-settings:/var/lib/ghost/content/settings
|
||||||
|
- ghost-content-adapters:/var/lib/ghost/content/adapters
|
||||||
|
- ghost-content-data:/var/lib/ghost/content/data
|
||||||
|
- ghost-content-logs:/var/lib/ghost/content/logs
|
||||||
|
|
||||||
|
environment:
|
||||||
|
- GIT_DOMAIN=$GIT_DOMAIN
|
||||||
|
- GHOST-MAIL-SERVICE=$GHOST-MAIL-SERVICE
|
||||||
|
- GHOST-MAIL-USER=$GHOST-MAIL-USER
|
||||||
|
- GHOST-MAIL-PASSWORD=$GHOST-MAIL-PASSWORD
|
||||||
|
- COMMENTO_ORIGIN=$COMMENTO_ORIGIN
|
||||||
|
- database__client=mysql
|
||||||
|
- database__connection__host=ghost-mysql
|
||||||
|
- database__connection__user=root
|
||||||
|
- database__connection__password=$GHOST_MYSQL_ROOT_PASSWORD
|
||||||
|
- database__connection__database=ghost
|
||||||
|
- database__pool__min=0 # https://github.com/knex/knex/issues/975
|
||||||
|
networks:
|
||||||
|
- appnet
|
||||||
|
- externalnet
|
||||||
|
ghost-mysql:
|
||||||
|
image: mysql:5.7
|
||||||
|
deploy:
|
||||||
|
placement:
|
||||||
|
constraints: [node.labels.com.sigyl.git-stack-data == yes]
|
||||||
|
replicas: 1
|
||||||
|
restart_policy:
|
||||||
|
condition: any
|
||||||
|
volumes:
|
||||||
|
- ghost-data:/var/lib/mysql
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: $GHOST_MYSQL_ROOT_PASSWORD
|
||||||
|
networks:
|
||||||
|
- appnet
|
||||||
|
volumes:
|
||||||
|
ghost-content:
|
||||||
|
ghost-data:
|
||||||
|
ghost-content-adapters:
|
||||||
|
ghost-content-settings:
|
||||||
|
ghost-content-images:
|
||||||
|
ghost-content-data:
|
||||||
|
ghost-content-logs:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
appnet:
|
||||||
|
driver: overlay
|
||||||
|
#external: true
|
||||||
|
externalnet:
|
||||||
|
driver: overlay
|
||||||
|
external: true
|
|
@ -0,0 +1,15 @@
|
||||||
|
FROM alpine/git as git
|
||||||
|
|
||||||
|
WORKDIR /themes
|
||||||
|
RUN git clone https://sigyl.com/git/themes/casper.git
|
||||||
|
|
||||||
|
FROM ghost:3.14.0
|
||||||
|
# USER root
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install -y gettext
|
||||||
|
|
||||||
|
COPY config.production.json /var/lib/ghost/
|
||||||
|
COPY --from=git /themes/ /var/lib/ghost/content/themes/
|
||||||
|
COPY post.hbs /hbs/
|
||||||
|
COPY run.sh /
|
||||||
|
CMD ["sh", "/run.sh"]
|
|
@ -0,0 +1,33 @@
|
||||||
|
{
|
||||||
|
"url": "https://${GIT_DOMAIN}/",
|
||||||
|
"server": {
|
||||||
|
"port": 2368,
|
||||||
|
"host": "0.0.0.0"
|
||||||
|
},
|
||||||
|
"database": {
|
||||||
|
"client": "sqlite3",
|
||||||
|
"connection": {
|
||||||
|
"filename": "/var/lib/ghost/content/data/ghost.db"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mail": {
|
||||||
|
"transport": "SMTP",
|
||||||
|
"options": {
|
||||||
|
"service": "${GHOST_MAIL_SERVICE}",
|
||||||
|
"auth": {
|
||||||
|
"user": "${GHOST_MAIL_USER}",
|
||||||
|
"pass": "${GHOST_MAIL_PASSWORD}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"logging": {
|
||||||
|
"transports": [
|
||||||
|
"file",
|
||||||
|
"stdout"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"process": "systemd",
|
||||||
|
"paths": {
|
||||||
|
"contentPath": "/var/lib/ghost/content"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,213 @@
|
||||||
|
{{!< default}}
|
||||||
|
|
||||||
|
{{!-- The tag above means: insert everything in this file
|
||||||
|
into the {body} of the default.hbs template --}}
|
||||||
|
|
||||||
|
<header class="site-header">
|
||||||
|
{{> site-header}}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{!-- Everything inside the #post tags pulls data from the post --}}
|
||||||
|
{{#post}}
|
||||||
|
|
||||||
|
<main id="site-main" class="site-main outer">
|
||||||
|
<div class="inner">
|
||||||
|
|
||||||
|
<article class="post-full {{post_class}} {{#unless feature_image}}no-image{{/unless}}">
|
||||||
|
|
||||||
|
<header class="post-full-header">
|
||||||
|
|
||||||
|
{{#if primary_tag}}
|
||||||
|
<section class="post-full-tags">
|
||||||
|
{{#primary_tag}}
|
||||||
|
<a href="{{url}}">{{name}}</a>
|
||||||
|
{{/primary_tag}}
|
||||||
|
</section>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<h1 class="post-full-title">{{title}}</h1>
|
||||||
|
|
||||||
|
{{#if custom_excerpt}}
|
||||||
|
<p class="post-full-custom-excerpt">{{custom_excerpt}}</p>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<div class="post-full-byline">
|
||||||
|
|
||||||
|
<section class="post-full-byline-content">
|
||||||
|
|
||||||
|
<ul class="author-list">
|
||||||
|
{{#foreach authors}}
|
||||||
|
<li class="author-list-item">
|
||||||
|
|
||||||
|
<div class="author-card">
|
||||||
|
{{#if profile_image}}
|
||||||
|
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
|
||||||
|
{{else}}
|
||||||
|
<div class="author-profile-image">{{> "icons/avatar"}}</div>
|
||||||
|
{{/if}}
|
||||||
|
<div class="author-info">
|
||||||
|
{{#if bio}}
|
||||||
|
<div class="bio">
|
||||||
|
<h2>{{name}}</h2>
|
||||||
|
<p>{{bio}}</p>
|
||||||
|
<p><a href="{{url}}">More posts</a> by {{name}}.</p>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<h2>{{name}}</h2>
|
||||||
|
<p>Read <a href="{{url}}">more posts</a> by this author.</p>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{#if profile_image}}
|
||||||
|
<a href="{{url}}" class="author-avatar">
|
||||||
|
<img class="author-profile-image" src="{{img_url profile_image size="xs"}}" alt="{{name}}" />
|
||||||
|
</a>
|
||||||
|
{{else}}
|
||||||
|
<a href="{{url}}" class="author-avatar author-profile-image">{{> "icons/avatar"}}</a>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
</li>
|
||||||
|
{{/foreach}}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<section class="post-full-byline-meta">
|
||||||
|
<h4 class="author-name">{{authors}}</h4>
|
||||||
|
<div class="byline-meta-content">
|
||||||
|
<time class="byline-meta-date" datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time>
|
||||||
|
<span class="byline-reading-time"><span class="bull">•</span> {{reading_time}}</span>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{#if feature_image}}
|
||||||
|
<figure class="post-full-image">
|
||||||
|
{{!-- This is a responsive image, it loads different sizes depending on device
|
||||||
|
https://medium.freecodecamp.org/a-guide-to-responsive-images-with-ready-to-use-templates-c400bd65c433 --}}
|
||||||
|
<img
|
||||||
|
srcset="{{img_url feature_image size="s"}} 300w,
|
||||||
|
{{img_url feature_image size="m"}} 600w,
|
||||||
|
{{img_url feature_image size="l"}} 1000w,
|
||||||
|
{{img_url feature_image size="xl"}} 2000w"
|
||||||
|
sizes="(max-width: 800px) 400px,
|
||||||
|
(max-width: 1170px) 1170px,
|
||||||
|
2000px"
|
||||||
|
src="{{img_url feature_image size="xl"}}"
|
||||||
|
alt="{{title}}"
|
||||||
|
/>
|
||||||
|
</figure>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<section class="post-full-content">
|
||||||
|
<div class="post-content">
|
||||||
|
{{content}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{{!-- Email subscribe form at the bottom of the page --}}
|
||||||
|
{{#if @labs.members}}
|
||||||
|
{{> subscribe-form}}
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
<section class="post-full-comments">
|
||||||
|
<div id="commento"></div>
|
||||||
|
<script src="${COMMENTO_ORIGIN}js/commento.js"></script>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</article>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
{{!-- Links to Previous/Next posts --}}
|
||||||
|
<aside class="read-next outer">
|
||||||
|
<div class="inner">
|
||||||
|
<div class="read-next-feed">
|
||||||
|
{{#if primary_tag}}
|
||||||
|
{{#get "posts" filter="tags:{{primary_tag.slug}}+id:-{{id}}" limit="3" as |related_posts|}}
|
||||||
|
{{#if related_posts}}
|
||||||
|
<article class="read-next-card">
|
||||||
|
<header class="read-next-card-header">
|
||||||
|
{{#../primary_tag}}
|
||||||
|
<h3><span>More in</span> <a href="{{url}}">{{name}}</a></h3>
|
||||||
|
{{/../primary_tag}}
|
||||||
|
</header>
|
||||||
|
<div class="read-next-card-content">
|
||||||
|
<ul>
|
||||||
|
{{#foreach related_posts}}
|
||||||
|
<li>
|
||||||
|
<h4><a href="{{url}}">{{title}}</a></h4>
|
||||||
|
<div class="read-next-card-meta">
|
||||||
|
<p><time datetime="{{date format="YYYY-MM-DD"}}">{{date format="D MMM YYYY"}}</time> –
|
||||||
|
{{reading_time}}</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{/foreach}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<footer class="read-next-card-footer">
|
||||||
|
<a href="{{#../primary_tag}}{{url}}{{/../primary_tag}}">{{plural meta.pagination.total empty='No posts' singular='% post' plural='See all % posts'}}
|
||||||
|
→</a>
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
|
{{/if}}
|
||||||
|
{{/get}}
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{!-- If there's a next post, display it using the same markup included from - partials/post-card.hbs --}}
|
||||||
|
{{#next_post}}
|
||||||
|
{{> "post-card"}}
|
||||||
|
{{/next_post}}
|
||||||
|
|
||||||
|
{{!-- If there's a previous post, display it using the same markup included from - partials/post-card.hbs --}}
|
||||||
|
{{#prev_post}}
|
||||||
|
{{> "post-card"}}
|
||||||
|
{{/prev_post}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
{{/post}}
|
||||||
|
|
||||||
|
{{!-- The #contentFor helper here will send everything inside it up to the matching #block helper found in default.hbs --}}
|
||||||
|
{{#contentFor "scripts"}}
|
||||||
|
<script>
|
||||||
|
$(document).ready(function () {
|
||||||
|
// FitVids - start
|
||||||
|
var $postContent = $(".post-full-content");
|
||||||
|
$postContent.fitVids();
|
||||||
|
// FitVids - end
|
||||||
|
|
||||||
|
// Replace nav with title on scroll - start
|
||||||
|
Casper.stickyNavTitle({
|
||||||
|
navSelector: '.site-nav-main',
|
||||||
|
titleSelector: '.post-full-title',
|
||||||
|
activeClass: 'nav-post-title-active'
|
||||||
|
});
|
||||||
|
// Replace nav with title on scroll - end
|
||||||
|
|
||||||
|
// Hover on avatar
|
||||||
|
var hoverTimeout;
|
||||||
|
$('.author-list-item').hover(function () {
|
||||||
|
var $this = $(this);
|
||||||
|
|
||||||
|
clearTimeout(hoverTimeout);
|
||||||
|
|
||||||
|
$('.author-card').removeClass('hovered');
|
||||||
|
$(this).children('.author-card').addClass('hovered');
|
||||||
|
|
||||||
|
}, function () {
|
||||||
|
var $this = $(this);
|
||||||
|
|
||||||
|
hoverTimeout = setTimeout(function () {
|
||||||
|
$this.children('.author-card').removeClass('hovered');
|
||||||
|
}, 800);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{{/contentFor}}
|
|
@ -0,0 +1,3 @@
|
||||||
|
envsubst < /var/lib/ghost/config.production.json > __tmp && mv __tmp /var/lib/ghost/config.production.json
|
||||||
|
envsubst < /hbs/post.hbs > /var/lib/ghost/content/themes/casper/post.hbs
|
||||||
|
node "current/index.js"
|
Loading…
Reference in New Issue