lektor-website/docs/deployment/ftp/index.html

279 lines
9.8 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="../../../static/styles.css?h=dff0aaad">
<link rel="stylesheet" href="../../../static/pygments.css">
<link rel="shortcut icon" href="../../../static/favicon.png?h=fa09bedd">
<title>FTP | Documentation | Lektor Static Content Management System</title>
</head>
<body class="default">
<nav class="navbar navbar-inverse navbar-static-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="../../../">Lektor</a>
</div>
<div id="navbar" class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="../../../downloads/">Download</a></li>
<li class="active"><a href="../../">Documentation</a></li>
<li><a href="../../../showcase/">Showcase</a></li>
<li><a href="../../../plugins/">Plugins</a></li>
<li><a href="../../../community/">Community</a></li>
<li><a href="../../../blog/">Blog</a></li>
</ul>
</div>
</div>
</nav>
<div class="body-wrapper">
<div class="container">
<div class="row">
<div class="col-sm-3">
<ul class="tree-nav nocontent">
<li><a href="../../">Welcome</a></li>
<li><a href="../../what/">What is Lektor</a>
<li><a href="../../installation/">Installation</a>
<li><a href="../../quickstart/">Quickstart</a>
<li><a href="../../project/">Project</a>
<li><a href="../../content/">Content</a>
<li><a href="../../templates/">Templates</a>
<li><a href="../../themes/">Themes</a>
<li><a href="../../guides/">Guides</a>
<li><a href="../">Deployment</a>
<ul>
<li class="active"><a href="./">FTP</a>
<ul></ul>
<li><a href="../ghpages/">GitHub Pages</a>
<li><a href="../glpages/">GitLab Pages</a>
<li><a href="../rsync/">rsync</a>
<li><a href="../travisci/">Travis-CI</a>
</ul>
<li><a href="../../plugins/">Plugins</a>
<li><a href="../../models/">Data Modelling</a>
<li><a href="../../cli/">Command Line</a>
<li><a href="../../api/">API</a>
<li><a href="../../search/">Search</a>
</ul>
<div class="visible-md-block visible-lg-block">
<h4>This Page</h4>
<ul class="toc">
<li><a href="#example">Example</a></li>
<li><a href="#credentials">Credentials</a></li>
<li><a href="#implementation">Implementation</a></li>
<li><a href="#using-other-tools">Using Other Tools</a></li>
</ul>
</div>
</div>
<div class="col-sm-9 doc-styling">
<h1>FTP</h1>
<ul class=page-meta>
</ul>
<ul>
<li><code>ftp://username:password@server:port/path?passive=yes|no</code></li>
<li><code>ftps://username:password@server:port/path?passive=yes|no</code></li>
</ul>
<p>FTP is a very old but well supported protocol. Lektor can publish through it
but to speed up the operation it has to make certain concessions. In
particular it needs to maintain a “listing file” to remember the state of
the files as FTP does not support any form of file comparisons. This means
that you cannot use Lektor in addition to another system to publish files
to your FTP server. It's an either/or thing.</p>
<p>If you have alternatives to using FTP it's recommended to use those. FTP is
a very simple transport format, very slow, underspecified, largely insecure
and not very portable.</p>
<p>The system supports FTP (<code>ftp://</code>) and FTP over TLS (<code>ftps://</code>). Passive mode
can be enabled/disabled with the optional <code>?passive</code> parameter. It defaults
to true.</p>
<h2 id="example">Example</h2><div class="hll"><pre><span></span><span class="k">[servers.production]</span>
<span class="na">target</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">ftps://myuser:mypassword@ftp.example.com/var/www/example</span>
</pre></div>
<h2 id="credentials">Credentials</h2><p>FTP is considered a largely insecure protocol for Lektor. As such if you
want to use it you should keep your project file safe as credentials will
be most likely embedded there. Alternatively you can set the credentials
via the command line with the <code>--username</code> and <code>--password</code> option (or via the
environment variables <code>LEKTOR_DEPLOY_USERNAME</code> and <code>LEKTOR_DEPLOY_PASSWORD</code>)
though this will mean that most likely deploys via the admin interface
will fail as the values will not be available there.</p>
<h2 id="implementation">Implementation</h2><p>If you want to know how the FTP sync process works, here is how the system
figures out what to sync and what not. When it synchronizes it maintains
a “listing file” in <code>.lektor/listing</code>. This file contains the checksums of
all uploaded artifacts. If that file desynchronizes with the actual files
that were uploaded it can be deleted and Lektor will sync up everything.
The file is modified through append operations and at the end of the sync
duplicate entries in that file are resolved.</p>
<h2 id="using-other-tools">Using Other Tools</h2><p>The FTP support in Lektor is quite rudimentary and in some situations you
might want to use a different tool like filezilla to do your synchronizations
instead. In that case you just need to point your FTP client to the build
folder. To find out where this is, just run this command:</p>
<pre><code>$ lektor project-info --output-path
</code></pre>
<div class="comment-box">
<h2>Comments</h2>
<div id="disqus_thread"></div>
<script>
var disqus_config = function() { this.page.identifier = "/docs/deployment/ftp"; this.page.url = "https://www.getlektor.com/docs/deployment/ftp/"; };
(function() {
var d = document, s = d.createElement('script');
s.src = '//lektordocumentation.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>
Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript"
rel="nofollow">comments powered by Disqus.</a>
</noscript>
</div>
</div>
</div>
</div>
</div>
<div class="bottomsummary">
<div class="container">
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-sm-4 icon-bar">
<a href="https://github.com/lektor/lektor/" title="Lektor on GitHub"
><i class="fa fa-github"></i></a>
<a href="https://github.com/lektor/lektor/issues/" title="Report Issues for Lektor"
><i class="fa fa-bug"></i></a>
<a href="https://twitter.com/getlektor" title="Find Lektor on Twitter"
><i class="fa fa-twitter"></i></a>
<a href="https://gitter.im/lektor/lektor" title="Chat on Gitter"
><i class="fa fa-comment"></i></a>
<a href="https://github.com/lektor/lektor-website/tree/master/content/docs/deployment/ftp/contents.lr" title="View source for this page"><i class="fa fa-code"></i></a>
</div>
<div class="col-sm-8">
<a href="../../../license/">License & Copyright</a>
<a href="../../../contact/">Contact</a>
Made with <i class="fa fa-fw fa-heart" title="Heart"><span hidden>Heart</span></i> in Carinthia
</div>
</div>
</div>
</footer>
<script type=text/javascript src="../../../static/app.js?h=8b801996" charset="utf-8"></script>
<script>
((window.gitter = {}).chat = {}).options = {
room: 'lektor/lektor',
activationElement: null
};
document.write('<button class="js-gitter-toggle-chat-button">Toggle Chat</button>');
var dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
if (dnt != "1" && dnt != "yes") {
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-70822533-1', 'auto');
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
} else {
console.debug("Respecting Do-Not-Track, not running analytics.");
}
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
<script src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer></script>
</body>
</html>