Compare commits

...

6 Commits

12 changed files with 16 additions and 348 deletions

View File

@ -113,7 +113,18 @@ tasks:
sh: git rev-parse --short HEAD
TIMESTAMP:
sh: date +%s
IMAGE_TAG: homepage-nginx:{{.COMMIT_HASH}}-{{.TIMESTAMP}}
DOCKER_IMAGE: homepage-nginx:{{.COMMIT_HASH}}-{{.TIMESTAMP}}
cmds:
- task: build-prod
- docker build --pull --file docker/Dockerfile.nginx.prod --tag {{.IMAGE_TAG}} .
- docker build --pull --file docker/Dockerfile.nginx.prod --tag {{.DOCKER_IMAGE}} .
- task: deploy-with-ansible
vars:
DOCKER_IMAGE: '{{.DOCKER_IMAGE}}'
deploy-with-ansible:
internal: true
requires:
vars: [DOCKER_IMAGE]
dir: '/home/av/projects/private/pet-project-server'
cmd: ansible-playbook -i production.yml playbook-app-homepage.yml --extra-vars 'homepage_web_image={{.DOCKER_IMAGE}}'

View File

@ -5,16 +5,6 @@ sculpin:
sculpin_content_types:
posts:
enabled: false
albums:
type: path
path: _albums
singular_name: album
layout: internal
permalink: albums/:basename/
publish_drafts: false
enabled: true
taxonomies:
- tags
articles:
type: path
path: _articles

View File

@ -85,7 +85,7 @@ class SiteMapGenerator implements DataProviderInterface, EventSubscriberInterfac
return [];
}
if ($data['draft']) {
if (array_key_exists('draft', $data) && $data['draft']) {
return [];
}

View File

@ -1,11 +0,0 @@
version: '2'
services:
nginx:
image: '${NGINX_IMAGE}'
# user: '${CURRENT_UID}:${CURRENT_GID}'
restart: unless-stopped
ports:
- '${WEB_SERVER_PORT}:80'
env_file:
- .env

View File

@ -1,61 +0,0 @@
---
title: Белое море - 2011, 2013 года
description: Фотографии с поездок на Белое море в самую короткую ночь в году
---
{% block content %}
<p>
<a href="https://img-fotki.yandex.ru/get/9222/46045840.28/0_98765_7fc8895f_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9222/46045840.28/0_98765_7fc8895f_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9312/46045840.28/0_98748_e6ab013e_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9312/46045840.28/0_98748_e6ab013e_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9231/46045840.28/0_98749_b4fb46a9_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9231/46045840.28/0_98749_b4fb46a9_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9305/46045840.28/0_9874a_afbf859b_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9305/46045840.28/0_9874a_afbf859b_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9171/46045840.28/0_98747_7d4ca4c9_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9171/46045840.28/0_98747_7d4ca4c9_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9217/46045840.28/0_9874b_e42da6b4_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9217/46045840.28/0_9874b_e42da6b4_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9228/46045840.28/0_9874f_9af8aa8f_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9228/46045840.28/0_9874f_9af8aa8f_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9301/46045840.28/0_9875a_d96bfbd7_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9301/46045840.28/0_9875a_d96bfbd7_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/9324/46045840.28/0_98756_13fee051_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/9324/46045840.28/0_98756_13fee051_XL.jpg"/>
</a>
</p>
{% endblock %}

View File

@ -1,67 +0,0 @@
---
title: Зимний туман
description: Фотографи набережной Седова, сделанные в туманный зимний день
---
{% block content %}
<p>
<a href="https://img-fotki.yandex.ru/get/5821/46045840.24/0_6f263_3e1f58f6_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/5821/46045840.24/0_6f263_3e1f58f6_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/4419/46045840.24/0_6f25c_397758c6_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/4419/46045840.24/0_6f25c_397758c6_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/5313/46045840.24/0_6f256_e62604eb_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/5313/46045840.24/0_6f256_e62604eb_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/5313/46045840.24/0_6f257_5eaf214c_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/5313/46045840.24/0_6f257_5eaf214c_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/4614/46045840.24/0_6f259_3caa7abe_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/4614/46045840.24/0_6f259_3caa7abe_XXXL.jpg"/>
</a>
</p>
<p>
<a class="photo-link" href="https://img-fotki.yandex.ru/get/4419/46045840.24/0_6f25a_4f1fa9ef_XXXL.jpg">
<img class="photo-image" src="https://img-fotki.yandex.ru/get/4419/46045840.24/0_6f25a_4f1fa9ef_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/4614/46045840.24/0_6f25b_8a14fb24_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/4614/46045840.24/0_6f25b_8a14fb24_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/4419/46045840.24/0_6f25d_b4fd58d3_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/4419/46045840.24/0_6f25d_b4fd58d3_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/4614/46045840.24/0_6f25f_b60733cd_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/4614/46045840.24/0_6f25f_b60733cd_XL.jpg"/>
</a>
</p>
<p>
<a href="https://img-fotki.yandex.ru/get/4418/46045840.24/0_6f255_c458f69c_XXXL.jpg">
<img src="https://img-fotki.yandex.ru/get/4418/46045840.24/0_6f255_c458f69c_XL.jpg"/>
</a>
</p>
{% endblock %}

View File

@ -1,78 +0,0 @@
<template>
<section class="app">
<p class="fact-index">Факт {{ factIndex }}</p>
<p class="note">{{ fact }}</p>
<button @click.prevent="next" class="button-next">
Узнать чуть лучше
</button>
</section>
</template>
<script>
import _ from 'underscore';
const NOTES = [
'Люблю фильм "Три идиота".',
'Люблю кататься на велосипеде.',
'Люблю читать фантастические книги.',
'Люблю шоколад.',
'На день рождения ко мне можно прийти без подарка.',
'Не люблю пьяных людей.',
'Предпочитаю ходить в кино на 2D-сеансы.',
'Проехал на велосипеде 200 километров за день.',
'Работаю программистом.',
'Хотел бы побывать в горах.',
];
export default {
data() {
return {
notes: NOTES,
shown: [],
fact: '',
factIndex: null,
};
},
mounted() {
this.pick();
},
methods: {
next() {
this.pick();
},
pick() {
let available = _.difference(this.notes, this.shown);
if (_.size(available) === 0) {
available = this.notes;
this.shown = [];
}
const fact = _.sample(available);
this.shown.push(fact);
this.fact = fact;
this.factIndex = _.indexOf(NOTES, fact) + 1;
},
},
};
</script>
<style lang="scss" scoped>
@import '../components/button';
.app {
text-align: center;
}
.fact-index {
margin-top: 3em;
}
.note {
display: block;
font-size: 160%;
margin: 0 auto 2em;
min-height: 3em;
}
.button-next {
@extend %button;
}
</style>

View File

@ -1,7 +0,0 @@
import Vue from 'vue';
import About from './about.vue';
new Vue({
el: '#app',
render: h => h(About),
});

View File

@ -1,19 +0,0 @@
---
layout: internal
title: Обо мне
description: Несколько фактов об авторе
---
{% block js %}
{{ parent() }}
<script async src="{{ hashed_asset('/static/about.js') }}"></script>
{% endblock %}
{% block css %}
{{ parent() }}
<link rel="stylesheet" href="{{ hashed_asset('/static/about.css') }}">
{% endblock %}
{% block content %}
<div id="app"></div>
{% endblock %}

View File

@ -1,25 +0,0 @@
---
layout: internal
title: Фотоальбомы
description: Фотоальбомы
use: [albums]
---
{% block content %}
<h1>{{ page.title }}</h1>
<ul>
{% for album in data.albums %}
<li>
<p>
<a href="{{ album.url }}">{{ album.title }}</a>
{% if album.description %}
<br>
{{ album.description }}
{% endif %}
</p>
</li>
{% endfor %}
</ul>
{% endblock %}

View File

@ -25,7 +25,6 @@ use: [articles]
Работаю в <a href="https://playkot.com/" target="_blank">Playkot</a>.
Пишу на PHP.
Разбираюсь в back-end, экспериментирую с front-end, интересуюсь функциональным программированием.
Иногда <a href="/albums/">фотографирую</a>.
</p>
<span class="hr-line"></span>
@ -41,23 +40,8 @@ use: [articles]
</a>
</li>
<li class="social__item">
<a class="social__link" href="https://github.com/anwinged" target="_blank" title="Код на Гитхабе">
<i class="fab fa-github"></i>
</a>
</li>
<li class="social__item">
<a class="social__link" href="https://www.linkedin.com/in/anton-vakhrushev" target="_blank" title="Профиль на Линкедин">
<i class="fab fa-linkedin"></i>
</a>
</li>
<li class="social__item">
<a class="social__link" href="https://instagram.com/anwinged" target="_blank" title="Фотографии в Инстаграме">
<i class="fab fa-instagram"></i>
</a>
</li>
<li class="social__item">
<a class="social__link" href="/about/" target="_blank" title="Об авторе">
<i class="fas fa-ghost"></i>
<a class="social__link" href="https://git.vakhrushev.me" target="_blank" title="Код на Гитхабе">
<i class="fab fa-git-square"></i>
</a>
</li>
<li class="social__item">

View File

@ -1,49 +0,0 @@
from fabric import Connection
from invoke import task
from datetime import datetime
import subprocess
import shlex
APP_NAME = "homepage"
SSH_HOST = "homepage@51.250.85.23"
DOCKER_REGISTRY = "cr.yandex/crplfk0168i4o8kd7ade"
def run(args):
return subprocess.run(args, check=True, capture_output=True).stdout
@task
def deploy(c):
timestamp = int(datetime.now().timestamp())
commit = run(["git", "rev-parse", "--short", "HEAD"]).decode("utf-8").strip()
nginx_image_tag = f"{DOCKER_REGISTRY}/homepage-nginx:{commit}-{timestamp}"
print(f"Build nginx image {nginx_image_tag}")
run(
[
"docker",
"build",
"--file",
"docker/Dockerfile.nginx.prod",
"--tag",
nginx_image_tag,
".",
]
)
print("Push nginx image")
run(["docker", "push", nginx_image_tag])
print("Ready to setup remote host")
with Connection(SSH_HOST) as c:
c.put(
"./docker/docker-compose.prod.yml",
remote="/home/homepage/docker-compose.yml",
)
c.run("cp .env .env.prod")
c.run(f"echo NGINX_IMAGE={shlex.quote(nginx_image_tag)} >> .env.prod")
c.run(f"docker-compose --project-name {shlex.quote(APP_NAME)} --env-file=.env.prod up --detach")