<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.fsci.in/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bady</id>
	<title>FSCI Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.fsci.in/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bady"/>
	<link rel="alternate" type="text/html" href="https://wiki.fsci.in/Special:Contributions/Bady"/>
	<updated>2026-05-31T20:12:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Discourse&amp;diff=11037</id>
		<title>Discourse</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Discourse&amp;diff=11037"/>
		<updated>2022-10-17T17:29:47Z</updated>

		<summary type="html">&lt;p&gt;Bady: Bady moved page Discourse to Discourse/Archive: No longer maintained&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Discourse/Archive]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Discourse/Archive&amp;diff=11036</id>
		<title>Discourse/Archive</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Discourse/Archive&amp;diff=11036"/>
		<updated>2022-10-17T17:29:47Z</updated>

		<summary type="html">&lt;p&gt;Bady: Bady moved page Discourse to Discourse/Archive: No longer maintained&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;India OS Forum - https://forum.indiaos.in - Maintained by Zerodha and Frappe Technologies&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=11035</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=11035"/>
		<updated>2022-07-28T17:18:06Z</updated>

		<summary type="html">&lt;p&gt;Bady: Add workaround to access XMPP service when diaspora account is closed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
* Riot-web Matrix client is hosted at https://chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://codema.in/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
&lt;br /&gt;
Boot into rescue system using https://docs.hetzner.com/robot/dedicated-server/troubleshooting/hetzner-rescue-system&lt;br /&gt;
&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw allow http/tcp&lt;br /&gt;
 ufw allow https/tcp&lt;br /&gt;
 ufw allow Turnserver&lt;br /&gt;
 ufw allow XMPP&lt;br /&gt;
 ufw allow 8448&lt;br /&gt;
&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
 &lt;br /&gt;
 # Enable ufw logging with default mode low&lt;br /&gt;
 ufw logging on&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery is running [https://github.com/matrix-org/synapse/blob/master/docs/workers.md workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled:&lt;br /&gt;
&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service matrix-synapse@synchrotron_2.service&lt;br /&gt;
&lt;br /&gt;
To load balance between the 2 synchrotrons, We are running [https://github.com/Sorunome/matrix-synchrotron-balancer matrix-synchrotron-balancer]. It has a systemd file at &amp;lt;code&amp;gt;/etc/systemd/system/matrix-synchrotron-balancer&amp;lt;/code&amp;gt;. The files are in &amp;lt;code&amp;gt;/opt/matrix-synchrotron-balancer&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://matrix-org.github.io/synapse/latest/upgrade synapse//latest/upgrade] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
* Current version of synapse can be found from https://poddery.com/_matrix/federation/v1/version&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run the following (make sure to replace &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; with a proper version number like &amp;lt;code&amp;gt;v1.0.0&amp;lt;/code&amp;gt;):&lt;br /&gt;
 /var/www/get-riot &amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Note- letsencrypt executable used below is actually a symlik to /usr/bin/certbot&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
* To include an additional subdomain such as fund.poddery.com use with --expand parameter as shown below&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos --expand -w /usr/share/diaspora/public -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save/ -d save.poddery.com -w /var/www/riot/ -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
==Backup==&lt;br /&gt;
&lt;br /&gt;
Backup server is provided by Manu (KVM virtual machine with 180 GB storage and 1 GB ram ). &lt;br /&gt;
&lt;br /&gt;
Debian Stetch was upgraded Debian Buster before database relication of synapse database. &lt;br /&gt;
&lt;br /&gt;
Documentation: https://www.percona.com/blog/2018/09/07/setting-up-streaming-replication-postgresql/&lt;br /&gt;
&lt;br /&gt;
Currently postgres database for matrix-synapse is backed up.&lt;br /&gt;
&lt;br /&gt;
===Before Replication (specific to poddery.com)===&lt;br /&gt;
&lt;br /&gt;
Setup tinc vpn in the backup server&lt;br /&gt;
&lt;br /&gt;
 # apt install tinc&lt;br /&gt;
&lt;br /&gt;
Configure tinc by creating tinc.conf and host podderybackup under label fsci.&lt;br /&gt;
Add tinc-up and tinc-down scripts&lt;br /&gt;
Copy poddery host config to backup server and podderybackup host config to poddery.com server.&lt;br /&gt;
&lt;br /&gt;
Reload tinc vpn service at both poddery.com and backup servers&lt;br /&gt;
&lt;br /&gt;
 # systemctl reload tinc@fsci.service&lt;br /&gt;
&lt;br /&gt;
Enable tinc@fsci systemd service for autostart&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable tinc@fsci.service&lt;br /&gt;
&lt;br /&gt;
The synapse database was also pruned to reduce the size before replication by following this guide - https://levans.fr/shrink-synapse-database.html&lt;br /&gt;
If you want to follow this guide, make sure matrix synapse server is updated to version 1.13 atleast since it introduces the Rooms API mentioned the guide.&lt;br /&gt;
Changes done to steps in the guide.&lt;br /&gt;
&lt;br /&gt;
  # jq &#039;.rooms[] | select(.joined_local_members == 0) | .room_id&#039; &amp;lt; roomlist.json | sed -e &#039;s/&amp;quot;//g&#039; &amp;gt; to_purge.txt&lt;br /&gt;
&lt;br /&gt;
The room list obtained this way can, be looped to pass the room names as variables to the purge api. &lt;br /&gt;
&lt;br /&gt;
 # set +H // if you are using bash to avoid &#039;!&#039; in the roomname triggering the history substitution.&lt;br /&gt;
 # for room_id in $(cat to_purge.txt); do curl --header &amp;quot;Authorization: Bearer &amp;lt;your access token&amp;gt;&amp;quot; \&lt;br /&gt;
    -X POST -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;{ \&amp;quot;room_id\&amp;quot;: \&amp;quot;$room_id\&amp;quot; }&amp;quot; \&lt;br /&gt;
    &#039;https://127.0.0.1:8008/_synapse/admin/v1/purge_room&#039;; done;&lt;br /&gt;
&lt;br /&gt;
We also did not remove old history of large rooms.&lt;br /&gt;
&lt;br /&gt;
===Step 1: Postgresql (for synapse) Primary configuration===&lt;br /&gt;
&lt;br /&gt;
Create postgresql user for replication.&lt;br /&gt;
&lt;br /&gt;
 $ psql -c &amp;quot;CREATE USER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD &#039;yourpassword&#039;;&amp;quot;&lt;br /&gt;
The password is in the access repo if you need it later.&lt;br /&gt;
&lt;br /&gt;
Allow standby to connect to primary using the user just created.&lt;br /&gt;
&lt;br /&gt;
 $ cd /etc/postgresql/11/main&lt;br /&gt;
&lt;br /&gt;
 $ nano pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
Add below line to allow replication user to get access to the server&lt;br /&gt;
&lt;br /&gt;
 host    replication     replication     172.16.0.3/32   md5&lt;br /&gt;
&lt;br /&gt;
Next , open the postgres configuration file&lt;br /&gt;
&lt;br /&gt;
 nano postgresql.conf&lt;br /&gt;
&lt;br /&gt;
Set the following configuration options in the postgresql.conf file&lt;br /&gt;
&lt;br /&gt;
 listen_addresses = &#039;localhost,172.16.0.2&#039;&lt;br /&gt;
 port=5432&lt;br /&gt;
 wal_level = replica&lt;br /&gt;
 max_wal_senders = 1&lt;br /&gt;
 wal_keep_segments = 64&lt;br /&gt;
 archive_mode = on&lt;br /&gt;
 archive_command = &#039;cd .&#039;&lt;br /&gt;
&lt;br /&gt;
You need to restart since postgresql.conf was edited and parameters changed,&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart postgresql&lt;br /&gt;
&lt;br /&gt;
===Step 2: Postgresql (for synapse) Standby configuration ===&lt;br /&gt;
&lt;br /&gt;
Install postgresql &lt;br /&gt;
&lt;br /&gt;
 # apt install postgresql&lt;br /&gt;
&lt;br /&gt;
Check postgresql server is running&lt;br /&gt;
&lt;br /&gt;
 # su postgres -c psql&lt;br /&gt;
&lt;br /&gt;
Make sure en_US.UTF-8 locale is available&lt;br /&gt;
&lt;br /&gt;
 # dpkg-reconfigure locales&lt;br /&gt;
&lt;br /&gt;
Stop postgresql before changing any configuration&lt;br /&gt;
&lt;br /&gt;
 #systemctl stop postgresql@11-main&lt;br /&gt;
&lt;br /&gt;
Switch to postgres user&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ cd /etc/postgresql/11/&lt;br /&gt;
&lt;br /&gt;
Copy data from master and create recovery.conf&lt;br /&gt;
&lt;br /&gt;
 $ pg_basebackup -h git.fosscommunity.in -D /var/lib/postgresql/11/main/ -P -U rep --wal-method=fetch  -R&lt;br /&gt;
&lt;br /&gt;
Open the postgres configuration file&lt;br /&gt;
&lt;br /&gt;
 $ nano postgresql.conf&lt;br /&gt;
&lt;br /&gt;
Set the following configuration options in the postgresql.conf file&lt;br /&gt;
&lt;br /&gt;
 max_connections = 500 // This option and the one below are set to be same as in postgresql.conf at primary or the service won&#039;t start.&lt;br /&gt;
 max_worker_processes = 16&lt;br /&gt;
 host_standby = on // The above pg_basebackup command should set it. If it&#039;s not manually turn it to on.&lt;br /&gt;
&lt;br /&gt;
Start the stopped postgresql service&lt;br /&gt;
&lt;br /&gt;
 # systemctl start postgresql@11-main&lt;br /&gt;
&lt;br /&gt;
===Postgresql (for synapse) Replication Status===&lt;br /&gt;
&lt;br /&gt;
On Primary,&lt;br /&gt;
&lt;br /&gt;
 $ ps -ef | grep sender&lt;br /&gt;
 $ psql -c &amp;quot;select * from pg_stat_activity where usename=&#039;rep&#039;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On Standby,&lt;br /&gt;
&lt;br /&gt;
 $ ps -ef | grep receiver&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
== Allow XMPP login even if diaspora account is closed ==&lt;br /&gt;
Diaspora has a [https://github.com/diaspora/diaspora/blob/develop/Changelog.md#new-maintenance-feature-to-automatically-expire-inactive-accounts default setting] to close accounts that have been inactive for 2 years. At the time of writing, there seems [https://github.com/diaspora/diaspora/issues/5358#issuecomment-371921462 no way] to reopen a closed account. This also means that if your account is closed, you will no longer be able to login to the associated XMPP service as well. Here we discuss a workaround to get access back to the XMPP account.&lt;br /&gt;
&lt;br /&gt;
The prosody module [https://gist.github.com/jhass/948e8e8d87b9143f97ad#file-mod_auth_diaspora-lua mod_auth_diaspora] is used for diaspora-based XMPP auth. It checks if &amp;lt;code&amp;gt;locked_at&amp;lt;/code&amp;gt; value in the &amp;lt;code&amp;gt;users&amp;lt;/code&amp;gt; table of diaspora db is &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; [https://gist.github.com/jhass/948e8e8d87b9143f97ad#file-mod_auth_diaspora-lua-L89 here] and [https://gist.github.com/jhass/948e8e8d87b9143f97ad#file-mod_auth_diaspora-lua-L98 here]. If your account is locked, it will have the &amp;lt;code&amp;gt;datetime&amp;lt;/code&amp;gt; value that represents the date and time at which your account is locked. Setting it back to &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; will let you use your XMPP account again.&lt;br /&gt;
&lt;br /&gt;
 -- Replace &amp;lt;username&amp;gt; with actual username of the locked account&lt;br /&gt;
 UPDATE users SET locked_at=NULL WHERE username=&#039;&amp;lt;username&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
NOTE: Matrix account won&#039;t be affected even if the associated diaspora account is closed because it uses a [https://pypi.org/project/synapse-diaspora-auth/ custom auth module] which works differently.&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=11023</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=11023"/>
		<updated>2021-12-02T09:23:04Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* videos.fsci.org.in */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€1.00&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€5.99&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€10.98&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€15.97&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€20.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
| €42&lt;br /&gt;
| €16.05&lt;br /&gt;
|-&lt;br /&gt;
| April 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €11.06&lt;br /&gt;
|-&lt;br /&gt;
| May 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €6.07&lt;br /&gt;
|-&lt;br /&gt;
| June 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €1.08&lt;br /&gt;
|-&lt;br /&gt;
| July 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€3.91&lt;br /&gt;
|-&lt;br /&gt;
| August 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€8.90&lt;br /&gt;
|-&lt;br /&gt;
| September 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€13.89&lt;br /&gt;
|-&lt;br /&gt;
| October 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€18.88&lt;br /&gt;
|-&lt;br /&gt;
| November 2021 &lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€23.87&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ peertube expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021*&lt;br /&gt;
| €3.49&lt;br /&gt;
| €42 + €15&lt;br /&gt;
| €73.47&lt;br /&gt;
|-&lt;br /&gt;
| April 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €68.38&lt;br /&gt;
|-&lt;br /&gt;
| May 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €63.29&lt;br /&gt;
|-&lt;br /&gt;
| June 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €58.20&lt;br /&gt;
|-&lt;br /&gt;
| July 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €53.11&lt;br /&gt;
|-&lt;br /&gt;
| August 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €48.02&lt;br /&gt;
|-&lt;br /&gt;
| September 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €42.93&lt;br /&gt;
|-&lt;br /&gt;
| October 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €37.84&lt;br /&gt;
|-&lt;br /&gt;
| November 2021&lt;br /&gt;
| €5.09&lt;br /&gt;
|&lt;br /&gt;
| €32.75&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Additional 40G storage space added which adds €1.6 to the monthly cost. The total monthly cost is now €5.09. Got €15 sponsorship for the storage space and €42 for hosting charges for one year.&lt;br /&gt;
&lt;br /&gt;
=== git.fosscommunity.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: $47.28 per month&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ git.fosscommunity.in expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| October 2021&lt;br /&gt;
| $30.00&lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| November 2021&lt;br /&gt;
| $104.56&lt;br /&gt;
| $610&lt;br /&gt;
| $505.44&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=11022</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=11022"/>
		<updated>2021-12-02T09:01:35Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* codema.in */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€1.00&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€5.99&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€10.98&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€15.97&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€20.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
| €42&lt;br /&gt;
| €16.05&lt;br /&gt;
|-&lt;br /&gt;
| April 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €11.06&lt;br /&gt;
|-&lt;br /&gt;
| May 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €6.07&lt;br /&gt;
|-&lt;br /&gt;
| June 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €1.08&lt;br /&gt;
|-&lt;br /&gt;
| July 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€3.91&lt;br /&gt;
|-&lt;br /&gt;
| August 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€8.90&lt;br /&gt;
|-&lt;br /&gt;
| September 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€13.89&lt;br /&gt;
|-&lt;br /&gt;
| October 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€18.88&lt;br /&gt;
|-&lt;br /&gt;
| November 2021 &lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€23.87&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ peertube expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021*&lt;br /&gt;
| €3.49&lt;br /&gt;
| €42 + €15&lt;br /&gt;
| €73.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Additional 40G storage space added which adds €1.6 to the monthly cost. The total monthly cost is now €5.09. Got €15 sponsorship for the storage space and €42 for hosting charges for one year.&lt;br /&gt;
&lt;br /&gt;
=== git.fosscommunity.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: $47.28 per month&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ git.fosscommunity.in expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| October 2021&lt;br /&gt;
| $30.00&lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| November 2021&lt;br /&gt;
| $104.56&lt;br /&gt;
| $610&lt;br /&gt;
| $505.44&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Infrastructure&amp;diff=10999</id>
		<title>Infrastructure</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Infrastructure&amp;diff=10999"/>
		<updated>2021-04-01T14:01:41Z</updated>

		<summary type="html">&lt;p&gt;Bady: Add jitsi&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Our machines ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
! Host name&lt;br /&gt;
! Domain &lt;br /&gt;
! Purpose&lt;br /&gt;
! Remarks&lt;br /&gt;
|-&lt;br /&gt;
|mahishasura&lt;br /&gt;
|http://mahishasura.pxq.in&lt;br /&gt;
|Test machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Poddery_-_Diaspora,_Matrix_and_XMPP|poddery]]&lt;br /&gt;
|https://poddery.com&lt;br /&gt;
|diaspora pod, matrix homeserver and xmpp server (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|lists&lt;br /&gt;
|https://lists.fsci.in&lt;br /&gt;
|Mailing list service (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Loomio&lt;br /&gt;
|https://codema.in&lt;br /&gt;
|Loomio service&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|git&lt;br /&gt;
|https://git.fosscommunity.in&lt;br /&gt;
|Gitlab instance (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Mediawiki&lt;br /&gt;
|https://wiki.fsci.org.in/index.php&lt;br /&gt;
|Mediawiki instance (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Peer tube&lt;br /&gt;
|https://videos.fsci.in&lt;br /&gt;
|Peer tube instance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Jitsi&lt;br /&gt;
|https://meet.fsci.in&lt;br /&gt;
|Jitsi instance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Monitor&lt;br /&gt;
|https://monitor.fsci.in&lt;br /&gt;
|For monitoring various services, (grafana)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Open Source Event Manager&lt;br /&gt;
|https://events.fsci.org.in&lt;br /&gt;
|Event management service (production)&lt;br /&gt;
|Currently down&lt;br /&gt;
|-&lt;br /&gt;
|mayasura&lt;br /&gt;
|62.210.83.200 ssh:19022&lt;br /&gt;
|Backup server for diasp.in&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bhasmasura&lt;br /&gt;
|62.210.83.200 ssh:12022 postgres:12432&lt;br /&gt;
|Backup server for git.fosscommunity.in&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|banasura&lt;br /&gt;
|62.210.83.200 ssh:11022 mysql:&lt;br /&gt;
|Backup server for poddery.com&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other services endorsed by FSCI ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
! Host name&lt;br /&gt;
! Domain &lt;br /&gt;
! Purpose&lt;br /&gt;
! Remarks&lt;br /&gt;
|-&lt;br /&gt;
|Discourse&lt;br /&gt;
|https://freesoftwareindia.org/&lt;br /&gt;
|Discourse instance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Mastodon&lt;br /&gt;
|https://social.masto.host/&lt;br /&gt;
|Mastodon instance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|libre infra&lt;br /&gt;
|https://libreinfra.org&lt;br /&gt;
|Email, Next Cloud services&lt;br /&gt;
|Public registration is closed&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Infrastructure&amp;diff=10998</id>
		<title>Infrastructure</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Infrastructure&amp;diff=10998"/>
		<updated>2021-04-01T13:53:46Z</updated>

		<summary type="html">&lt;p&gt;Bady: Update domain names and uptime status&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Our machines ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
! Host name&lt;br /&gt;
! Domain &lt;br /&gt;
! Purpose&lt;br /&gt;
! Remarks&lt;br /&gt;
|-&lt;br /&gt;
|mahishasura&lt;br /&gt;
|http://mahishasura.pxq.in&lt;br /&gt;
|Test machine&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[Poddery_-_Diaspora,_Matrix_and_XMPP|poddery]]&lt;br /&gt;
|https://poddery.com&lt;br /&gt;
|diaspora pod, matrix homeserver and xmpp server (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|lists&lt;br /&gt;
|https://lists.fsci.in&lt;br /&gt;
|Mailing list service (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Loomio&lt;br /&gt;
|https://codema.in&lt;br /&gt;
|Loomio service&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|git&lt;br /&gt;
|https://git.fosscommunity.in&lt;br /&gt;
|Gitlab instance (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Mediawiki&lt;br /&gt;
|https://wiki.fsci.org.in/index.php&lt;br /&gt;
|Mediawiki instance (production)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Peer tube&lt;br /&gt;
|https://videos.fsci.in&lt;br /&gt;
|Peer tube instance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Monitor&lt;br /&gt;
|https://monitor.fsci.in&lt;br /&gt;
|For monitoring various services, (grafana)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Open Source Event Manager&lt;br /&gt;
|https://events.fsci.org.in&lt;br /&gt;
|Event management service (production)&lt;br /&gt;
|Currently down&lt;br /&gt;
|-&lt;br /&gt;
|mayasura&lt;br /&gt;
|62.210.83.200 ssh:19022&lt;br /&gt;
|Backup server for diasp.in&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|bhasmasura&lt;br /&gt;
|62.210.83.200 ssh:12022 postgres:12432&lt;br /&gt;
|Backup server for git.fosscommunity.in&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|banasura&lt;br /&gt;
|62.210.83.200 ssh:11022 mysql:&lt;br /&gt;
|Backup server for poddery.com&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Other services endorsed by FSCI ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
! Host name&lt;br /&gt;
! Domain &lt;br /&gt;
! Purpose&lt;br /&gt;
! Remarks&lt;br /&gt;
|-&lt;br /&gt;
|Discourse&lt;br /&gt;
|https://freesoftwareindia.org/&lt;br /&gt;
|Discourse instance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Mastodon&lt;br /&gt;
|https://social.masto.host/&lt;br /&gt;
|Mastodon instance&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|libre infra&lt;br /&gt;
|https://libreinfra.org&lt;br /&gt;
|Email, Next Cloud services&lt;br /&gt;
|Public registration is closed&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10997</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10997"/>
		<updated>2021-03-30T19:20:16Z</updated>

		<summary type="html">&lt;p&gt;Bady: Fix a minor typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€1.00&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€5.99&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€10.98&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€15.97&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€20.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
| €42&lt;br /&gt;
| €16.05&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021*&lt;br /&gt;
| €3.49&lt;br /&gt;
| €42 + €15&lt;br /&gt;
| €73.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Additional 40G storage space added which adds €1.6 to the monthly cost. The total monthly cost is now €5.09. Got €15 sponsorship for the storage space and €42 for hosting charges for one year.&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10996</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10996"/>
		<updated>2021-03-30T19:19:25Z</updated>

		<summary type="html">&lt;p&gt;Bady: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€1.00&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€5.99&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€10.98&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€15.97&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€20.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
| €42&lt;br /&gt;
| €16.05&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021*&lt;br /&gt;
| €3.49&lt;br /&gt;
| €42 + €15&lt;br /&gt;
| €73.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Additional 40G storage space added which add €1.6 to the monthly cost. The total monthly cost is now €5.09. Got €15 sponsorship for the storage space and €42 for hosting charges for one year.&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10995</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10995"/>
		<updated>2021-03-30T19:03:30Z</updated>

		<summary type="html">&lt;p&gt;Bady: Update codema budget&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€1.00&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€5.99&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€10.98&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€15.97&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| -€20.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €4.99&lt;br /&gt;
| €42&lt;br /&gt;
| €16.05&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021*&lt;br /&gt;
| €3.49&lt;br /&gt;
| €42 + €15&lt;br /&gt;
| €73.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Additional 40G storage space added which add 1.6 to the monthly cost. The total monthly cost is now €5.09. Got €15 sponsorship for the storage space and €42 for hosting charges for one year.&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10994</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10994"/>
		<updated>2021-03-30T18:54:14Z</updated>

		<summary type="html">&lt;p&gt;Bady: Update peertube budget with sponsorship details&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021*&lt;br /&gt;
| €3.49&lt;br /&gt;
| €42 + €15&lt;br /&gt;
| €73.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Additional 40G storage space added which add 1.6 to the monthly cost. The total monthly cost is now €5.09. Got €15 sponsorship for the storage space and €42 for hosting charges for one year.&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10993</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10993"/>
		<updated>2021-03-30T18:47:59Z</updated>

		<summary type="html">&lt;p&gt;Bady: Update peertube budget&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
| €57&lt;br /&gt;
| €73.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10992</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10992"/>
		<updated>2021-03-30T18:20:14Z</updated>

		<summary type="html">&lt;p&gt;Bady: Add cost of poddery&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €25.21 per month.&lt;br /&gt;
&lt;br /&gt;
See the [[poddery]] page for more details.&lt;br /&gt;
&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €16.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10986</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10986"/>
		<updated>2021-03-15T15:22:01Z</updated>

		<summary type="html">&lt;p&gt;Bady: Update videos.fsci.in budget&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €3.49 * 12 =  €41.88 per year&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €47.88&lt;br /&gt;
| €47.88&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €44.39&lt;br /&gt;
|-&lt;br /&gt;
| August 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €40.9&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €37.41&lt;br /&gt;
|-&lt;br /&gt;
| October 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €33.92&lt;br /&gt;
|-&lt;br /&gt;
| November 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €30.43&lt;br /&gt;
|-&lt;br /&gt;
| December 2020&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €26.94&lt;br /&gt;
|-&lt;br /&gt;
| January 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €23.45&lt;br /&gt;
|-&lt;br /&gt;
| February 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €19.96&lt;br /&gt;
|-&lt;br /&gt;
| March 2021&lt;br /&gt;
| €3.49&lt;br /&gt;
|&lt;br /&gt;
| €16.47&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10980</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10980"/>
		<updated>2021-01-29T10:22:26Z</updated>

		<summary type="html">&lt;p&gt;Bady: Fix synapse workers doc link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
* Riot-web Matrix client is hosted at https://chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
&lt;br /&gt;
Boot into rescue system using https://docs.hetzner.com/robot/dedicated-server/troubleshooting/hetzner-rescue-system&lt;br /&gt;
&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw allow http/tcp&lt;br /&gt;
 ufw allow https/tcp&lt;br /&gt;
 ufw allow Turnserver&lt;br /&gt;
 ufw allow XMPP&lt;br /&gt;
 ufw allow 8448&lt;br /&gt;
&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
 &lt;br /&gt;
 # Enable ufw logging with default mode low&lt;br /&gt;
 ufw logging on&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery is running [https://github.com/matrix-org/synapse/blob/master/docs/workers.md workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled:&lt;br /&gt;
&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service matrix-synapse@synchrotron_2.service&lt;br /&gt;
&lt;br /&gt;
To load balance between the 2 synchrotrons, We are running [https://github.com/Sorunome/matrix-synchrotron-balancer matrix-synchrotron-balancer]. It has a systemd file at &amp;lt;code&amp;gt;/etc/systemd/system/matrix-synchrotron-balancer&amp;lt;/code&amp;gt;. The files are in &amp;lt;code&amp;gt;/opt/matrix-synchrotron-balancer&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run the following (make sure to replace &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; with a proper version number like &amp;lt;code&amp;gt;v1.0.0&amp;lt;/code&amp;gt;):&lt;br /&gt;
 /var/www/get-riot &amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Note- letsencrypt executable used below is actually a symlik to /usr/bin/certbot&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
* To include an additional subdomain such as fund.poddery.com use with --expand parameter as shown below&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos --expand -w /usr/share/diaspora/public -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save/ -d save.poddery.com -w /var/www/riot/ -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
==Backup==&lt;br /&gt;
&lt;br /&gt;
Backup server is provided by Manu (KVM virtual machine with 180 GB storage and 1 GB ram ). &lt;br /&gt;
&lt;br /&gt;
Debian Stetch was upgraded Debian Buster before database relication of synapse database. &lt;br /&gt;
&lt;br /&gt;
Documentation: https://www.percona.com/blog/2018/09/07/setting-up-streaming-replication-postgresql/&lt;br /&gt;
&lt;br /&gt;
Currently postgres database for matrix-synapse is backed up.&lt;br /&gt;
&lt;br /&gt;
===Before Replication (specific to poddery.com)===&lt;br /&gt;
&lt;br /&gt;
Setup tinc vpn in the backup server&lt;br /&gt;
&lt;br /&gt;
 # apt install tinc&lt;br /&gt;
&lt;br /&gt;
Configure tinc by creating tinc.conf and host podderybackup under label fsci.&lt;br /&gt;
Add tinc-up and tinc-down scripts&lt;br /&gt;
Copy poddery host config to backup server and podderybackup host config to poddery.com server.&lt;br /&gt;
&lt;br /&gt;
Relaod tinc vpn service at both poddery.com and backup servers&lt;br /&gt;
&lt;br /&gt;
 # systemctl reload tinc@fsci.service&lt;br /&gt;
&lt;br /&gt;
Enable tinc@fsci systemd service for autostart&lt;br /&gt;
&lt;br /&gt;
 # systemctl enable tinc@fsci.service&lt;br /&gt;
&lt;br /&gt;
The synapse database was also pruned to reduce the size before replication by following this guide - https://levans.fr/shrink-synapse-database.html&lt;br /&gt;
If you want to follow this guide, make sure matrix synapse server is updated to version 1.13 atleast since it introduces the Rooms API mentioned the guide.&lt;br /&gt;
Changes done to steps in the guide.&lt;br /&gt;
&lt;br /&gt;
  # jq &#039;.rooms[] | select(.joined_local_members == 0) | .room_id&#039; &amp;lt; roomlist.json | sed -e &#039;s/&amp;quot;//g&#039; &amp;gt; to_purge.txt&lt;br /&gt;
&lt;br /&gt;
The room list obtained this way can, be looped to pass the room names as variables to the purge api. &lt;br /&gt;
&lt;br /&gt;
 # set +H // if you are using bash to avoid &#039;!&#039; in the roomname triggering the history substitution.&lt;br /&gt;
 # for room_id in $(cat to_purge.txt); do curl --header &amp;quot;Authorization: Bearer &amp;lt;your access token&amp;gt;&amp;quot; \&lt;br /&gt;
    -X POST -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;quot;{ \&amp;quot;room_id\&amp;quot;: \&amp;quot;$room_id\&amp;quot; }&amp;quot; \&lt;br /&gt;
    &#039;https://127.0.0.1:8008/_synapse/admin/v1/purge_room&#039;; done;&lt;br /&gt;
&lt;br /&gt;
We also did not remove old history of large rooms.&lt;br /&gt;
&lt;br /&gt;
===Step 1: Postgresql (for synapse) Primary configuration===&lt;br /&gt;
&lt;br /&gt;
Create postgresql user for replication.&lt;br /&gt;
&lt;br /&gt;
 $ psql -c &amp;quot;CREATE USER replication REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD &#039;yourpassword&#039;;&amp;quot;&lt;br /&gt;
The password is in the access repo if you need it later.&lt;br /&gt;
&lt;br /&gt;
Allow standby to connect to primary using the user just created.&lt;br /&gt;
&lt;br /&gt;
 $ cd /etc/postgresql/11/main&lt;br /&gt;
&lt;br /&gt;
 $ nano pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
Add below line to allow replication user to get access to the server&lt;br /&gt;
&lt;br /&gt;
 host    replication     replication     172.16.0.3/32   md5&lt;br /&gt;
&lt;br /&gt;
Next , open the postgres configuration file&lt;br /&gt;
&lt;br /&gt;
 nano postgresql.conf&lt;br /&gt;
&lt;br /&gt;
Set the following configuration options in the postgresql.conf file&lt;br /&gt;
&lt;br /&gt;
 listen_addresses = &#039;localhost,172.16.0.2&#039;&lt;br /&gt;
 port=5432&lt;br /&gt;
 wal_level = replica&lt;br /&gt;
 max_wal_senders = 1&lt;br /&gt;
 wal_keep_segments = 64&lt;br /&gt;
 archive_mode = on&lt;br /&gt;
 archive_command = &#039;cd .&#039;&lt;br /&gt;
&lt;br /&gt;
You need to restart since postgresql.conf was edited and parameters changed,&lt;br /&gt;
&lt;br /&gt;
 # systemctl restart postgresql&lt;br /&gt;
&lt;br /&gt;
===Step 2: Postgresql (for synapse) Standby configuration ===&lt;br /&gt;
&lt;br /&gt;
Install postgresql &lt;br /&gt;
&lt;br /&gt;
 # apt install postgresql&lt;br /&gt;
&lt;br /&gt;
Check postgresql server is running&lt;br /&gt;
&lt;br /&gt;
 # su postgres -c psql&lt;br /&gt;
&lt;br /&gt;
Make sure en_US.UTF-8 locale is available&lt;br /&gt;
&lt;br /&gt;
 # dpkg-reconfigure locales&lt;br /&gt;
&lt;br /&gt;
Stop postgresql before changing any configuration&lt;br /&gt;
&lt;br /&gt;
 #systemctl stop postgresql@11-main&lt;br /&gt;
&lt;br /&gt;
Switch to postgres user&lt;br /&gt;
&lt;br /&gt;
 # su - postgres&lt;br /&gt;
 $ cd /etc/postgresql/11/&lt;br /&gt;
&lt;br /&gt;
Copy data from master and create recovery.conf&lt;br /&gt;
&lt;br /&gt;
 $ pg_basebackup -h git.fosscommunity.in -D /var/lib/postgresql/11/main/ -P -U rep --wal-method=fetch  -R&lt;br /&gt;
&lt;br /&gt;
Open the postgres configuration file&lt;br /&gt;
&lt;br /&gt;
 $ nano postgresql.conf&lt;br /&gt;
&lt;br /&gt;
Set the following configuration options in the postgresql.conf file&lt;br /&gt;
&lt;br /&gt;
 max_connections = 500 // This option and the one below are set to be same as in postgresql.conf at primary or the service won&#039;t start.&lt;br /&gt;
 max_worker_processes = 16&lt;br /&gt;
 host_standby = on // The above pg_basebackup command should set it. If it&#039;s not manually turn it to on.&lt;br /&gt;
&lt;br /&gt;
Start the stopped postgresql service&lt;br /&gt;
&lt;br /&gt;
 # systemctl start postgresql@11-main&lt;br /&gt;
&lt;br /&gt;
===Postgresql (for synapse) Replication Status===&lt;br /&gt;
&lt;br /&gt;
On Primary,&lt;br /&gt;
&lt;br /&gt;
 $ ps -ef | grep sender&lt;br /&gt;
 $ psql -c &amp;quot;select * from pg_stat_activity where usename=&#039;rep&#039;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
On Standby,&lt;br /&gt;
&lt;br /&gt;
 $ ps -ef | grep receiver&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Learn_Debian_Packaging&amp;diff=10977</id>
		<title>Learn Debian Packaging</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Learn_Debian_Packaging&amp;diff=10977"/>
		<updated>2021-01-27T11:13:00Z</updated>

		<summary type="html">&lt;p&gt;Bady: Fix links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are guiding some learners of [https://camp.fsf.org.in Free Software Camp] to learn Debian Packaging and this page will be used to track the progress of the tasks.&lt;br /&gt;
&lt;br /&gt;
== Setting up a Debian Sid environment for packaging ==&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.debian.org/Packaging/Pre-Requisites Different options for setting up a Debian Sid environment]&lt;br /&gt;
&lt;br /&gt;
== Learn basics of Packaging ==&lt;br /&gt;
&lt;br /&gt;
Understand the basic concepts using debmake/dh_make (getting source tarballs, creating source package, building the binary package, making it lintian clean)&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.abrahamraji.in/simple-packaging-tutorial/ Abraham Raji&#039;s simple packaging tutorial]&lt;br /&gt;
* [https://wiki.debian.org/SimplePackagingTutorial Simple Packaging Tutorial on Debian Wiki]&lt;br /&gt;
&lt;br /&gt;
Once you understand the basic concepts, use npm2deb to automate some of those tasks like getting source tarball, a better debian directory template than the ones created by dh_make/debmake as npm2deb knows more details specific to node modules. You will still have to fix the remaining issues flagged by lintian.&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.debian.org/Javascript/Nodejs/Npm2Deb/Tutorial npm2deb Tutorial on Debian Wiki]&lt;br /&gt;
&lt;br /&gt;
By this time you should know creating lintian clean packages for simple modules and building it in a clean environment like sbuild.&lt;br /&gt;
&lt;br /&gt;
== Packaging more complicated modules ==&lt;br /&gt;
&lt;br /&gt;
Once you get a clear picture of packaging a simple module, we can move to the next stage of packaging more complicated modules that will involve things like, modifying some upstream files, removing some files from source tarball, generating some files from source, getting the source tarball from a git commit etc.&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.debian.org/Javascript/Nodejs/Npm2Deb/AdvancedTutorial Advanced tutorial for more complicated modules]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10937</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10937"/>
		<updated>2020-10-07T14:52:42Z</updated>

		<summary type="html">&lt;p&gt;Bady: Add codema expenses&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services. See [https://www.loomio.org/d/7znkc0RX/annual-budget-for-fsci-looking-for-volunteers this discussion for the background].&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
=== codema.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: €2.99 * 12 =  €35.88 per year (₹239.04 * 12 =  ₹2868.48, calculated as of 28/06/2018)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ codema expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| January 2018&lt;br /&gt;
|&lt;br /&gt;
| €35.88&lt;br /&gt;
| €35.88&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| €2.19&lt;br /&gt;
|&lt;br /&gt;
| €33.69&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| €1.76&lt;br /&gt;
|&lt;br /&gt;
| €31.93&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €28.94&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| €3.01&lt;br /&gt;
|&lt;br /&gt;
| €25.93&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €22.94&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €19.95&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €16.96&lt;br /&gt;
|-&lt;br /&gt;
| July 2020&lt;br /&gt;
| €2.99&lt;br /&gt;
|&lt;br /&gt;
| €13.97&lt;br /&gt;
|-&lt;br /&gt;
| August 2020*&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €8.98&lt;br /&gt;
|-&lt;br /&gt;
| September 2020&lt;br /&gt;
| €4.99&lt;br /&gt;
|&lt;br /&gt;
| €3.99&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* *Scaleway increased hosting charges from €2.99 to €4.99 from August 2020&lt;br /&gt;
&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ mailman3 expense&lt;br /&gt;
|-&lt;br /&gt;
! Month&lt;br /&gt;
! Debit&lt;br /&gt;
! Credit&lt;br /&gt;
! Balance&lt;br /&gt;
|-&lt;br /&gt;
| June 2018&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
| ₹ 2855.00&lt;br /&gt;
|-&lt;br /&gt;
| July 2018&lt;br /&gt;
| ₹ 53.62&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2801.38&lt;br /&gt;
|-&lt;br /&gt;
| August 2018&lt;br /&gt;
| ₹ 279.82&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2521.56&lt;br /&gt;
|-&lt;br /&gt;
| September 2018&lt;br /&gt;
| ₹ 259.20&lt;br /&gt;
| &lt;br /&gt;
| ₹ 2262.36&lt;br /&gt;
|-&lt;br /&gt;
| October 2018&lt;br /&gt;
| ₹ 265.07&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1997.29&lt;br /&gt;
|-&lt;br /&gt;
| November 2018&lt;br /&gt;
| ₹ 261.14&lt;br /&gt;
| &lt;br /&gt;
| ₹ 1736.15&lt;br /&gt;
|-&lt;br /&gt;
| December 2018&lt;br /&gt;
| ₹ 250.25&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1485.90&lt;br /&gt;
|-&lt;br /&gt;
| January 2019&lt;br /&gt;
| ₹ 253.69&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1232.21&lt;br /&gt;
|-&lt;br /&gt;
| February 2019&lt;br /&gt;
| ₹ 389.31&lt;br /&gt;
|&lt;br /&gt;
| ₹ 843.21&lt;br /&gt;
|-&lt;br /&gt;
| March 2019&lt;br /&gt;
| ₹ 363.68&lt;br /&gt;
| ₹ 4670.00&lt;br /&gt;
| ₹ 5149.53&lt;br /&gt;
|-&lt;br /&gt;
| April 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4832.00&lt;br /&gt;
|-&lt;br /&gt;
| May 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4514.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 4196.94&lt;br /&gt;
|-&lt;br /&gt;
| July 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3879.41&lt;br /&gt;
|-&lt;br /&gt;
| August 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3561.88&lt;br /&gt;
|-&lt;br /&gt;
| September 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 3244.35&lt;br /&gt;
|-&lt;br /&gt;
| October 2019&lt;br /&gt;
| ₹ 317.53&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2926.77&lt;br /&gt;
|-&lt;br /&gt;
| November 2019&lt;br /&gt;
| ₹ 316.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2609.97&lt;br /&gt;
|-&lt;br /&gt;
| December 2019&lt;br /&gt;
| ₹ 318.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 2291.17&lt;br /&gt;
|-&lt;br /&gt;
| January 2020&lt;br /&gt;
| ₹ 314.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1976.37&lt;br /&gt;
|-&lt;br /&gt;
| February 2020&lt;br /&gt;
| ₹ 317.5&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1658.87&lt;br /&gt;
|-&lt;br /&gt;
| March 2020&lt;br /&gt;
| ₹ 332.7&lt;br /&gt;
|&lt;br /&gt;
| ₹ 1326.17&lt;br /&gt;
|-&lt;br /&gt;
| April 2020&lt;br /&gt;
| ₹ 329.9&lt;br /&gt;
|&lt;br /&gt;
| ₹ 996.27&lt;br /&gt;
|-&lt;br /&gt;
| May 2020&lt;br /&gt;
| ₹ 335.8&lt;br /&gt;
|&lt;br /&gt;
| ₹ 660.47&lt;br /&gt;
|-&lt;br /&gt;
| June 2020&lt;br /&gt;
| ₹ 263.01&lt;br /&gt;
|&lt;br /&gt;
| ₹ 397.46&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: ₹318.99 * 12 =  ₹3827.88 per year&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10812</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10812"/>
		<updated>2019-05-10T13:57:27Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Chat/Matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
* Riot-web Matrix client is hosted at https://chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw allow http/tcp&lt;br /&gt;
 ufw allow https/tcp&lt;br /&gt;
 ufw allow Turnserver&lt;br /&gt;
 ufw allow XMPP&lt;br /&gt;
 ufw allow 8448&lt;br /&gt;
&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
 &lt;br /&gt;
 # Enable ufw logging with default mode low&lt;br /&gt;
 ufw logging on&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery is running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run the following (make sure to replace &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; with a proper version number like &amp;lt;code&amp;gt;v1.0.0&amp;lt;/code&amp;gt;):&lt;br /&gt;
 /var/www/get-riot &amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Note- letsencrypt executable used below is actually a symlik to /usr/bin/certbot&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
* To include an additional subdomain such as fund.poddery.com use with --expand parameter as shown below&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public --expand -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save/ -d save.poddery.com -w /var/www/riot/ -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10811</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10811"/>
		<updated>2019-05-10T13:54:26Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Chat/Matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
* Riot web client is hosted at https://chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw allow http/tcp&lt;br /&gt;
 ufw allow https/tcp&lt;br /&gt;
 ufw allow Turnserver&lt;br /&gt;
 ufw allow XMPP&lt;br /&gt;
 ufw allow 8448&lt;br /&gt;
&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
 &lt;br /&gt;
 # Enable ufw logging with default mode low&lt;br /&gt;
 ufw logging on&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery is running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run the following (make sure to replace &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; with a proper version number like &amp;lt;code&amp;gt;v1.0.0&amp;lt;/code&amp;gt;):&lt;br /&gt;
 /var/www/get-riot &amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Note- letsencrypt executable used below is actually a symlik to /usr/bin/certbot&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
* To include an additional subdomain such as fund.poddery.com use with --expand parameter as shown below&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public --expand -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save/ -d save.poddery.com -w /var/www/riot/ -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10810</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10810"/>
		<updated>2019-05-10T13:50:58Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Riot-web Updation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw allow http/tcp&lt;br /&gt;
 ufw allow https/tcp&lt;br /&gt;
 ufw allow Turnserver&lt;br /&gt;
 ufw allow XMPP&lt;br /&gt;
 ufw allow 8448&lt;br /&gt;
&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
 &lt;br /&gt;
 # Enable ufw logging with default mode low&lt;br /&gt;
 ufw logging on&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery is running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run the following (make sure to replace &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; with a proper version number like &amp;lt;code&amp;gt;v1.0.0&amp;lt;/code&amp;gt;):&lt;br /&gt;
 /var/www/get-riot &amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Note- letsencrypt executable used below is actually a symlik to /usr/bin/certbot&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
* To include an additional subdomain such as fund.poddery.com use with --expand parameter as shown below&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public --expand -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save/ -d save.poddery.com -w /var/www/riot/ -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10809</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10809"/>
		<updated>2019-05-10T13:49:14Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Workers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw allow http/tcp&lt;br /&gt;
 ufw allow https/tcp&lt;br /&gt;
 ufw allow Turnserver&lt;br /&gt;
 ufw allow XMPP&lt;br /&gt;
 ufw allow 8448&lt;br /&gt;
&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
 &lt;br /&gt;
 # Enable ufw logging with default mode low&lt;br /&gt;
 ufw logging on&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery is running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run the following (make sure to replace &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; with a proper version number like v1.0.0):&lt;br /&gt;
 /var/www/get-riot &amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Note- letsencrypt executable used below is actually a symlik to /usr/bin/certbot&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
* To include an additional subdomain such as fund.poddery.com use with --expand parameter as shown below&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public --expand -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save/ -d save.poddery.com -w /var/www/riot/ -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10808</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10808"/>
		<updated>2019-05-10T11:05:03Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Riot-web Updation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw allow http/tcp&lt;br /&gt;
 ufw allow https/tcp&lt;br /&gt;
 ufw allow Turnserver&lt;br /&gt;
 ufw allow XMPP&lt;br /&gt;
 ufw allow 8448&lt;br /&gt;
&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
 &lt;br /&gt;
 # Enable ufw logging with default mode low&lt;br /&gt;
 ufw logging on&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run the following (make sure to replace &amp;lt;code&amp;gt;&amp;lt;version&amp;gt;&amp;lt;/code&amp;gt; with a proper version number like v1.0.0):&lt;br /&gt;
 /var/www/get-riot &amp;lt;version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Note- letsencrypt executable used below is actually a symlik to /usr/bin/certbot&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
* To include an additional subdomain such as fund.poddery.com use with --expand parameter as shown below&lt;br /&gt;
 letsencrypt certonly --webroot --agree-tos -w /usr/share/diaspora/public --expand -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save/ -d save.poddery.com -w /var/www/riot/ -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10805</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10805"/>
		<updated>2019-05-01T18:54:02Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Disk Partitioning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Setup filesystem on the logical volumes&lt;br /&gt;
 mkfs.ext4 /dev/data/log&lt;br /&gt;
 mkfs.ext4 /dev/data/db&lt;br /&gt;
 mkfs.ext4 /dev/data/static&lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run &amp;lt;code&amp;gt;/var/www/get-riot&amp;lt;/code&amp;gt; and reload &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com &lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10804</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10804"/>
		<updated>2019-05-01T18:49:47Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Configuration and Maintenance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
 &lt;br /&gt;
 # Verify everything is setup properly&lt;br /&gt;
 ufw status&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 systemctl restart ssh&lt;br /&gt;
 systemctl enable fail2ban&lt;br /&gt;
 systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 systemctl disable mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/diaspora&lt;br /&gt;
 mv /usr/share/diaspora/public/uploads /var/lib/static/diaspora&lt;br /&gt;
 ln -s /var/lib/static/diaspora/uploads /usr/share/diaspora/public/&lt;br /&gt;
 chown -R diaspora: /var/lib/static/diaspora&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
* Move PostgreSQL data to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop postgresql&lt;br /&gt;
 systemctl disable postgresql&lt;br /&gt;
 mv /var/lib/postgres /var/lib/db/&lt;br /&gt;
 ln -s /var/lib/db/postgres /var/lib/&lt;br /&gt;
 systemctl start postgresql&lt;br /&gt;
&lt;br /&gt;
* Move static files to encrypted partition:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/static&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/static&amp;lt;/code&amp;gt;&lt;br /&gt;
 mkdir /var/lib/static/synapse&lt;br /&gt;
 mv /var/lib/matrix-synapse/uploads /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/uploads /var/lib/matrix-synapse/&lt;br /&gt;
 mv /var/lib/matrix-synapse/media /var/lib/static/synapse/&lt;br /&gt;
 ln -s /var/lib/static/synapse/media /var/lib/matrix-synapse/&lt;br /&gt;
 chown -R matrix-synapse: /var/lib/static/synapse&lt;br /&gt;
&lt;br /&gt;
* Install identity server &amp;lt;code&amp;gt;mxisd&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;deb&amp;lt;/code&amp;gt; package available [https://github.com/kamax-matrix/mxisd/blob/master/docs/install/debian.md here])&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
* For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
* A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
* The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
* Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
* These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
* These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
* First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* Just run &amp;lt;code&amp;gt;/var/www/get-riot&amp;lt;/code&amp;gt; and reload &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
 &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
 &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
* Install plugins&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;mercurial&amp;lt;/code&amp;gt; is installed&lt;br /&gt;
 cd /etc &amp;amp;&amp;amp; hg clone https://hg.prosody.im/prosody-modules/ prosody-modules&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;letsencrypt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
* Generate certificates. For more details see https://certbot.eff.org.&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/diaspora/ssl&lt;br /&gt;
 &#039;&#039;total 0&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 47 Apr  2 22:47 poddery.com-bundle.pem -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 45 Apr  2 22:48 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
 # If you don&#039;t get the above output, then run the following:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/prosody/certs/poddery.com.crt&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/prosody/certs/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com &lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10803</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10803"/>
		<updated>2019-05-01T09:50:58Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Workers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect &amp;lt;code&amp;gt;synapse.app.appservice&amp;lt;/code&amp;gt; is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* https://chat.poddery.com/#/welcome&lt;br /&gt;
  # Backup current riot-web folder from &amp;lt;code&amp;gt;riot&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt;&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  # Transfer the old &amp;lt;code&amp;gt;config.json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home.html&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home-status.html&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/riot/&amp;lt;/code&amp;gt;&lt;br /&gt;
  systemctl reload nginx&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com &lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10802</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10802"/>
		<updated>2019-05-01T09:48:54Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Backend Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Let&#039;s Encrypt&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
* UFW (Uncomplicated Firewall)&lt;br /&gt;
&lt;br /&gt;
=== Intrusion Prevention ===&lt;br /&gt;
* Fail2ban&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* https://chat.poddery.com/#/welcome&lt;br /&gt;
  # Backup current riot-web folder from &amp;lt;code&amp;gt;riot&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt;&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  # Transfer the old &amp;lt;code&amp;gt;config.json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home.html&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home-status.html&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/riot/&amp;lt;/code&amp;gt;&lt;br /&gt;
  systemctl reload nginx&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com &lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10801</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10801"/>
		<updated>2019-05-01T09:45:49Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Diaspora */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Install &amp;lt;code&amp;gt;diaspora-installer&amp;lt;/code&amp;gt; from Debian Buster contrib:&lt;br /&gt;
 apt install diaspora-installer&lt;br /&gt;
&lt;br /&gt;
* Move MySQL data to encrypted partition&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* https://chat.poddery.com/#/welcome&lt;br /&gt;
  # Backup current riot-web folder from &amp;lt;code&amp;gt;riot&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt;&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  # Transfer the old &amp;lt;code&amp;gt;config.json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home.html&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home-status.html&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/riot/&amp;lt;/code&amp;gt;&lt;br /&gt;
  systemctl reload nginx&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com &lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10800</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10800"/>
		<updated>2019-05-01T09:39:19Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Chat/XMPP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* https://chat.poddery.com/#/welcome&lt;br /&gt;
  # Backup current riot-web folder from &amp;lt;code&amp;gt;riot&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt;&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  # Transfer the old &amp;lt;code&amp;gt;config.json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home.html&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home-status.html&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/riot/&amp;lt;/code&amp;gt;&lt;br /&gt;
  systemctl reload nginx&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
=== Set Nginx Conf for BOSH URLS ===&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com &lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10799</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10799"/>
		<updated>2019-05-01T09:33:21Z</updated>

		<summary type="html">&lt;p&gt;Bady: Added Matrix and XMPP configuration&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight.&lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster].&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from the [https://github.com/matrix-org/synapse official GitHub repo].&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GnuPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&amp;lt;code&amp;gt;sda&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;sdb&amp;lt;/code&amp;gt;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&amp;lt;code&amp;gt;md0&amp;lt;/code&amp;gt; - 16GB), boot (&amp;lt;code&amp;gt;md1&amp;lt;/code&amp;gt; - 512MB) and root (&amp;lt;code&amp;gt;md2&amp;lt;/code&amp;gt; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure &amp;lt;code&amp;gt;lvm2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;udev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &amp;lt;code&amp;gt;poddery&amp;lt;/code&amp;gt;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &amp;lt;code&amp;gt;log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;db&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;static&amp;lt;/code&amp;gt;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial]):&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;fail2ban&amp;lt;/code&amp;gt; configured against brute force attacks:&lt;br /&gt;
 # Check for the following line &amp;lt;code&amp;gt;/etc/ssh/sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &amp;lt;code&amp;gt;/var/log/fail2ban.log&amp;lt;/code&amp;gt; to get the banned IP and then run the following&lt;br /&gt;
 # Here &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;/dev/data/db&amp;lt;/code&amp;gt; is mounted to &amp;lt;code&amp;gt;/var/lib/db&amp;lt;/code&amp;gt;&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
 systemctl start mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &amp;lt;code&amp;gt;/etc/diaspora&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/diaspora.conf&amp;lt;/code&amp;gt; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; packages are installed&lt;br /&gt;
 # Grant &amp;lt;code&amp;gt;rwx&amp;lt;/code&amp;gt; permissions for the ssh user to &amp;lt;code&amp;gt;/usr/share/diaspora/public&amp;lt;/code&amp;gt;&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
== Matrix ==&lt;br /&gt;
* See the [https://github.com/matrix-org/synapse/blob/master/INSTALL.md official installation guide] of Synapse for installing from source.&lt;br /&gt;
* Nginx is used as reverse proxy to send requests that has &amp;lt;code&amp;gt;/_matrix/*&amp;lt;/code&amp;gt; in URL to Synapse on port &amp;lt;code&amp;gt;8008&amp;lt;/code&amp;gt;. This is configured in &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Shamil&#039;s [https://git.fosscommunity.in/necessary129/synapse-diaspora-auth Synapse Diaspora Auth] script is used to authenticate Synapse with Diaspora database.&lt;br /&gt;
&lt;br /&gt;
=== Workers ===&lt;br /&gt;
For scalability, Poddery running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something).&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
 matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Synapse Updation ===&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra needs to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
* https://chat.poddery.com/#/welcome&lt;br /&gt;
  # Backup current riot-web folder from &amp;lt;code&amp;gt;riot&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt;&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  # Transfer the old &amp;lt;code&amp;gt;config.json&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home.html&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;home-status.html&amp;lt;/code&amp;gt; from &amp;lt;code&amp;gt;riot-backup&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;/var/www/riot/&amp;lt;/code&amp;gt;&lt;br /&gt;
  systemctl reload nginx&lt;br /&gt;
&lt;br /&gt;
== Chat/XMPP ==&lt;br /&gt;
* Steps for setting up Prosody is given at https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
 # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP and then run the following:&lt;br /&gt;
 mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
 CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
 GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
 systemctl restart prosody&lt;br /&gt;
&lt;br /&gt;
==== Set Nginx Conf for BOSH URLS ====&lt;br /&gt;
&lt;br /&gt;
* Add the following in &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration file to enable the BOSH URL to make JSXC Working:&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.diasporafoundation.org/Integration/Chat#Nginx See here] for more details on &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt; configuration. Alternatively, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt; settings can be found [https://github.com/jsxc/jsxc/wiki/Prepare-apache here].&lt;br /&gt;
&lt;br /&gt;
== TLS ==&lt;br /&gt;
&lt;br /&gt;
* Ensure proper permissions are set for &amp;lt;code&amp;gt;/etc/letsencrypt&amp;lt;/code&amp;gt; and its contents.&lt;br /&gt;
 chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;diaspora&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
&lt;br /&gt;
* Make sure the certificates used by &amp;lt;code&amp;gt;prosody&amp;lt;/code&amp;gt; are symbolic links to letsencrypt default location:&lt;br /&gt;
 ls -l /etc/prosody/certs/&lt;br /&gt;
 &#039;&#039;total 0&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&#039;&#039;&lt;br /&gt;
 &#039;&#039;lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Cron jobs:&lt;br /&gt;
 crontab -e&lt;br /&gt;
 &#039;&#039;30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&#039;&#039;&lt;br /&gt;
 &#039;&#039;32 2 * * 1 /etc/init.d/nginx reload&#039;&#039;&lt;br /&gt;
 &#039;&#039;34 2 * * 1 /etc/init.d/prosody reload&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Manually updating TLS certificate:&lt;br /&gt;
 letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -d fund.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com &lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10798</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10798"/>
		<updated>2019-05-01T07:26:33Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight. &lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster]&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from their [https://github.com/matrix-org/synapse/#synapse-installation official GitHub repo]&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xFBB7061C27CB70C1 - Ranjith Siji&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&#039;&#039;sda&#039;&#039; and &#039;&#039;sdb&#039;&#039;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&#039;&#039;md0&#039;&#039; - 16GB), boot (&#039;&#039;md1&#039;&#039; - 512MB) and root (&#039;&#039;md2&#039;&#039; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure lvm2, udev and cryptsetup packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &#039;&#039;poddery&#039;&#039;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &#039;&#039;data&#039;&#039;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &#039;&#039;log&#039;&#039;, &#039;&#039;db&#039;&#039; and &#039;&#039;static&#039;&#039;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* Firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
 # Check for the following line /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &#039;&#039;/var/log/fail2ban.log&#039;&#039; to get the banned IP and then run the following&lt;br /&gt;
 # Here sshd is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 # Make sure /dev/data/db is mounted to /var/lib/db&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &#039;&#039;/etc/diaspora&#039;&#039; and &#039;&#039;/etc/diaspora.conf&#039;&#039; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure git and acl packages are installed&lt;br /&gt;
 sudo apt-get install git acl&lt;br /&gt;
 &lt;br /&gt;
 # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10797</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10797"/>
		<updated>2019-05-01T07:18:28Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight. &lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster]&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from their [https://github.com/matrix-org/synapse/#synapse-installation official GitHub repo]&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0xB77D2E2E23735427 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&#039;&#039;sda&#039;&#039; and &#039;&#039;sdb&#039;&#039;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&#039;&#039;md0&#039;&#039; - 16GB), boot (&#039;&#039;md1&#039;&#039; - 512MB) and root (&#039;&#039;md2&#039;&#039; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure lvm2, udev and cryptsetup packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &#039;&#039;poddery&#039;&#039;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &#039;&#039;data&#039;&#039;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &#039;&#039;log&#039;&#039;, &#039;&#039;db&#039;&#039; and &#039;&#039;static&#039;&#039;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* Firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
 # Check for the following line /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &#039;&#039;/var/log/fail2ban.log&#039;&#039; to get the banned IP and then run the following&lt;br /&gt;
 # Here sshd is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 # Make sure /dev/data/db is mounted to /var/lib/db&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &#039;&#039;/etc/diaspora&#039;&#039; and &#039;&#039;/etc/diaspora.conf&#039;&#039; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure git and acl packages are installed&lt;br /&gt;
 sudo apt-get install git acl&lt;br /&gt;
 &lt;br /&gt;
 # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10796</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10796"/>
		<updated>2019-05-01T07:18:00Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight. &lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster]&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from their [https://github.com/matrix-org/synapse/#synapse-installation official GitHub repo]&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
* Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
* The following people have their GPG keys in the [[#Server_Access|access file]]:&lt;br /&gt;
** ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
** ID: 0x96EDAB9B2E6B7171 - Balasankar C&lt;br /&gt;
** ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
** ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
** ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
** ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
** ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
** ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
** ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
** ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
** ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
* It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&#039;&#039;sda&#039;&#039; and &#039;&#039;sdb&#039;&#039;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&#039;&#039;md0&#039;&#039; - 16GB), boot (&#039;&#039;md1&#039;&#039; - 512MB) and root (&#039;&#039;md2&#039;&#039; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure lvm2, udev and cryptsetup packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &#039;&#039;poddery&#039;&#039;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &#039;&#039;data&#039;&#039;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &#039;&#039;log&#039;&#039;, &#039;&#039;db&#039;&#039; and &#039;&#039;static&#039;&#039;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* Firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
 # Check for the following line /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &#039;&#039;/var/log/fail2ban.log&#039;&#039; to get the banned IP and then run the following&lt;br /&gt;
 # Here sshd is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 # Make sure /dev/data/db is mounted to /var/lib/db&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &#039;&#039;/etc/diaspora&#039;&#039; and &#039;&#039;/etc/diaspora.conf&#039;&#039; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure git and acl packages are installed&lt;br /&gt;
 sudo apt-get install git acl&lt;br /&gt;
 &lt;br /&gt;
 # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10795</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10795"/>
		<updated>2019-05-01T07:14:54Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Contact */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight. &lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster]&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from their [https://github.com/matrix-org/synapse/#synapse-installation official GitHub repo]&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file:&lt;br /&gt;
* ID: 0xCE1F9C674512C22A - Praveen Arimbrathodiyil (piratepin)&lt;br /&gt;
* ID: 0x96EDAB9B2E6B7171 - Balasankar C&lt;br /&gt;
* ID: 0x5D0064186AF037D9 - Manu Krishnan T V&lt;br /&gt;
* ID: 0x51C954405D432381 - Fayad Fami (fayad)&lt;br /&gt;
* ID: 0x863D4DF2ED9C28EF - Abhijith PA&lt;br /&gt;
* ID: 0x6EF48CCD865A1FFC - Syam G Krishnan (sgk)&lt;br /&gt;
* ID: 0xFD49D0BC6FEAECDA - Sagar Ippalpalli&lt;br /&gt;
* ID: 0x92FDAB42A95FF20C - Pirate Bady (piratesin)&lt;br /&gt;
* ID: 0x0B1955F40C691CCE - Kannan&lt;br /&gt;
* ID: 0x32FF6C6F5B7AE248 - Akhil Varkey&lt;br /&gt;
* ID: 0xEAAFE4A8F39DE34F - Kiran S Kunjumon (hacksk)&lt;br /&gt;
&lt;br /&gt;
It&#039;s recommended to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. Those who are new to GPG can follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&#039;&#039;sda&#039;&#039; and &#039;&#039;sdb&#039;&#039;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&#039;&#039;md0&#039;&#039; - 16GB), boot (&#039;&#039;md1&#039;&#039; - 512MB) and root (&#039;&#039;md2&#039;&#039; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure lvm2, udev and cryptsetup packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &#039;&#039;poddery&#039;&#039;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &#039;&#039;data&#039;&#039;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &#039;&#039;log&#039;&#039;, &#039;&#039;db&#039;&#039; and &#039;&#039;static&#039;&#039;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* Firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
 # Check for the following line /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &#039;&#039;/var/log/fail2ban.log&#039;&#039; to get the banned IP and then run the following&lt;br /&gt;
 # Here sshd is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 # Make sure /dev/data/db is mounted to /var/lib/db&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &#039;&#039;/etc/diaspora&#039;&#039; and &#039;&#039;/etc/diaspora.conf&#039;&#039; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure git and acl packages are installed&lt;br /&gt;
 sudo apt-get install git acl&lt;br /&gt;
 &lt;br /&gt;
 # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10794</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10794"/>
		<updated>2019-04-30T22:08:11Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Configuration and Maintenance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight. &lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster]&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from their [https://github.com/matrix-org/synapse/#synapse-installation official GitHub repo]&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file:&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE), Akhil Varkey (ID: 0x32FF6C6F5B7AE248)&lt;br /&gt;
&lt;br /&gt;
We recommend you to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&#039;&#039;sda&#039;&#039; and &#039;&#039;sdb&#039;&#039;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&#039;&#039;md0&#039;&#039; - 16GB), boot (&#039;&#039;md1&#039;&#039; - 512MB) and root (&#039;&#039;md2&#039;&#039; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure lvm2, udev and cryptsetup packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &#039;&#039;poddery&#039;&#039;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &#039;&#039;data&#039;&#039;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &#039;&#039;log&#039;&#039;, &#039;&#039;db&#039;&#039; and &#039;&#039;static&#039;&#039;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
 &lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* Firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
 # Check for the following line /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &#039;&#039;/var/log/fail2ban.log&#039;&#039; to get the banned IP and then run the following&lt;br /&gt;
 # Here sshd is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 # Make sure /dev/data/db is mounted to /var/lib/db&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &#039;&#039;/etc/diaspora&#039;&#039; and &#039;&#039;/etc/diaspora.conf&#039;&#039; as needed (backup of the current configuration files are available in the [[#Server_Access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure git and acl packages are installed&lt;br /&gt;
 sudo apt-get install git acl&lt;br /&gt;
 &lt;br /&gt;
 # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10793</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10793"/>
		<updated>2019-04-30T22:02:29Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Disk Partitioning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight. &lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster]&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from their [https://github.com/matrix-org/synapse/#synapse-installation official GitHub repo]&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file:&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE), Akhil Varkey (ID: 0x32FF6C6F5B7AE248)&lt;br /&gt;
&lt;br /&gt;
We recommend you to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&#039;&#039;sda&#039;&#039; and &#039;&#039;sdb&#039;&#039;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&#039;&#039;md0&#039;&#039; - 16GB), boot (&#039;&#039;md1&#039;&#039; - 512MB) and root (&#039;&#039;md2&#039;&#039; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure lvm2, udev and cryptsetup packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume named &#039;&#039;poddery&#039;&#039;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &#039;&#039;data&#039;&#039;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named &#039;&#039;log&#039;&#039;, &#039;&#039;db&#039;&#039; and &#039;&#039;static&#039;&#039;&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* Firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
 # Check for the following line /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &#039;&#039;/var/log/fail2ban.log&#039;&#039; to get the banned IP and then run the following&lt;br /&gt;
 # Here sshd is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 # Make sure /dev/data/db is mounted to /var/lib/db&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &#039;&#039;/etc/diaspora&#039;&#039; and &#039;&#039;/etc/diaspora.conf&#039;&#039; as needed (backup of the current configuration files are available in the [[#Server_access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure git and acl packages are installed&lt;br /&gt;
 sudo apt-get install git acl&lt;br /&gt;
 &lt;br /&gt;
 # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10792</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10792"/>
		<updated>2019-04-30T22:01:08Z</updated>

		<summary type="html">&lt;p&gt;Bady: Updated according to the current setup in Hetzner server&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run decentralized and federated [https://diasporafoundation.org/ Diaspora] social netowrk, [https://xmpp.org/ XMPP] and [https://matrix.org Matrix] instant messaging services at [https://poddery.com poddery.com]. Along with Diaspora, Poddery username and password can be used to access XMPP and Matrix services as well. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
Poddery is hosted at [https://www.hetzner.com Hetzner] with the following specs:&lt;br /&gt;
&lt;br /&gt;
* Intel Xeon E3-1246V3 Process - 4 Cores, 3.5GHz&lt;br /&gt;
* 4TB HDD&lt;br /&gt;
* 32GB DDR3 RAM&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
* Debian Buster&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
* Currently installed version is 0.7.6.1 which is available in [https://packages.debian.org/buster/diaspora-installer Debian Buster contrib]&lt;br /&gt;
* For live statistics see https://poddery.com/statistics&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
* [https://prosody.im/ Prosody] is used as the XMPP server which is modern and lightweight. &lt;br /&gt;
* Currently installed version is 0.11.2 which is available in [https://packages.debian.org/buster/prosody Debian Buster]&lt;br /&gt;
* All XEPs are enabled which the [https://conversations.im/ Conversations app] support.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
* [https://matrix.org/docs/projects/server/synapse.html Synapse] is used as the Matrix server.&lt;br /&gt;
* Synapse is currently installed directly from their [https://github.com/matrix-org/synapse/#synapse-installation official GitHub repo]&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
Homepage and other static pages are maintained in FSCI [https://git.fosscommunity.in GitLab instance]. &lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
* fund.poddery.com -&amp;gt; https://git.fosscommunity.in/community/fund-poddery&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== Web Server / Reverse Proxy ===&lt;br /&gt;
* Nginx web server which also acts as front-end (reverse proxy) for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== Database ===&lt;br /&gt;
* PostgreSQL for Matrix&lt;br /&gt;
* MySQL for Diaspora&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;TODO&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== Email ===&lt;br /&gt;
* Exim&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
* Letsencrypt&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
* [https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group Loomio group] - Mainly used for decision making&lt;br /&gt;
* Matrix room - [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues Issue tracker] - Used for tracking progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file:&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE), Akhil Varkey (ID: 0x32FF6C6F5B7AE248)&lt;br /&gt;
&lt;br /&gt;
We recommend you to setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
Maintained in a private git repo at https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Configuration and Maintenance =&lt;br /&gt;
== Disk Partitioning ==&lt;br /&gt;
* RAID 1 setup on 2x2TB HDDs (&#039;&#039;sda&#039;&#039; and &#039;&#039;sdb&#039;&#039;).&lt;br /&gt;
 mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
* Separate partitions for swap (&#039;&#039;md0&#039;&#039; - 16GB), boot (&#039;&#039;md1&#039;&#039; - 512MB) and root (&#039;&#039;md2&#039;&#039; - 50GB).&lt;br /&gt;
* LVM on Luks for separate encrypted data partitions for database, static files and logs.&lt;br /&gt;
 # Setup LUKS (make sure lvm2, udev and cryptsetup packages are installed).&lt;br /&gt;
 cryptsetup luksFormat /dev/mdX&lt;br /&gt;
 # Give disk encryption password as specified in the [[#Server_access|access repo]]&lt;br /&gt;
 cryptsetup luksOpen /dev/mdX poddery&lt;br /&gt;
 &lt;br /&gt;
 # LVM Setup&lt;br /&gt;
 # Create physical volume name &#039;&#039;&#039;poddery&#039;&#039;&#039;&lt;br /&gt;
 pvcreate /dev/mapper/poddery&lt;br /&gt;
 # Create volume group named &#039;&#039;&#039;data&#039;&#039;&#039;&lt;br /&gt;
 vgcreate data /dev/mapper/poddery&lt;br /&gt;
 # Create logical volumes named log, db and static&lt;br /&gt;
 lvcreate -n log /dev/data -L 50G&lt;br /&gt;
 lvcreate -n db /dev/data -L 500G&lt;br /&gt;
 # Assign remaining free space for static files&lt;br /&gt;
 lvcreate -n static /dev/data -l 100%FREE &lt;br /&gt;
 &lt;br /&gt;
 # Create directories for mounting the encrypted partitions&lt;br /&gt;
 mkdir /var/lib/db /var/lib/static /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
 # Manually mount encrypted partitions. This is needed on each reboot as Hetzner doesn&#039;t provide a web console so that we can&#039;t decrypt the partitions during booting.&lt;br /&gt;
 mount /dev/data/db /var/lib/db&lt;br /&gt;
 mount /dev/data/static /var/lib/static&lt;br /&gt;
 mount /dev/data/log /var/log/poddery&lt;br /&gt;
&lt;br /&gt;
== Hardening checklist ==&lt;br /&gt;
* SSH password based login disabled (allow only key based logins)&lt;br /&gt;
* SSH login disabled for root user (use a normal user with sudo)&lt;br /&gt;
 # Check for the following settings in /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 ...&lt;br /&gt;
 PasswordAuthentication no&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
* Firewall enabled with only the ports that needs to be opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
 ufw default deny incoming&lt;br /&gt;
 ufw default allow outgoing&lt;br /&gt;
 ufw allow ssh&lt;br /&gt;
 ufw enable&lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
 # Check for the following line /etc/ssh/sshd_config:&lt;br /&gt;
 ...&lt;br /&gt;
 LogLevel VERBOSE&lt;br /&gt;
 ...&lt;br /&gt;
 &lt;br /&gt;
 # Restart SSH and enable fail2ban&lt;br /&gt;
 sudo systemctl restart ssh&lt;br /&gt;
 sudo systemctl enable fail2ban&lt;br /&gt;
 sudo systemctl start fail2ban&lt;br /&gt;
 &lt;br /&gt;
 # To unban an IP, first check &#039;&#039;/var/log/fail2ban.log&#039;&#039; to get the banned IP and then run the following&lt;br /&gt;
 # Here sshd is the defaut jail name, change it if you are using a different jail&lt;br /&gt;
 fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Diaspora ==&lt;br /&gt;
* Diaspora installation and configuration:&lt;br /&gt;
 apt install diaspora-isntaller&lt;br /&gt;
 &lt;br /&gt;
 # Move MySQL data to encrypted partition&lt;br /&gt;
 systemctl stop mysql&lt;br /&gt;
 # Make sure /dev/data/db is mounted to /var/lib/db&lt;br /&gt;
 mv /var/lib/mysql /var/lib/db&lt;br /&gt;
 ln -s /var/lib/db/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
* Modify configuration files at &#039;&#039;/etc/diaspora&#039;&#039; and &#039;&#039;/etc/diaspora.conf&#039;&#039; as needed (backup of the current configuration files are available in the [[#Server_access|access repo]]).&lt;br /&gt;
* Homepage configuration:&lt;br /&gt;
 # Make sure git and acl packages are installed&lt;br /&gt;
 sudo apt-get install git acl&lt;br /&gt;
 &lt;br /&gt;
 # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
 sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
 &lt;br /&gt;
 # Clone poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public&lt;br /&gt;
 git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
 cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
 cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* [https://save.poddery.com Save Poddery] repo is maintained as a sub module in poddery.com repo. See this [https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ tutorial] for working with git submodules. &lt;br /&gt;
 # Clone save.poddery.com repo&lt;br /&gt;
 cd /usr/share/diaspora/public/save&lt;br /&gt;
 git submodule init&lt;br /&gt;
 git submodule update&lt;br /&gt;
&lt;br /&gt;
= History =&lt;br /&gt;
* [[Poddery/Archive|See here]] for the archive of Poddery wiki page before the migration to Hetzner.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery/Archive&amp;diff=10791</id>
		<title>Poddery/Archive</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery/Archive&amp;diff=10791"/>
		<updated>2019-04-30T19:15:06Z</updated>

		<summary type="html">&lt;p&gt;Bady: Archive of Poddery setup before migrating to Hetzner&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* Create partitions root, boot and swap.&lt;br /&gt;
* Setup RAID 1:&lt;br /&gt;
   mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n log /dev/data -L &amp;lt;size_of_disk&amp;gt; # currently 50G&lt;br /&gt;
  sudo lvcreate -n db /dev/data -L &amp;lt;size_of_disk&amp;gt; #currently 500G&lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -l 100%FREE&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
==== Set Nginx Conf for BOSH URLS ====&lt;br /&gt;
&lt;br /&gt;
* Add this configuration in nginx configuration file to enable the BOSH url to make JSXC Working.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nginx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plz look [https://wiki.diasporafoundation.org/Integration/Chat#Nginx here] for more details. And apache settings [https://github.com/jsxc/jsxc/wiki/Prepare-apache here] :)&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database&lt;br /&gt;
&lt;br /&gt;
==== Workers ====&lt;br /&gt;
&lt;br /&gt;
For scalability, we are running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers. (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something.)&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
  matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
==== Upgrade ====&lt;br /&gt;
&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra need to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade-synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
  https://chat.poddery.com/#/welcome&lt;br /&gt;
  Backup current riot-web folder from riot to riot-backup&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  Transfer the old config.json,home.html,home-status.html from riot-backup to /var/www/riot/&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
NOTE: This service has been disabled since the community decided that XMPP service no longer needs to be served via port 443, see this [https://www.loomio.org/d/xSiI8FGT/xmpp-service-on-port-443-and-sslh-complexity loomio post] for more details.&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues issue tracker] - we use this to track progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10789</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10789"/>
		<updated>2019-04-01T12:26:19Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* System health check */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* Create partitions root, boot and swap.&lt;br /&gt;
* Setup RAID 1:&lt;br /&gt;
   mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n log /dev/data -L &amp;lt;size_of_disk&amp;gt; # currently 50G&lt;br /&gt;
  sudo lvcreate -n db /dev/data -L &amp;lt;size_of_disk&amp;gt; #currently 500G&lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -l 100%FREE&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
==== Set Nginx Conf for BOSH URLS ====&lt;br /&gt;
&lt;br /&gt;
* Add this configuration in nginx configuration file to enable the BOSH url to make JSXC Working.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nginx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plz look [https://wiki.diasporafoundation.org/Integration/Chat#Nginx here] for more details. And apache settings [https://github.com/jsxc/jsxc/wiki/Prepare-apache here] :)&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database&lt;br /&gt;
&lt;br /&gt;
==== Workers ====&lt;br /&gt;
&lt;br /&gt;
For scalability, we are running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers. (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something.)&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
  matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
==== Upgrade ====&lt;br /&gt;
&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra need to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade_synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
  https://chat.poddery.com/#/welcome&lt;br /&gt;
  Backup current riot-web folder from riot to riot-backup&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  Transfer the old config.json,home.html,home-status.html from riot-backup to /var/www/riot/&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
NOTE: This service has been disabled since the community decided that XMPP service no longer needs to be served via port 443, see this [https://www.loomio.org/d/xSiI8FGT/xmpp-service-on-port-443-and-sslh-complexity loomio post] for more details.&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues issue tracker] - we use this to track progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10788</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10788"/>
		<updated>2019-04-01T12:15:33Z</updated>

		<summary type="html">&lt;p&gt;Bady: Add a new raid array to software RAID&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* Create partitions root, boot and swap.&lt;br /&gt;
* Setup RAID 1:&lt;br /&gt;
   mdadm --verbose --create /dev/mdX --level=mirror --raid-devices=2 /dev/sdaY /dev/sdbY&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -L &amp;lt;size_of_disk&amp;gt;&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
==== Set Nginx Conf for BOSH URLS ====&lt;br /&gt;
&lt;br /&gt;
* Add this configuration in nginx configuration file to enable the BOSH url to make JSXC Working.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nginx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plz look [https://wiki.diasporafoundation.org/Integration/Chat#Nginx here] for more details. And apache settings [https://github.com/jsxc/jsxc/wiki/Prepare-apache here] :)&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database&lt;br /&gt;
&lt;br /&gt;
==== Workers ====&lt;br /&gt;
&lt;br /&gt;
For scalability, we are running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers. (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something.)&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
  matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
==== Upgrade ====&lt;br /&gt;
&lt;br /&gt;
First check [https://github.com/matrix-org/synapse/blob/master/UPGRADE.rst synapse/UPGRADE.rst] to see if anything extra need to be done. Then, just run &amp;lt;code&amp;gt;/root/upgrade_synapse&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
=== Riot-web Updation === &lt;br /&gt;
  https://chat.poddery.com/#/welcome&lt;br /&gt;
  Backup current riot-web folder from riot to riot-backup&lt;br /&gt;
  wget https://github.com/vector-im/riot-web/releases/download/v1.0.1/riot-v1.0.1.tar.gz&lt;br /&gt;
  tar -xvf riot-v1.01.tar.gz &lt;br /&gt;
  cp -r riot-v1.0.1/* /var/www/riot/&lt;br /&gt;
  rm -rf ./riot-v1.0.1*&lt;br /&gt;
  Transfer the old config.json,home.html,home-status.html from riot-backup to /var/www/riot/&lt;br /&gt;
  systemctl restart nginx&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
NOTE: This service has been disabled since the community decided that XMPP service no longer needs to be served via port 443, see this [https://www.loomio.org/d/xSiI8FGT/xmpp-service-on-port-443-and-sslh-complexity loomio post] for more details.&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues issue tracker] - we use this to track progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10766</id>
		<title>Loomio/Archive 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10766"/>
		<updated>2019-02-02T17:04:44Z</updated>

		<summary type="html">&lt;p&gt;Bady: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://freesoftwareindia.org/ Loomio] instance at https://codema.fsci.org.in. Loomio is a &#039;&#039;&#039;co&#039;&#039;&#039;llaborative &#039;&#039;&#039;de&#039;&#039;&#039;cision-&#039;&#039;&#039;ma&#039;&#039;&#039;king platform (hence we&#039;re using the name &#039;&#039;&#039;codema&#039;&#039;&#039;) where users can initiate discussions and put up proposals. &lt;br /&gt;
&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We were now on a [https://www.scaleway.com/virtual-cloud-servers START1-S instance] virtual cloud server with the following specs:&lt;br /&gt;
&lt;br /&gt;
* 2 x86-64 bit Cores&lt;br /&gt;
* 2 GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 200 Mbit/s Bandwidth&lt;br /&gt;
* 1 Reserved IP (v4)&lt;br /&gt;
* €3.99/Month&lt;br /&gt;
&lt;br /&gt;
== Coordination ==&lt;br /&gt;
&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#codema:poddery.com #codema:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
We were on a [https://www.scaleway.com/virtual-cloud-servers VC1S instance] virtual cloud server with the following specs until 31/01/2019.&lt;br /&gt;
&lt;br /&gt;
* 2 x86-64 bit Cores&lt;br /&gt;
* 2GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 200Mbit/s Unmetered bandwidth&lt;br /&gt;
* €2.99/Month&lt;br /&gt;
&lt;br /&gt;
On 01/02/2019 our server was taken down by [https://scaleway.com Scaleway] quoting payment issues. Payment was failing even after updating the credit card details and following that our server got deleted without proper notifications from Scaleway&#039;s side. Screenshot of the email from Scaleway attached below. Fortunately we were provided with a snapshot of the server from which we were able to recover codema to a new server.&lt;br /&gt;
&lt;br /&gt;
[[File:]]&lt;br /&gt;
&lt;br /&gt;
=== Codema recovery process ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Here&#039;s a brief description of how codema was recovered after the server take down on 01/01/2019:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Under &#039;Snapshots&#039; tab in the Scaleway dashboard we were provided with the snapshot (backup) of our codema server. A system image was created from this snapshot and it was used to create a new server with similar specifications. We lost our public IP along with the old server, so a new IP was assigned to the server and then updated the DNS A record of codema.fsci.org.in to point to this new IP. Once the server was up loomio was restarted using the following commands from the loomio installation directory:&lt;br /&gt;
&lt;br /&gt;
  docker-compose down&lt;br /&gt;
  docker-compose up -d&lt;br /&gt;
&lt;br /&gt;
The logs were checked for errors using the following command:&lt;br /&gt;
&lt;br /&gt;
  docker-compose logs -f&lt;br /&gt;
&lt;br /&gt;
Loomio wasn&#039;t getting started saying the port 25 was already in use. So the application using that port (which was exim4 in this case) was killed and loomio was restarted again.&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10737</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10737"/>
		<updated>2018-10-14T10:17:44Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* sslh */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -L &amp;lt;size_of_disk&amp;gt;&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
==== Set Nginx Conf for BOSH URLS ====&lt;br /&gt;
&lt;br /&gt;
* Add this configuration in nginx configuration file to enable the BOSH url to make JSXC Working.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nginx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plz look [https://wiki.diasporafoundation.org/Integration/Chat#Nginx here] for more details. And apache settings [https://github.com/jsxc/jsxc/wiki/Prepare-apache here] :)&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database&lt;br /&gt;
&lt;br /&gt;
==== Workers ====&lt;br /&gt;
&lt;br /&gt;
For scalability, we are running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers. (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something.)&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
  matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
NOTE: This service has been disabled since the community decided that XMPP service no longer needs to be served via port 443, see this [https://www.loomio.org/d/xSiI8FGT/xmpp-service-on-port-443-and-sslh-complexity loomio post] for more details.&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues issue tracker] - we use this to track progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10736</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10736"/>
		<updated>2018-10-14T10:14:27Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* sslh */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -L &amp;lt;size_of_disk&amp;gt;&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
==== Set Nginx Conf for BOSH URLS ====&lt;br /&gt;
&lt;br /&gt;
* Add this configuration in nginx configuration file to enable the BOSH url to make JSXC Working.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nginx&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 upstream chat_cluster {&lt;br /&gt;
   server localhost:5280;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 location /http-bind {&lt;br /&gt;
   proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
   proxy_set_header Host $http_host;&lt;br /&gt;
   proxy_set_header X-Forwarded-Proto https;&lt;br /&gt;
   proxy_redirect off;&lt;br /&gt;
   proxy_connect_timeout 5;&lt;br /&gt;
   proxy_buffering       off;&lt;br /&gt;
   proxy_read_timeout    70;&lt;br /&gt;
   keepalive_timeout     70;&lt;br /&gt;
   send_timeout          70;&lt;br /&gt;
   client_max_body_size 4M;&lt;br /&gt;
   client_body_buffer_size 128K;&lt;br /&gt;
   proxy_pass http://chat_cluster;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Plz look [https://wiki.diasporafoundation.org/Integration/Chat#Nginx here] for more details. And apache settings [https://github.com/jsxc/jsxc/wiki/Prepare-apache here] :)&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database&lt;br /&gt;
&lt;br /&gt;
==== Workers ====&lt;br /&gt;
&lt;br /&gt;
For scalability, we are running [https://github.com/matrix-org/synapse/blob/master/docs/workers.rst workers]. Currently all workers specified in that page, expect `synapse.app.appservice` is running on poddery.com&lt;br /&gt;
&lt;br /&gt;
A new service [https://gist.github.com/necessary129/5dfbb140e4727496b0ad2bf801c10fdc &amp;lt;code&amp;gt;matrix-synapse@.service&amp;lt;/code&amp;gt;] is installed for the workers. (Save the &amp;lt;code&amp;gt;synape_worker&amp;lt;/code&amp;gt; file somewhere like &amp;lt;code&amp;gt;/usr/local/bin/&amp;lt;/code&amp;gt; or something.)&lt;br /&gt;
&lt;br /&gt;
The worker config can be found at &amp;lt;code&amp;gt;/etc/matrix-synapse/workers&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Synapse needs to be put under a reverse proxy see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/matrix&amp;lt;/code&amp;gt;. A lot of &amp;lt;code&amp;gt;/_matrix/&amp;lt;/code&amp;gt; urls needs to be overridden too see &amp;lt;code&amp;gt;/etc/nginx/sites-enabled/diaspora&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These lines must be added to &amp;lt;code&amp;gt;homeserver.yaml&amp;lt;/code&amp;gt; as we are running &amp;lt;code&amp;gt;media_repository&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;federation_sender&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pusher&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;user_dir&amp;lt;/code&amp;gt; workers respectively:&lt;br /&gt;
&lt;br /&gt;
  enable_media_repo: False&lt;br /&gt;
  send_federation: False&lt;br /&gt;
  start_pushers: False&lt;br /&gt;
  update_user_directory: false&lt;br /&gt;
&lt;br /&gt;
These services must be enabled, and added to &amp;lt;code&amp;gt;Requires&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Before&amp;lt;/code&amp;gt; sections of the original &amp;lt;code&amp;gt;matrix-synapse.service&amp;lt;/code&amp;gt;:&lt;br /&gt;
  matrix-synapse@synchrotron.service matrix-synapse@federation_reader.service matrix-synapse@event_creator.service matrix-synapse@federation_sender.service matrix-synapse@pusher.service matrix-synapse@user_dir.service matrix-synapse@media_repository.service matrix-synapse@frontend_proxy.service matrix-synapse@client_reader.service&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
NOTE: This service has been disabled since the community decided that XMPP service no longer needs to be served via port 443, see this loomio post for more details.&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
* [https://git.fosscommunity.in/community/poddery.com/issues issue tracker] - we use this to track progress of tasks&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Budget&amp;diff=10695</id>
		<title>Budget</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Budget&amp;diff=10695"/>
		<updated>2018-06-29T16:52:13Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Budget details of FSCI managed services.&lt;br /&gt;
&lt;br /&gt;
== Domains ==&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
=== poddery.com ===&lt;br /&gt;
=== codema.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: ₹239.04 * 12 =  ₹2868.48 per year&lt;br /&gt;
=== lists.fsci.org.in ===&lt;br /&gt;
=== videos.fsci.org.in ===&lt;br /&gt;
&lt;br /&gt;
Hosting charges: ₹318.99 * 12 =  ₹3827.88 per year&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10693</id>
		<title>Loomio/Archive 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10693"/>
		<updated>2018-06-26T09:39:07Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Hosting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://freesoftwareindia.org/ Loomio] instance at https://codema.fsci.org.in. Loomio is a &#039;&#039;&#039;co&#039;&#039;&#039;llaborative &#039;&#039;&#039;de&#039;&#039;&#039;cision-&#039;&#039;&#039;ma&#039;&#039;&#039;king platform (hence we&#039;re using the name &#039;&#039;&#039;codema&#039;&#039;&#039;) where users can initiate discussions and put up proposals. &lt;br /&gt;
&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/virtual-cloud-servers VC1S instance] of scaleway.com virtual cloud server.&lt;br /&gt;
&lt;br /&gt;
* 2 x86 64bit Cores&lt;br /&gt;
* 2GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 200Mbit/s Unmetered bandwidth&lt;br /&gt;
* €2.99 Per Month&lt;br /&gt;
&lt;br /&gt;
== Coordination ==&lt;br /&gt;
&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#codema:poddery.com #codema:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10692</id>
		<title>Loomio/Archive 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10692"/>
		<updated>2018-06-25T16:58:41Z</updated>

		<summary type="html">&lt;p&gt;Bady: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://freesoftwareindia.org/ Loomio] instance at https://codema.fsci.org.in. Loomio is a &#039;&#039;&#039;co&#039;&#039;&#039;llaborative &#039;&#039;&#039;de&#039;&#039;&#039;cision-&#039;&#039;&#039;ma&#039;&#039;&#039;king platform (hence we&#039;re using the name &#039;&#039;&#039;codema&#039;&#039;&#039;) where users can initiate discussions and put up proposals. &lt;br /&gt;
&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/virtual-cloud-servers VC1S instance] of scaleway.com virtual cloud server.&lt;br /&gt;
&lt;br /&gt;
== Coordination ==&lt;br /&gt;
&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#codema:poddery.com #codema:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10691</id>
		<title>Loomio/Archive 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Loomio/Archive_1&amp;diff=10691"/>
		<updated>2018-06-25T16:55:43Z</updated>

		<summary type="html">&lt;p&gt;Bady: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://freesoftwareindia.org/ Loomio] instance at https://codema.fsci.org.in. Loomio is a &#039;&#039;&#039;co&#039;&#039;&#039;llaborative &#039;&#039;&#039;de&#039;&#039;&#039;cision-&#039;&#039;&#039;ma&#039;&#039;&#039;king platform (hence we&#039;re using the name &#039;&#039;&#039;codema&#039;&#039;&#039;) where users can initiate discussions and put up proposals. &lt;br /&gt;
&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/virtual-cloud-servers VC1S instance] of scaleway.com virtual cloud server].&lt;br /&gt;
&lt;br /&gt;
== Coordination ==&lt;br /&gt;
&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#codema:poddery.com #codema:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
[[Category: Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10663</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10663"/>
		<updated>2018-03-25T10:48:50Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* exim4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -L &amp;lt;size_of_disk&amp;gt;&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database (Note: PyPi package is outdated, hence install from git)&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10662</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10662"/>
		<updated>2018-03-25T10:05:45Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Chat/Matrix */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -L &amp;lt;size_of_disk&amp;gt;&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database (Note: PyPi package is outdated, hence install from git)&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim4 ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10661</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10661"/>
		<updated>2018-03-25T09:19:39Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Backend Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -L &amp;lt;size_of_disk&amp;gt;&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database.&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== exim4 ===&lt;br /&gt;
&lt;br /&gt;
For sending emails.&lt;br /&gt;
 sudo dpkg-reconfigure exim4-config&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com -w /var/www/riot -d chat.poddery.com&lt;br /&gt;
&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
Make sure the certificates used by prosody are symbolic links to letsencrypt default location.&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
	<entry>
		<id>https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10654</id>
		<title>Poddery - Diaspora, Matrix and XMPP</title>
		<link rel="alternate" type="text/html" href="https://wiki.fsci.in/index.php?title=Poddery_-_Diaspora,_Matrix_and_XMPP&amp;diff=10654"/>
		<updated>2018-02-16T17:44:28Z</updated>

		<summary type="html">&lt;p&gt;Bady: /* Handling critical data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We run Diaspora, XMPP and Matrix services at [https://poddery.com poddery.com]. Diaspora username and password can be used to access XMPP and Matrix services. [https://chat.poddery.com chat.poddery.com] provides Riot client (accessed by a web browser), which can be used to connect to any Matrix server without installing a Riot app/client.&lt;br /&gt;
&lt;br /&gt;
= Environment =&lt;br /&gt;
== Hosting ==&lt;br /&gt;
We are on a [https://www.scaleway.com/baremetal-cloud-servers/ C2S instance of scaleway.com bare metal cloud server].&lt;br /&gt;
&lt;br /&gt;
* 4 Dedicated x86 64bit Cores&lt;br /&gt;
* 8GB Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* 300Mbit/s Unmetered bandwidth&lt;br /&gt;
* 2.5Gbit/s Internal bandwidth &lt;br /&gt;
* €11.99 Per Month&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Due to performance issues we are migrating to a new server ([https://www.scaleway.com/baremetal-cloud-servers/ C2M instance of scaleway.com]) with the following specs:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;8&#039;&#039;&#039; Dedicated x86 64bit Cores&lt;br /&gt;
* &#039;&#039;&#039;16GB&#039;&#039;&#039; Memory&lt;br /&gt;
* 50GB SSD Disk&lt;br /&gt;
* 1 Flexible Public IPv4&lt;br /&gt;
* &#039;&#039;&#039;500Mbit/s&#039;&#039;&#039; Unmeterd bandwidth&lt;br /&gt;
* &#039;&#039;&#039;5Gbit/s&#039;&#039;&#039; Internal bandwidth&lt;br /&gt;
* &#039;&#039;&#039;€17.99&#039;&#039;&#039; Per Month&lt;br /&gt;
* Extra &#039;&#039;&#039;150GB&#039;&#039;&#039; SSD&lt;br /&gt;
* Total &#039;&#039;&#039;€20.99&#039;&#039;&#039; Per Month&lt;br /&gt;
&lt;br /&gt;
== Operating System ==&lt;br /&gt;
&lt;br /&gt;
We run Debian 9 Stretch image provided by Scaleway, with latest security updates applied.&lt;br /&gt;
&lt;br /&gt;
=== Hardening checklist ===&lt;br /&gt;
* SSH password login disabled (allow only key based logins)&lt;br /&gt;
* root SSH login disabled (use a normal user with sudo)&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  PermitRootLogin no&lt;br /&gt;
  ...&lt;br /&gt;
  PasswordAuthentication no&lt;br /&gt;
  ...&lt;br /&gt;
* Firewall enabled with only the ports we need opened ([https://fxdata.cloud/tutorials/set-up-a-firewall-with-ufw-on-ubuntu-16-04 ufw tutorial])&lt;br /&gt;
  sudo ufw default deny incoming&lt;br /&gt;
  sudo ufw default allow outgoing&lt;br /&gt;
  sudo ufw allow ssh&lt;br /&gt;
  sudo ufw enable&lt;br /&gt;
Currently ufw is disabled as it is crashing the server. &lt;br /&gt;
&lt;br /&gt;
* fail2ban configured against brute force attacks&lt;br /&gt;
&#039;&#039;&#039;/etc/ssh/sshd_config:&#039;&#039;&#039;&lt;br /&gt;
  ...&lt;br /&gt;
  LogLevel VERBOSE&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
  sudo systemctl restart ssh&lt;br /&gt;
  sudo systemctl enable fail2ban&lt;br /&gt;
  sudo systemctl start fail2ban&lt;br /&gt;
&lt;br /&gt;
Check &#039;&#039;&#039;/var/log/fail2ban.log&#039;&#039;&#039; for logs&lt;br /&gt;
&lt;br /&gt;
Unban an IP:&lt;br /&gt;
  sudo fail2ban-client set sshd unbanip &amp;lt;banned_ip&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here sshd is the defaut jail name, change it if you are using a different jail.&lt;br /&gt;
&lt;br /&gt;
=== System health check ===&lt;br /&gt;
&lt;br /&gt;
* There should be a data disk attached (added from cloud.scaleway.com)&lt;br /&gt;
* The attached disk (/dev/nbdX) should be an lvm physical volume. We cannot use it directly for encryption, so we use lvm.&lt;br /&gt;
  # Make sure &#039;&#039;&#039;lvm2&#039;&#039;&#039; and &#039;&#039;&#039;udev&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install lvm2 udev&lt;br /&gt;
  &lt;br /&gt;
  # Replace X with valid number according to &#039;&#039;&#039;lsblk&#039;&#039;&#039;&lt;br /&gt;
  sudo pvcreate /dev/nbdX &lt;br /&gt;
* /dev/data is an lvm volume group created from /dev/nbdX&lt;br /&gt;
  sudo vgcreate data /dev/nbdX&lt;br /&gt;
* /dev/data/diaspora is an lvm logical volume &lt;br /&gt;
  sudo lvcreate -n diaspora /dev/data -L &amp;lt;size_of_disk&amp;gt;&lt;br /&gt;
* /dev/mapper/diaspora is an encrypted device &lt;br /&gt;
  # Make sure &#039;&#039;&#039;cryptsetup&#039;&#039;&#039; package is installed&lt;br /&gt;
  sudo apt-get install cryptsetup&lt;br /&gt;
&lt;br /&gt;
  # Give disk encryption password as specified in the [[#Server_Access|access repo]]&lt;br /&gt;
  sudo cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
  sudo cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
* /dev/mapper/diaspora is an ext4 file system &lt;br /&gt;
  sudo mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
* /var/lib/diaspora should be mounted. All [[#Handling_critical_data|critical data]] should be on /var/lib/diaspora.&lt;br /&gt;
  sudo mkdir /var/lib/diaspora&lt;br /&gt;
  sudo mount /dev/mapper/diaspora /var/lib/diaspora&lt;br /&gt;
&lt;br /&gt;
== User Visible Services ==&lt;br /&gt;
=== Diaspora ===&lt;br /&gt;
&lt;br /&gt;
* We use diaspora-installer-mysql package from https://people.debian.org/~praveen/diaspora/README &lt;br /&gt;
* See [https://salsa.debian.org/ruby-team/diaspora-installer/blob/debian/0.6.6.0+debian1/README /usr/share/doc/diaspora-common/README] for package specific configuration.&lt;br /&gt;
* [https://poddery.com/statistics live statistics]&lt;br /&gt;
&lt;br /&gt;
=== Chat/XMPP ===&lt;br /&gt;
&lt;br /&gt;
* We use Prosody and steps for setting up Prosody is given at -&amp;gt; https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  # Follow steps 1 to 6 from https://wiki.debian.org/Diaspora/XMPP&lt;br /&gt;
  sudo mysql -u root -p # Enter password from the access repo&lt;br /&gt;
  &lt;br /&gt;
  CREATE USER &#039;prosody&#039;@&#039;localhost&#039; IDENTIFIED BY &#039;&amp;lt;passwd_in_repo&amp;gt;&#039;;&lt;br /&gt;
  GRANT ALL PRIVILEGES ON diaspora_production.* TO &#039;prosody&#039;@&#039;localhost&#039;;&lt;br /&gt;
  FLUSH PRIVILEGES;&lt;br /&gt;
  &lt;br /&gt;
  sudo chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+r -R /etc/letsencrypt&lt;br /&gt;
  sudo chmod g+x /etc/letsencrypt/{archive,live}&lt;br /&gt;
  &lt;br /&gt;
  sudo systemctl restart prosody&lt;br /&gt;
* We have enabled all XEPs conversations expect. We use sslh to multiplex Diaspora and Prosody on port 443. See [https://wiki.debian.org/InstallingProsody#XMPP_over_HTTPS XMPP over HTTPS] section of the Installing Prosody article in Debian Wiki for sample sslh configuration.&lt;br /&gt;
&lt;br /&gt;
=== Chat/Matrix ===&lt;br /&gt;
&lt;br /&gt;
* We use Synapse server for setting up the Matrix server.&lt;br /&gt;
* We will be using https://github.com/matrix-org/synapse/#synapse-installation for setting up this instance&lt;br /&gt;
* We use nginx reverse proxy to send requests that has &#039;&#039;/_matrix/*&#039;&#039; in url to synapse on 8008. See /etc/nginx/sites-enabled/diaspora&lt;br /&gt;
* We use https://git.fosscommunity.in/necessary129/synapse-diaspora-auth to authenticate synapse with Diaspora database.&lt;br /&gt;
&lt;br /&gt;
=== Homepage ===&lt;br /&gt;
&lt;br /&gt;
Homepage and other static pages are maintained in our Gitlab instance. You can change it directly in the master branch or send pull requests. You can edit it via web as well.&lt;br /&gt;
&lt;br /&gt;
* poddery.com -&amp;gt; https://git.fosscommunity.in/community/poddery.com&lt;br /&gt;
  # Make sure &#039;&#039;&#039;git&#039;&#039;&#039; and &#039;&#039;&#039;acl&#039;&#039;&#039; packages are installed&lt;br /&gt;
  sudo apt-get install git acl&lt;br /&gt;
  &lt;br /&gt;
  # Grant rwx permissions for the ssh user to /usr/share/diaspora/public&lt;br /&gt;
  sudo setfacl -m &amp;quot;u:&amp;lt;ssh_user&amp;gt;:rwx&amp;quot; /usr/share/diaspora/public&lt;br /&gt;
  &lt;br /&gt;
  # Clone poddery.com repo&lt;br /&gt;
  cd /usr/share/diaspora/public&lt;br /&gt;
  git clone https://git.fosscommunity.in/community/poddery.com.git&lt;br /&gt;
  cd poddery.com &amp;amp;&amp;amp; mv * .[^.]* .. #Give yes for all files when prompted&lt;br /&gt;
  cd .. &amp;amp;&amp;amp; rmdir poddery.com&lt;br /&gt;
&lt;br /&gt;
* save.poddery.com -&amp;gt; https://git.fosscommunity.in/community/save.poddery.com&lt;br /&gt;
  cd /usr/share/diaspora/public/save&lt;br /&gt;
  git submodule init&lt;br /&gt;
  git submodule update&lt;br /&gt;
save.poddery.com repo is maintained as a sub module in poddery.com repo. See this tutorial -&amp;gt; https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ for working with git submodules.&lt;br /&gt;
&lt;br /&gt;
== Backend Services ==&lt;br /&gt;
=== nginx ===&lt;br /&gt;
&lt;br /&gt;
Front-end for Diaspora and Matrix.&lt;br /&gt;
&lt;br /&gt;
=== PostgreSQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Matrix.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
Backend for Diaspora. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO&#039;&#039;&#039;: Consider migrating to PostgreSQL to optimize resources (We can reduce one service and RAM usage).&lt;br /&gt;
&lt;br /&gt;
=== sslh ===&lt;br /&gt;
&lt;br /&gt;
Port multiplexer to allow XMPP and Diaspora to share 443 port. This allows us to fool stupid firewalls which blocks all ports except 80 and 443 (hence XMPP).&lt;br /&gt;
&lt;br /&gt;
=== SSL/TLS certificates ===&lt;br /&gt;
&lt;br /&gt;
 # letsencrypt certonly --webroot -w /usr/share/diaspora/public  -d poddery.com -d www.poddery.com -d test.poddery.com -d groups.poddery.com -w /usr/share/diaspora/public/save -d save.poddery.com&lt;br /&gt;
 # cp  -L /etc/letsencrypt/live/poddery.com/fullchain.pem /etc/diaspora/ssl/poddery.com-bundle.pem&lt;br /&gt;
 # cp -L /etc/letsencrypt/live/poddery.com/privkey.pem /etc/diaspora/ssl/poddery.com.key&lt;br /&gt;
 # chown -R root:ssl-cert /etc/letsencrypt&lt;br /&gt;
 # chmod g+r -R /etc/letsencrypt&lt;br /&gt;
 # chmod g+x /etc/letsencrypt/*&lt;br /&gt;
&lt;br /&gt;
 # ls -l /etc/prosody/certs/&lt;br /&gt;
 total 0&lt;br /&gt;
 lrwxrwxrwx 1 root root 40 Mar 28 01:16 poddery.com.crt -&amp;gt; /etc/letsencrypt/live/poddery.com/fullchain.pem&lt;br /&gt;
 lrwxrwxrwx 1 root root 33 Mar 28 01:16 poddery.com.key -&amp;gt; /etc/letsencrypt/live/poddery.com/privkey.pem&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 30 2 * * 1 letsencrypt renew  &amp;gt;&amp;gt; /var/log/le-renew.log&lt;br /&gt;
 32 2 * * 1 /etc/init.d/nginx reload&lt;br /&gt;
 34 2 * * 1 /etc/init.d/prosody reload&lt;br /&gt;
&lt;br /&gt;
=== Handling critical data ===&lt;br /&gt;
  sudo /etc/init.d/mysql stop&lt;br /&gt;
  sudo mv /var/lib/mysql /var/lib/diaspora&lt;br /&gt;
  sudo ln /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
  sudo mkdir /var/lib/diaspora/uploads&lt;br /&gt;
  sudo chown -R diaspora: /var/lib/diaspora/uploads&lt;br /&gt;
  sudo ln -s /var/lib/diaspora/uploads /usr/share/diaspora/public/uploads&lt;br /&gt;
&lt;br /&gt;
=== Services health check ===&lt;br /&gt;
&lt;br /&gt;
Sample output - Look for &amp;quot;Active: active (running)&amp;quot;&lt;br /&gt;
  &lt;br /&gt;
  systemctl status nginx # Our web server front-end for Diaspora, XMPP and Matrix&lt;br /&gt;
  nginx.service - A high performance web server and a reverse proxy server&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/nginx.service; enabled)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:17:02 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5063 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 13140 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5071 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5067 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 5072 (nginx)&lt;br /&gt;
  CGroup: /system.slice/nginx.service&lt;br /&gt;
           ├─ 5072 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&lt;br /&gt;
           ├─13149 nginx: worker process&lt;br /&gt;
           ├─13150 nginx: worker process&lt;br /&gt;
           ├─13151 nginx: worker process&lt;br /&gt;
           └─13153 nginx: worker process&lt;br /&gt;
&lt;br /&gt;
  systemctl status diaspora # Diaspora service&lt;br /&gt;
  diaspora.service - LSB: Diaspora application server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/diaspora)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:21:29 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 5146 ExecStop=/etc/init.d/diaspora stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 5167 ExecStart=/etc/init.d/diaspora start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/diaspora.service&lt;br /&gt;
          ├─  850 unicorn worker[0] -c config/unicorn.rb -D&lt;br /&gt;
          ├─ 5174 sudo -u diaspora -E -H ./script/server&lt;br /&gt;
          ├─ 5175 eye monitoring v0.9.1 [diaspora] (in /usr/share/diaspora)&lt;br /&gt;
          ├─ 5211 sidekiq 4.2.9 diaspora [0 of 25 busy]&lt;br /&gt;
          ├─ 5222 unicorn master -c config/unicorn.rb -D&lt;br /&gt;
          └─31717 unicorn worker[1] -c config/unicorn.rb -D  &lt;br /&gt;
 &lt;br /&gt;
  systemctl status matrix-synapse.service # Synapse Matrix Server&lt;br /&gt;
  matrix-synapse.service - Synapse Matrix homeserver&lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/matrix-synapse.service; enabled)&lt;br /&gt;
  Active: active (running) since Sat 2018-01-13 05:38:55 UTC; 3 weeks 1 days ago&lt;br /&gt;
  Process: 15800 ExecStartPre=/var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --generate-keys (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Main PID: 15808 (python2.7)&lt;br /&gt;
  CGroup: /system.slice/matrix-synapse.service&lt;br /&gt;
          └─15808 /var/lib/matrix-synapse/synapse/bin/python2.7 -m synapse.app.homeserver --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/&lt;br /&gt;
&lt;br /&gt;
  systemctl status prosody # Prosody XMPP Server&lt;br /&gt;
  prosody.service - LSB: Prosody XMPP Server&lt;br /&gt;
  Loaded: loaded (/etc/init.d/prosody)&lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:35:41 UTC; 4 weeks 1 days ago&lt;br /&gt;
  Process: 6218 ExecStop=/etc/init.d/prosody stop (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6483 ExecReload=/etc/init.d/prosody reload (code=exited, status=0/SUCCESS)&lt;br /&gt;
  Process: 6223 ExecStart=/etc/init.d/prosody start (code=exited, status=0/SUCCESS)&lt;br /&gt;
  CGroup: /system.slice/prosody.service&lt;br /&gt;
          └─6231 /usr/bin/lua5.1 /usr/bin/prosody&lt;br /&gt;
&lt;br /&gt;
  systemctl status sslh # SSL/SSH multiplexer which allow us to provide multiple services via 443 port (to bypass stupid firewalls)&lt;br /&gt;
  sslh.service - SSL/SSH multiplexer &lt;br /&gt;
  Loaded: loaded (/lib/systemd/system/sslh.service; enabled) &lt;br /&gt;
  Active: active (running) since Fri 2018-01-05 07:29:27 UTC; 4 weeks 1 days ago &lt;br /&gt;
     Docs: man:sslh(8) &lt;br /&gt;
  Main PID: 5444 (sslh) &lt;br /&gt;
  CGroup: /system.slice/sslh.service &lt;br /&gt;
          ├─  713 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─  830 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1672 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 1673 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3514 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3875 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3876 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 3896 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 4965 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5395 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5444 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5445 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 5963 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6617 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6774 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 6957 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7063 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─ 7083 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          ├─25613 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg &lt;br /&gt;
          └─27481 /usr/sbin/sslh --foreground -F /etc/sslh/sslh.cfg&lt;br /&gt;
&lt;br /&gt;
= Coordination =&lt;br /&gt;
&lt;br /&gt;
*[https://www.loomio.org/g/2bjVXqAu/fosscommunity-in-poddery-com-maintainer-s-group loomio group] - we use this for decision making.&lt;br /&gt;
* Hangout with us in our Matrix room [https://matrix.to/#/#poddery:poddery.com #poddery:poddery.com]&lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Email: poddery at autistici.org (alias that reaches Akhilan, Abhijith Balan, Fayad, Balasankar, Julius, Praveen, Prasobh, Sruthi, Shirish, Vamsee and Manukrishnan)&lt;br /&gt;
&lt;br /&gt;
The following people have their GPG keys in the password file.&lt;br /&gt;
&lt;br /&gt;
Praveen Arimbrathodiyil (piratepin) (ID: 0xCE1F9C674512), Balasankar C (ID: 0x96EDAB9B2E6B7171), Manu Krishnan T V (ID: 0x5D0064186AF037D9), Fayad Fami (fayad) (ID: 0x51C954405D432381), Abhijith PA (ID: 0x863D4DF2ED9C28EF), Syam G Krishnan (sgk) (ID: 0x6EF48CCD865A1FFC), Sagar Ippalpalli (ID: 0xFD49D0BC6FEAECDA), Pirate Bady (piratesin) (ID: 0x92FDAB42A95FF20C), Kannan (ID: 0x0B1955F40C691CCE)&lt;br /&gt;
&lt;br /&gt;
We recommend you setup [http://www.vim.org/scripts/script.php?script_id=3645 Vim GPG Plugin] for transparent editing. If you are new to GPG, then follow [https://www.madboa.com/geek/gpg-quickstart/ this guide].&lt;br /&gt;
&lt;br /&gt;
=== Server Access ===&lt;br /&gt;
&lt;br /&gt;
Maintained in a private git repo at -&amp;gt; https://git.fosscommunity.in/community/access&lt;br /&gt;
&lt;br /&gt;
= Setting up Backup =&lt;br /&gt;
&lt;br /&gt;
Backup was setup on a Scaleway C1 VPS (4 core ARM processor with 2GB RAM). &#039;&#039;&#039;TODO: C1 server was crashing frequently and we need to setup backup again on VPS provided by Manu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Hostname (IP): backup.poddery.com (No public ip, access via scaleway.com web console). If you restart this machine, you may want to add poddery.com private ip in /etc/hosts&lt;br /&gt;
&lt;br /&gt;
 # apt-get install lvm2 cryptsetup&lt;br /&gt;
&lt;br /&gt;
Directly creating luks volume on /dev/nbd1 is not working, so we use a logical volume&lt;br /&gt;
&lt;br /&gt;
 # pvcreate /dev/nbd1&lt;br /&gt;
 # vgcreate data /dev/nbd1&lt;br /&gt;
 # lvcreate -n diaspora -L 46.5G /dev/data&lt;br /&gt;
&lt;br /&gt;
 # cryptsetup luksFormat /dev/data/diaspora&lt;br /&gt;
 # cryptsetup luksOpen /dev/data/diaspora diaspora&lt;br /&gt;
&lt;br /&gt;
and update /etc/crypttab&lt;br /&gt;
 # &amp;lt;target name&amp;gt; &amp;lt;source device&amp;gt;         &amp;lt;key file&amp;gt;      &amp;lt;options&amp;gt;&lt;br /&gt;
 diaspora /dev/data/diaspora none luks&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 # mkfs.ext4 /dev/mapper/diaspora&lt;br /&gt;
 # mkdir /var/lib/diaspora&lt;br /&gt;
and update /etc/fstab&lt;br /&gt;
 # UNCONFIGURED FSTAB FOR BASE SYSTEM&lt;br /&gt;
 /dev/mapper/diaspora /var/lib/diaspora ext4 defaults 0 2&lt;br /&gt;
&lt;br /&gt;
 # mount -a&lt;br /&gt;
 # apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
Move MySQL data directory to encrypted volume&lt;br /&gt;
 # /etc/init.d/mysql stop&lt;br /&gt;
 # mv /var/lib/mysql /var/lib/diaspora/&lt;br /&gt;
 # ln -s /var/lib/diaspora/mysql /var/lib/mysql&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterbaseconfig.html for replication&lt;br /&gt;
&lt;br /&gt;
Follow steps in https://www.howtoforge.com/how-to-set-up-mysql-database-replication-with-ssl-encryption-on-centos-5.4 for ssl (but ssl support is disabled in debian)&lt;br /&gt;
&lt;br /&gt;
Follow steps in http://www.networkcomputing.com/storage/how-set-ssh-encrypted-mysql-replication/1111882674 to use ssh port forwarding to have encrypted replication&lt;br /&gt;
&lt;br /&gt;
 # adduser sshtunnel --disabled-login&lt;br /&gt;
 # su sshtunnel&lt;br /&gt;
&lt;br /&gt;
Generate SSH key pair and copy public key to target system&lt;br /&gt;
 $ ssh-keygen -t rsa&lt;br /&gt;
 $ ssh -f sshtunnel@poddery.com -L 7777:127.0.0.1:3306 -N&lt;br /&gt;
&lt;br /&gt;
Test the connectivity&lt;br /&gt;
 # mysql -u poddery_backup -p -P 7777 -h 127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Uploads are rsynced every hour&lt;br /&gt;
&lt;br /&gt;
 # crontab -e&lt;br /&gt;
 # m h  dom mon dow   command&lt;br /&gt;
 0 * * * * pgrep rsync || rsync -av --delete root@poddery.com:/var/lib/diaspora/uploads/ /var/lib/diaspora/uploads/ &amp;gt;/var/lib/diaspora/rsync-uploads.log&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since we are not using a public ip (saves us money), backup.poddery.com connects to poddery.com via private ip. So if poddery.com is rebooted, the new ip address should be updated in /etc/hosts file of backup.poddery.com. To connect, use the web console from scaleway.com&lt;br /&gt;
&lt;br /&gt;
= Add more disk space =&lt;br /&gt;
&lt;br /&gt;
# Power off the machine with &amp;quot;ARCHIVE&amp;quot; option. It may take upto an hour for shutdown to complete on backup.poddery.com and poddery.com&lt;br /&gt;
# Add more disk from scaleway.com control panel . Volumes -&amp;gt; CREATE VOLUME&lt;br /&gt;
# Attach the newly created volume to server from Server page&lt;br /&gt;
# Power on the server&lt;br /&gt;
# Create physical volume (pvcreate /dev/nbdN)&lt;br /&gt;
# Expand volume group (vgextend data /dev/nbdN)&lt;br /&gt;
# Expand logical volume (lvresize --size=186G data/diaspora)&lt;br /&gt;
# Expand encrypted partition (cryptsetup resize diaspora)&lt;br /&gt;
# Resize file system (resize2fs /dev/mapper/diaspora)&lt;br /&gt;
&lt;br /&gt;
= Maintenance history =&lt;br /&gt;
This section holds maintenance/issue history for future tracking.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When updating diaspora-installer-mysql packages, remember to recreate /usr/share/diaspora/public/uploads symlink to /var/lib/diaspora/uploads&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1. Prosody error - Failed to load private key&lt;br /&gt;
&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Previous error (see logs), or other system error. (for poddery.com)&lt;br /&gt;
 tls error   Unable to initialize TLS: error loading private key (system lib)&lt;br /&gt;
 certmanager error SSL/TLS: Failed to load &#039;/etc/letsencrypt/live/poddery.com/privkey.pem&#039;: Check that the permissions allow Prosody to read this file.&lt;br /&gt;
&lt;br /&gt;
This error is usually when ssl certificate in freshly installed or renewed. Prosody user is unable to access the key file due to lack of privileges.&lt;br /&gt;
&lt;br /&gt;
Note that Poddery uses Letsencrypt for ssl.&lt;br /&gt;
&lt;br /&gt;
Fix: &lt;br /&gt;
&lt;br /&gt;
* Make sure that prosody user is in &#039;certs&#039; group (this group may also be called ssl-certs as setup by Letencrypt) &lt;br /&gt;
* /etc/letsencrypt/ is the ssl directory. &lt;br /&gt;
* Prosody user should have permissions to all folders importantly archive and live folders in /etc/letsencrypt. Permissions to each folder must be 750.&lt;br /&gt;
* Troubleshoot by checking if you can switch to each folder in /etc/letsencrypt as prosody user and cat the files.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If replication fails, you can restart it following the instructions here&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
https://dba.stackexchange.com/questions/69394/mysql-replication-error-1594&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Bady</name></author>
	</entry>
</feed>