<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Moinz.de Webservices – Docs</title><link>http://help.moinz.de/docs/</link><description>Recent content in Docs on Moinz.de Webservices</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><atom:link href="http://help.moinz.de/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Docs: Introduction</title><link>http://help.moinz.de/docs/fs/intro/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://help.moinz.de/docs/fs/intro/</guid><description>
&lt;p>FS is a simple file storage with simple rest api.&lt;/p>
&lt;h2 id="access">Access&lt;/h2>
&lt;p>Endpoint: &lt;code>https://apps.moinz.de/fs/fs.php&lt;/code>. See the &lt;a href="http://help.moinz.de/docs/fs/api/">API&lt;/a> page for details.&lt;/p>
&lt;h2 id="authorization">Authorization&lt;/h2>
&lt;p>Access to paths can be finely tuned by an admin (TBD: provide an iam api). Policies can control access to various resources based on username, action and paths.&lt;/p>
&lt;p>The &lt;a href="https://github.com/zeisss/fs-php/blob/master/Docs/Configuration.md#policies">authorization guide&lt;/a> documents the Policy concept.&lt;/p>
&lt;h2 id="clients">Clients&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://raw.githubusercontent.com/zeisss/fs-php/master/fs.bash">fs.bash&lt;/a> - Small bash wrapper around curl.&lt;/li>
&lt;/ul></description></item><item><title>Docs: Introduction</title><link>http://help.moinz.de/docs/msg/msg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://help.moinz.de/docs/msg/msg/</guid><description>
&lt;p>&lt;strong>Msg&lt;/strong> is a simple and small message queue for pushing and polling single messages.
Topics and other more advanced mechanisms are not supported.&lt;/p>
&lt;h2 id="access">Access&lt;/h2>
&lt;p>Endpoint: &lt;code>https://apps.moinz.de/msg/msg.php&lt;/code>&lt;/p>
&lt;h2 id="api">API&lt;/h2>
&lt;p>The API is documented &lt;a href="http://help.moinz.de/docs/msg/api/">here&lt;/a>.&lt;/p></description></item><item><title>Docs: API</title><link>http://help.moinz.de/docs/msg/api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://help.moinz.de/docs/msg/api/</guid><description>
&lt;h2 id="welcome">Welcome&lt;/h2>
&lt;p>A very simple http based message queue inspired by Amazons SNS.&lt;/p>
&lt;h2 id="notation">Notation&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>Each action contains two lists: The request fields and response fields. Please note that the top level of the JSON is always an object.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The field names may contain dots to intend sub objects. In case the field denotes an array, a single uppercase letter is used, e.g. &lt;code>tags.N.key&lt;/code> means the &lt;code>tags&lt;/code> field contains an array containing more objects with a &lt;code>key&lt;/code> field inside.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>The field table may contain a required column. The notation is as followed:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Value&lt;/th>
&lt;th>Meaning&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>O&lt;/td>
&lt;td>Optional - the field must not be provided&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>R&lt;/td>
&lt;td>Required&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/li>
&lt;li>
&lt;p>Currently no pagination is supported.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="authorization">Authorization&lt;/h2>
&lt;p>The &lt;code>msg-php&lt;/code> service authorizes requests over htbasic auth. Your credentials will be provided by the service operator.&lt;/p>
&lt;h2 id="datastructures">DataStructures&lt;/h2>
&lt;h3 id="uri">URI&lt;/h3>
&lt;p>URIs are string identifiers for objects inside the &lt;em>msg&lt;/em> service. They generally take the following format: &lt;code>msg:&amp;lt;type&amp;gt;:&amp;lt;unique-id&amp;gt;&lt;/code>. Type is one of &lt;code>queue&lt;/code> or &lt;code>message&lt;/code>.&lt;/p>
&lt;h3 id="queue">Queue&lt;/h3>
&lt;pre tabindex="0">&lt;code>{
&amp;#34;id&amp;#34;: &amp;#34;msg:queue:uuid()&amp;#34;
&amp;#34;tags&amp;#34;: [
{&amp;#34;key&amp;#34;: &amp;#34;Name&amp;#34;, &amp;#34;value&amp;#34;: &amp;#34;Value&amp;#34;},
...
]
}
&lt;/code>&lt;/pre>&lt;h3 id="queuestatus">QueueStatus&lt;/h3>
&lt;pre tabindex="0">&lt;code>{
&amp;#34;id&amp;#34;: &amp;#34;msg:queue:uuid()&amp;#34;,
&amp;#34;messages&amp;#34;: int(),
}
&lt;/code>&lt;/pre>&lt;h3 id="message">Message&lt;/h3>
&lt;pre tabindex="0">&lt;code>{
&amp;#34;id&amp;#34;: &amp;#34;string()&amp;#34;,
&amp;#34;content_type&amp;#34;: &amp;#34;string()&amp;#34;,
&amp;#34;body&amp;#34;: &amp;#34;json escaped query body&amp;#34;,
&amp;#34;created_at&amp;#34;: &amp;#34;ISO8601()&amp;#34;
}
&lt;/code>&lt;/pre>&lt;h3 id="errormessage">ErrorMessage&lt;/h3>
&lt;pre tabindex="0">&lt;code>{
&amp;#34;message&amp;#34;: &amp;#34;string()&amp;#34;,
[&amp;#34;error&amp;#34;: bool(),]
[&amp;#34;detail&amp;#34;: &amp;#34;string()&amp;#34;,]
&amp;#34;code&amp;#34;: int()
}
&lt;/code>&lt;/pre>&lt;h2 id="actions">Actions&lt;/h2>
&lt;p>Generally all actions have the same format. Send a &lt;code>POST&lt;/code> request to &lt;code>https://apps.moinz.de/msg/msg.php&lt;/code> with a query parameter &lt;code>action&lt;/code> of one of the list below. Operation parameters are given via query parameters. Data from the request body is only used when explicitly stated.&lt;/p>
&lt;h3 id="createqueue">CreateQueue&lt;/h3>
&lt;p>Creates a new queue and returns the created queue.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Required&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>tags.N.key&lt;/td>
&lt;td>O&lt;/td>
&lt;td>The key for the tag. &lt;code>N&lt;/code> must be replaced with a sequential number starting at 1 with a maximum of 20.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>tags.N.value&lt;/td>
&lt;td>O&lt;/td>
&lt;td>The value of the tag.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>Queue&lt;/td>
&lt;td>The queue that was created&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Example&lt;/p>
&lt;pre tabindex="0">&lt;code>POST /msg/msg.php?action=CreateQueue&amp;amp;tags.1.key=name&amp;amp;tags.1.value=example-queue&amp;amp;tags.2.key=env&amp;amp;tags.2.value=production
Content-Length: 0
200 OK
Content-Type: application/json
{
&amp;#34;queue&amp;#34; : {
&amp;#34;id&amp;#34;: &amp;#34;msg:queue:1234-56789-01234-5678&amp;#34;,
&amp;#34;tags&amp;#34;: {
&amp;#34;name&amp;#34;: &amp;#34;example-queue&amp;#34;,
&amp;#34;env&amp;#34;: &amp;#34;production&amp;#34;
}
}
}
&lt;/code>&lt;/pre>&lt;h3 id="describequeues">DescribeQueues&lt;/h3>
&lt;p>DescribeQueues fetches a list of Queues and returns them with their ids and tags to the client.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>filter.tag:key&lt;/td>
&lt;td>Filters for queues having &lt;code>key&lt;/code> as a tag with the given value as the value.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queues&lt;/td>
&lt;td>[]Queue&lt;/td>
&lt;td>The queues that match the given filters&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="deletequeue">DeleteQueue&lt;/h3>
&lt;p>DeleteQueue deletes the specified queue and all messages contained within it.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>the URI of the queue to delete&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>Queue&lt;/td>
&lt;td>The queue that was deleted&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="describequeuestatus">DescribeQueueStatus&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>The URI of the queue to fetch the message from&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>id&lt;/td>
&lt;td>URI&lt;/td>
&lt;td>The URI of the queue&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>messages&lt;/td>
&lt;td>int&lt;/td>
&lt;td>Number of messages in the queue&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="updatequeuetags">UpdateQueueTags&lt;/h3>
&lt;p>Updates the tags for the specified queue.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>The URI of the queue to fetch the message from&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>tags.N.key&lt;/td>
&lt;td>The key for the tag&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>tags.N.value&lt;/td>
&lt;td>The value of the tag&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>Queue&lt;/td>
&lt;td>The queue that got updated&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="purgequeue">PurgeQueue&lt;/h3>
&lt;p>PurgeQueue removes all messages currently stored in the queue.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>The URI of the queue to fetch the message from&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>[]Queue&lt;/td>
&lt;td>The queue that was purged&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="pushmessage">PushMessage&lt;/h3>
&lt;p>Creates a new message in the given queue. The body of the reuqest is taken as the message body, the request
content-type is saved along.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>The URI of the queue to push into&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>URI&lt;/td>
&lt;td>The URI of the queue the message was pushed into&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>message&lt;/td>
&lt;td>URI&lt;/td>
&lt;td>The URI of the message that was pushed&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>content-md5&lt;/td>
&lt;td>string&lt;/td>
&lt;td>MD5 hash of the request body&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="popmessage">PopMessage&lt;/h3>
&lt;p>Returns a message and deletes it from the queue. If no message can be found, &lt;code>null&lt;/code> is returned for the &lt;code>message&lt;/code> field.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Query Parameters&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>The URI of the queue to fetch the message from&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Response Fields&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>queue&lt;/td>
&lt;td>URI&lt;/td>
&lt;td>The URI of the queue&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>message&lt;/td>
&lt;td>Message&lt;/td>
&lt;td>The messages that was dequeued&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="common-errors">Common Errors&lt;/h2>
&lt;h3 id="invalid-method">Invalid Method&lt;/h3>
&lt;p>Since the &lt;em>msg&lt;/em> service takes only POST requests, all other http methods are quit with a &lt;code>405&lt;/code> error.&lt;/p>
&lt;h3 id="invalid-action">Invalid Action&lt;/h3>
&lt;p>StatusCode: 400
If the &lt;code>action&lt;/code> parameter is unknown.&lt;/p>
&lt;h3 id="invalid-request">Invalid Request&lt;/h3>
&lt;p>Most actions require a &lt;code>queue&lt;/code> parameter. If it is missing, the &lt;em>msg&lt;/em> services responds with a &lt;code>ErrorMessage&lt;/code> and a 400 status code.&lt;/p>
&lt;h3 id="queuenotfound">QueueNotFound&lt;/h3>
&lt;p>When the specified &lt;code>queue&lt;/code> cannot be found, an &lt;code>ErrorMessage&lt;/code> and a &lt;code>404&lt;/code> is returned.&lt;/p>
&lt;h3 id="internal-server-error">Internal Server Error&lt;/h3>
&lt;p>If an unexpected error occurs, an &lt;code>ErrorMessage&lt;/code> with the text &amp;ldquo;Internal Server Error&amp;rdquo; and a &lt;code>500&lt;/code> status code is returned.&lt;/p>
&lt;h2 id="authorization-1">Authorization&lt;/h2>
&lt;p>Authorization is simply handled via htbasic auth as defined in the HTTP protocol.&lt;/p>
&lt;h2 id="permissions">Permissions&lt;/h2>
&lt;p>Like the &lt;em>fs-php&lt;/em> service, &lt;em>msg&lt;/em> supports policies to fine tune access to actions and/or resources for special users.&lt;/p>
&lt;p>All actions are prefixed with &lt;code>msg::&lt;/code> and contain the name listed above, e.g. &lt;code>msg::DescribeQueues&lt;/code>, &lt;code>msg::PushMessage&lt;/code>.
All resource names start with &lt;code>msg:&lt;/code> followed by the type and a unique id, e.g. &lt;code>msg:queue:123ac12&lt;/code> or &lt;code>msg:message:123141231&lt;/code>. Actions that do no work on a specific resource, use the resource &lt;code>msg:*&lt;/code>.&lt;/p>
&lt;h3 id="examples">Examples&lt;/h3>
&lt;pre tabindex="0">&lt;code>$accessManager-&amp;gt;newPolicy()
-&amp;gt;description(&amp;#39;Eve may push into the &amp;#39;)
-&amp;gt;forUsername(&amp;#39;eve&amp;#39;)
-&amp;gt;permission(&amp;#39;msg::PushMessage&amp;#39;)
-&amp;gt;forResource(&amp;#39;msg:queue:bf54e8c38a1dbe21246e268ab3109aff&amp;#39;);
$accessManager-&amp;gt;newPolicy()
-&amp;gt;description(&amp;#39;Bob may only check queues and consume messages&amp;#39;)
-&amp;gt;forUsername(&amp;#39;bob&amp;#39;)
-&amp;gt;permission(&amp;#39;msg::Describe*&amp;#39;)
-&amp;gt;forPermission(&amp;#39;msg::PopMessage&amp;#39;)
-&amp;gt;forResource(&amp;#39;msg:*&amp;#39;);
&lt;/code>&lt;/pre></description></item><item><title>Docs: Objects API</title><link>http://help.moinz.de/docs/fs/api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://help.moinz.de/docs/fs/api/</guid><description>
&lt;p>The &lt;em>Objects API&lt;/em> is accessable under the following URL:&lt;/p>
&lt;pre tabindex="0">&lt;code class="language-url" data-lang="url">http://apps.moinz.de/fs/fs.php
&lt;/code>&lt;/pre>&lt;p>Generally all API responses are JSON responses, if not stated otherwise. If the URL parameter &lt;code>pretty&lt;/code> is set, the responses will be pretty printed.&lt;/p>
&lt;p>NOTE: All examples below are slightly pretty-printed for easier readability.&lt;/p>
&lt;h2 id="authentication">Authentication&lt;/h2>
&lt;p>Authentication can happen over Basic Auth or using JWT as a bearer token and cookies.
A token can be obtained by contacting support.&lt;/p>
&lt;p>NOTE: For all examples below that an authentication header is passed.&lt;/p>
&lt;h2 id="operations">Operations&lt;/h2>
&lt;h3 id="listing-objects">Listing objects&lt;/h3>
&lt;p>Lists all objects in the bucket. Use query parameter &lt;code>prefix&lt;/code> to define a common prefix string. If given, it must
start with a &lt;code>/&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>GET /fs/fs.php?prefix=/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;prefix&amp;#34;: &amp;#34;/&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;objects&amp;#34;: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&amp;#34;key&amp;#34;: &amp;#34;/docs/api.md&amp;#34;, &amp;#34;acl&amp;#34;:&amp;#34;public-read&amp;#34;, &amp;#34;size&amp;#34;: 100, &amp;#34;mtime&amp;#34;: &amp;#34;2015-10-10T19:00:00Z&amp;#34;, &amp;#34;mime&amp;#34;: &amp;#34;plain/text&amp;#34;},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&amp;#34;key&amp;#34;: &amp;#34;/README.md&amp;#34;, &amp;#34;acl&amp;#34;: &amp;#34;public-read&amp;#34;, size&amp;#34;: 100, &amp;#34;mtime&amp;#34;: &amp;#34;2015-10-10T19:00:00Z&amp;#34;, &amp;#34;mime&amp;#34;: &amp;#34;plain/text&amp;#34;}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>By default, all objects are listed. If you just want to discover, you can pass &lt;code>delimiter=/&lt;/code>, which splits the keys and list the prefix in the field &lt;code>common-prefixes&lt;/code>.
In combination with the &lt;code>prefix&lt;/code> parameter this allows to list
files and folders easily.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>GET /fs/fs.php?prefix=/&amp;amp;delimiter=/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;prefix&amp;#34;: &amp;#34;/&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;delimiter&amp;#34;: &amp;#34;/&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;common-prefixes&amp;#34;: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;/docs/&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ],
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;objects&amp;#34;: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&amp;#34;key&amp;#34;: &amp;#34;/README.md&amp;#34;, &amp;#34;acl&amp;#34;: &amp;#34;public-read&amp;#34;, size&amp;#34;: 100, &amp;#34;mtime&amp;#34;: &amp;#34;2015-10-10T19:00:00Z&amp;#34;, &amp;#34;mime&amp;#34;: &amp;#34;plain/text&amp;#34;}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>GET /fs/fs.php?prefix=/docs&amp;amp;delimiter=/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;prefix&amp;#34;: &amp;#34;/docs&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;delimiter&amp;#34;: &amp;#34;/&amp;#34;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#34;objects&amp;#34;: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&amp;#34;key&amp;#34;: &amp;#34;/docs/api.md&amp;#34;, &amp;#34;acl&amp;#34;:&amp;#34;public-read&amp;#34;, &amp;#34;size&amp;#34;: 100, &amp;#34;mtime&amp;#34;: &amp;#34;2015-10-10T19:00:00Z&amp;#34;, &amp;#34;mime&amp;#34;: &amp;#34;plain/text&amp;#34;}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="get-object">Get Object&lt;/h3>
&lt;p>To read the contents of an objects, provide the key to the object behind the endpoint url. The content-type will be determined by the server.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>GET /fs/fs.php/docs/api.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>A &lt;code>404 Not Found&lt;/code> will be returned, if the given key does not exist. Otherwise a &lt;code>200 OK&lt;/code>. If the file has the &lt;code>public-read&lt;/code> acl, no authorization is required.&lt;/p>
&lt;p>A header &lt;code>x-acl&lt;/code> contains the ACL of the object.&lt;/p>
&lt;p>PS: &lt;code>HEAD&lt;/code> is also supported.&lt;/p>
&lt;h3 id="create-an-object">Create an Object&lt;/h3>
&lt;p>Simply use &lt;code>PUT&lt;/code> with the desired key and provide the content in the body.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>PUT /fs/fs.php/demo.md
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>This is the new content
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The server responds with a &lt;code>201 Created&lt;/code> if the upload was successful.&lt;/p>
&lt;p>You can specify a &lt;code>x-acl&lt;/code> header field, which can be either &lt;code>private&lt;/code> or &lt;code>public-read&lt;/code>. &lt;code>private&lt;/code> is the default.
When set to &lt;code>public-read&lt;/code>, &lt;em>reading&lt;/em> this file does not require authentication.&lt;/p>
&lt;h3 id="deleting-an-object">Deleting an Object&lt;/h3>
&lt;p>Use &lt;code>DELETE&lt;/code> to delete an undesired object.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>DELETE /fs/fs.php/demo.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The server responds with a &lt;code>204 No Content&lt;/code> if the delete was successful. If no such key exists, a &lt;code>404 Not Found&lt;/code> is returned.&lt;/p>
&lt;h3 id="updating-an-objects-acl">Updating an Objects ACL&lt;/h3>
&lt;p>You can change the ACL of an object after it was created by issuing a PUT to the &lt;code>?acl&lt;/code> resource.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>PUT /fs/fs.php/demo.md?acl
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>public-read
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The servers responds with a &lt;code>204 No Content&lt;/code>. A &lt;code>400 Bad Request&lt;/code> indicates a wrong ACL.&lt;/p>
&lt;h2 id="workarounds">Workarounds&lt;/h2>
&lt;p>All object keys can optionally end in &lt;code>.ignore&lt;/code> which will be dropped when
reading/writing. &lt;code>fs.bash&lt;/code> appends this automatically to all routes.&lt;/p></description></item><item><title>Docs: CLI</title><link>http://help.moinz.de/docs/fs/cli/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://help.moinz.de/docs/fs/cli/</guid><description>
&lt;p>A cli is available as &lt;code>fs-client-go&lt;/code>.&lt;/p>
&lt;p>It supports the following subcommands:&lt;/p>
&lt;ul>
&lt;li>&lt;code>ls PREFIX&lt;/code>&lt;/li>
&lt;li>&lt;code>delete KEY&lt;/code>&lt;/li>
&lt;li>&lt;code>set KEY CONTENT&lt;/code>&lt;/li>
&lt;li>&lt;code>set-acl KEY ACL&lt;/code>&lt;/li>
&lt;li>&lt;code>push KEY PATH&lt;/code>&lt;/li>
&lt;li>&lt;code>url KEY&lt;/code>&lt;/li>
&lt;/ul></description></item><item><title>Docs: Deployer</title><link>http://help.moinz.de/docs/deployer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://help.moinz.de/docs/deployer/</guid><description>
&lt;blockquote>
&lt;p>Deploys code. Into folders. From artifacts. Like Crazy. So much wow.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;strong>Deployer&lt;/strong> is a service to deploy static or php websites.&lt;/p>
&lt;h2 id="features">Features&lt;/h2>
&lt;ul>
&lt;li>Supports different target sites&lt;/li>
&lt;li>Sites can have a different setup&lt;/li>
&lt;li>Sites can optionally include a separate configuration tarball&lt;/li>
&lt;li>Installation into sibling folder and moving in place for atomic updates via symlink rename (simple blue/green)&lt;/li>
&lt;/ul>
&lt;h2 id="limitations">Limitations&lt;/h2>
&lt;ul>
&lt;li>Currently only supports deployments of artifacts from &lt;a href="http://help.moinz.de/docs/fs/intro/">fs&lt;/a>&lt;/li>
&lt;li>Currently only supports &lt;code>.tar.gz&lt;/code> artifacts&lt;/li>
&lt;li>Sites for deployment must be predefined by an admin&lt;/li>
&lt;/ul>
&lt;h2 id="endpoint">Endpoint&lt;/h2>
&lt;p>The API endpoint is at &lt;code>https://apps.moinz.de/deployer/deploy.php&lt;/code>. A valid &lt;code>bearer&lt;/code> authorization header is required.&lt;/p>
&lt;h2 id="usage">Usage&lt;/h2>
&lt;p>After installing, have your deployment script publish your artifact as a tarball to &lt;a href="http://help.moinz.de/docs/fs/intro/">fs&lt;/a> and then perform a &lt;code>POST&lt;/code> request to &lt;code>deploy.php&lt;/code> with a &lt;code>site&lt;/code> and &lt;code>desired_version&lt;/code> parameter.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-sh" data-lang="sh">&lt;span style="display:flex;">&lt;span>curl -XPOST https://apps.moinz.de/deployer/deploy.php &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -d site&lt;span style="color:#f92672">=&lt;/span>help.moinz.de &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -d desired_version&lt;span style="color:#f92672">=&lt;/span>master-12314556789123
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Inside the fs storage, the following path will now be deployed: &lt;code>/artifacts/help.moinz.de/master-12314556789123/help.moinz.de.tar.gz&lt;/code>.&lt;/p>
&lt;h2 id="site-configuration">Site Configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Moinz.de Blog (production)&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;path&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;/home/zeisss/www/moinz.de/htdocs/blog&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;artifact&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;artifact&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;moinz-de-blog-production&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;artifactBundle&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;moinz-de-blog.tar.gz&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;config&amp;#34;&lt;/span>: {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;name&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;artifact-name&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;revision&amp;#34;&lt;/span>: &lt;span style="color:#ae81ff">42&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Key&lt;/th>
&lt;th>Comment&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>name&lt;/code>&lt;/td>
&lt;td>Name of the site&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>path&lt;/code>&lt;/td>
&lt;td>Target site where active app files should be linked to&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>artifact.artifact&lt;/code>&lt;/td>
&lt;td>Name of the artifact - will be used to find artifacts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>artifact.artifactBundle&lt;/code>&lt;/td>
&lt;td>Name of the artifact bundle that should be deployed&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>config.name&lt;/code>&lt;/td>
&lt;td>Name of the config bundle to unpack ontop of the artifact bundle&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>config.revision&lt;/code>&lt;/td>
&lt;td>Revision of the config bundle to unpack&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table></description></item></channel></rss>