Files
icq/docs/slidgram/main/admin/attachments.html
T
estorozhenko 3c4190402b Telegram bridge: slidgram + SOCKS5 proxy, mod_privilege (XEP-0356), XEP audit
- docker-compose: сервис slidgram (Slidge->Telegram, внешний компонент XEP-0114)
- кастомный образ slidgram-proxy: SOCKS5-патч (SLIDGRAM_PROXY -> Pyrogram) для маршрутизации через VPS01
- prosody: component telegram.nixg.ru (5347), component_secret в секции Component (0.11!),
  mod_privilege + privileged_entities (roster sync мостов), mod_pubsub включён
- modules/mod_privilege.lua (community, hg.prosody.im)
- docs/slidgram/: офлайн-копия документации slidgram (slidge.im)
- README: секции 'Функциональность (XEP)' и 'Мост Telegram'; XEP-AUDIT.md (полный аудит XEP)
- STATUS.md: мост ПОДКЛЮЧЁН, privilege, аудит
2026-08-29 14:38:25 +00:00

475 lines
29 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html class="no-js" lang="en" data-content_root="../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="index" title="Index" href="../genindex.html"><link rel="search" title="Search" href="../search.html"><link rel="next" title="Privileges" href="privileges.html"><link rel="prev" title="Quick start" href="quickstart.html">
<!-- Generated with Sphinx 9.1.0 and Furo 2025.12.19 -->
<title>Attachments - slidgram documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=7bdb33bb" />
<link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../index.html"><div class="brand">slidgram documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../index.html">
<span class="sidebar-brand-text">slidgram documentation</span>
</a><form class="sidebar-search-container" method="get" action="../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<ul class="current">
<li class="toctree-l1 current has-children"><a class="reference internal" href="index.html">For admins</a><input aria-label="Toggle navigation of For admins" checked="" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="install.html">Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="quickstart.html">Quick start</a></li>
<li class="toctree-l2 current current-page"><a class="current reference internal" href="#">Attachments</a></li>
<li class="toctree-l2"><a class="reference internal" href="privileges.html">Privileges</a></li>
<li class="toctree-l2"><a class="reference internal" href="config.html">Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="examples/index.html">XMPP server configs examples</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../user/index.html">For users</a><input aria-label="Toggle navigation of For users" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../user/registration.html">Registration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../user/usage.html">Usage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../user/features.html">Features</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../contributing.html">Contributing</a></li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="view-this-page">
<a class="muted-link" href="https://codeberg.org/slidge/slidgram/src/branch/main/docs/source/admin/attachments.rst" title="View this page">
<svg><use href="#svg-eye"></use></svg>
<span class="visually-hidden">View this page</span>
</a>
</div><div class="edit-this-page">
<a class="muted-link" href="https://codeberg.org/slidge/slidgram/_edit/main/docs/source/admin/attachments.rst" rel="edit" title="Edit this page">
<svg><use href="#svg-pencil"></use></svg>
<span class="visually-hidden">Edit this page</span>
</a>
</div><div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<section id="attachments">
<span id="id1"></span><h1>Attachments<a class="headerlink" href="#attachments" title="Link to this heading"></a></h1>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Attachments from XMPP to Telegram require no special configuration.</p>
</div>
<p>For slidgram to bridge attachments from Telegram to XMPP, you have two options:</p>
<ul class="simple">
<li><p><strong>HTTP Upload</strong>: slidgram will use your XMPP server’s upload component (<a class="extlink-xep reference external" href="https://xmpp.org/extensions/xep-0363.html">XEP-0363</a>).</p></li>
<li><p><strong>No upload</strong>: slidgram will copy attachments to a path it can write to. You then need to serve these files from via an HTTP server (eg nginx,
prosody’s <a class="reference external" href="https://prosody.im/doc/modules/mod_http_files">http_files</a>, etc.).</p></li>
</ul>
<section id="http-upload">
<span id="upload"></span><h2>HTTP Upload<a class="headerlink" href="#http-upload" title="Link to this heading"></a></h2>
<p>slidgram can use the HTTP Upload component (<a class="extlink-xep reference external" href="https://xmpp.org/extensions/xep-0363.html">XEP-0363</a>) of your XMPP server,
if you configure it with <code class="docutils literal notranslate"><span class="pre">upload-service=upload.example.org</span></code> (see <a class="reference internal" href="config.html#generic-config"><span class="std std-ref">Generic slidge config</span></a>).
In this setting, slidgram will upload files just like any normal user of your server.</p>
<section id="example-1-prosody-s-mod-http-file-share">
<h3>Example 1: prosody’s mod_http_file_share<a class="headerlink" href="#example-1-prosody-s-mod-http-file-share" title="Link to this heading"></a></h3>
<p>In slidgram’s <a class="reference internal" href="config.html#config-file"><span class="std std-ref">configuration file</span></a>, use <code class="docutils literal notranslate"><span class="pre">upload-service=upload.example.org</span></code></p>
<div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="nv">modules_enabled</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">-- make sure http_file_share is listed here</span>
<span class="w"> </span><span class="s2">&quot;http_file_share&quot;</span><span class="p">;</span>
<span class="p">}</span>
<span class="nv">Component</span><span class="w"> </span><span class="s2">&quot;upload.example.org&quot;</span><span class="w"> </span><span class="s2">&quot;http_file_share&quot;</span>
<span class="w"> </span><span class="c1">-- allow slidgram to use the upload component</span>
<span class="w"> </span><span class="nv">http_file_share_access</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">&quot;telegram.example.org&quot;</span><span class="w"> </span><span class="p">}</span>
</pre></div>
</div>
<p>More info: <a class="reference external" href="https://prosody.im/doc/modules/mod_http_file_share">mod_http_file_share</a>.</p>
</section>
<section id="example-2-ejabberd-mod-http-upload">
<h3>Example 2: ejabberd mod_http_upload<a class="headerlink" href="#example-2-ejabberd-mod-http-upload" title="Link to this heading"></a></h3>
<p>In slidgram’s <a class="reference internal" href="config.html#config-file"><span class="std std-ref">configuration file</span></a>, use <code class="docutils literal notranslate"><span class="pre">upload-service=example.org</span></code></p>
<p>The subdomain’s FQDN (example.org) should be listed under the top level ‘hosts’.</p>
<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">hosts</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;example.org&quot;</span>
<span class="nt">acl</span><span class="p">:</span>
<span class="w"> </span><span class="nt">slidge_acl</span><span class="p">:</span>
<span class="w"> </span><span class="nt">server</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;telegram.example.org&quot;</span>
<span class="nt">listen</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span>
<span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">5443</span>
<span class="w"> </span><span class="nt">module</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">ejabberd_http</span>
<span class="w"> </span><span class="nt">tls</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span>
<span class="w"> </span><span class="nt">request_handlers</span><span class="p">:</span>
<span class="w"> </span><span class="nt">/upload</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mod_http_upload</span>
<span class="nt">modules</span><span class="p">:</span>
<span class="w"> </span><span class="nt">mod_http_upload</span><span class="p">:</span>
<span class="w"> </span><span class="c1"># Any path that ejabberd has read and write access to</span>
<span class="w"> </span><span class="nt">docroot</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">/ejabberd/upload</span>
<span class="w"> </span><span class="nt">put_url</span><span class="p">:</span><span class="w"> </span><span class="s">&quot;https://@HOST@:5443/upload&quot;</span>
<span class="w"> </span><span class="nt">access</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">allow</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">local</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="nt">allow</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">slidge_acl</span>
</pre></div>
</div>
<p>To get more information about component configuration, see <a class="reference external" href="https://docs.ejabberd.im/admin/configuration/modules/#mod-http-upload">ejabberd’s docs</a>.</p>
</section>
</section>
<section id="no-upload">
<span id="id2"></span><h2>No upload<a class="headerlink" href="#no-upload" title="Link to this heading"></a></h2>
<p>You need to set up <code class="docutils literal notranslate"><span class="pre">no-upload-path</span></code> to point to a directory, and <code class="docutils literal notranslate"><span class="pre">no-upload-url-prefix</span></code> to an URL prefix pointing to files in that directory (see <a class="reference internal" href="config.html#generic-config"><span class="std std-ref">Generic slidge config</span></a> for more detail).
Example: <code class="docutils literal notranslate"><span class="pre">no-upload-path=/var/www/slidgram-attachments/</span></code> and <code class="docutils literal notranslate"><span class="pre">no-upload-url-prefix=https://example.org/slidgram/</span></code> means that <code class="docutils literal notranslate"><span class="pre">/var/www/slidgram-attachments/some-image.jpg</span></code> is accessible at <code class="docutils literal notranslate"><span class="pre">https://example.org/slidgram/some-image.jpg</span></code></p>
<p>Make sure that <code class="docutils literal notranslate"><span class="pre">no-upload-path</span></code> is writeable by slidgram and readable by
your HTTP server. You may use <code class="docutils literal notranslate"><span class="pre">no-upload-file-read-others=true</span></code> to do that easily,
but you might want to restrict which users can read this directory.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>slidgram will not take care of removing old files, so you should set up a cronjob,
a systemd timer, or something similar, to regularly delete files, eg.
<code class="docutils literal notranslate"><span class="pre">find</span> <span class="pre">.</span> <span class="pre">-mtime</span> <span class="pre">+7</span> <span class="pre">-delete</span> <span class="pre">&amp;&amp;</span> <span class="pre">find</span> <span class="pre">.</span> <span class="pre">-depth</span> <span class="pre">-type</span> <span class="pre">d</span> <span class="pre">-empty</span> <span class="pre">-delete</span></code>
to clean up files older than a week.</p>
</div>
<p>For the following examples, in slidgram’s config,
you would have <code class="docutils literal notranslate"><span class="pre">no-upload-path=/var/lib/slidgram/attachments</span></code>.</p>
<section id="example-1-prosody-s-http-files">
<h3>Example 1: prosody’s http_files<a class="headerlink" href="#example-1-prosody-s-http-files" title="Link to this heading"></a></h3>
<p>Here, <code class="docutils literal notranslate"><span class="pre">no-upload-url-prefix</span></code> would be <code class="docutils literal notranslate"><span class="pre">https://example.org:5281/files/</span></code>,
as per the <a class="reference external" href="https://prosody.im/doc/modules/mod_http_files">mod_http_files documentation</a>.</p>
<div class="highlight-lua notranslate"><div class="highlight"><pre><span></span><span class="nv">modules_enabled</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1">-- make sure http_files is listed here</span>
<span class="w"> </span><span class="s2">&quot;http_files&quot;</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">-- Must be the same value as slidgram&#39;s no-upload-path</span>
<span class="nv">http_files_dir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">&quot;/var/lib/slidgram/attachments&quot;</span>
</pre></div>
</div>
</section>
<section id="example-2-nginx">
<span id="nginx-no-upload"></span><h3>Example 2: nginx<a class="headerlink" href="#example-2-nginx" title="Link to this heading"></a></h3>
<p>Here, <code class="docutils literal notranslate"><span class="pre">no-upload-url-prefix</span></code> would be <code class="docutils literal notranslate"><span class="pre">https://example.org/slidgram/</span></code>.</p>
<div class="highlight-nginx notranslate"><div class="highlight"><pre><span></span><span class="k">server</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kn">listen</span><span class="w"> </span><span class="mi">80</span><span class="p">;</span>
<span class="w"> </span><span class="kn">server_name</span><span class="w"> </span><span class="s">example.org</span><span class="p">;</span>
<span class="w"> </span><span class="kn">root</span><span class="w"> </span><span class="s">/var/www/html</span><span class="p">;</span><span class="w"> </span><span class="c1"># if you already have nginx serving files…</span>
<span class="w"> </span><span class="c1"># the section below is for slidgram</span>
<span class="w"> </span><span class="kn">location</span><span class="w"> </span><span class="s">/slidgram</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="c1"># Must be the same value as slidgram&#39;s no-upload-path</span>
<span class="w"> </span><span class="kn">alias</span><span class="w"> </span><span class="s">/var/lib/slidgram/attachments/</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>See the <a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/">nginx docs</a> for more info.</p>
</section>
</section>
<section id="next-steps">
<h2>Next steps<a class="headerlink" href="#next-steps" title="Link to this heading"></a></h2>
<p>To make your slidgram install top notch, set up its <a class="reference internal" href="privileges.html#privileges"><span class="std std-ref">privileges</span></a>.</p>
</section>
</section>
</article>
</div>
<footer>
<div class="related-pages">
<a class="next-page" href="privileges.html">
<div class="page-info">
<div class="context">
<span>Next</span>
</div>
<div class="title">Privileges</div>
</div>
<svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
</a>
<a class="prev-page" href="quickstart.html">
<svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg>
<div class="page-info">
<div class="context">
<span>Previous</span>
</div>
<div class="title">Quick start</div>
</div>
</a>
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2026, the slidgram contributors
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
<div class="icons">
<a class="muted-link " href="https://codeberg.org/slidge/slidgram" aria-label="Codeberg"><svg xmlns="http://www.w3.org/2000/svg"
aria-label="Codeberg" role="img"
viewBox="55 65 400 390">
<defs>
<linearGradient id="A" x1="259.804" x2="383.132" y1="161.4" y2="407.835" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#ffffff" stop-opacity="0"/>
<stop offset=".5" stop-color="#71c2ff"/>
<stop offset="1" stop-color="#39aaff"/>
</linearGradient>
</defs>
<path fill="url(#A)"
d="M259.804 161.4c-.44 0-1.1 0-1.32.44l-.44 1.1L332.04 440.21a192.039 192.039 0 0 0 86.77-74.437L261.125 162.06a1.762 1.762 0 0 0-1.321-.661z"
opacity=".5" paint-order="stroke markers fill"/>
<path fill="#2185d0"
d="M255.3 71.8a192 192 0 0 0-162 294l160.1-207c.5-.6 1.5-1 2.6-1s2 .4 2.6 1l160 207a192 192 0 0 0 29.4-102c0-106-86-192-192-192a192 192 0 0 0-.7 0z"
paint-order="stroke markers fill"/>
</svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<aside class="toc-drawer">
<div class="toc-sticky toc-scroll">
<div class="toc-title-container">
<span class="toc-title">
On this page
</span>
</div>
<div class="toc-tree-container">
<div class="toc-tree">
<ul>
<li><a class="reference internal" href="#">Attachments</a><ul>
<li><a class="reference internal" href="#http-upload">HTTP Upload</a><ul>
<li><a class="reference internal" href="#example-1-prosody-s-mod-http-file-share">Example 1: prosody’s mod_http_file_share</a></li>
<li><a class="reference internal" href="#example-2-ejabberd-mod-http-upload">Example 2: ejabberd mod_http_upload</a></li>
</ul>
</li>
<li><a class="reference internal" href="#no-upload">No upload</a><ul>
<li><a class="reference internal" href="#example-1-prosody-s-http-files">Example 1: prosody’s http_files</a></li>
<li><a class="reference internal" href="#example-2-nginx">Example 2: nginx</a></li>
</ul>
</li>
<li><a class="reference internal" href="#next-steps">Next steps</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</aside>
</div>
</div><script src="../_static/documentation_options.js?v=5929fcd5"></script>
<script src="../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>