<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[My personal thoughs...]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://ghost.raveau.info/</link><image><url>https://ghost.raveau.info/favicon.png</url><title>My personal thoughs...</title><link>https://ghost.raveau.info/</link></image><generator>Ghost 4.17</generator><lastBuildDate>Sun, 05 Jul 2026 23:53:49 GMT</lastBuildDate><atom:link href="https://ghost.raveau.info/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Start here for a quick overview of everything you need to know]]></title><description><![CDATA[We've crammed the most important information to help you get started with Ghost into this one post. It's your cheat-sheet to get started, and your shortcut to advanced features.]]></description><link>https://ghost.raveau.info/welcome/</link><guid isPermaLink="false">61331a7483eb670001f7a6df</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Sat, 04 Sep 2021 07:04:22 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/welcome-to-ghost.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/welcome-to-ghost.png" alt="Start here for a quick overview of everything you need to know"><p><strong>Hey there</strong>, welcome to your new home on the web! </p><p>Unlike social networks, this one is all yours. Publish your work on a custom domain, invite your audience to subscribe, send them new content by email newsletter, and offer premium subscriptions to generate sustainable recurring revenue to fund your work. </p><p>Ghost is an independent, open source app, which means you can customize absolutely everything. Inside the admin area, you&apos;ll find straightforward controls for changing themes, colors, navigation, logos and settings &#x2014; so you can set your site up just how you like it. No technical knowledge required.</p><p>If you&apos;re feeling a little more adventurous, there&apos;s really no limit to what&apos;s possible. With just a little bit of HTML and CSS you can modify or build your very own theme from scratch, or connect to Zapier to explore advanced integrations. Advanced developers can go even further and build entirely custom workflows using the Ghost API.</p><p>This level of customization means that Ghost grows with you. It&apos;s easy to get started, but there&apos;s always another level of what&apos;s possible. So, you won&apos;t find yourself outgrowing the app in a few months time and wishing you&apos;d chosen something more powerful!</p><hr><p>For now, you&apos;re probably just wondering what to do first. To help get you going as quickly as possible, we&apos;ve populated your site with starter content (like this post!) covering all the key concepts and features of the product.</p><p>You&apos;ll find an outline of all the different topics below, with links to each section so you can explore the parts that interest you most.</p><p>Once you&apos;re ready to begin publishing and want to clear out these starter posts, you can delete the &quot;Ghost&quot; staff user. Deleting an author will automatically remove all of their posts, leaving you with a clean blank canvas.</p><h2 id="your-guide-to-ghost">Your guide to Ghost</h2><ul><li><a href="https://ghost.raveau.info/design/">Customizing your brand and site settings</a></li><li><a href="https://ghost.raveau.info/write/">Writing &amp; managing content, an advanced guide for creators</a></li><li><a href="https://ghost.raveau.info/portal/">Building your audience with subscriber signups</a></li><li><a href="https://ghost.raveau.info/sell/">Selling premium memberships with recurring revenue</a></li><li><a href="https://ghost.raveau.info/grow/">How to grow your business around an audience</a></li><li><a href="https://ghost.raveau.info/integrations/">Setting up custom integrations and apps</a></li></ul><p>If you get through all those and you&apos;re hungry for more, you can find an extensive library of content for creators over on <a href="https://ghost.org/blog/">the Ghost blog</a>.</p><hr><h2 id="getting-help">Getting help</h2><p>If you need help, <a href="https://ghost.org/pricing/">Ghost(Pro)</a> customers can always reach our full-time support team by clicking on the <em>Ghost(Pro)</em> link inside their admin panel.</p><p>If you&apos;re a developer working with the codebase in a self-managed install, check out our <a href="https://forum.ghost.org">developer community forum</a> to chat with other users.</p><p>Have fun!</p>]]></content:encoded></item><item><title><![CDATA[Customizing your brand and design settings]]></title><description><![CDATA[How to tweak a few settings in Ghost to transform your site from a generic template to a custom brand with style and personality.]]></description><link>https://ghost.raveau.info/design/</link><guid isPermaLink="false">61331a7383eb670001f7a6dd</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Sat, 04 Sep 2021 07:04:21 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/publishing-options.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/publishing-options.png" alt="Customizing your brand and design settings"><p>As discussed in the <a href="https://ghost.raveau.info/welcome/">introduction</a> post, one of the best things about Ghost is just how much you can customize to turn your site into something unique. Everything about your layout and design can be changed, so you&apos;re not stuck with yet another clone of a social network profile.</p><p>How far you want to go with customization is completely up to you, there&apos;s no right or wrong approach! The majority of people use one of Ghost&apos;s built-in themes to get started, and then progress to something more bespoke later on as their site grows. </p><p>The best way to get started is with Ghost&apos;s branding settings, where you can set up colors, images and logos to fit with your brand.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://static.ghost.org/v4.0.0/images/brandsettings.png" class="kg-image" alt="Customizing your brand and design settings" loading="lazy" width="3456" height="2338"><figcaption>Ghost Admin &#x2192; Settings &#x2192; Branding</figcaption></figure><p>Any Ghost theme that&apos;s up to date and compatible with Ghost 4.0 and higher will reflect your branding settings in the preview window, so you can see what your site will look like as you experiment with different options.</p><p>When selecting an accent color, try to choose something which will contrast well with white text. Many themes will use your accent color as the background for buttons, headers and navigational elements. Vibrant colors with a darker hue tend to work best, as a general rule.</p><h2 id="installing-ghost-themes">Installing Ghost themes</h2><p>By default, new sites are created with Ghost&apos;s friendly publication theme, called Casper. Everything in Casper is optimized to work for the most common types of blog, newsletter and publication that people create with Ghost &#x2014; so it&apos;s a perfect place to start.</p><p>However, there are hundreds of different themes available to install, so you can pick out a look and feel that suits you best.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://static.ghost.org/v4.0.0/images/themesettings.png" class="kg-image" alt="Customizing your brand and design settings" loading="lazy" width="3208" height="1618"><figcaption>Ghost Admin &#x2192; Settings &#x2192; Theme</figcaption></figure><p>Inside Ghost&apos;s theme settings you&apos;ll find 4 more official themes that can be directly installed and activated. Each theme is suited to slightly different use-cases.</p><ul><li><strong>Casper</strong> <em>(default)</em> &#x2014; Made for all sorts of blogs and newsletters</li><li><strong>Edition</strong> &#x2014; A beautiful minimal template for newsletter authors</li><li><strong>Alto</strong> &#x2014; A slick news/magazine style design for creators</li><li><strong>London</strong> &#x2014; A light photography theme with a bold grid</li><li><strong>Ease</strong> &#x2014; A library theme for organizing large content archives</li></ul><p>And if none of those feel quite right, head on over to the <a href="https://ghost.org/themes/">Ghost Marketplace</a>, where you&apos;ll find a huge variety of both free and premium themes.</p><h2 id="building-something-custom">Building something custom</h2><p>Finally, if you want something completely bespoke for your site, you can always build a custom theme from scratch and upload it to your site.</p><p>Ghost&apos;s theming template files are very easy to work with, and can be picked up in the space of a few hours by anyone who has just a little bit of knowledge of HTML and CSS. Templates from other platforms can also be ported to Ghost with relatively little effort.</p><p>If you want to take a quick look at the theme syntax to see what it&apos;s like, you can <a href="https://github.com/tryghost/casper/">browse through the files of the default Casper theme</a>. We&apos;ve added tons of inline code comments to make it easy to learn, and the structure is very readable.</p><figure class="kg-card kg-code-card"><pre><code class="language-handlebars">{{#post}}
&lt;article class=&quot;article {{post_class}}&quot;&gt;

    &lt;h1&gt;{{title}}&lt;/h1&gt;
    
    {{#if feature_image}}
    	&lt;img src=&quot;{{feature_image}}&quot; alt=&quot;Feature image&quot; /&gt;
    {{/if}}
    
    {{content}}

&lt;/article&gt;
{{/post}}</code></pre><figcaption>A snippet from a post template</figcaption></figure><p>See? Not that scary! But still completely optional. </p><p>If you&apos;re interested in creating your own Ghost theme, check out our extensive <a href="https://ghost.org/docs/themes/">theme documentation</a> for a full guide to all the different template variables and helpers which are available.</p>]]></content:encoded></item><item><title><![CDATA[Writing and managing content in Ghost, an advanced guide]]></title><description><![CDATA[A full overview of all the features built into the Ghost editor, including powerful workflow automations to speed up your creative process.]]></description><link>https://ghost.raveau.info/write/</link><guid isPermaLink="false">61331a7383eb670001f7a6db</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Sat, 04 Sep 2021 07:04:20 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/writing-posts-with-ghost.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/writing-posts-with-ghost.png" alt="Writing and managing content in Ghost, an advanced guide"><p>Ghost comes with a best-in-class editor which does its very best to get out of the way, and let you focus on your content. Don&apos;t let its minimal looks fool you, though, beneath the surface lies a powerful editing toolset designed to accommodate the extensive needs of modern creators.</p><p>For many, the base canvas of the Ghost editor will feel familiar. You can start writing as you would expect, highlight content to access the toolbar you would expect, and generally use all of the keyboard shortcuts you would expect.</p><p>Our main focus in building the Ghost editor is to try and make as many things that you hope/expect might work: actually work. </p><ul><li>You can copy and paste raw content from web pages, and Ghost will do its best to correctly preserve the formatting. </li><li>Pasting an image from your clipboard will upload inline.</li><li>Pasting a social media URL will automatically create an embed.</li><li>Highlight a word in the editor and paste a URL from your clipboard on top: Ghost will turn it into a link.</li><li>You can also paste (or write!) Markdown and Ghost will usually be able to auto-convert it into fully editable, formatted content.</li></ul><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://static.ghost.org/v4.0.0/images/editor.png" class="kg-image" alt="Writing and managing content in Ghost, an advanced guide" loading="lazy" width="3182" height="1500"><figcaption>The Ghost editor. Also available in dark-mode, for late night writing sessions.</figcaption></figure><p>The goal, as much as possible, is for things to work so that you don&apos;t have to <em>think</em> so much about the editor. You won&apos;t find any disastrous &quot;block builders&quot; here, where you have to open 6 submenus and choose from 18 different but identical alignment options. That&apos;s not what Ghost is about.</p><p>What you will find though, is dynamic cards which allow you to embed rich media into your posts and create beautifully laid out stories.</p><h2 id="using-cards">Using cards</h2><p>You can insert dynamic cards inside post content using the <code>+</code> button, which appears on new lines, or by typing <code>/</code> on a new line to trigger the card menu. Many of the choices are simple and intuitive, like bookmark cards, which allow you to create rich links with embedded structured data:</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://opensubscriptionplatforms.com/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Open Subscription Platforms</div><div class="kg-bookmark-description">A shared movement for independent subscription data.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://opensubscriptionplatforms.com/images/favicon.png" alt="Writing and managing content in Ghost, an advanced guide"><span class="kg-bookmark-author">Open Subscription Platforms</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opensubscriptionplatforms.com/images/osp-card.png" alt="Writing and managing content in Ghost, an advanced guide"></div></a></figure><p>or embed cards which make it easy to insert content you want to share with your audience, from external services:</p><figure class="kg-card kg-embed-card"><iframe width="200" height="113" src="https://www.youtube.com/embed/hmH3XMlms8E?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></figure><p>But, dig a little deeper, and you&apos;ll also find more advanced cards, like one that only shows up in email newsletters (great for personalized introductions) and a comprehensive set of specialized cards for different types of images and galleries.</p><blockquote>Once you &#xA0;start mixing text and image cards creatively, the whole narrative of the story changes. Suddenly, you&apos;re working in a new format.</blockquote><figure class="kg-card kg-image-card kg-width-full"><img src="https://static.ghost.org/v4.0.0/images/andreas-selter-xSMqGH7gi6o-unsplash.jpg" class="kg-image" alt="Writing and managing content in Ghost, an advanced guide" loading="lazy" width="6000" height="4000"></figure><p>As it turns out, sometimes pictures and a thousand words go together really well. Telling people a great story often has much more impact if they can feel, even for a moment, as though they were right there with you.</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://static.ghost.org/v4.0.0/images/andreas-selter-e4yK8QQlZa0-unsplash.jpg" width="4572" height="3048" loading="lazy" alt="Writing and managing content in Ghost, an advanced guide"></div><div class="kg-gallery-image"><img src="https://static.ghost.org/v4.0.0/images/steve-carter-Ixp4YhCKZkI-unsplash.jpg" width="4032" height="2268" loading="lazy" alt="Writing and managing content in Ghost, an advanced guide"></div></div></div></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://static.ghost.org/v4.0.0/images/lukasz-szmigiel-jFCViYFYcus-unsplash.jpg" class="kg-image" alt="Writing and managing content in Ghost, an advanced guide" loading="lazy" width="2560" height="1705"></figure><figure class="kg-card kg-gallery-card kg-width-wide kg-card-hascaption"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://static.ghost.org/v4.0.0/images/jd-mason-hPiEFq6-Eto-unsplash.jpg" width="5184" height="3888" loading="lazy" alt="Writing and managing content in Ghost, an advanced guide"></div><div class="kg-gallery-image"><img src="https://static.ghost.org/v4.0.0/images/jp-valery-OBpOP9GVH9U-unsplash.jpg" width="5472" height="3648" loading="lazy" alt="Writing and managing content in Ghost, an advanced guide"></div></div></div><figcaption>Peaceful places</figcaption></figure><p>Galleries and image cards can be combined in so many different ways &#x2014; the only limit is your imagination.</p><h2 id="build-workflows-with-snippets">Build workflows with snippets</h2><p>One of the most powerful features of the Ghost editor is the ability to create and re-use content snippets. If you&apos;ve ever used an email client with a concept of <em>saved replies</em> then this will be immediately intuitive.</p><p>To create a snippet, select a piece of content in the editor that you&apos;d like to re-use in future, then click on the snippet icon in the toolbar. Give your snippet a name, and you&apos;re all done. Now your snippet will be available from within the card menu, or you can search for it directly using the <code>/</code> command.</p><p>This works really well for saving images you might want to use often, like a company logo or team photo, links to resources you find yourself often linking to, or introductions and passages that you want to remember.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://static.ghost.org/v4.0.0/images/createsnippet.png" class="kg-image" alt="Writing and managing content in Ghost, an advanced guide" loading="lazy" width="2282" height="1272"></figure><p>You can even build entire post templates or outlines to create a quick, re-usable workflow for publishing over time. Or build custom design elements for your post with an HTML card, and use a snippet to insert it.</p><p>Once you get a few useful snippets set up, it&apos;s difficult to go back to the old way of diving through media libraries and trawling for that one thing you know you used somewhere that one time.</p><hr><h2 id="publishing-and-newsletters-the-easy-way">Publishing and newsletters the easy way</h2><p>When you&apos;re ready to publish, Ghost makes it as simple as possible to deliver your new post to all your existing members. Just hit the <em>Preview</em> link and you&apos;ll get a chance to see what your content looks like on Web, Mobile, Email and Social.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://static.ghost.org/v4.0.0/images/preview.png" class="kg-image" alt="Writing and managing content in Ghost, an advanced guide" loading="lazy" width="3166" height="2224"></figure><p>You can send yourself a test newsletter to make sure everything looks good in your email client, and then hit the <em>Publish</em> button to decide who to deliver it to.</p><p>Ghost comes with a streamlined, optimized email newsletter template that has settings built-in for you to customize the colors and typography. We&apos;ve spent countless hours refining the template to make sure it works great across all email clients, and performs well for email deliverability.</p><p>So, you don&apos;t need to fight the awful process of building a custom email template from scratch. It&apos;s all done already!</p><hr><p>The Ghost editor is powerful enough to do whatever you want it to do. With a little exploration, you&apos;ll be up and running in no time.</p>]]></content:encoded></item><item><title><![CDATA[Building your audience with subscriber signups]]></title><description><![CDATA[How Ghost allows you to turn anonymous readers into an audience of active subscribers, so you know what's working and what isn't.]]></description><link>https://ghost.raveau.info/portal/</link><guid isPermaLink="false">61331a7283eb670001f7a6d9</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Sat, 04 Sep 2021 07:04:19 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/creating-a-custom-theme.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/creating-a-custom-theme.png" alt="Building your audience with subscriber signups"><p>What sets Ghost apart from other products is that you can publish content and grow your audience using the same platform. Rather than just endlessly posting and hoping someone is listening, you can track real signups against your work and have them subscribe to be notified of future posts. The feature that makes all this possible is called <em>Portal</em>.</p><p>Portal is an embedded interface for your audience to sign up to your site. It works on every Ghost site, with every theme, and for any type of publisher. </p><p>You can customize the design, content and settings of Portal to suit your site, whether you just want people to sign up to your newsletter &#x2014; or you&apos;re running a full premium publication with user sign-ins and private content.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://static.ghost.org/v4.0.0/images/portalsettings.png" class="kg-image" alt="Building your audience with subscriber signups" loading="lazy" width="2924" height="1810"></figure><p>Once people sign up to your site, they&apos;ll receive an email confirmation with a link to click. The link acts as an automatic sign-in, so subscribers will be automatically signed-in to your site when they click on it. There are a couple of interesting angles to this:</p><p>Because subscribers are automatically able to sign in and out of your site as registered members: You can (optionally) restrict access to posts and pages depending on whether people are signed-in or not. So if you want to publish some posts for free, but keep some really great stuff for members-only, this can be a great draw to encourage people to sign up!</p><p>Ghost members sign in using email authentication links, so there are no passwords for people to set or forget. You can turn any list of email subscribers into a database of registered members who can sign in to your site. Like magic.</p><p>Portal makes all of this possible, and it appears by default as a floating button in the bottom-right corner of your site. When people are logged out, clicking it will open a sign-up/sign-in window. When members are logged in, clicking the Portal button will open the account menu where they can edit their name, email, and subscription settings.</p><p>The floating Portal button is completely optional. If you prefer, you can add manual links to your content, navigation, or theme to trigger it instead.</p><p>Like this! <a href="#/portal">Sign up here</a></p><hr><p>As you start to grow your registered audience, you&apos;ll be able to get a sense of who you&apos;re publishing <em>for</em> and where those people are coming <em>from</em>. Best of all: You&apos;ll have a straightforward, reliable way to connect with people who enjoy your work.</p><p>Social networks go in and out of fashion all the time. Email addresses are timeless.</p><p>Growing your audience is valuable no matter what type of site you run, but if your content <em>is</em> your business, then you might also be interested in <a href="https://ghost.raveau.info/sell/">setting up premium subscriptions</a>.</p>]]></content:encoded></item><item><title><![CDATA[Selling premium memberships with recurring revenue]]></title><description><![CDATA[<p>For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.</p><p>Connect your <a href="https://stripe.com">Stripe</a> account to Ghost, and you&apos;ll be able to quickly and easily create monthly and yearly premium</p>]]></description><link>https://ghost.raveau.info/sell/</link><guid isPermaLink="false">61331a7283eb670001f7a6d7</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Sat, 04 Sep 2021 07:04:18 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/organizing-your-content.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/organizing-your-content.png" alt="Selling premium memberships with recurring revenue"><p>For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.</p><p>Connect your <a href="https://stripe.com">Stripe</a> account to Ghost, and you&apos;ll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.</p><p>Ghost takes <strong>0% payment fees</strong>, so everything you make is yours to keep!</p><p>Using subscriptions, you can build an independent media business like <a href="https://stratechery.com">Stratechery</a>, <a href="https://www.theinformation.com">The Information</a>, or <a href="https://thebrowser.com">The Browser</a>.</p><p>The creator economy is just getting started, and Ghost allows you to build something based on technology that you own and control.</p><figure class="kg-card kg-image-card kg-card-hascaption"><a href="https://thebrowser.com"><img src="https://static.ghost.org/v4.0.0/images/thebrowser.jpg" class="kg-image" alt="Selling premium memberships with recurring revenue" loading="lazy" width="1600" height="2000"></a><figcaption>The Browser has over 10,000 paying subscribers</figcaption></figure><p>Most successful subscription businesses publish a mix of free and paid posts to attract a new audience, and upsell the most loyal members to a premium offering. You can also mix different access levels within the same post, showing a free preview to logged out members and then, right when you&apos;re ready for a cliffhanger, that&apos;s a good time to...</p>]]></content:encoded></item><item><title><![CDATA[How to grow your business around an audience]]></title><description><![CDATA[A guide to collaborating with other staff users to publish, and some resources to help you with the next steps of growing your business]]></description><link>https://ghost.raveau.info/grow/</link><guid isPermaLink="false">61331a7283eb670001f7a6d5</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Sat, 04 Sep 2021 07:04:17 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/admin-settings.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/admin-settings.png" alt="How to grow your business around an audience"><p>As you grow, you&apos;ll probably want to start inviting team members and collaborators to your site. Ghost has a number of different user roles for your team:</p><p><strong>Contributors</strong><br>This is the base user level in Ghost. Contributors can create and edit their own draft posts, but they are unable to edit drafts of others or publish posts. Contributors are <strong>untrusted</strong> users with the most basic access to your publication.</p><p><strong>Authors</strong><br>Authors are the 2nd user level in Ghost. Authors can write, edit and publish their own posts. Authors are <strong>trusted</strong> users. If you don&apos;t trust users to be allowed to publish their own posts, they should be set as Contributors.</p><p><strong>Editors</strong><br>Editors are the 3rd user level in Ghost. Editors can do everything that an Author can do, but they can also edit and publish the posts of others - as well as their own. Editors can also invite new Contributors &amp; Authors to the site.</p><p><strong>Administrators</strong><br>The top user level in Ghost is Administrator. Again, administrators can do everything that Authors and Editors can do, but they can also edit all site settings and data, not just content. Additionally, administrators have full access to invite, manage or remove any other user of the site.<br><br><strong>The Owner</strong><br>There is only ever one owner of a Ghost site. The owner is a special user which has all the same permissions as an Administrator, but with two exceptions: The Owner can never be deleted. And in some circumstances the owner will have access to additional special settings if applicable. For example: billing details, if using <a href="https://ghost.org/pricing/"><strong>Ghost(Pro)</strong></a>.</p><blockquote><em>Ask all of your users to fill out their user profiles, including bio and social links. These will populate rich structured data for posts and generally create more opportunities for themes to fully populate their design.</em></blockquote><hr><p>If you&apos;re looking for insights, tips and reference materials to expand your content business, here&apos;s 5 top resources to get you started:</p><ul><li><a href="https://ghost.org/blog/how-to-create-a-newsletter/"><strong>How to create a premium newsletter (+ some case studies)</strong></a><strong> </strong> <br>Learn how others run successful paid email newsletter products</li><li><strong><a href="https://ghost.org/blog/membership-sites/">The ultimate guide to membership websites for creators</a></strong><br>Tips to help you build, launch and grow your new membership business</li><li><strong><a href="https://newsletterguide.org/">The Newsletter Guide</a></strong><br>A 201 guide for taking your newsletters to the next level</li><li><a href="https://ghost.org/blog/find-your-niche-creator-economy/"><strong>The proven way to find your niche, explained</strong></a><br>Find the overlap and find a monetizable niche that gets noticed</li><li><strong><a href="https://ghost.org/blog/newsletter-referral-programs/">Should you launch a referral program? </a></strong><br>Strategies for building a sustainable referral growth machine</li></ul>]]></content:encoded></item><item><title><![CDATA[Setting up apps and custom integrations]]></title><description><![CDATA[Work with all your favorite apps and tools or create your own custom integrations using the Ghost API.]]></description><link>https://ghost.raveau.info/integrations/</link><guid isPermaLink="false">61331a7083eb670001f7a6d3</guid><category><![CDATA[Getting Started]]></category><dc:creator><![CDATA[Ghost]]></dc:creator><pubDate>Sat, 04 Sep 2021 07:04:16 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/app-integrations.png" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/app-integrations.png" alt="Setting up apps and custom integrations"><p>It&apos;s possible to extend your Ghost site and connect it with hundreds of the most popular apps and tools using integrations. </p><p>Whether you need to automatically publish new posts on social media, connect your favorite analytics tool, sync your community or embed forms into your content &#x2014; our <a href="https://ghost.org/integrations/">integrations library</a> has got it all covered with hundreds of integration tutorials.</p><p>Many integrations are as simple as inserting an embed by pasting a link, or copying a snippet of code directly from an app and pasting it into Ghost. Our integration tutorials are used by creators of all kinds to get apps and integrations up and running in no time &#x2014; no technical knowledge required.</p><figure class="kg-card kg-image-card kg-width-full"><img src="https://static.ghost.org/v4.0.0/images/integrations-icons.png" class="kg-image" alt="Setting up apps and custom integrations" loading="lazy"></figure><h2 id="zapier">Zapier</h2><p>Zapier is a no-code tool that allows you to build powerful automations, and our official integration allows you to connect your Ghost site to more than 1,000 external services.</p><blockquote><strong>Example</strong>: When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).</blockquote><p><strong>Here&apos;s a few of the most popular automation templates:</strong> </p><!--kg-card-begin: markdown--><script src="https://zapier.com/apps/embed/widget.js?services=Ghost,-shortcm,-hubspot,-sendpulse,-noticeable,-aweber,-icontact,-facebook-pages,-github,-medium,-slack,-mailchimp,-activecampaign,-twitter,-discourse&amp;container,-convertkit,-drip,-airtable=true&amp;limit=5"></script>
<!--kg-card-end: markdown--><h2 id="custom-integrations">Custom integrations</h2><p>For more advanced automation, it&apos;s possible to create custom Ghost integrations with dedicated API keys from the Integrations page within Ghost Admin. </p><figure class="kg-card kg-image-card"><img src="https://static.ghost.org/v4.0.0/images/iawriter-integration.png" class="kg-image" alt="Setting up apps and custom integrations" loading="lazy" width="2244" height="936"></figure><p>These custom integrations allow you to use the Ghost API without needing to write code, and create powerful workflows such as sending content from your favorite desktop editor into Ghost as a new draft.</p>]]></content:encoded></item><item><title><![CDATA[jjlavaza/rpi-jeedom: image Jeedom docker optimisée pour Rpi4/k3s/php7/Mqtt/Mosquitto]]></title><description><![CDATA[<h3 id="image-jeedom-docker-kubernetes-arm-lib-mosquitto-mqtt">Image Jeedom Docker-kubernetes arm + lib mosquitto-MQTT</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/jjlavaza/rpi-jeedom"><div class="kg-bookmark-content"><div class="kg-bookmark-title">jjlavaza/rpi-jeedom</div><div class="kg-bookmark-description">jeedom dockerfile for armv7 with mosquitto client on php7 - jjlavaza/rpi-jeedom</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicon.ico"><span class="kg-bookmark-author">jjlavaza</span><span class="kg-bookmark-publisher">GitHub</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://avatars1.githubusercontent.com/u/7627224?s=400&amp;v=4"></div></a></figure><p><a href="https://hub.docker.com/r/jjlavaza/jeedom">https://hub.docker.com/r/jjlavaza/jeedom</a></p><ul><li>Image docker jjlavaza/jeedom sp&#xE9;cifique optimis&#xE9;e pour kubernetes, car embarque les librairies n&#xE9;cessaires au red&</li></ul>]]></description><link>https://ghost.raveau.info/jeedom-sur-rpi4-k3s/</link><guid isPermaLink="false">5e1354be3e585000013d50a1</guid><pubDate>Sun, 01 Mar 2020 12:54:40 GMT</pubDate><content:encoded><![CDATA[<h3 id="image-jeedom-docker-kubernetes-arm-lib-mosquitto-mqtt">Image Jeedom Docker-kubernetes arm + lib mosquitto-MQTT</h3><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/jjlavaza/rpi-jeedom"><div class="kg-bookmark-content"><div class="kg-bookmark-title">jjlavaza/rpi-jeedom</div><div class="kg-bookmark-description">jeedom dockerfile for armv7 with mosquitto client on php7 - jjlavaza/rpi-jeedom</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicon.ico"><span class="kg-bookmark-author">jjlavaza</span><span class="kg-bookmark-publisher">GitHub</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://avatars1.githubusercontent.com/u/7627224?s=400&amp;v=4"></div></a></figure><p><a href="https://hub.docker.com/r/jjlavaza/jeedom">https://hub.docker.com/r/jjlavaza/jeedom</a></p><ul><li>Image docker jjlavaza/jeedom sp&#xE9;cifique optimis&#xE9;e pour kubernetes, car embarque les librairies n&#xE9;cessaires au red&#xE9;marrage auto avec mosquitto-client pour g&#xE9;rer les messages MQTT.</li><li>Reg&#xE9;n&#xE9;rer et publier r&#xE9;guli&#xE8;rement sur <strong>DockerHub</strong> lors d&apos;&#xE9;volution majeure</li><li>Le but est de fournir un conteneur &#xE0; jour et directement op&#xE9;rationnel en cas de red&#xE9;marrage. Ainsi dans un cluster type k3s, en cas de plantage, un &quot;deploy&quot; Jeedom est red&#xE9;marr&#xE9; automatiquement, via l&apos;ensemble du param&#xE9;trage externalis&#xE9; dans une base de donn&#xE9;es.</li><li>Pour les instructions de d&#xE9;ploiement &quot;docker&quot;, voir la documentation <a href="https://hub.docker.com/r/codafog/jeedom-rpi/">codafog/jeedom-rpi/</a>.</li><li>Pour les d&#xE9;tails d&apos;une installation k3s, se r&#xE9;f&#xE9;rer &#xE0; une documentation sp&#xE9;cifique (cf. liens en bas de page).</li><li>Pour compiler se placer au niveau du dockerfile et lancer:</li></ul><!--kg-card-begin: markdown--><p><code>sudo docker build -t jjlavaza/jeedom .</code></p>
<!--kg-card-end: markdown--><p><em>A voir si la derni&#xE8;re commande est utile pour finaliser la configuration des packages:</em></p><!--kg-card-begin: markdown--><pre><code>dpkg --configure -a apt upgrade
</code></pre>
<!--kg-card-end: markdown--><p>Dockerfile adapt&#xE9; du docker file de &#xA0;<a href="https://hub.docker.com/r/codafog/jeedom-rpi/">codafog/jeedom-rpi/</a>, utilise plut&#xF4;t l&apos;image de balenalib, afin d&apos;&#xE9;viter les erreurs de mise &#xE0; jour d&apos;apt. De plus </p><!--kg-card-begin: markdown--><pre><code>FROM  balenalib/armv7hf-debian

# Enable building ARM container on x86 machinery on the web (comment out next line if built on Raspberry)
#RUN [ &quot;cross-build-start&quot; ]

ENV SHELL_ROOT_PASSWORD Jeedom123

# JR
#&#xA0;RUN apt-get clean &amp;&amp; apt-get update &amp;&amp; apt upgrade &amp;&amp; apt-get install --no-install-recommends -y wget openssh-server supervisor mysql-client
RUN apt-get clean &amp;&amp; apt-get update &amp;&amp; apt upgrade &amp;&amp; apt-get install --no-install-recommends -y wget openssh-server supervisor apt-utils


RUN echo &quot;root:${SHELL_ROOT_PASSWORD}&quot; | chpasswd &amp;&amp; \
  sed -i &apos;s/PermitRootLogin without-password/PermitRootLogin yes/&apos; /etc/ssh/sshd_config &amp;&amp; \
  sed -i &apos;s@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g&apos; /etc/pam.d/sshd

RUN mkdir -p /var/run/sshd /var/log/supervisor
WORKDIR /etc
RUN rm /etc/motd &amp;&amp; wget -q https://raw.githubusercontent.com/jeedom/core/master/install/motd

WORKDIR /etc/supervisor/conf.d
RUN wget -q https://raw.githubusercontent.com/jeedom/core/master/install/OS_specific/Docker/supervisord.conf

WORKDIR /root
RUN rm -f /root/.bashrc &amp;&amp; wget -O .bashrc -q https://raw.githubusercontent.com/jeedom/core/master/install/bashrc

RUN wget -O install_docker.sh -q https://raw.githubusercontent.com/jeedom/core/master/install/install.sh &amp;&amp; chmod +x /root/install_docker.sh
RUN /root/install_docker.sh -s 2;exit 0
RUN /root/install_docker.sh -s 4;exit 0
RUN /root/install_docker.sh -s 5;exit 0
RUN /root/install_docker.sh -s 7;exit 0
RUN /root/install_docker.sh -s 10;exit 0

RUN wget -q https://raw.githubusercontent.com/jeedom/core/master/install/OS_specific/Docker/init.sh &amp;&amp; chmod +x /root/init.sh

#Ajout JR &#xE0; partir du DockerFile de codafog
RUN apt update &amp;&amp; apt upgrade &amp;&amp; apt install mosquitto mosquitto-clients make php-pear libmosquitto-dev php-dev
RUN pecl install Mosquitto-alpha &amp;&amp; echo &quot;extension=mosquitto.so&quot; &gt;&gt; /etc/php/7.3/cli/php.ini &amp;&amp; echo &quot;extension=mosquitto.so&quot; &gt;&gt;  /etc/php/7.3/apache2/php.ini

# pour essayer de charger la conf automatique
RUN dpkg --configure -a

CMD [&quot;/root/init.sh&quot;]

# stop processing ARM emulation (comment out next line if built on Raspberry)
#RUN [ &quot;cross-build-end&quot; ]


</code></pre>
<!--kg-card-end: markdown--><p></p><p><strong>Divers liens :</strong></p><ul><li>dd : <a href="https://opensource.com/article/18/7/how-use-dd-linux">https://opensource.com/article/18/7/how-use-dd-linux</a></li><li>exmple de d&#xE9;ploiements: <a href="https://medium.com/@abenahmed1/serverless-fonctions-%C3%A0-la-demande-avec-k3s-via-fission-kubeless-et-openfaas-26848d70f3bf">https://medium.com/@abenahmed1/serverless-fonctions-%C3%A0-la-demande-avec-k3s-via-fission-kubeless-et-openfaas-26848d70f3bf</a></li><li>kubectl commands cheatsheet: <a href="https://medium.com/faun/kubectl-commands-cheatsheet-43ce8f13adfb">https://medium.com/faun/kubectl-commands-cheatsheet-43ce8f13adfb</a></li><li><a href="https://medium.com/@rboulanouar/hands-on-k3os-k3s-cluster-5fe6c3497a1e">Hands on K3S (Using K3OS) - R&#xE9;my Boulanouar - Medium</a></li><li><a href="https://yoshwata-blog.netlify.com/posts/install-helm-to-k3s/">Install Helm to ARM k3s cluster &#xA0; Hello yoshwata NG &#x2014; A simple theme for Hugo</a></li><li><a href="http://dockerlabs.collabnix.com/beginners/install/raspberrypi3/setting-up-k3s-cluster.html">Building up K3s Cluster | dockerlabs</a><br></li></ul>]]></content:encoded></item><item><title><![CDATA[Thinker-AI Esp32-Cam OTA]]></title><description><![CDATA[<p>Objectif: image OTA ESP32-CAM </p><!--kg-card-begin: markdown--><ul>
<li>BLE: pour envoie des photos &#xE0; intervalle et/ou activation externe.</li>
<li>Wifi: OTA.</li>
<li>Server Web: configuration et ajustement de l&apos;image</li>
<li>Batterie Li/Po, mesure courant, r&#xE9;gulation &amp; recharge</li>
<li>Activation de la LED si &#xE9;clairage faible ou action</li>
<li>Mode DeepSleep</li>
<li>PIR: D&</li></ul>]]></description><link>https://ghost.raveau.info/thinker-ai-esp32-cam-ota/</link><guid isPermaLink="false">5e5aa320158c8200014790b2</guid><dc:creator><![CDATA[Jjlavaza]]></dc:creator><pubDate>Sat, 29 Feb 2020 18:13:54 GMT</pubDate><media:content url="https://ghost.raveau.info/content/images/2020/02/esp32-cam.jpeg" medium="image"/><content:encoded><![CDATA[<img src="https://ghost.raveau.info/content/images/2020/02/esp32-cam.jpeg" alt="Thinker-AI Esp32-Cam OTA"><p>Objectif: image OTA ESP32-CAM </p><!--kg-card-begin: markdown--><ul>
<li>BLE: pour envoie des photos &#xE0; intervalle et/ou activation externe.</li>
<li>Wifi: OTA.</li>
<li>Server Web: configuration et ajustement de l&apos;image</li>
<li>Batterie Li/Po, mesure courant, r&#xE9;gulation &amp; recharge</li>
<li>Activation de la LED si &#xE9;clairage faible ou action</li>
<li>Mode DeepSleep</li>
<li>PIR: D&#xE9;tection et sortie du mode veille</li>
</ul>
<!--kg-card-end: markdown--><p>Le sketch fourni par d&#xE9;faut dans Arduino IDE, &#xA0;d&#xE9;velopp&#xE9; par Expressif, ne permet pas de cr&#xE9;er une image OTA, ie. flashable &#xE0; distance via Wifi, et donc plus pratique que via USB.</p><p>En effet OTA faisant cohabiter ancienne et nouvelle version des sketchs en m&#xE9;moire, il faut donc disposer d&apos;une RAM disponible deux fois plus grande que celle du sketch &#xE0; uploader. </p><p>Ici la taille maximale serait logiquement de 2Mo (4Mo RAM sur esp32-cam =&gt; 4 / 2 = 2 Mo). </p><p>Le sketch par d&#xE9;faut (+ gestion OTA) d&#xE9;passe largement ces 2Mo (168%). </p><p>Cependant, des tentatives existent pour diminuer son empreinte m&#xE9;moire, notamment en supprimant la partie IA de reconnaissance de visage, inutile dans certains projets.</p><p>Malgr&#xE9; cela, il reste difficile d&apos;activer plusieurs fonctionnalit&#xE9;s ensemble OTA, serveur WebCam, Wifi, BLE...</p><p>Depuis le d&#xE9;but 2020 certains projets semblent avoir relever le challenge... A tester...</p><!--kg-card-begin: markdown--><h2 id="projet-lampe-esp32-cam">Projet lampe ESP32-CAM</h2>
<p>Projet de mise en oeuvre de l&apos;ESP32-CAM, avec d&#xE9;tection de mouvement PIR, Relay et DHT22.<br>
Le tout avec un circuit imprim&#xE9; maison r&#xE9;alis&#xE9; avec une machine CNC.</p>
<p><img src="https://ghost.raveau.info/content/images/2022/02/IMG20220204191959.jpg" alt="Thinker-AI Esp32-Cam OTA" loading="lazy"><br>
<img src="https://ghost.raveau.info/content/images/2022/02/Screenshot_2022-02-05-17-50-47-62_99c04817c0de5652397fc8b56c3b3817.jpg" alt="Thinker-AI Esp32-Cam OTA" loading="lazy"></p>
<!--kg-card-end: markdown--><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://learn.circuit.rocks/esp32-cam-with-rtsp-video-streaming"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ESP32 CAM with RTSP Streaming | LEARN @ CIRCUITROCKS</div><div class="kg-bookmark-description">In this tutorial, we&#x2019;ll discuss ESP32-CAM - one of the cheapest solutions if you want to add video recording to your IoT project.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://learn.circuit.rocks/wp-content/uploads/2019/08/cropped-circuitrocks-favicon-192x192.png" alt="Thinker-AI Esp32-Cam OTA"><span class="kg-bookmark-author">LEARN @ CIRCUITROCKS</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://learn.circuit.rocks/wp-content/uploads/2020/03/CaseStand.png" alt="Thinker-AI Esp32-Cam OTA"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://esp32.com/viewtopic.php?t=14700"><div class="kg-bookmark-content"><div class="kg-bookmark-title">OTA does not work on AI Thinker ESP32-CAM board - ESP32 Forum</div><div class="kg-bookmark-description">Espressif ESP32 Official Forum</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://esp32.com/styles/Subway/theme/images/favicon.ico" alt="Thinker-AI Esp32-Cam OTA"><span class="kg-bookmark-author">ESP32 Forum</span><span class="kg-bookmark-publisher">Postby sailaway &#xBB; Thu Mar 12, 2020 4:37 pm</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://esp32.com/styles/Subway/theme/images/esp32.png" alt="Thinker-AI Esp32-Cam OTA"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://randomnerdtutorials.com/esp32-cam-pir-motion-detector-photo-capture/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ESP32-CAM PIR Motion Detector with Photo Capture | Random Nerd Tutorials</div><div class="kg-bookmark-description">In this project, we&#x2019;re going to make a motion sensor detector with photo capture using an ESP32-CAM. When your PIR sensor detects motion, it wakes up, takes a photo and saves it in the microSD card.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i2.wp.com/randomnerdtutorials.com/wp-content/uploads/2018/03/n-favicon-2018.png?fit=16%2C16&amp;ssl=1" alt="Thinker-AI Esp32-Cam OTA"><span class="kg-bookmark-author">Random Nerd Tutorials</span><span class="kg-bookmark-publisher">Dominic</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i1.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/08/ESP32-CAM-Motion-Detection-with-Photo-Capture-saves-to-microSD-card.jpg?fit=813%2C457&amp;ssl=1" alt="Thinker-AI Esp32-Cam OTA"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/xenpac/ESP32-CAM-with-LED-control"><div class="kg-bookmark-content"><div class="kg-bookmark-title">xenpac/ESP32-CAM-with-LED-control</div><div class="kg-bookmark-description">Camera Webserver ESP32-CAM ESP32-WROVER-B AI-THINKER Board with LED control - xenpac/ESP32-CAM-with-LED-control</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicon.ico" alt="Thinker-AI Esp32-Cam OTA"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">xenpac</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://avatars1.githubusercontent.com/u/28014826?s=400&amp;v=4" alt="Thinker-AI Esp32-Cam OTA"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/raphaelbs/esp32-cam-ai-thinker"><div class="kg-bookmark-content"><div class="kg-bookmark-title">raphaelbs/esp32-cam-ai-thinker</div><div class="kg-bookmark-description">Informations and examples about A.I. Thinker ESP32-CAM using ESP-IDF - raphaelbs/esp32-cam-ai-thinker</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicon.ico" alt="Thinker-AI Esp32-Cam OTA"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">raphaelbs</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://avatars3.githubusercontent.com/u/11169832?s=400&amp;v=4" alt="Thinker-AI Esp32-Cam OTA"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/easytarget/esp32-cam-webserver"><div class="kg-bookmark-content"><div class="kg-bookmark-title">easytarget/esp32-cam-webserver</div><div class="kg-bookmark-description">Expanded version of the Espressif ESP webcam. Contribute to easytarget/esp32-cam-webserver development by creating an account on GitHub.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicon.ico" alt="Thinker-AI Esp32-Cam OTA"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">easytarget</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://avatars0.githubusercontent.com/u/4005142?s=400&amp;v=4" alt="Thinker-AI Esp32-Cam OTA"></div></a></figure><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://randomnerdtutorials.com/esp32-cam-video-streaming-face-recognition-arduino-ide/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">ESP32-CAM Video Streaming and Face Recognition with Arduino IDE | Random Nerd Tutorials</div><div class="kg-bookmark-description">This article is a quick getting started guide for the ESP32-CAM board. We&#x2019;ll show you how to setup a video streaming web server with face recognition and detection in less than 5 minutes with Arduino IDE.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://i2.wp.com/randomnerdtutorials.com/wp-content/uploads/2018/03/n-favicon-2018.png?fit=16%2C16&amp;ssl=1" alt="Thinker-AI Esp32-Cam OTA"><span class="kg-bookmark-author">Random Nerd Tutorials</span><span class="kg-bookmark-publisher">CVBruce</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://i1.wp.com/randomnerdtutorials.com/wp-content/uploads/2019/03/ESP32-CAM-getting-started.jpg?fit=813%2C457&amp;ssl=1" alt="Thinker-AI Esp32-Cam OTA"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[Mysql On Raspberry Kubernetes]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="stepsofcreation">Steps of creation</h1>
<ol>
<li>Create Secrets:</li>
<li>Create Glusterfs</li>
<li>Creates Pv and PVC</li>
<li>Create Mysql.yaml file</li>
<li>Create mysql database, with user&apos;s permissions</li>
<li>Expose Service</li>
<li>Usefull links</li>
</ol>
<h1 id="1createsecrets">1. Create secrets</h1>
<p><a href="https://kubernetes.io/docs/concepts/configuration/secret/">https://kubernetes.io/docs/concepts/configuration/secret/</a></p>
<pre><code># Create files needed for rest of example.
$ echo -n &apos;admin&apos; &gt;</code></pre>]]></description><link>https://ghost.raveau.info/mysql-on-raspberry-kubernetes/</link><guid isPermaLink="false">5bfed534a459800001a89d0a</guid><pubDate>Tue, 12 Feb 2019 07:18:08 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="stepsofcreation">Steps of creation</h1>
<ol>
<li>Create Secrets:</li>
<li>Create Glusterfs</li>
<li>Creates Pv and PVC</li>
<li>Create Mysql.yaml file</li>
<li>Create mysql database, with user&apos;s permissions</li>
<li>Expose Service</li>
<li>Usefull links</li>
</ol>
<h1 id="1createsecrets">1. Create secrets</h1>
<p><a href="https://kubernetes.io/docs/concepts/configuration/secret/">https://kubernetes.io/docs/concepts/configuration/secret/</a></p>
<pre><code># Create files needed for rest of example.
$ echo -n &apos;admin&apos; &gt; ./username.txt
$ echo -n &apos;1f2d1e2e67df&apos; &gt; ./password.txt
kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret &quot;db-user-pass&quot; created

##Describe password
$ kubectl get secrets
$ kubectl describe secrets/db-user-pass
</code></pre>
<h1 id="2createglusterfs">2. Create Glusterfs</h1>
<p>...</p>
<h1 id="3createspvandpvc">3. Creates Pv and PVC</h1>
<p>...</p>
<h1 id="4createmysqlyamlfile">4. Create Mysql.yaml file</h1>
<p>First try with hypriot/rpi-mysql, with no success due to lack of privillege to access root@localhost, via mysql -u root -p. But after several try I realize that db files store in shared pvc, are corrupted, and I have to delete them in order to get a clean initialization.<br>
And it seems impossible to restart Mysql with --skip-grant-tables in a container, as I used in normal mysql instance.</p>
<pre><code>\#Not working in K8 mysql container:
sudo  service mysql stop
sudo /usr/bin/mysqld_safe --skip-grant-tables &amp;
</code></pre>
<p>So I tried the arm Docker image file of tobi312/rpi-mysql, with empty data reportory and I was able to connect to db, with:</p>
<pre><code>mysql -u root -p
GRANT ALL PRIVILEGES ON database_name.* TO &apos;username&apos;@&apos;localhost&apos;;
SHOW GRANTS FOR &apos;username&apos;@&apos;%&apos;;
</code></pre>
<h1 id="5createmysqldatabasewithuserspermissions">5. Create mysql database, with user&apos;s permissions</h1>
<pre><code>```mysq_setpermission```
</code></pre>
<h1 id="6exposeservice">6. Expose service</h1>
<p>I try first with a service declaration file .yaml, but with no success</p>
<pre><code>External-Ip seems, not to be linked with internal IP container
</code></pre>
<p>After that I try to expose directl with following command, with success:</p>
<pre><code>kc expose deploy mysql --name=mysql-svc --external-ip=192.168.1.30
</code></pre>
<h1 id="7usefulllinks">7. Usefull links</h1>
<ul>
<li><a href="https://www.debian-fr.xyz/viewtopic.php?t=210">How to initialize grant permisson on startup</a></li>
<li><a href="kubernetesbyexample.com">Kubernetes par l&apos;exemple</a></li>
<li><a href="http://www.linuxaddict.fr/index.php/2013/12/24/comment-regler-lerreur-dacces-de-debian-sys-maint-dans-mysql/">Doc qui peut &#xEA;tre int&#xE9;ressante sur l&apos;install par d&#xE9;faut d&apos;une debian</a></li>
<li><a href="https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/blob/master/wordpress-persistent-disks/mysql.yaml">kubernetes-engine-samples_mysql.yaml</a></li>
</ul>
<p>Notes: Using shared directory may corrupt all new instances, if files get some errors. In this case, solution is to delete all files, and restart from a brand new install..</p>
<p>Attention l&apos;utilisation d&apos;un r&#xE9;pertoire partag&#xE9; peut v&#xE9;roler toutes les nouvelles instances, si les fichiers contiennent des erreurs. Dans ce cas l&#xE0; il faut les effacer, pour repartir d&apos;une installation saine...</p>
<!--kg-card-end: markdown--><p></p>]]></content:encoded></item><item><title><![CDATA[Jeedom-Kubernetes-Raspi]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><strong>Objectif</strong><br>
D&#xE9;ployer une instance Jeedom sur Kubernetes/Raspberry, permettant les red&#xE9;marrages automatiques lors de plantage. Les donn&#xE9;es sont stock&#xE9;es via une instance MYSQL ind&#xE9;pendante dont les fichiers sont externalis&#xE9;s sur un serveur GlusterFS.</p>
<p>Les premiers tests n&apos;</p>]]></description><link>https://ghost.raveau.info/jeedom-kubernetes-raspi/</link><guid isPermaLink="false">5bfed534a459800001a89d09</guid><pubDate>Thu, 03 Jan 2019 21:58:19 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><strong>Objectif</strong><br>
D&#xE9;ployer une instance Jeedom sur Kubernetes/Raspberry, permettant les red&#xE9;marrages automatiques lors de plantage. Les donn&#xE9;es sont stock&#xE9;es via une instance MYSQL ind&#xE9;pendante dont les fichiers sont externalis&#xE9;s sur un serveur GlusterFS.</p>
<p>Les premiers tests n&apos;&#xE9;tant pas probants via Helm (pas comptatible avec raspberry pour le moment?), il a fallu, dans un premier temps trouver les images compatibles et op&#xE9;rationnelles sur ARM, en les testant directement dans des conteneurs Docker simples.</p>
<p><em><strong>Jeedom for arm32v7</strong></em><br>
Si l&apos;installation de Jeedom sur une raspbian ou Hypriot parait chose courante, cela n&apos;est plus le cas pour une utilisation Kubernetes les sources d&apos;informations &#xE9;tant beaucoup plus rares...</p>
<p><strong><strong>Install</strong></strong><br>
La solution que j&apos;ai r&#xE9;ussi &#xE0; faire tourner provient du projet<br>
<a href="https://github.com/CodaFog/jeedom-rpi">jeedom-rpi</a>.<br>
ce projet utilise un containeur MySQl &#xE0; part qu&apos;il faut lier &#xE0; l&apos;ex&#xE9;cution.</p>
<pre><code>docker run --name jeedom --link jeedom-mysql:mysql --privileged -v /home/pi/jeedom/data:/var/www/html -e ROOT_PASSWORD=jeedom -p 9080:80 -p 9022:22 -d codafog/jeedom-rpi
</code></pre>
<p>Pour exposer Mosquitto (serveur MQTT)</p>
<pre><code>docker run --name jeedom --link jeedom-mysql:mysql --privileged -v /home/pi/jeedom/data:/var/www/html -e ROOT_PASSWORD=jeedom -p 9080:80 -p 9022:22 -p 1883:1883 -d codafog/jeedom-rpi
</code></pre>
<p><strong>MySql</strong><br>
Diff&#xE9;rentes solutions de bases de donn&#xE9;es sont possibles. J&apos;ai choisi de partir sur une base de donn&#xE9;es contenue dans un autre conteneur.<br>
Pour plus d&apos;information sur l&apos;installation de MySQL dans K8, voir <a href="http://">l&apos;article sur ce sujet: &quot;Mysql On Raspberry Kubernetes&quot;</a>.</p>
<p><em><strong>Connexion base de donn&#xE9;es &quot;externe&quot;</strong></em><br>
Pour plus de r&#xE9;siliance, il faut externaliser le fichier de configuration et le mapper dans le fichier de d&#xE9;ploiement Jeedom, pour obtenir une version op&#xE9;rationnelle lors d&apos;un red&#xE9;marrage post-crash du conteneur Jeedom, sans devoir passer par une nouvelle phase de &quot;setup&quot;.</p>
<pre><code>root@24af79140b62:~# cat /var/www/html/core/config/common.config.php
&lt;?php
/* * ********************* Debug **************** */
define(&apos;DEBUG&apos;, 0);
/* * *********************** MySQL &amp; Memcached ******************* */
global $CONFIG;
$CONFIG = array(
	//MySQL parametres
	&apos;db&apos; =&gt; array(
		&apos;host&apos; =&gt; &apos;K8MasterServerDNSName&apos;,
		&apos;port&apos; =&gt; &apos;3306&apos;,
		&apos;dbname&apos; =&gt; &apos;jeedom&apos;,
		&apos;username&apos; =&gt; &apos;jeedom_username&apos;,
		&apos;password&apos; =&gt; &apos;jeedom_password&apos;,
	),
);
</code></pre>
<p><strong><strong>Mot de passe admin</strong></strong><br>
<a href="https://jeedom.github.io/documentation/howto/fr_FR/reset.password">Reset admin password</a><br>
Dans MySQl, modifier le mot de passe pour l&apos;utilisateur adminTmp, cr&#xE9;&#xE9; pour l&apos;occasion:<br>
<code>REPLACE INTO user SET `login`=&apos;adminTmp&apos;,password=&apos;c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec&apos;,profils=&apos;admin&apos;, enable=&apos;1&apos;;</code></p>
<p><em><strong><strong>JMQTT (MQTT)</strong></strong></em><br>
Suite &#xE0; plusieurs tests infructueux avec MQTT, j&apos;utilise JMQTT qui semble convenir d&apos;avantage.</p>
<p>L&apos;image Jeedom utilis&#xE9;e ne poss&#xE8;de pas initialement les plugins et d&#xE9;pendances n&#xE9;cessaires &#xE0; MQTT (JMQTT), qui doivent &#xEA;tre r&#xE9;install&#xE9;s. Or lors d&apos;une premi&#xE8;re tentative d&apos;install des d&#xE9;pendances JMQTT, le script plante (cf. log JMQTT-dep), il faut donc installer make:</p>
<pre><code>sudo apt-get install make
</code></pre>
<p>Il peut &#xEA;tre judicieux de r&#xE9;aliser au pr&#xE9;alable un update et upgrade des librairies.</p>
<p>Ceci peut &#xEA;tre suffisant pour relancer une installation des d&#xE9;pendances via la page de config du plugin une fois install&#xE9; par la console Web.</p>
<p>Pour ces premiers tests on utilise un serveur Mosquitto distant qu&apos;il faut &#xE9;galement configurer, en indiquant le serveur ad&#xE9;aquate de la partie host, en ayant pr&#xE9;alablement d&#xE9;coch&#xE9; la case &quot;installation locale&quot;.</p>
<p>Tout ces param&#xE9;trages font que l&apos;image de base ne peut fonctionner automatiquement apr&#xE8;s un red&#xE9;marrage post-crash k8. Il faut donc trouver un moyen pour conserver tout ces param&#xE9;trages en relan&#xE7;ant un script de reconfiguration, ou bien en sauvegardant une image pleinement configur&#xE9;e...</p>
<p>Trouver la meilleure solution...<br>
On peut notamment installer les librairies Mosquitto en utilisant par la m&#xE9;thode pr&#xE9;sent&#xE9;e ci-dessous. Tout n&apos;est cependant pas forc&#xE9;ment n&#xE9;cessaire, notamment la relance d&apos;Apache qui semble fonctionner sans (&#xE0; v&#xE9;rifier).<br>
L&apos;id&#xE9;al serait de partir d&apos;une image Docker contenant d&#xE9;j&#xE0; l&apos;ensemble des plugins param&#xE9;tr&#xE9;s... (r&#xE9;aliser une telle image).</p>
<p><em><strong><strong>Compl&#xE9;ment Mosquito (v&#xE9;rifier si cela est n&#xE9;cessaire)</strong></strong></em></p>
<p>*Si cette image semble fonctionner correctement dans Docker, il n&apos;en va pas de m&#xEA;me pour Mosquitto et MQTT lors d&apos;une migration dans Kubernetes. Une solution alternative aux explications ci-dessous, consiste &#xE0; tiliser le plugin JMQTT plut&#xF4;t que celui de MQTT, et de d&#xE9;ployer un serveur Mosquitto ind&#xE9;pendant.<br>
*<br>
Avant d&apos;effectuer les modifs ci-dessous faire un essai avec l&apos;exposition du port mosquitto au lancement de l&apos;image Docker...<br>
Rmq: L&apos;exposition du port 1883 n&apos;est pas suffisante, car lc configuration du serveur Jeedom n&apos;est pas compl&#xE8;te pour ce qui est du serveur Mosquitto (MQTT) pr&#xE9;sent dans le container. De plus un bug semble emp&#xEA;cher l&apos;installation automatique par le Dashboard Web Jeedom. LA solution semble passer par son installation manuelle:<br>
<a href="https://lunarok.github.io/jeedom_docs/plugins/mqtt/">MQQT Lunarok</a><br>
<a href="https://jeedom.com/doc_old/documentation/plugins/MQTT/fr_FR/MQTT#_troubleshoting">MQTT#_troubleshoting</a><br>
<a href="https://stackoverflow.com/questions/26716279/how-to-test-the-mosquitto-server">how-to-test-the-mosquitto-server</a></p>
<pre><code>    1  apt-get update
    2  apt-get upgrade
    3  sudo apt-get install mosquitto mosquitto-clients libmosquitto-dev
    4  sudo apt-get install make
    5  sudo pecl install Mosquitto-alpha
    6  /etc/init.d/apache2 restart
    7  /etc/init.d/mosquitto status
    8  /etc/init.d/mosquitto start
</code></pre>
<p>Si pecl n&apos;est pas install&#xE9;:</p>
<pre><code>sudo apt-get update
sudo apt-get install php-pear php5-dev
sudo apt-get install libcurl3-openssl-dev
</code></pre>
<p>Ainsi la page d&apos;admin de MQTT dans Jeedom semble op&#xE9;rationnelle suite &#xE0; D&#xE9;marage du d&#xE9;mon sur cette m&#xEA;me page.<br>
Rmq: Suite au montage du r&#xE9;pertoire /var/www/html sur une partition GlusterFs, seules les &#xE9;tapes de 1 &#xE0; 4 ont &#xE9;t&#xE9; suffisantes pour relancer l&apos;installation des d&#xE9;pendances JMQTT, dans l&apos;administration du plugin Jeedom. A voir, si on peut r&#xE9;duire la liste...<br>
Suite &#xE0; un nouveau crash du serveur, et le lancement des &#xE9;tapes 1 &#xE0; 4, le d&#xE9;marrage du d&#xE9;mon  JMQTT (Mosquitto j&apos;imagine), tourne en boucle. Ce n&apos;est seulement qu&apos;&#xE0;pr&#xE8;s avoir relancer l&apos;installation des d&#xE9;pendances par la page d&apos;admin, que le d&#xE9;marrage peut se lancer sans probl&#xE8;me. V&#xE9;rifier, lors d&apos;un crash suivant si cette op&#xE9;ration n&apos;est pas suffisante (sans lancer les &#xE9;tapes 1 &#xE0; 4)</p>
<p>A terme il serait bien de cr&#xE9;er un script sur la nouvelle install et automatiser son lancement en cas de crash relance...</p>
<p>Mosquito.so est pr&#xE9;sent en fin de fichier php.ini</p>
<pre><code>...
; Local Variables:
; tab-width: 4
; End:
extension=mosquitto.so
</code></pre>
<p>Si Mosquitto n&apos;est pas d&#xE9;marr&#xE9; par d&#xE9;faut dans le conteneur, il faut configurer son instance.</p>
<pre><code>kc exec -ti jeedom-xxxxxxx-xxxx /bin/bash
/etc/init.d/mosquitto start
</code></pre>
<p>Personnaliser au pr&#xE9;alable, notamment les mots de passe, la persistence des donn&#xE9;es (cf pv et pvc), ports...</p>
<pre><code># Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

</code></pre>
<p><strong><strong>Liens</strong></strong></p>
<ul>
<li>
<p><em><strong><strong>Exemple multi containers</strong></strong></em><br>
<a href="https://sys-advisor.com/2015/09/04/tuto-jeedom-installation-dans-docker-sur-debian/">tuto-jeedom-installation-dans-docker-sur-debian</a></p>
</li>
<li>
<p><em><strong><strong>Autre solution <a href="https://github.com/icidel/docker-jeedom">GitHub - icidel_docker-jeedom: Jeedom in a docker container (for ARMv7 with hard float processor)</a></strong></strong></em><br>
Un fois t&#xE9;l&#xE9;charg&#xE9;e et d&#xE9;compress&#xE9;e, il faut &quot;builder&quot; l&apos;image:<br>
<code>docker build .</code></p>
</li>
<li>
<p><a href="https://hub.docker.com/r/cquad/jeedom/">cquad/jeedom/</a></p>
</li>
</ul>
<p><strong>Liens</strong><br>
<a href="https://www.pinterest.fr/pin/375206212692592965/">Pin interest &amp; Jeedom on Raspberry </a></p>
<p><a href="https://domopi.eu/surveillance-video-complement-domotique-jeedom/">Jeedom &amp; cam&#xE9;ra de surveillance 1</a><br>
<a href="https://www.habitat-domotique.fr/2018/05/24/jeedom-et-camera-ip-diy/">Jeedom &amp; cam&#xE9;ra de surveillance 2</a><br>
<a href="https://arno0x0x.wordpress.com/2018/05/31/jeedom-cameras-ip/">Jeedom &amp; cam&#xE9;ra sans le plugin</a><br>
<a href="http://esp32.net/">Doc sur l&apos;esp32</a></p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="compilationduneversioncomplte">Compilation d&apos;une version compl&#xE8;te</h3>
<p>ojectif: cr&#xE9;er une image de Jeedom la plus compl&#xE8;te possible, qui soit op&#xE9;rationnelle imm&#xE9;diatement en cas de crash/relance du serveur Kubernetes.</p>
<p>L&apos;instance du conteneur Jeedom utilise d&#xE9;j&#xE0; des r&#xE9;pertoires ainsi qu&apos;une instance MySql ext&#xE9;rieures, ce qui permet de conserver l&apos;ensemble des modifications, notamment l&apos;installation des plugins.</p>
<p>Ce qui est attendu par cette cr&#xE9;ation d&apos;une nouvelle image docker Jeedom:<br>
* le fait d&apos;utiliser un syst&#xE8;me stable (la version utilis&#xE9;e par codafog/jeedom-rpi ne permettant pas d&apos;apt-get update).<br>
* le fait d&apos;int&#xE9;grer l&apos;ensemble des installations de libriaries n&#xE9;cessaires au bon fonctionnement des plugins (JMQTT notamment).</p>
<p>Voir si je n&apos;ai pas comment&#xE9; par ailleurs cette description technique, et l&apos;exposer en d&#xE9;tail ici.<br>
Voir si je ne peux pas &#xE9;galement inscrire une mise &#xE0; jour des d&#xE9;pendances JMQTT au d&#xE9;marrage de l&apos;instance.</p>
<!--kg-card-end: markdown--><p>Lien vers le repo docker pour l&apos;image compil&#xE9;e:</p><p><a href="https://hub.docker.com/r/jjlavaza/jeedom">https://hub.docker.com/r/jjlavaza/jeedom</a></p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/jjlavaza/rpi-jeedom"><div class="kg-bookmark-content"><div class="kg-bookmark-title">jjlavaza/rpi-jeedom</div><div class="kg-bookmark-description">jeedom dockerfile for armv7 with mosquitto client on php7 - jjlavaza/rpi-jeedom</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicon.ico"><span class="kg-bookmark-author">jjlavaza</span><span class="kg-bookmark-publisher">GitHub</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://avatars1.githubusercontent.com/u/7627224?s=400&amp;v=4"></div></a></figure>]]></content:encoded></item><item><title><![CDATA[k8, migrate Gogs from Docker to K8]]></title><description><![CDATA[<p>I&apos;ve just move Gogs from Docker to K8, It was pretty easy with some issues to migrate repository to a GlusterFs directory...</p><p>My steps:</p><ol><li>Create volume in GlusterFs, with the persistent volume and volume claim to use in the k8-Gogs container:</li><li>Create and launch yml file for deploy,</li></ol>]]></description><link>https://ghost.raveau.info/k8-migrate-gogs-from-docker-to-k8/</link><guid isPermaLink="false">5c0233a4a459800001a89d3b</guid><pubDate>Sun, 02 Dec 2018 08:42:24 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;ve just move Gogs from Docker to K8, It was pretty easy with some issues to migrate repository to a GlusterFs directory...</p><p>My steps:</p><ol><li>Create volume in GlusterFs, with the persistent volume and volume claim to use in the k8-Gogs container:</li><li>Create and launch yml file for deploy, service and Ing</li><li>Connection to http://gogs_url and configure access on install page</li><li>This install fresh database schema</li><li>This schema is not the same of my origin gogs (older). So I&apos;ve to adapt schema and data before export-import</li></ol><p>On origin schema I add target columns for timestamp</p><!--kg-card-begin: markdown--><blockquote>
<p>ALTER TABLE <code>gogs</code>.<code>repository</code><br>
ADD COLUMN <code>created_unix</code> BIGINT(20) NULL AFTER <code>updated</code>;<br>
ALTER TABLE <code>gogs</code>.<code>repository</code><br>
ADD COLUMN <code>updated_unix</code> BIGINT(20) NULL AFTER <code>created_unix</code>;</p>
</blockquote>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><blockquote>
<p>update <code>gogs</code>.<code>repository</code><br>
set <code>created_unix</code> = UNIX_TIMESTAMP(created) where id &lt; 10000<br>
update <code>gogs</code>.<code>repository</code><br>
set <code>updated_unix</code> = UNIX_TIMESTAMP(updated) where id &lt; 10000</p>
</blockquote>
<!--kg-card-end: markdown--><p>On target schema I add older columns, just used during import that I&apos;ll destroy after.</p><p>&gt;ALTER TABLE <code>gogs</code>.<code>repository</code><br>ADD COLUMN <code>created</code> DATETIME NULL AFTER <code>updated_unix</code>,<br>ADD COLUMN <code>updated</code> DATETIME NULL AFTER <code>created</code>;</p><p>I export data with full name column, that I import in new schema</p><!--kg-card-begin: markdown--><p>ALTER TABLE <code>gogs</code>.<code>repository</code><br>
DROP COLUMN <code>updated</code>,<br>
DROP COLUMN <code>created</code>;</p>
<!--kg-card-end: markdown--><p>idem for action table</p><p>Copy the git repository from source to the destination per user (GlusterFs) in git/gogs-repositories/.</p><p>After migrating repository on new server, we encountered some error during pushing new commit. We have to resync ssh keys in admin panel:</p><p><a href="https://github.com/gogs/gogs/issues/1916">https://github.com/gogs/gogs/issues/1916</a></p><figure class="kg-card kg-image-card"><img src="/content/images/2018/12/gogs_migrating_issue1.png" class="kg-image"></figure><p>And voil&#xE0;, all should be Ok. :-)</p>]]></content:encoded></item><item><title><![CDATA[Raspberry Zéro & Camera (part 1)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Pi Zero avec Cam&#xE9;ra, centrale de gestion domotique: t&#xE9;l&#xE9;surveillance.<br>
Premier essai avec motionPi, plut&#xF4;t simple &#xE0; utiliser mais je vois tout de suite les limites; &#xE0; la premiere connexion ma cam&#xE9;ra n&apos;est pas d&#xE9;tect&#xE9;e</p>]]></description><link>https://ghost.raveau.info/raspberry-zero-camera/</link><guid isPermaLink="false">5bfed534a459800001a89cfe</guid><pubDate>Fri, 29 Dec 2017 07:07:44 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Pi Zero avec Cam&#xE9;ra, centrale de gestion domotique: t&#xE9;l&#xE9;surveillance.<br>
Premier essai avec motionPi, plut&#xF4;t simple &#xE0; utiliser mais je vois tout de suite les limites; &#xE0; la premiere connexion ma cam&#xE9;ra n&apos;est pas d&#xE9;tect&#xE9;e automatiquement. J&apos;essaie de me connecter en SSH, et mes premi&#xE8;res lectures indiquent qu&apos;ils ne sera pas possible de mettre &#xE0; jour les paquets install&#xE9;s,...<br>
Du coup, je bascule tout de suite sur une Raspbian sur laquelle je vais installer MotioEye, qui semble &#xEA;tre une bonne alternative pour ajouter des fonctionnalit&#xE9;s &#xE0; la t&#xE9;l&#xE9;surveillance.</p>
<p>(Tuto Motion Eye)[<a href="http://www.epingle.info/?p=3466">http://www.epingle.info/?p=3466</a>]</p>
<p><strong>MotionEye</strong>:<br>
(doc Install officielle)[<a href="https://github.com/ccrisan/motioneye/wiki/Install-On-Raspbian">https://github.com/ccrisan/motioneye/wiki/Install-On-Raspbian</a>]<br>
(Autre doc)[<a href="https://lairbag.wordpress.com/2015/07/07/raspberry-pi-et-video-surveillance-installation-de-motioneye/">https://lairbag.wordpress.com/2015/07/07/raspberry-pi-et-video-surveillance-installation-de-motioneye/</a>]<br>
(et une autre)[<a href="https://anderson69s.com/2014/06/28/raspberry-pi-picam-camera-de-securite/">https://anderson69s.com/2014/06/28/raspberry-pi-picam-camera-de-securite/</a>]</p>
<p><code>modprove v4l2 sudo modprobe bcm2835-v4l2</code><br>
Voir doc. sur (stackoverflow)[<a href="https://raspberrypi.stackexchange.com/questions/28943/why-raspberry-pi-camera-no-device-found-in-cheese-or-iceweasel">https://raspberrypi.stackexchange.com/questions/28943/why-raspberry-pi-camera-no-device-found-in-cheese-or-iceweasel</a>]</p>
<p><strong>Materiel</strong>: <a href="http://www.raspberry-camera.com/fr/">http://www.raspberry-camera.com/fr/</a></p>
<p><strong>Raspbian</strong>: configuration raspberry Pi Zero Headless, Wifi &amp; ssh<br>
Solution, positionner un fichier nomm&#xE9; ssh &#xE0; la racine du /boot/ et ajouter une configuration dans</p>
<p><code>sudo nano /etc/wpa_supplicant/wpa_supplicant.conf</code></p>
<p>and add at the end of the file the informations about your wifi network:</p>
<p><code>network={     ssid=&quot;your-network-ssid-name&quot;     psk=&quot;your-network-password&quot; }</code></p>
<p>Et voil&#xE0; cela permet dobtenir une premi&#xE8;re solution de surveillance, via MotioPi et son interface de monitoring, tr&#xE8;s compl&#xE8;te.<br>
On peut ainsi, configurer une quantit&#xE9; importante de param&#xE8;tres (alertes, stockages des captures...).</p>
<p><strong>Notifications</strong><br>
Probl&#xE8;me sur le SMTP Orange: l&apos;envoi de mail ne fonctionne pas sur le port par d&#xE9;faut (465)!; Il faut employer le 587,  sur smtp.orange.fr.<br>
<a href="https://github.com/ccrisan/motioneye/issues/603">Impossible to send mails notifications &#xB7; Issue #603 &#xB7; ccrisan_motioneye &#xB7; GitHub</a></p>
<p><strong>Exposition des webservices</strong>:<br>
La prochaine &#xE9;tape: ins&#xE9;rer ce syst&#xE8;me dans une gestion centraliser.<br>
Le plus simple, dans un premier temps, sera d&apos;exposer les webservices directement sur le r&#xE9;seau local, pour monter un prototype et v&#xE9;rifier des hypoth&#xE8;ses.<br>
Pour cela on peut exposer simplement des webservices Python en utilisant les fonctionnalit&#xE9;s int&#xE9;gr&#xE9;es dans Python de base.<br>
Une mise &#xE0; jour vers la version 3 est n&#xE9;cessaire:<br>
<code>sudo apt-get install python3</code></p>
<p>Mais cela fera l&apos;objet d&apos;un prochain billet...</p>
<p><strong>IA de reconnaissance</strong><br>
Afin de rendre la d&#xE9;tection plus intelligente, une proposition d&apos;&#xE9;volution, est l&apos;utilisation de l&apos;IA pour reconnaitre certains &#xE9;v&#xE8;nements. Cela peut &#xEA;tre une piste int&#xE9;ressante.<br>
<a href="https://github.com/ccrisan/motioneye/issues/778">Integrate with free machine learning based image analysis to reduce false positives #778</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[ESP8266 & MFRC522]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h5 id="dyiesp8266rfidministationmto">DYI ESP8266, RFID + mini station m&#xE9;t&#xE9;o</h5>
<h6 id="monprojetlecteurdecarterfidmfrc522ministationmtotempratureethumiditsurunmoduleesp8266esp8266d1mininodemcu">Mon projet: lecteur de carte RFID (MFRC522) + mini station m&#xE9;t&#xE9;o (temp&#xE9;rature et humidit&#xE9;), sur un module ESP8266 (ESP8266 D1 Mini NodeMcu).</h6>
<p><a href="https://openhomeautomation.net/choose-esp8266-module/">Plusieurs possibilit&#xE9;s de choix de module ESP8266</a>. Dans les mod&</p>]]></description><link>https://ghost.raveau.info/esp8266-mfrc522/</link><guid isPermaLink="false">5bfed534a459800001a89cfd</guid><pubDate>Sat, 18 Nov 2017 10:33:08 GMT</pubDate><media:content url="https://ghost.raveau.info/content/images/2017/11/20171022_231656.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h5 id="dyiesp8266rfidministationmto">DYI ESP8266, RFID + mini station m&#xE9;t&#xE9;o</h5>
<h6 id="monprojetlecteurdecarterfidmfrc522ministationmtotempratureethumiditsurunmoduleesp8266esp8266d1mininodemcu">Mon projet: lecteur de carte RFID (MFRC522) + mini station m&#xE9;t&#xE9;o (temp&#xE9;rature et humidit&#xE9;), sur un module ESP8266 (ESP8266 D1 Mini NodeMcu).</h6>
<img src="https://ghost.raveau.info/content/images/2017/11/20171022_231656.jpg" alt="ESP8266 &amp; MFRC522"><p><a href="https://openhomeautomation.net/choose-esp8266-module/">Plusieurs possibilit&#xE9;s de choix de module ESP8266</a>. Dans les mod&#xE8;les les plus r&#xE9;cents on peut &#xE9;galement opter pour un ESP32 une &#xE9;volution des premiers ESP.</p>
<p>Fonctionnalit&#xE9;s suppl&#xE9;mentaires:</p>
<ul>
<li>Utiliser un module DHT11 de mesure de temp&#xE9;rature et d&apos;humidit&#xE9;. A intervalle r&#xE9;gulier l&apos;<a href="https://wiki.wemos.cc/products:d1:d1_mini">ESP8266</a> sort de son hibernatiopn (deesleep), pour mesurer et envoyer la temp&#xE9;rature par appel de webservice.</li>
<li>Mesure du Voltage &#xE0; la sortie de la batterie, en utilisant un diviseur de pont afin de mesurer une tension sup&#xE9;rieure, &#xE0; la tension maximale mesurable en entr&#xE9;e des GPIO analogique A0. <a href="https://projetsdiy.fr/mesurer-tension-alimentation-batterie-esp8266-arduino/">Mesurer la tension d&apos;une batterie ou pile (Arduino, ESP8266)</a></li>
<li>Ajout d&apos;un panneau solaire pour recharge</li>
</ul>
<h5 id="montage">Montage</h5>
<p>//TODO ajouter un sch&#xE9;ma du montage</p>
<h6 id="descriptiondumontage">Description du montage</h6>
<ol>
<li>DHT11, ajout de pullup qui permet de maintenir le module dans un &#xE9;tat &#xE0; faible consommation, celui-ci &#xE9;tant activ&#xE9; par une s&#xE9;quence &#xE0; l&apos;&#xE9;tat bas <a href="http://store.ardwtech.com/index.php?id_product=35&amp;controller=product">Explication compl&#xE8;te DHT11</a>. Pour plus de pr&#xE9;cision on pourra utiliser un DHT22, un peu plus on&#xE9;reux. Le composant consomme 0,5mA et 2,5mA pour les modes respectifs de veille et prise de mesure.</li>
</ol>
<h5 id="programmation">Programmation</h5>
<ol>
<li>
<p>Mise &#xE0; jour Arduino IDE, afin de prende en compte l&apos;ESP8266.<br>
Pour cela il faut charger les biblioth&#xE8;ques:<br>
<a href="https://projetsdiy.fr/esp-easy-esp8266-wemos-d1-mini-mqtt/#.WU52sjekInW">explication du montage</a></p>
</li>
<li>
<p>Installer et mettre &#xE0; jour la biblioth&#xE8;que MFRC522, directement depuis les menus de l&apos;IDE Arduino. Cela m&apos;a permis de r&#xE9;soudre une erreur d&apos;initialisation de la carte (Firmware 0xDE non reconnu).</p>
</li>
</ol>
<p><a href="https://www.gotronic.fr/pj2-sbc-rfid-rc522-fr-1439.pdf">Doc. utile MFRC522</a></p>
<p>Pour la prog via Arduino ide,<br>
<img src="http://" alt="ESP8266 &amp; MFRC522"></p>
<p>Pour moi, suite &#xE0; la lecture de plusieurs documentations, je suis tomb&#xE9; sur la configuration suivante, pour</p>
<p>Code utilis&#xE9; :</p>
<p>Configuration des PIN</p>
<p>Mode d&apos;interruption &#xE0; configurer afin de limiter la consommation de l&apos;engin. Id&#xE9;alement, le passage de la carte sur le lecteur r&#xE9;veil, le module et l&apos;ESP8266.</p>
<p>Un compl&#xE9;ment du montage est de communiquer le num&#xE9;ro de la carte &#xE0; un webservice distant, pour activer une action (inscription dans une log, ouverture d&apos;une porte, d&#xE9;sactiver une alarme). Cette communication est possible par le module Wifi int&#xE9;gr&#xE9; dans l&apos;ESP8266.<br>
Cela lui permet de se comporter en serveur par l&apos;exposition d&apos;un point d&apos;acc&#xE8;s, ou bien en client en se connectant &#xE0; un r&#xE9;seau Wifi.</p>
<h6 id="modedeepsleep">Mode DeepSleep</h6>
<blockquote>
<p>Double sortie de du deepSleep, soit par bouton, soit par timer. Pour cela le Pin Reset doit &#xEA;tre connect&#xE9; au PIN 16 (v&#xE9;rifier le num&#xE9;ro), et au bouton effectuant le passage au mode Low.</p>
</blockquote>
<blockquote>
<p>Une led indique le mode activation en cours.<br>
ETeint: mode DeepSleep, alum&#xE9; =&gt; mode en attente de badgeage, et clignotant, en cours de d&#xE9;marrage.<br>
Pb en mode deepSleep l&apos;esp8266, repasse les PIN dans un &#xE9;tat interm&#xE9;diaire, ie., allum&#xE9; faiblement. Pour r&#xE9;duire la consommation ajout de deux r&#xE9;sistances, le moins de la led avec  une valeur de 27Kohms, et le pull-down de 2,7k ohms.<br>
Rem&#xE8;de: En fait pour &#xE9;viter ce probl&#xE8;me il suffit de brancher la led &#xE0; un pin b&#xE9;n&#xE9;ficiant d&apos;un mode pull-down sur l&apos;ESP8266, com&apos; par exemple le pin D8 (cf, <a href="https://wiki.wemos.cc/products:d1:d1_mini">Doc du mini Wemos </a></p>
</blockquote>
<h6 id="questionsencours">Questions en cours</h6>
<ul>
<li>Comment mesurer l&apos;amp&#xE9;rage consomm&#xE9; en mode &quot;deeSleep&quot;, sachant que les composants &quot;RDC&quot;, ont une marge d&apos;erreur d&apos;environ 13mA, alors que je souhaite mesurer des microAmp? Plusieurs tentatives infructueuse avec mon amp&#xE8;rem&#xE9;tre.</li>
<li>Pourquoi la mesure de la tension de la batterie me retourne une valeur en dessous de celle mesur&#xE9;e directement aux bornes de la batterie, ou lorsque l&apos;esp est aliment&#xE9; par USB 5V. 3,8V au lieu de 4,1V r&#xE9;el? Cela est-il du &#xE0; une chute de tension lors de la prise de mesure, ou des r&#xE9;sistances mal choisies pour le pont diviseur de tension (1K Ohms actuellement). Plusieurs valeurs sup&#xE9;rieurs de resistance semblaient encore plus p&#xE9;nalisantes, malgr&#xE8;s les conseils lus dans le forum de la doc du diviseur de tension en r&#xE9;f&#xE9;rence dans ce billet.</li>
<li>Comment utiliser des leds sur des ports GPIO sans qu&apos;ils soient alum&#xE9;s en mode deepSleep. Lors des 1er tests, ils semblerait que les ports reviennent dans un &#xE9;tat interm&#xE9;diaire =&gt; les faiblement aliment&#xE9;es.<br>
<strong>-&gt; Solution: utiliser un port ayant un &#xE9;tat d&#xE9;fini, en Pull-down. Voir les specs. de l&apos;esp utilis&#xE9;</strong></li>
<li>Comment calculer les r&#xE9;sistances &#xE0; utiliser avec le bouton de reset. Ce dernier permettant de sortir de l&apos;&#xE9;tat deepSleep, pour badger par exemple.</li>
</ul>
<h6 id="amliorationsprvoir">Am&#xE9;liorations &#xE0; pr&#xE9;voir</h6>
<p>De plus afin de rendre le module ind&#xE9;pendant, et permettre par exemple la cr&#xE9;ation d&apos;un boitier externe non connect&#xE9; &#xE0; un r&#xE9;seau &#xE9;lectrique, il faut penser &#xE0; diff&#xE9;rents points:</p>
<ul>
<li>Voir si un r&#xE9;gulateur &#xE0; d&#xE9;coupage DC-DC serait plus optimal pour le montage, sachant que le type de r&#xE9;gulateur que j&apos;utilise peut n&#xE9;cessiter une diff&#xE9;rence de potentiel non n&#xE9;gligeable (ie au moins 1v volt de diff entre in et out pour fonctionner), et semble suivant la oc en lien moins performante que la DC-DC (&gt;95% d&apos;efficacit&#xE9;), la diff&#xE9;rence de tension &#xE9;tant transform&#xE9;e en chaleur et donc perdue.</li>
<li>Boitier final &#xE9;tanche, et permettant d&apos;avoir un bouton souple pour la sortie du mode deepsleep, un port de connexion pour mettre &#xE0; jour le soft et recharger si n&#xE9;cessaire</li>
<li>Plusieurs points de connexion Wifi en cas de panne de l&apos;un d&apos;eux</li>
<li>Crypter les &#xE9;changes avec le serveur notamment pour les codes RFID, et voir m&#xEA;me pour les id de connexions Wifi.</li>
<li>Meilleure gestion des Led et/ou bip sonore pour indiquer le mode de connexion.</li>
<li>permettre le d&#xE9;clenchement du module raspberry en enregistrant les messages de lecture RFID dans une file de message.</li>
</ul>
<h3 id="domotique">Domotique</h3>
<h4 id="boitierexternelecteurrfidstationmto">Boitier externe, lecteur RFID &amp; station m&#xE9;t&#xE9;o</h4>
<p><a href="https://www.hackster.io/Tiobel/esp32-solar-weather-station-bf9c23">ESP32 Solar Weather Station</a></p>
<h6 id="liens">Liens</h6>
<ul>
<li><a href="http://www.kerrywong.com/2013/01/17/current-adapter-for-low-current-measurement-using-ts1001/">Current-adapter-for-low-current-measurement-using-ts1001</a></li>
<li><a href="https://wiki.mchobby.be/index.php?title=Regulateur-DC-DC">Comparateur r&#xE9;gulateurs de tension</a></li>
<li><a href="https://wiki.mchobby.be/index.php?title=Regulateur-DC-DC-Reg">Regulateur-DC-DC-Reg</a></li>
<li><a href="https://github.com/miguelbalboa/rfid">Librairie utilis&#xE9;e g&#xE9;n&#xE9;ralement: Miguel Balboa</a></li>
<li><a href="http://www.instructables.com/id/WiFi-RFID-Reader/">Bonne explication ESP2866 - MFRC522</a></li>
<li>[Framework Flask](<a href="http://flask.pocoo.org/(http://www.instructables.com/id/WiFi-RFID-Reader/)">http://flask.pocoo.org/(http://www.instructables.com/id/WiFi-RFID-Reader/)</a></li>
<li><a href="https://www.gotronic.fr/pj2-sbc-rfid-rc522-fr-1439.pdf">Installation Go Tronic</a></li>
<li><a href="https://www.djangoproject.com/">Framework Django</a></li>
<li><a href="https://www.reddit.com/r/esp8266/comments/4gj2hx/how_to_run_your_esp8266_for_years_on_a_battery/">How to Run Your ESP8266 for Years on a Battery</a><br>
<a href="http://www.esp8266.com/viewtopic.php?f=13&amp;t=5716">Cr&#xE9;er un bouton reset Esp8266</a></li>
</ul>
<h4 id="documentationmateriel">Documentation materiel</h4>
<ul>
<li><a href="https://dlnmh9ip6v2uc.cloudfront.net/datasheets/Prototyping/TP4056.pdf">R&#xE9;gulateur de charge &quot;solaire&quot;/d&#xE9;charge batterie</a></li>
<li><a href="https://www.olimex.com/Products/Breadboarding/BB-PWR-3608/resources/MT3608.pdf">MT3608 DC DC Step Up Power Appliquer Module Booster Power</a></li>
<li><a href="https://www.sparkfun.com/datasheets/Components/LD1117V33.pdf">R&#xE9;gulateur de tension 3V3</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Docker: Commandes utiles]]></title><description><![CDATA[<!--kg-card-begin: markdown--><ul>
<li>
<p>Changer le r&#xE9;pertoire de stockage de Docker:<br>
<a href="https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169">https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169</a></p>
</li>
<li>
<p>Construire une image &#xE0; partir d&apos;un Dockerfile<br>
<code>$ docker build -t test/cowsay-dockerfile .</code></p>
</li>
<li>
<p>Cr&#xE9;er une instance de container &#xE0; partir d&apos;une image:<br>
<code>$ docker run test/cowsay-dockerfile &quot;Moo&quot;</code></p></li></ul>]]></description><link>https://ghost.raveau.info/docker-commandes-utiles/</link><guid isPermaLink="false">5bfed534a459800001a89cf6</guid><pubDate>Fri, 04 Nov 2016 23:24:05 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><ul>
<li>
<p>Changer le r&#xE9;pertoire de stockage de Docker:<br>
<a href="https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169">https://forums.docker.com/t/how-do-i-change-the-docker-image-installation-directory/1169</a></p>
</li>
<li>
<p>Construire une image &#xE0; partir d&apos;un Dockerfile<br>
<code>$ docker build -t test/cowsay-dockerfile .</code></p>
</li>
<li>
<p>Cr&#xE9;er une instance de container &#xE0; partir d&apos;une image:<br>
<code>$ docker run test/cowsay-dockerfile &quot;Moo&quot;</code><br>
<code>$ docker run --name oc -p 80:80 -p 443:443 -d l3iggs/owncloud</code><br>
<code>$ docker run -p 27017:27017 -v /opt/mongodb/db:/data/db -d mongo mongod --auth</code></p>
</li>
<li>
<p><a href="https://developer.ibm.com/recipes/tutorials/kubectl-unable-to-deploy-the-pod-in-the-cluster/">Forcer la suppression d&apos;un pod</a> en status &apos;ImagePullBackOff&quot;:<br>
<code>$ kubectl delete -f whoami.xml</code></p>
</li>
<li>
<p>Supprimer les images qui ne sont plus attach&#xE9;es &#xE0; un conteneur:<br>
<code>$ docker rm -v $(docker ps -aq -f status=exited)</code><br>
&quot;<em>Note that the -v argument will delete any Docker-managed volumes that aren&#x2019;t referenced by other contain&#x2010;ers.</em>&quot;</p>
</li>
<li>
<p>suppression des images sans label:<br>
<code>docker images --filter &quot;dangling=true&quot; -q | xargs docker rmi</code></p>
</li>
<li>
<p>Transforme un conteneur en une image r&#xE9;utilisable par la suite:<br>
<code>$ docker commit cowsay test/cowsayimage</code><br>
ici le conteneur nomm&#xE9; &#xE0; son lancement cowsay est sauvegard&#xE9; dans test/cowsayimage</p>
</li>
<li>
<p>See the full set of layers that make up an image by running the docker history command.<br>
For example:<br>
<code>$ docker history mongo:latest</code></p>
</li>
<li>
<p>Se connecter via terminal sur un container d&#xE9;j&#xE0; lanc&#xE9;<br>
<code>docker exec -it docker_owncloud_1 bash</code></p>
</li>
</ul>
<p><em>bouger un container d&apos;un host &#xE0; un autre sans passer par un repository:</em></p>
<blockquote>
<ol>
<li>Export the container to a tarball<br>
docker export <code>&lt;CONTAINER ID&gt;</code> &gt; /home/export.tar</li>
<li>Move your tarball to new machine</li>
<li>Import it back</li>
</ol>
</blockquote>
<p><code>cat /home/export.tar | docker import - some-name:latest</code></p>
<ul>
<li>
<p>Si copie &#xE0; partir d&apos;une image:<br>
docker save &apos;image_name:tag&apos; &gt; ./export.tar</p>
</li>
<li>
<p>stats usage m&#xE9;moire : <code>dockker stats -a</code></p>
</li>
</ul>
<p><strong>Liens vers doc sur la manipulation des conteneurs:</strong><br>
<a href="http://tuhrig.de/difference-between-save-and-export-in-docker/">Save vs export</a></p>
<h6 id="constructionduneimagepartirdundockerfile">Construction d&apos;une image &#xE0; partir d&apos;un dockerfile:</h6>
<p><a href="https://docs.docker.com/engine/reference/builder">https://docs.docker.com/engine/reference/builder</a></p>
<p><code>$ mkdir cowsay $ cd cowsay $ touch Dockerfile</code></p>
<p><strong>in dockerfile:</strong></p>
<pre><code>FROM debian:wheezy
RUN apt-get update &amp;&amp; apt-get install -y cowsay fortune
COPY entrypoint.sh /
ENTRYPOINT [&quot;/entrypoint.sh&quot;]
NB: l&apos;entrypoint permet de sp&#xE9;cifier quel script docker doit lancer au d&#xE9;marrage du conteneur
</code></pre>
<p><strong>commande pour lancer la construction:</strong></p>
<p><code>$ docker build -t test/cowsay-dockerfile .</code><br>
...<br>
<code>$ docker run test/cowsay-dockerfile &quot;Moo&quot; </code></p>
<p><strong>Base Image</strong></p>
<blockquote>
<p>Toujours privil&#xE9;gier les images officielle, notamment celles minimalistes &#xE0; taille r&#xE9;duite, tout en profitant des syst&#xE8;mes de layer (image d&#xE9;j&#xE0; charg&#xE9;e)<br>
<a href="https://hub.docker.com/_/alpine/">https://hub.docker.com/_/alpine/</a> syst&#xE8;me minimal Linux g&#xE9;n&#xE9;re une image d&apos;un server de 16Mo, contre &gt;200Mo pour une base Ubuntu.</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>